package gueei.binding.markupDemoICS.viewModels;
import gueei.binding.Command;
import gueei.binding.Observable;
import gueei.binding.collections.ArrayListObservable;
import gueei.binding.labs.EventAggregator;
import gueei.binding.labs.EventSubscriber;
import gueei.binding.markupDemoICS.R;
import gueei.binding.serialization.ViewModelParceler;
import android.app.Activity;
import android.content.res.XmlResourceParser;
import android.os.Bundle;
import android.view.View;
public class LaunchViewModel {
private Activity mContext;
public final ActionBar ActionBarViewModel;
public final Observable<DemoCategory> SelectedCategory =
new Observable<DemoCategory>(DemoCategory.class);
public final ArrayListObservable<DemoCategory> Categories =
new ArrayListObservable<DemoCategory>(DemoCategory.class);
public final Observable<Object> Demo = new Observable<Object>(Object.class);
public final Command CategorySelected = new Command(){
@Override
public void Invoke(View view, Object... args) {
SelectedCategory.get().showFirstDemo();
}
};
public LaunchViewModel(Activity context){
mContext = context;
parseDemos();
ActionBarViewModel = new ActionBar();
EventAggregator.getInstance(context)
.subscribe("ShowDemo", new EventSubscriber(){
@Override
public void onEventTriggered(String eventName,
Object publisher, Bundle data) {
DemoEntry entry = new DemoEntry();
ViewModelParceler.restoreViewModel(data, entry);
showDemo(entry);
}
});
}
private void showDemo(DemoEntry entry){
Demo.set(new ShowDemoViewModel(mContext, entry));
}
private void parseDemos(){
DemoCategory current = null;
DemoEntry entry = null;
XmlResourceParser parser = mContext.getResources().getXml(R.xml.demos);
try {
int eventType = parser.getEventType();
while(eventType != XmlResourceParser.END_DOCUMENT){
switch(eventType){
case XmlResourceParser.START_TAG:
if (parser.getName().equals("category") && current == null){
current = new DemoCategory(mContext, parser.getAttributeValue(null, "name"));
}
if (parser.getName().equals("entry")){
if (current==null)
throw new Exception();
entry = new DemoEntry(
parser.getAttributeValue(null, "name"),
resolveVM(parser.getAttributeValue(null, "vm")),
resolveLayout(parser.getAttributeValue(null, "layout")));
current.Entries.add(entry);
}else if (parser.getName().equals("raw")){
if (entry!=null){
entry.Raws.add(new RawEntry(
parser.getAttributeValue(null, "title"),
resolveRaw(parser.getAttributeValue(null, "name")),
parser.getAttributeValue(null, "type")
));
}
}
break;
case XmlResourceParser.END_TAG:
if (parser.getName().equals("category")){
if (current==null)
throw new Exception();
Categories.add(current);
current = null;
}
break;
}
eventType = parser.next();
}
}catch(Exception e){
e.printStackTrace();
}
}
private int resolveRaw(String name) throws Exception{
if (name.startsWith(".")){
Class<?> rawClass = gueei.binding.markupDemoICS.R.raw.class;
return rawClass.getField(name.substring(1)).getInt(null);
}
else{
Class<?> rawClass = R.raw.class;
return rawClass.getField(name).getInt(null);
}
}
private int resolveLayout(String name) throws Exception{
if (name.startsWith(".")){
Class<?> layoutClass = gueei.binding.markupDemoICS.R.layout.class;
return layoutClass.getField(name.substring(1)).getInt(null);
}
else{
Class<?> layoutClass = R.layout.class;
return layoutClass.getField(name).getInt(null);
}
}
private String resolveVM(String name) throws Exception{
String pkgName = "gueei.binding.markupDemoICS.viewModels.";
if (name.startsWith("."))
pkgName = "com.gueei.demos.markupDemo.viewModels";
return pkgName + name;
}
}