package com.kuxhausen.huemore.state; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Log; import com.kuxhausen.huemore.persistence.Definitions.GroupBulbColumns; import com.kuxhausen.huemore.persistence.Definitions.GroupColumns; import java.util.ArrayList; import java.util.List; public class DatabaseGroup extends Group { // must be kept in sync with DatabaseGroup constructor public final static String[] GROUP_QUERY_COLUMNS = { GroupColumns._ID, GroupColumns.COL_GROUP_NAME, GroupColumns.COL_GROUP_LOWERCASE_NAME, GroupColumns.COL_GROUP_PRIORITY, GroupColumns.COL_GROUP_FLAGS }; // must be kept in sync with DatabaseGroup constructor private final static String[] GROUPBULB_QUERY_COLUMNS = { GroupBulbColumns._ID, GroupBulbColumns.COL_GROUP_ID, GroupBulbColumns.COL_BULB_PRECEDENCE, GroupBulbColumns.COL_NET_BULB_ID }; private long mId; private String mName, mLowercaseName; private int mPriority; private int mFlags; private List<Long> mGroupBulbNetId = new ArrayList<>(); public static DatabaseGroup loadAllGroup(Context context) { String where = GroupColumns.COL_GROUP_FLAGS + "=?"; String[] whereArgs = {"" + GroupColumns.FLAG_ALL}; Cursor groupCursor = context.getContentResolver() .query(GroupColumns.URI, GROUP_QUERY_COLUMNS, where, whereArgs, null); if (groupCursor.moveToFirst()) { DatabaseGroup result = new DatabaseGroup(groupCursor, context); groupCursor.close(); return result; } else { throw new IllegalStateException("ALL Group not in database"); } } public static @Nullable DatabaseGroup load(@NonNull String name, @NonNull Context context) { Cursor cursor = getGroupCursor(name, context); if (cursor != null) { return new DatabaseGroup(cursor, context); } else { return null; } } public static @Nullable DatabaseGroup load(long id, @NonNull Context context) { Cursor cursor = getGroupCursor(id, context); if (cursor != null) { return new DatabaseGroup(cursor, context); } else { return null; } } public DatabaseGroup(@NonNull Cursor groupCursor, @NonNull Context c) { mId = groupCursor.getLong(0); mName = groupCursor.getString(1); mLowercaseName = groupCursor.getString(2); mPriority = groupCursor.getInt(3); mFlags = groupCursor.getInt(4); String[] bulbWhere = {"" + mId}; Cursor bulbCursor = c.getContentResolver().query(GroupBulbColumns.URI, GROUPBULB_QUERY_COLUMNS, GroupBulbColumns.COL_GROUP_ID + "=?", bulbWhere, GroupBulbColumns.COL_BULB_PRECEDENCE + " ASC"); bulbCursor.moveToPosition(-1); while (bulbCursor.moveToNext()) { mGroupBulbNetId.add(bulbCursor.getLong(3)); } bulbCursor.close(); } private static @Nullable Cursor getGroupCursor(String name, @NonNull Context c) { String[] groupWhere = {name}; Cursor groupCursor = c.getContentResolver() .query(GroupColumns.URI, GROUP_QUERY_COLUMNS, GroupColumns.COL_GROUP_NAME + "=?", groupWhere, null); if (groupCursor!=null && groupCursor.moveToFirst()) { return groupCursor; } else { if (groupCursor != null) { groupCursor.close(); } String[] lowercaseGroupWhere = {name.toLowerCase().trim()}; Cursor lowercaseGroupCursor = c.getContentResolver().query(GroupColumns.URI, GROUP_QUERY_COLUMNS, GroupColumns.COL_GROUP_LOWERCASE_NAME + "=?", lowercaseGroupWhere, null); if (lowercaseGroupCursor != null && lowercaseGroupCursor.moveToFirst()) { return lowercaseGroupCursor; } else { Log.w("Database", "Group " + name + " not in database"); if (lowercaseGroupCursor != null) { lowercaseGroupCursor.close(); } return null; } } } private static @Nullable Cursor getGroupCursor(long id, @NonNull Context c) { String[] groupWhere = {"" + id}; Cursor groupCursor = c.getContentResolver() .query(GroupColumns.URI, GROUP_QUERY_COLUMNS, GroupColumns._ID + "=?", groupWhere, null); if (groupCursor != null && groupCursor.moveToFirst()) { return groupCursor; } else { Log.w("Database", "Group id " + id + " not in database"); if (groupCursor != null) { groupCursor.close(); } return null; } } public long getId() { return mId; } @Override public String getName() { return mName; } public void setName(String name, Context c) { if (!mName.equals(name)) { mName = name; mLowercaseName = name.toLowerCase().trim(); saveGroupUpdate(c); } } @Override public List<Long> getNetworkBulbDatabaseIds() { return mGroupBulbNetId; } public void setNetBulbDatabaseIds(List<Long> bulbIdList, Context c) { if (!mGroupBulbNetId.equals(bulbIdList)) { String where = GroupBulbColumns.COL_GROUP_ID + "=?"; String[] whereArgs = {"" + mId}; c.getContentResolver().delete(GroupBulbColumns.URI, where, whereArgs); for (int i = 0; i < bulbIdList.size(); i++) { ContentValues values = new ContentValues(); values.put(GroupBulbColumns.COL_GROUP_ID, mId); values.put(GroupBulbColumns.COL_BULB_PRECEDENCE, i); values.put(GroupBulbColumns.COL_NET_BULB_ID, bulbIdList.get(i)); c.getContentResolver().insert(GroupBulbColumns.URI, values); } mGroupBulbNetId = bulbIdList; } } public boolean isStared() { return (mPriority == GroupColumns.PRIORITY_STARRED); } public void starChanged(Context c, boolean isStared) { if (isStared) { mPriority = GroupColumns.PRIORITY_STARRED; } else { mPriority = GroupColumns.PRIORITY_UNSTARRED; } saveGroupUpdate(c); } public boolean isALL() { return (mFlags == GroupColumns.FLAG_ALL); } private void saveGroupUpdate(Context c) { ContentValues values = new ContentValues(); values.put(GroupColumns.COL_GROUP_NAME, mName); values.put(GroupColumns.COL_GROUP_LOWERCASE_NAME, mLowercaseName); values.put(GroupColumns.COL_GROUP_PRIORITY, mPriority); values.put(GroupColumns.COL_GROUP_FLAGS, mFlags); String where = GroupColumns._ID + "=?"; String[] whereArg = {"" + mId}; c.getContentResolver().update(GroupColumns.URI, values, where, whereArg); } public static DatabaseGroup createGroup(String name, Context c) { ContentValues values = new ContentValues(); values.put(GroupColumns.COL_GROUP_NAME, name); values.put(GroupColumns.COL_GROUP_LOWERCASE_NAME, name.toLowerCase().trim()); values.put(GroupColumns.COL_GROUP_PRIORITY, GroupColumns.PRIORITY_UNSTARRED); values.put(GroupColumns.COL_GROUP_FLAGS, GroupColumns.FLAG_NORMAL); long id = Long.parseLong( c.getContentResolver().insert(GroupColumns.URI, values).getLastPathSegment()); return load(id, c); } /* * no further methods should be called on this object after this */ public void deleteSelf(Context c) { String groupWhere = GroupColumns._ID + "=?"; String[] whereArgs = {"" + mId}; c.getContentResolver().delete(GroupColumns.URI, groupWhere, whereArgs); mId = mPriority = -1; mName = mLowercaseName = ""; } }