package co.mwater.clientapp.databinding;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.ContentObserver;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.net.Uri;
import android.os.Handler;
import android.widget.CheckBox;
import android.widget.Spinner;
import android.widget.TextView;
public class DataBinder {
List<DataBinderElement> elements;
Uri uri;
ContentResolver contentResolver;
Handler handler;
DataBinderContentObserver contentObserver;
public DataBinder(ContentResolver contentResolver, Handler handler) {
elements = new ArrayList<DataBinderElement>();
this.contentResolver = contentResolver;
this.handler = handler;
}
public void addTextView(TextView control, String column) {
elements.add(new TextViewDataBinderElement(column, control));
}
public void addSpinner(Spinner control, String column) {
elements.add(new SpinnerDataBinderElement(column, control));
}
public void addCheckBox(CheckBox control, String column) {
elements.add(new CheckBoxDataBinderElement(column, control));
}
public void bind(Uri uri) {
unbind();
this.uri = uri;
contentObserver = new DataBinderContentObserver(handler);
contentResolver.registerContentObserver(uri, true, contentObserver);
load(uri, true);
}
public void unbind() {
// Unregister old content observer
if (contentObserver != null)
contentResolver.unregisterContentObserver(contentObserver);
uri = null;
}
public void save() {
if (uri == null)
throw new IllegalArgumentException("Not bound");
saveTo(uri);
}
/**
* Saves without binding
*
* @param toUri
*/
public void saveTo(Uri toUri) {
ContentValues content = new ContentValues();
// Get contents to save
for (DataBinderElement elem : elements) {
if (elem.isModified())
elem.Save(content);
}
if (content.size() > 0) {
contentResolver.update(toUri, content, null, null);
}
}
/**
* Saves without binding
*
* @param toUri
*/
public void saveAllTo(ContentValues values) {
// Get contents to save
for (DataBinderElement elem : elements) {
elem.Save(values);
}
}
public void loadFrom(Uri fromUri) {
load(fromUri, true);
}
public void revert() {
load(uri, true);
}
void load(Uri loadUri, boolean includeModified) {
if (loadUri == null)
return;
// Requery
Cursor cursor = contentResolver.query(loadUri, null, null, null, null);
if (!cursor.moveToFirst())
{
// Non-existant row. Do not load
cursor.close();
return;
}
ContentValues content = new ContentValues();
DatabaseUtils.cursorRowToContentValues(cursor, content);
// Reload all elements
for (DataBinderElement elem : elements) {
if (!elem.isModified() || includeModified)
elem.Load(content);
}
cursor.close();
}
void handleContentChange() {
load(uri, false);
}
class DataBinderContentObserver extends ContentObserver {
public DataBinderContentObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
handleContentChange();
}
}
}