package com.ioabsoftware.gameraven.db;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnShowListener;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckedTextView;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.ioabsoftware.gameraven.AllInOneV2;
import com.ioabsoftware.gameraven.R;
import net.margaritov.preference.colorpicker.ColorPickerDialog;
import net.margaritov.preference.colorpicker.ColorPickerDialog.OnColorChangedListener;
import java.util.HashMap;
import java.util.Locale;
public class HighlightListDBHelper extends SQLiteOpenHelper {
private HashMap<String, HighlightedUser> highlightedUsers;
/**
* DO NOT STORE REFERENCES TO THIS LIST! Always call this method when needing to use the list,
* this list will always be up to date.
*
* @return An up-to-date list of highlighted users.
*/
public HashMap<String, HighlightedUser> getHighlightedUsers() {
return highlightedUsers;
}
private static final String DATABASE_NAME = "highlightlists.db";
private static final int DATABASE_VERSION = 1;
public static final String TABLE_USERS = "users";
public static final String COLUMN_USERS_ID = "_id";
public static final String COLUMN_USERS_NAME = "name";
public static final String COLUMN_USERS_LABEL = "label";
public static final String COLUMN_USERS_COLOR = "color";
private static final String CREATE_TABLE_USERS =
"create table " + TABLE_USERS + "(" +
COLUMN_USERS_ID + " integer primary key autoincrement, " +
COLUMN_USERS_NAME + " text not null, " +
COLUMN_USERS_LABEL + " text not null, " +
COLUMN_USERS_COLOR + " integer not null);";
public HighlightListDBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
SQLiteDatabase db = getWritableDatabase();
updateUsers(db);
db.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE_USERS);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVer, int newVer) {
// nothing. ABSOLUTELY NOTHING!
}
public boolean hasUser(String user) {
return highlightedUsers.containsKey(user.toLowerCase(Locale.US));
}
public HashMap<String, HighlightedUser> addUser(String name, String label, int color) {
SQLiteDatabase db = getWritableDatabase();
ContentValues vals = new ContentValues();
vals.put(COLUMN_USERS_NAME, name);
vals.put(COLUMN_USERS_LABEL, label);
vals.put(COLUMN_USERS_COLOR, color);
db.insert(TABLE_USERS, null, vals);
updateUsers(db);
db.close();
return highlightedUsers;
}
public HashMap<String, HighlightedUser> updateUser(HighlightedUser user) {
SQLiteDatabase db = getWritableDatabase();
ContentValues vals = new ContentValues();
vals.put(COLUMN_USERS_NAME, user.getName());
vals.put(COLUMN_USERS_LABEL, user.getLabel());
vals.put(COLUMN_USERS_COLOR, user.getColor());
db.update(TABLE_USERS, vals, COLUMN_USERS_ID + " = " + user.getID(), null);
updateUsers(db);
db.close();
return highlightedUsers;
}
public HashMap<String, HighlightedUser> deleteUser(String user) {
if (hasUser(user))
return deleteUser(highlightedUsers.get(user.toLowerCase(Locale.US)));
else
return highlightedUsers;
}
public HashMap<String, HighlightedUser> deleteUser(HighlightedUser user) {
SQLiteDatabase db = getWritableDatabase();
db.delete(TABLE_USERS, COLUMN_USERS_ID + " = " + user.getID(), null);
updateUsers(db);
db.close();
return highlightedUsers;
}
private void updateUsers(SQLiteDatabase db) {
highlightedUsers = new HashMap<String, HighlightedUser>();
Cursor cur = db.query(TABLE_USERS, null, null, null, null, null, null);
if (cur.moveToFirst()) {
do {
highlightedUsers.put(cur.getString(1).toLowerCase(Locale.US),
new HighlightedUser(cur.getInt(0), cur.getString(1), cur.getString(2), cur.getInt(3)));
} while (cur.moveToNext());
cur.close();
}
}
/**
* Shows a dialog used to add or update user highlighting.
*
* @param c Activity used as a Context and for getLayoutInflator
* @param user HighlightedUser object. If null or ID equals -1, this is a new user being highlighted.
* @param username Optional username to set. Does nothing if this isn't a new user being highlighted.
* @param listener Optional listener to be fired just before the dialog gets dismissed on successful save.
*/
@SuppressWarnings("ConstantConditions")
public static void showHighlightUserDialog(final Activity c, final HighlightedUser user,
String username, final HlUDDismissListener listener) {
boolean isNewCheck = false;
if (user == null || user.getID() == -1)
isNewCheck = true;
final boolean isAddNew = isNewCheck;
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(c);
LayoutInflater inflater = c.getLayoutInflater();
final View dialogView = inflater.inflate(R.layout.highlightuserdialog, null);
dialogBuilder.setView(dialogView);
dialogBuilder.setTitle("Add Highlighted User");
final EditText dName = (EditText) dialogView.findViewById(R.id.huName);
final EditText dLabel = (EditText) dialogView.findViewById(R.id.huLabel);
final Button dSetColor = (Button) dialogView.findViewById(R.id.huSetColor);
final TextView dColorVal = (TextView) dialogView.findViewById(R.id.huColorVal);
final CheckedTextView dDelete = (CheckedTextView) dialogView.findViewById(R.id.huDelete);
dSetColor.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int startColor = Integer.parseInt(dColorVal.getText().toString());
ColorPickerDialog picker = new ColorPickerDialog(c, startColor);
picker.setOnColorChangedListener(new OnColorChangedListener() {
@Override
public void onColorChanged(int color) {
dSetColor.setBackgroundColor(color);
dSetColor.setTextColor(~color | 0xFF000000); //without alpha
dColorVal.setText(Integer.toString(color));
}
});
picker.setHexValueEnabled(true);
picker.show();
}
});
if (!isAddNew) {
dDelete.setVisibility(View.VISIBLE);
dDelete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
((CheckedTextView) v).toggle();
}
});
dName.setText(user.getName());
dLabel.setText(user.getLabel());
dSetColor.setBackgroundColor(user.getColor());
dSetColor.setTextColor(~user.getColor() | 0xFF000000); //without alpha
dColorVal.setText(Integer.toString(user.getColor()));
} else if (username != null)
dName.setText(username);
dialogBuilder.setPositiveButton("Save", null);
dialogBuilder.setNegativeButton("Cancel", null);
final AlertDialog diag = dialogBuilder.create();
diag.setOnShowListener(new OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
diag.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
boolean shouldDismiss = true;
if (!dDelete.isChecked()) {
if (dName.getText().toString().length() > 0
&& dLabel.getText().toString().length() > 0
&& !dColorVal.getText().equals("0")) {
if (isAddNew) {
AllInOneV2.getHLDB().addUser(
dName.getText().toString(),
dLabel.getText().toString(),
Integer.parseInt(dColorVal
.getText().toString()));
} else {
user.setName(dName.getText().toString());
user.setLabel(dLabel.getText().toString());
user.setColor(Integer.parseInt(dColorVal
.getText().toString()));
AllInOneV2.getHLDB().updateUser(user);
}
} else {
Toast.makeText(c,
"Missing required info",
Toast.LENGTH_SHORT).show();
shouldDismiss = false;
}
} else {
AllInOneV2.getHLDB().deleteUser(user);
}
if (shouldDismiss) {
if (listener != null)
listener.beforeDismissSuccessfulSave();
diag.dismiss();
}
}
});
}
});
diag.show();
}
}