package com.kuxhausen.huemore;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.Cursor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;
import android.support.v4.widget.SimpleCursorAdapter;
import android.util.SparseBooleanArray;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.EditText;
import android.widget.ListView;
import com.kuxhausen.huemore.persistence.Definitions.InternalArguments;
import com.kuxhausen.huemore.persistence.Definitions.NetBulbColumns;
import com.kuxhausen.huemore.persistence.Definitions.PreferenceKeys;
import com.kuxhausen.huemore.state.DatabaseGroup;
import java.util.ArrayList;
public class EditGroupDialogFragment extends DialogFragment implements
LoaderManager.LoaderCallbacks<Cursor> {
private static final int NET_BULBS_LOADER = 0;
private static final String[] net_columns = {NetBulbColumns.NAME_COLUMN,
NetBulbColumns.DEVICE_ID_COLUMN, NetBulbColumns._ID};
public CursorAdapter dataSource;
private ListView mBulbsListView;
private EditText mNameEditText;
private DatabaseGroup initialGroup;
private NetworkManagedActivity mParent;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception.
try {
mParent = (NetworkManagedActivity) activity;
} catch (ClassCastException e) {
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the Builder class for convenient dialog construction
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
View groupDialogView = inflater.inflate(R.layout.edit_group_dialog, null);
mBulbsListView = ((ListView) groupDialogView.findViewById(R.id.listView1));
mBulbsListView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
getLoaderManager().initLoader(NET_BULBS_LOADER, null, this);
dataSource =
new SimpleCursorAdapter(this.getActivity(),
android.R.layout.simple_list_item_multiple_choice, null,
net_columns, new int[]{android.R.id.text1}, 0);
mBulbsListView.setAdapter(dataSource);
builder.setView(groupDialogView);
mNameEditText = (EditText) groupDialogView.findViewById(R.id.editText1);
Bundle args = this.getArguments();
if (args != null && args.containsKey(InternalArguments.GROUP_ID)) {
initialGroup = DatabaseGroup.load(args.getLong(InternalArguments.GROUP_ID), mParent);
mNameEditText.setText(initialGroup.getName());
}
builder.setPositiveButton(R.string.accept, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
String groupName = mNameEditText.getText().toString();
if (groupName == null || groupName.length() < 1) {
SharedPreferences settings =
PreferenceManager.getDefaultSharedPreferences(mParent);
int unnamedNumber = 1 + settings.getInt(PreferenceKeys.UNNAMED_GROUP_NUMBER, 0);
Editor edit = settings.edit();
edit.putInt(PreferenceKeys.UNNAMED_GROUP_NUMBER, unnamedNumber);
edit.commit();
groupName =
mParent.getResources().getString(R.string.unnamed_group) + " "
+ unnamedNumber;
}
if(initialGroup==null){
initialGroup = DatabaseGroup.createGroup(groupName, mParent);
}
initialGroup.setName(groupName, mParent);
ArrayList<Long> bulbIds = new ArrayList<Long>();
SparseBooleanArray set = mBulbsListView.getCheckedItemPositions();
Cursor cursor = dataSource.getCursor();
cursor.moveToFirst();
for (int i = 0; i < cursor.getCount(); i++) {
if (set.get(i)) {
bulbIds.add(cursor.getLong(2));
}
cursor.moveToNext();
}
cursor.close();
initialGroup.setNetBulbDatabaseIds(bulbIds, mParent);
}
}).setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
}
});
// Create the AlertDialog object and return it
return builder.create();
}
@Override
public Loader<Cursor> onCreateLoader(int loaderID, Bundle arg1) {
/*
* Takes action based on the ID of the Loader that's being created
*/
switch (loaderID) {
case NET_BULBS_LOADER:
// Returns a new CursorLoader
return new CursorLoader(getActivity(), // Parent activity context
NetBulbColumns.URI, // Table
net_columns, // Projection to return
null, // No selection clause
null, // No selection arguments
null // Default sort order
);
default:
// An invalid id was passed in
return null;
}
}
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {
/*
* Moves the query results into the adapter, causing the ListView fronting this adapter to
* re-display
*/
dataSource.changeCursor(cursor);
if (initialGroup != null) {
cursor.moveToFirst();
for (int i = 0; i < cursor.getCount(); i++) {
if (initialGroup.getNetworkBulbDatabaseIds().contains(cursor.getLong(2))) {
mBulbsListView.setItemChecked(i, true);
} else {
mBulbsListView.setItemChecked(i, false);
}
cursor.moveToNext();
}
}
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
/*
* Clears out the adapter's reference to the Cursor. This prevents memory leaks.
*/
dataSource.changeCursor(null);
}
}