http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/MapType.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/MapType.java
 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/MapType.java
new file mode 100644
index 0000000..18eaa7a
--- /dev/null
+++ 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/MapType.java
@@ -0,0 +1,227 @@
+package app.android.box.waveprotocol.org.androidwave.service.models;
+
+import org.waveprotocol.wave.model.adt.ObservableBasicMap;
+import org.waveprotocol.wave.model.adt.docbased.DocumentBasedBasicMap;
+import org.waveprotocol.wave.model.document.Doc;
+import org.waveprotocol.wave.model.document.ObservableDocument;
+import org.waveprotocol.wave.model.document.util.DefaultDocEventRouter;
+import org.waveprotocol.wave.model.document.util.DocEventRouter;
+import org.waveprotocol.wave.model.document.util.DocHelper;
+import org.waveprotocol.wave.model.util.CopyOnWriteSet;
+import org.waveprotocol.wave.model.util.Preconditions;
+import org.waveprotocol.wave.model.util.Serializer;
+import org.waveprotocol.wave.model.wave.SourcesEvents;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+public class MapType extends Type implements SourcesEvents<MapType.Listener> {
+
+
+    public final static String ROOT_TAG = "map";
+    public final static String PREFIX = "map";
+    private final static String ENTRY_TAG_NAME = "entry";
+    private final static String KEY_ATTR_NAME = "k";
+    private final static String VALUE_ATTR_NAME = "v";
+    private final CopyOnWriteSet<Listener> listeners = CopyOnWriteSet.create();
+    private ObservableBasicMap<String, Type> observableMap;
+    private ObservableBasicMap.Listener<String, Type> observableMapListener;
+    private Model model;
+    private ObservableDocument backendDocument;
+    private String backendDocumentId;
+    private Doc.E backendRootElement;
+    private boolean isAttached;
+    private Map<String, Type> map;
+
+    public MapType(Model model) {
+
+        this.model = model;
+        this.isAttached = false;
+        this.map = new HashMap<String, Type>();
+
+        observableMapListener = new ObservableBasicMap.Listener<String, 
Type>() {
+
+            @Override
+            public void onEntrySet(String key, Type oldValue, Type newValue) {
+
+                if (newValue == null) {
+
+                    map.remove(key);
+                    for (Listener l : listeners)
+                        l.onValueRemoved(key, oldValue);
+
+                } else {
+
+                    map.put(key, newValue);
+                    for (Listener l : listeners)
+                        l.onValueChanged(key, oldValue, newValue);
+
+                }
+
+            }
+        };
+    }
+
+    protected static Type createAndAttach(Model model, String id) {
+        // Model Root Doc is a map and more... allow model+root as map doc
+        Preconditions.checkArgument(id.startsWith(PREFIX) || 
id.startsWith(Model.ROOT_DOC_PREFIX),
+                "MapType.fromString() not a map id");
+        MapType map = new MapType(model);
+        map.attach(id);
+        return map;
+
+    }
+
+    @Override
+    protected void attach(String docId) {
+
+
+        if (docId == null) {
+
+            docId = model.generateDocId(getPrefix());
+            backendDocument = model.createDocument(docId);
+
+        } else
+            backendDocument = model.getDocument(docId);
+
+        backendDocumentId = docId;
+
+        backendRootElement = DocHelper.getElementWithTagName(backendDocument, 
ROOT_TAG);
+        if (backendRootElement == null)
+            backendRootElement =
+                    
backendDocument.createChildElement(backendDocument.getDocumentElement(), 
ROOT_TAG,
+                            Collections.<String, String>emptyMap());
+
+        DocEventRouter router = DefaultDocEventRouter.create(backendDocument);
+
+        this.observableMap =
+                DocumentBasedBasicMap.create(router, backendRootElement, 
Serializer.STRING,
+                        model.getTypeSerializer(), ENTRY_TAG_NAME, 
KEY_ATTR_NAME, VALUE_ATTR_NAME);
+
+        this.observableMap.addListener(observableMapListener);
+
+        this.isAttached = true;
+
+    }
+
+    protected void deAttach() {
+        Preconditions.checkArgument(isAttached, "Unable to deAttach an 
unattached MapType");
+    }
+
+    @Override
+    protected String getPrefix() {
+        return PREFIX;
+    }
+
+    @Override
+    protected boolean isAttached() {
+        return isAttached;
+    }
+
+    @Override
+    protected String serializeToModel() {
+        Preconditions.checkArgument(isAttached, "Unable to serialize an 
unattached MapType");
+        return backendDocumentId;
+    }
+
+    @Override
+    protected ListElementInitializer getListElementInitializer() {
+        return new ListElementInitializer() {
+
+            @Override
+            public String getType() {
+                return PREFIX;
+            }
+
+            @Override
+            public String getBackendId() {
+                return serializeToModel();
+            }
+        };
+    }
+
+    @Override
+    public void addListener(Listener listener) {
+        listeners.add(listener);
+    }
+
+    @Override
+    public void removeListener(Listener listener) {
+        listeners.add(listener);
+    }
+
+    public Type get(String key) {
+
+        if (!map.containsKey(key)) {
+            if (observableMap.keySet().contains(key)) {
+                map.put(key, observableMap.get(key));
+            } else
+                return null;
+        }
+
+        return map.get(key);
+    }
+
+    public Type put(String key, Type value) {
+        Preconditions.checkArgument(isAttached, "MapType.put(): not attached 
to model");
+        Preconditions.checkArgument(!value.isAttached(),
+                "MapType.put(): forbidden to add an already attached Type");
+
+        value.attach(null);
+
+        if (!observableMap.put(key, value)) {
+            return null;
+        }
+
+        return value;
+    }
+
+    public StringType put(String key, String value) {
+        Preconditions.checkArgument(isAttached, "MapType.put(): not attached 
to model");
+
+        StringType strValue = new StringType(model, value);
+        strValue.attach(null);
+
+        if (!observableMap.put(key, strValue)) {
+            return null;
+        }
+
+        return strValue;
+    }
+
+    public Set<String> keySet() {
+        return observableMap.keySet();
+    }
+
+    public void remove(String key) {
+        Preconditions.checkArgument(isAttached, "MapType.remove(): not 
attached to model");
+        observableMap.remove(key);
+    }
+
+    @Override
+    public String getDocumentId() {
+        return backendDocumentId;
+    }
+
+    @Override
+    public Model getModel() {
+        return model;
+    }
+
+    @Override
+    public String getType() {
+        return "MapType";
+    }
+
+    public interface Listener {
+
+        void onValueChanged(String key, Type oldValue, Type newValue);
+
+        void onValueRemoved(String key, Type value);
+
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/Model.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/Model.java
 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/Model.java
new file mode 100644
index 0000000..495f592
--- /dev/null
+++ 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/Model.java
@@ -0,0 +1,351 @@
+package app.android.box.waveprotocol.org.androidwave.service.models;
+
+import com.google.common.collect.ImmutableMap;
+
+import org.waveprotocol.wave.model.adt.ObservableBasicValue;
+import org.waveprotocol.wave.model.adt.ObservableElementList;
+import org.waveprotocol.wave.model.adt.docbased.DocumentBasedBasicValue;
+import org.waveprotocol.wave.model.adt.docbased.DocumentBasedElementList;
+import org.waveprotocol.wave.model.adt.docbased.Factory;
+import org.waveprotocol.wave.model.adt.docbased.Initializer;
+import org.waveprotocol.wave.model.document.Doc.E;
+import org.waveprotocol.wave.model.document.ObservableDocument;
+import org.waveprotocol.wave.model.document.WaveContext;
+import org.waveprotocol.wave.model.document.operation.DocInitialization;
+import org.waveprotocol.wave.model.document.util.DefaultDocEventRouter;
+import org.waveprotocol.wave.model.document.util.DocEventRouter;
+import org.waveprotocol.wave.model.document.util.DocHelper;
+import org.waveprotocol.wave.model.document.util.DocProviders;
+import org.waveprotocol.wave.model.document.util.DocumentEventRouter;
+import org.waveprotocol.wave.model.id.IdGenerator;
+import org.waveprotocol.wave.model.id.IdUtil;
+import org.waveprotocol.wave.model.id.ModernIdSerialiser;
+import org.waveprotocol.wave.model.id.WaveId;
+import org.waveprotocol.wave.model.id.WaveletId;
+import org.waveprotocol.wave.model.util.CopyOnWriteSet;
+import org.waveprotocol.wave.model.util.Preconditions;
+import org.waveprotocol.wave.model.util.Serializer;
+import org.waveprotocol.wave.model.version.HashedVersion;
+import org.waveprotocol.wave.model.wave.Blip;
+import org.waveprotocol.wave.model.wave.ObservableWavelet;
+import org.waveprotocol.wave.model.wave.ParticipantId;
+import org.waveprotocol.wave.model.wave.SourcesEvents;
+import org.waveprotocol.wave.model.wave.WaveletListener;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+public class Model implements SourcesEvents<Model.Listener> {
+
+    public static final String MODEL_VERSION = "0.2";
+    public static final String WAVELET_ID_PREFIX = "swl";
+    public static final String WAVELET_ID = WAVELET_ID_PREFIX + 
IdUtil.TOKEN_SEPARATOR + "root";
+
+    public static final String ROOT_DOC_PREFIX = "model";
+    private static final String ROOT_DOC_ID = ROOT_DOC_PREFIX + "+root";
+    private static final String METADATA_TAG = "model";
+    private static final String METADATA_ATTR_VERSION = "v";
+
+    private static final String STRING_INDEX_TAG = "strings";
+    private static final String STRING_ITEM_TAG = "s";
+    private static final String STRING_VALUE_ATTR = "v";
+
+    private static final Factory<E, ObservableBasicValue<String>, String> 
StringIndexFactory =
+            new Factory<E, ObservableBasicValue<String>, String>() {
+
+                @Override
+                public ObservableBasicValue<String> 
adapt(DocumentEventRouter<? super E, E, ?> router,
+                                                          E element) {
+                    return DocumentBasedBasicValue.create(router, element, 
Serializer.STRING,
+                            STRING_VALUE_ATTR);
+                }
+
+                @Override
+                public Initializer createInitializer(final String 
initialState) {
+
+                    return new Initializer() {
+
+                        @Override
+                        public void initialize(Map<String, String> target) {
+                            target.put(STRING_VALUE_ATTR, initialState);
+                        }
+
+                    };
+                }
+            };
+
+    private final MapSerializer typeSerializer;
+    private final ObservableDocument rootModelDocument;
+    private final ObservableElementList<ObservableBasicValue<String>, String> 
stringIndex;
+    private final ObservableWavelet wavelet;
+    private final TypeIdGenerator idGenerator;
+    private final CopyOnWriteSet<Listener> listeners = CopyOnWriteSet.create();
+    private final WaveletListener waveletListener = new WaveletListener() {
+
+        @Override
+        public void onParticipantRemoved(ObservableWavelet wavelet, 
ParticipantId participant) {
+            for (Listener l : listeners)
+                l.onRemoveParticipant(participant);
+        }
+
+        @Override
+        public void onParticipantAdded(ObservableWavelet wavelet, 
ParticipantId participant) {
+            for (Listener l : listeners)
+                l.onAddParticipant(participant);
+        }
+
+        @Override
+        public void onLastModifiedTimeChanged(ObservableWavelet wavelet, long 
oldTime, long newTime) {
+
+
+        }
+
+        @Override
+        public void onBlipAdded(ObservableWavelet wavelet, Blip blip) {
+
+
+        }
+
+        @Override
+        public void onBlipRemoved(ObservableWavelet wavelet, Blip blip) {
+
+
+        }
+
+        @Override
+        public void onBlipSubmitted(ObservableWavelet wavelet, Blip blip) {
+
+
+        }
+
+        @Override
+        public void onBlipTimestampModified(ObservableWavelet wavelet, Blip 
blip, long oldTime,
+                                            long newTime) {
+
+
+        }
+
+        @Override
+        public void onBlipVersionModified(ObservableWavelet wavelet, Blip 
blip, Long oldVersion,
+                                          Long newVersion) {
+
+
+        }
+
+        @Override
+        public void onBlipContributorAdded(ObservableWavelet wavelet, Blip 
blip,
+                                           ParticipantId contributor) {
+
+
+        }
+
+        @Override
+        public void onBlipContributorRemoved(ObservableWavelet wavelet, Blip 
blip,
+                                             ParticipantId contributor) {
+
+
+        }
+
+        @Override
+        public void onVersionChanged(ObservableWavelet wavelet, long 
oldVersion, long newVersion) {
+
+        }
+
+        @Override
+        public void onHashedVersionChanged(ObservableWavelet wavelet, 
HashedVersion oldHashedVersion,
+                                           HashedVersion newHashedVersion) {
+
+        }
+
+        @Override
+        public void onRemoteBlipContentModified(ObservableWavelet wavelet, 
Blip blip) {
+
+        }
+    };
+
+    private MapType rootMap = null;
+
+    protected Model(ObservableWavelet wavelet, TypeIdGenerator idGenerator,
+                    ObservableElementList<ObservableBasicValue<String>, 
String> stringIndex,
+                    ObservableDocument modelDocument) {
+
+        this.wavelet = wavelet;
+        this.wavelet.addListener(waveletListener);
+
+        this.idGenerator = idGenerator;
+        this.stringIndex = stringIndex;
+        this.rootModelDocument = modelDocument;
+        this.typeSerializer = new MapSerializer(this);
+    }
+
+    public static Model create(WaveContext wave, String domain, ParticipantId 
loggedInUser,
+                               boolean isNewWave, IdGenerator idGenerator) {
+
+        WaveletId waveletId = WaveletId.of(domain, WAVELET_ID);
+        ObservableWavelet wavelet = wave.getWave().getWavelet(waveletId);
+
+        if (wavelet == null) {
+            wavelet = wave.getWave().getWavelet(waveletId);
+            wavelet.addParticipant(loggedInUser);
+        }
+
+        ObservableDocument modelDocument = wavelet.getDocument(ROOT_DOC_ID);
+        DocEventRouter router = DefaultDocEventRouter.create(modelDocument);
+
+        E metadataElement = DocHelper.getElementWithTagName(modelDocument, 
METADATA_TAG);
+        if (metadataElement == null) {
+            metadataElement = 
modelDocument.createChildElement(modelDocument.getDocumentElement(), 
METADATA_TAG,
+                    ImmutableMap.of(METADATA_ATTR_VERSION, MODEL_VERSION));
+        }
+
+        E strIndexElement = DocHelper.getElementWithTagName(modelDocument, 
STRING_INDEX_TAG);
+        if (strIndexElement == null) {
+            strIndexElement =
+                    
modelDocument.createChildElement(modelDocument.getDocumentElement(), 
STRING_INDEX_TAG,
+                            Collections.<String, String>emptyMap());
+        }
+
+        return new Model(wavelet, TypeIdGenerator.get(idGenerator), 
DocumentBasedElementList.create(
+                router, strIndexElement, STRING_ITEM_TAG, StringIndexFactory), 
modelDocument);
+    }
+
+    protected ObservableElementList<ObservableBasicValue<String>, String> 
getStringIndex() {
+        return stringIndex;
+    }
+
+    public WaveId getWaveId() {
+        return this.wavelet.getWaveId();
+    }
+
+    public String getWaveletIdString() {
+        return ModernIdSerialiser.INSTANCE.serialiseWaveletId(wavelet.getId());
+    }
+
+    protected String generateDocId(String prefix) {
+        return idGenerator.newDocumentId(prefix);
+    }
+
+    protected ObservableDocument createDocument(String docId) {
+        Preconditions.checkArgument(!wavelet.getDocumentIds().contains(docId),
+                "Trying to create an existing substrate document");
+        return wavelet.getDocument(docId);
+    }
+
+    protected DocInitialization getBlipDocInitialization(String text) {
+
+        DocInitialization op;
+        String initContent = "<body><line/>" + text + "</body>";
+
+        try {
+            op = DocProviders.POJO.parse(initContent).asOperation();
+        } catch (IllegalArgumentException e) {
+            /*
+            if (e.getCause() instanceof XmlParseException) {
+
+            } else {
+
+            }
+            **/
+            return null;
+        }
+
+        return op;
+    }
+
+    protected Blip createBlip(String docId) {
+        Preconditions.checkArgument(!wavelet.getDocumentIds().contains(docId),
+                "Trying to create an existing substrate document");
+        return wavelet.createBlip(docId);
+    }
+
+    protected ObservableDocument getDocument(String docId) {
+        Preconditions.checkArgument(wavelet.getDocumentIds().contains(docId),
+                "Trying to get a non existing substrate document");
+        return wavelet.getDocument(docId);
+    }
+
+
+    protected Blip getBlip(String docId) {
+        Preconditions.checkArgument(wavelet.getDocumentIds().contains(docId),
+                "Trying to get a non existing substrate document");
+        return wavelet.getBlip(docId);
+    }
+
+
+    protected MapSerializer getTypeSerializer() {
+        return typeSerializer;
+    }
+
+    @Override
+    public void addListener(Listener listener) {
+        listeners.add(listener);
+    }
+
+
+    @Override
+    public void removeListener(Listener listener) {
+        listeners.add(listener);
+    }
+
+    public Set<ParticipantId> getParticipants() {
+        return wavelet.getParticipantIds();
+    }
+
+    public void addParticipant(String address) {
+        wavelet.addParticipant(ParticipantId.ofUnsafe(address));
+    }
+
+    public void removeParticipant(String address) {
+        wavelet.removeParticipant(ParticipantId.ofUnsafe(address));
+    }
+
+    public MapType getRoot() {
+
+        if (rootMap == null) {
+            rootMap = (MapType) MapType.createAndAttach(this, ROOT_DOC_ID);
+        }
+
+        return rootMap;
+    }
+
+
+    public MapType createMap() {
+        return new MapType(this);
+    }
+
+    public StringType createString(String value) {
+        return new StringType(this, value);
+    }
+
+    public ListType createList() {
+        return new ListType(this);
+    }
+
+    public TextType createText() {
+        return new TextType(this);
+    }
+
+    public TextType createText(String textOrXml) {
+        TextType tt = new TextType(this);
+        if (textOrXml != null) tt.setInitContent(textOrXml);
+        return tt;
+    }
+
+    public Set<String> getModelDocuments() {
+        return wavelet.getDocumentIds();
+    }
+
+    public String getModelDocument(String documentId) {
+        return wavelet.getDocument(documentId).toDebugString();
+    }
+
+    public interface Listener {
+
+        void onAddParticipant(ParticipantId participant);
+
+        void onRemoveParticipant(ParticipantId participant);
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/StringType.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/StringType.java
 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/StringType.java
new file mode 100644
index 0000000..53dc309
--- /dev/null
+++ 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/StringType.java
@@ -0,0 +1,159 @@
+package app.android.box.waveprotocol.org.androidwave.service.models;
+
+import org.waveprotocol.wave.model.adt.ObservableBasicValue;
+import org.waveprotocol.wave.model.util.CopyOnWriteSet;
+import org.waveprotocol.wave.model.util.Preconditions;
+import org.waveprotocol.wave.model.wave.SourcesEvents;
+
+public class StringType extends Type implements 
SourcesEvents<StringType.Listener> {
+
+
+    public final static String PREFIX = "str";
+    public final static String VALUE_ATTR = "v";
+    private final CopyOnWriteSet<Listener> listeners = CopyOnWriteSet.create();
+    private ObservableBasicValue<String> observableValue;
+    private ObservableBasicValue.Listener<String> observableValueListener;
+    private Model model;
+    private int indexStringPos;
+    private String initValue;
+    private boolean isAttached;
+
+    protected StringType(Model model) {
+
+        this.model = model;
+        this.initValue = null;
+        this.observableValueListener = new 
ObservableBasicValue.Listener<String>() {
+
+            @Override
+            public void onValueChanged(String oldValue, String newValue) {
+                for (Listener l : listeners)
+                    l.onValueChanged(oldValue, newValue);
+            }
+        };
+    }
+
+    public StringType(Model model, String value) {
+
+        this.model = model;
+        this.initValue = value != null ? value : ""; // null string is not 
valid
+
+        this.observableValueListener = new 
ObservableBasicValue.Listener<String>() {
+
+            @Override
+            public void onValueChanged(String oldValue, String newValue) {
+                for (Listener l : listeners)
+                    l.onValueChanged(oldValue, newValue);
+            }
+        };
+    }
+
+    protected static Type createAndAttach(Model model, String id) {
+
+        Preconditions.checkArgument(id.startsWith(PREFIX),
+                "StringType.createAndAttach() not a string id");
+        StringType string = new StringType(model);
+        string.attach(id);
+        return string;
+
+    }
+
+    @Override
+    protected String getPrefix() {
+        return PREFIX;
+    }
+
+    @Override
+    protected void attach(String stringId) {
+
+        if (stringId == null) {
+
+            indexStringPos = model.getStringIndex().size();
+            observableValue = model.getStringIndex().add(indexStringPos, 
initValue);
+
+        } else {
+
+            indexStringPos = Integer.valueOf(stringId.split("\\+")[1]);
+            observableValue = model.getStringIndex().get(indexStringPos);
+            initValue = observableValue.get();
+
+        }
+
+        observableValue.addListener(observableValueListener);
+
+        this.isAttached = true;
+
+    }
+
+    protected void deAttach() {
+        Preconditions.checkArgument(isAttached, "Unable to deAttach an 
unattached MapType");
+    }
+
+    @Override
+    protected boolean isAttached() {
+        return isAttached;
+    }
+
+    @Override
+    protected String serializeToModel() {
+        Preconditions.checkArgument(isAttached, "Unable to serialize an 
unattached StringType");
+        return PREFIX + "+" + Integer.toString(indexStringPos);
+    }
+
+    @Override
+    protected ListElementInitializer getListElementInitializer() {
+        return new ListElementInitializer() {
+
+            @Override
+            public String getType() {
+                return PREFIX;
+            }
+
+            @Override
+            public String getBackendId() {
+                Preconditions.checkArgument(isAttached, "Unable to initialize 
an unattached StringType");
+                return serializeToModel();
+            }
+
+        };
+    }
+
+    @Override
+    public void addListener(Listener listener) {
+        listeners.add(listener);
+    }
+
+    @Override
+    public void removeListener(Listener listener) {
+        listeners.remove(listener);
+    }
+
+    public String getValue() {
+        if (!isAttached())
+            return initValue;
+        else
+            return observableValue.get();
+    }
+
+    public void setValue(String value) {
+        if (isAttached()) observableValue.set(value);
+    }
+
+    @Override
+    public String getDocumentId() {
+        return null;
+    }
+
+    @Override
+    public Model getModel() {
+        return model;
+    }
+
+    @Override
+    public String getType() {
+        return "StringType";
+    }
+
+    public interface Listener {
+        void onValueChanged(String oldValue, String newValue);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/TextType.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/TextType.java
 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/TextType.java
new file mode 100644
index 0000000..fc145c8
--- /dev/null
+++ 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/TextType.java
@@ -0,0 +1,172 @@
+package app.android.box.waveprotocol.org.androidwave.service.models;
+
+import org.waveprotocol.wave.model.document.AnnotationInterval;
+import org.waveprotocol.wave.model.document.Doc.N;
+import org.waveprotocol.wave.model.document.Document;
+import org.waveprotocol.wave.model.document.ObservableDocument;
+import org.waveprotocol.wave.model.document.util.Point;
+import org.waveprotocol.wave.model.document.util.XmlStringBuilder;
+import org.waveprotocol.wave.model.util.CopyOnWriteSet;
+import org.waveprotocol.wave.model.util.Preconditions;
+import org.waveprotocol.wave.model.wave.Blip;
+import org.waveprotocol.wave.model.wave.SourcesEvents;
+
+import java.util.Collections;
+
+public class TextType extends Type implements SourcesEvents<TextType.Listener> 
{
+
+    public final static String PREFIX = "b";
+    public final static String VALUE_ATTR = "t";
+    private final CopyOnWriteSet<Listener> listeners = CopyOnWriteSet.create();
+    private Model model;
+    private Blip blip;
+    private String initContent;
+    private boolean isAttached;
+
+    protected TextType(Model model) {
+        this.model = model;
+        this.isAttached = false;
+    }
+
+    protected static Type createAndAttach(Model model, String id) {
+        Preconditions.checkArgument(id.startsWith(PREFIX), "Not a TextType 
instance id");
+        TextType txt = new TextType(model);
+        txt.attach(id);
+        return txt;
+    }
+
+    protected void setInitContent(String textOrXml) {
+        this.initContent = textOrXml;
+    }
+
+    @Override
+    protected void attach(String docId) {
+
+        if (docId == null) {
+            docId = model.generateDocId(PREFIX);
+            blip = model.createBlip(docId);
+
+            if (initContent == null)
+                initContent = "";
+            XmlStringBuilder sb = 
XmlStringBuilder.createFromXmlString("<body><line/>" + this.initContent + 
"</body>");
+            blip.getContent().appendXml(sb);
+
+        } else {
+            blip = model.getBlip(docId);
+        }
+        Preconditions.checkNotNull(blip, "Unable to attach TextType, couldn't 
create or get blip");
+        isAttached = true;
+    }
+
+    @Override
+    protected void deAttach() {
+        Preconditions.checkArgument(isAttached, "Unable to deAttach an 
unattached TextType");
+    }
+
+    @Override
+    protected ListElementInitializer getListElementInitializer() {
+        return new ListElementInitializer() {
+
+            @Override
+            public String getType() {
+                return PREFIX;
+            }
+
+            @Override
+            public String getBackendId() {
+                return serializeToModel();
+            }
+        };
+    }
+
+    @Override
+    protected String getPrefix() {
+        return PREFIX;
+    }
+
+    @Override
+    protected boolean isAttached() {
+        return isAttached;
+    }
+
+    @Override
+    protected String serializeToModel() {
+        Preconditions.checkArgument(isAttached, "Unable to serialize an 
unattached TextType");
+        return blip.getId();
+    }
+
+    @Override
+    public void addListener(Listener listener) {
+        listeners.add(listener);
+    }
+
+    @Override
+    public void removeListener(Listener listener) {
+        listeners.remove(listener);
+    }
+
+    @Override
+    public String getDocumentId() {
+        return blip.getId();
+    }
+
+    @Override
+    public Model getModel() {
+        return model;
+    }
+
+    @Override
+    public String getType() {
+        return "TextType";
+    }
+
+    public ObservableDocument getMutableDocument() {
+        return blip.getWavelet().getDocument(blip.getId());
+    }
+
+    public void insertText(int location, String text) {
+        Document doc = blip.getContent();
+        doc.insertText(location, text);
+    }
+
+    public void insertNewLine(int location) {
+        Document doc = blip.getContent();
+        Point<N> point = doc.locate(location);
+        doc.createElement(point, "line", Collections.<String, 
String>emptyMap());
+    }
+
+    public void deleteText(int start, int end) {
+        Document doc = blip.getContent();
+        doc.deleteRange(start, end);
+    }
+
+    public int getSize() {
+        Document doc = blip.getContent();
+        return doc.size();
+    }
+
+    public String getXml() {
+        Document doc = blip.getContent();
+        return doc.toXmlString();
+    }
+
+    public void setAnnotation(int start, int end, String key, String value) {
+        Document doc = blip.getContent();
+        doc.setAnnotation(start, end, key, value);
+    }
+
+    public String getAnnotation(int location, String key) {
+        Document doc = blip.getContent();
+        return doc.getAnnotation(location, key);
+    }
+
+    public Iterable<AnnotationInterval<String>> getAllAnnotations(int start, 
int end) {
+        Document doc = blip.getContent();
+        return doc.annotationIntervals(start, end, null);
+    }
+
+    public interface Listener {
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/Type.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/Type.java
 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/Type.java
new file mode 100644
index 0000000..02fe181
--- /dev/null
+++ 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/Type.java
@@ -0,0 +1,47 @@
+package app.android.box.waveprotocol.org.androidwave.service.models;
+
+public abstract class Type {
+
+    public static Type createInstance(String type, String backendId, Model 
model) {
+
+        Type instance = null;
+
+        if (StringType.PREFIX.equals(type)) {
+
+            instance = StringType.createAndAttach(model, backendId);
+
+        } else if (ListType.PREFIX.equals(type)) {
+
+            instance = ListType.createAndAttach(model, backendId);
+
+        } else if (MapType.PREFIX.equals(type)) {
+
+            instance = MapType.createAndAttach(model, backendId);
+
+        } else if (TextType.PREFIX.equals(type)) {
+
+            instance = TextType.createAndAttach(model, backendId);
+        }
+
+        return instance;
+    }
+
+    protected abstract void attach(String docId);
+
+    protected abstract void deAttach();
+
+    protected abstract ListElementInitializer getListElementInitializer();
+
+    protected abstract String getPrefix();
+
+    protected abstract boolean isAttached();
+
+    protected abstract String serializeToModel();
+
+    public abstract String getDocumentId();
+
+    public abstract Model getModel();
+
+    public abstract String getType();
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/TypeIdGenerator.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/TypeIdGenerator.java
 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/TypeIdGenerator.java
new file mode 100644
index 0000000..6aaba6f
--- /dev/null
+++ 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/models/TypeIdGenerator.java
@@ -0,0 +1,43 @@
+package app.android.box.waveprotocol.org.androidwave.service.models;
+
+import org.waveprotocol.wave.model.id.IdGenerator;
+import org.waveprotocol.wave.model.id.WaveId;
+
+public class TypeIdGenerator implements IdGeneratorGeneric {
+
+
+    public static final String WAVE_ID_PREFIX = "s";
+    private static TypeIdGenerator singleton = null;
+    private IdGenerator idGenerator;
+
+    TypeIdGenerator() {
+
+    }
+
+    public static TypeIdGenerator get() {
+        if (singleton == null) singleton = new TypeIdGenerator();
+        return singleton;
+    }
+
+    public static TypeIdGenerator get(IdGenerator idGenerator) {
+        if (singleton == null) singleton = new TypeIdGenerator();
+        singleton.idGenerator = idGenerator;
+        return singleton;
+    }
+
+    @Override
+    public IdGeneratorGeneric initialize(IdGenerator idGenerator) {
+        this.idGenerator = idGenerator;
+        return this;
+    }
+
+    @Override
+    public WaveId newWaveId() {
+        return WaveId.of(idGenerator.getDefaultDomain(), 
idGenerator.newId(WAVE_ID_PREFIX));
+    }
+
+    public String newDocumentId(String prefix) {
+        return idGenerator.newId(prefix);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/AndroidSimpleTimer.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/AndroidSimpleTimer.java
 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/AndroidSimpleTimer.java
new file mode 100644
index 0000000..529a23c
--- /dev/null
+++ 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/AndroidSimpleTimer.java
@@ -0,0 +1,38 @@
+package app.android.box.waveprotocol.org.androidwave.service.scheduler;
+
+import java.util.TimerTask;
+
+public class AndroidSimpleTimer implements SimpleTimer {
+
+    private final TimerTask task;
+
+    public static final SimpleTimer.Factory FACTORY = new 
SimpleTimer.Factory() {
+        public SimpleTimer create(TimerTask task) {
+            return new AndroidSimpleTimer(task);
+        }
+    };
+
+    public AndroidSimpleTimer(TimerTask task) {
+        this.task = task;
+    }
+
+    @Override
+    public double getTime() {
+        return 0;
+    }
+
+    @Override
+    public void schedule() {
+
+    }
+
+    @Override
+    public void schedule(double when) {
+
+    }
+
+    @Override
+    public void cancel() {
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/BrowserBackedScheduler.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/BrowserBackedScheduler.java
 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/BrowserBackedScheduler.java
new file mode 100644
index 0000000..d4dcddf
--- /dev/null
+++ 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/BrowserBackedScheduler.java
@@ -0,0 +1,104 @@
+package app.android.box.waveprotocol.org.androidwave.service.scheduler;
+
+import java.util.TimerTask;
+
+public class BrowserBackedScheduler implements Scheduler {
+
+    private final JobRegistry jobs;
+    private final SimpleTimer timer;
+    private final Controller controller;
+    private double nextSliceRunTime = Double.MAX_VALUE;
+    private int timeSliceMillis = 100;
+
+    public BrowserBackedScheduler(SimpleTimer.Factory timerFactory, Controller 
controller) {
+        this.timer = timerFactory.create(runner);
+        this.controller = controller;
+        this.jobs = new JobRegistry(controller);
+    }
+
+    private final TimerTask runner = new TimerTask() {
+
+        @Override
+        public void run() {
+            nextSliceRunTime = Double.MAX_VALUE;
+            workSlice(timeSliceMillis);
+            double next = getNextRunTime();
+            if (next == 0) {
+                maybeScheduleSlice();
+            } else if (next > 0) {
+                maybeScheduleSlice(next);
+            }
+        }
+    };
+
+    private void workSlice(int maxMillis) {
+
+    }
+
+    private double getNextRunTime() {
+        return 0;
+    }
+
+    private void maybeScheduleSlice(){
+
+    }
+
+    private void maybeScheduleSlice(double when){
+
+    }
+
+    @Override
+    public void noteUserActivity() {
+
+    }
+
+    @Override
+    public void schedule(Priority priority, Task task) {
+
+    }
+
+    @Override
+    public void schedule(Priority priority, IncrementalTask process) {
+
+    }
+
+    @Override
+    public void scheduleDelayed(Priority priority, Task task, int minimumTime) 
{
+
+    }
+
+    @Override
+    public void scheduleDelayed(Priority priority, IncrementalTask process, 
int minimumTime) {
+
+    }
+
+    @Override
+    public void scheduleRepeating(Priority priority, IncrementalTask process, 
int minimumTime, int interval) {
+
+    }
+
+    @Override
+    public void cancel(Schedulable job) {
+
+    }
+
+    @Override
+    public boolean isScheduled(Schedulable job) {
+        return false;
+    }
+
+    @Override
+    public void addListener(Listener listener) {
+
+    }
+
+    @Override
+    public void removeListener(Listener listener) {
+
+    }
+
+    @Override
+    public String debugShortDescription() {
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/Controller.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/Controller.java
 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/Controller.java
new file mode 100644
index 0000000..d35c8a8
--- /dev/null
+++ 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/Controller.java
@@ -0,0 +1,36 @@
+package app.android.box.waveprotocol.org.androidwave.service.scheduler;
+
+public interface Controller {
+
+    void jobAdded(Scheduler.Priority priority, Scheduler.Schedulable job);
+
+    void jobRemoved(Scheduler.Priority priority, Scheduler.Schedulable job);
+
+    boolean isRunnable(Scheduler.Priority priority);
+
+    boolean isSuppressed(Scheduler.Priority priority, Scheduler.Schedulable 
job);
+
+    public static final Controller NOOP = new Controller() {
+
+
+        @Override
+        public void jobAdded(Scheduler.Priority priority, 
Scheduler.Schedulable job) {
+            // Do nothing
+        }
+
+        @Override
+        public void jobRemoved(Scheduler.Priority priority, 
Scheduler.Schedulable job) {
+            // Do nothing
+        }
+
+        @Override
+        public boolean isRunnable(Scheduler.Priority priority) {
+            return true;
+        }
+
+        @Override
+        public boolean isSuppressed(Scheduler.Priority priority, 
Scheduler.Schedulable job) {
+            return false;
+        }
+    };
+}

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/JobRegistry.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/JobRegistry.java
 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/JobRegistry.java
new file mode 100644
index 0000000..ed2f9eb
--- /dev/null
+++ 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/JobRegistry.java
@@ -0,0 +1,25 @@
+package app.android.box.waveprotocol.org.androidwave.service.scheduler;
+
+import org.waveprotocol.wave.model.util.CollectionUtils;
+import org.waveprotocol.wave.model.util.IntMap;
+
+import java.util.LinkedList;
+import java.util.Queue;
+
+public class JobRegistry {
+
+    private int jobCount;
+
+    private final Controller jobCounter;
+
+    private final IntMap<Queue<Scheduler.Schedulable>> priorities = 
CollectionUtils.createIntMap();
+
+    public JobRegistry(Controller jobCounter) {
+        this.jobCounter = jobCounter;
+
+        for (Scheduler.Priority p : Scheduler.Priority.values()) {
+            priorities.put(p.ordinal(), new 
LinkedList<Scheduler.Schedulable>());
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/OptimalGroupingScheduler.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/OptimalGroupingScheduler.java
 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/OptimalGroupingScheduler.java
new file mode 100644
index 0000000..0c7b2c2
--- /dev/null
+++ 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/OptimalGroupingScheduler.java
@@ -0,0 +1,17 @@
+package app.android.box.waveprotocol.org.androidwave.service.scheduler;
+
+import org.waveprotocol.wave.model.util.FuzzingBackOffScheduler;
+import 
org.waveprotocol.wave.model.util.FuzzingBackOffScheduler.CollectiveScheduler;
+import org.waveprotocol.wave.model.util.Scheduler;
+
+
+public class OptimalGroupingScheduler implements CollectiveScheduler {
+
+    public OptimalGroupingScheduler(Object lowPriorityTimer) {
+    }
+
+    @Override
+    public FuzzingBackOffScheduler.Cancellable schedule(Scheduler.Command 
command, int i, int i1) {
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/Scheduler.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/Scheduler.java
 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/Scheduler.java
new file mode 100644
index 0000000..460838d
--- /dev/null
+++ 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/Scheduler.java
@@ -0,0 +1,53 @@
+package app.android.box.waveprotocol.org.androidwave.service.scheduler;
+
+public interface Scheduler {
+
+    public interface Listener {
+        void onJobExecuted(Schedulable job, int timeSpent);
+    }
+
+    public interface Schedulable {
+    }
+
+    public interface Task extends Schedulable {
+
+        void execute();
+    }
+
+    public interface IncrementalTask extends Schedulable {
+
+        boolean execute();
+    }
+
+    public enum Priority {
+        CRITICAL,
+        HIGH,
+        MEDIUM,
+        LOW,
+        INTERNAL_SUPPRESS;
+    }
+
+    public void noteUserActivity();
+
+    void schedule(Priority priority, Task task);
+
+    void schedule(Priority priority, IncrementalTask process);
+
+    void scheduleDelayed(Priority priority, Task task, int minimumTime);
+
+    void scheduleDelayed(Priority priority, IncrementalTask process,
+                         int minimumTime);
+
+    void scheduleRepeating(Priority priority, IncrementalTask process,
+                           int minimumTime, int interval);
+
+    void cancel(Schedulable job);
+
+    boolean isScheduled(Schedulable job);
+
+    void addListener(Listener listener);
+
+    void removeListener(Listener listener);
+
+    public String debugShortDescription();
+}

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/SchedulerInstance.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/SchedulerInstance.java
 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/SchedulerInstance.java
new file mode 100644
index 0000000..6c90fd7
--- /dev/null
+++ 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/SchedulerInstance.java
@@ -0,0 +1,34 @@
+package app.android.box.waveprotocol.org.androidwave.service.scheduler;
+
+
+
+public class SchedulerInstance {
+
+    private static TimerService low;
+    private static TimerService high;
+    private static TimerService medium;
+
+    private static BrowserBackedScheduler instance;
+
+    private static void init() {
+        if (instance == null) {
+            setSchedulerInstance(new 
BrowserBackedScheduler(AndroidSimpleTimer.FACTORY, Controller.NOOP));
+        }
+    }
+
+    public static void setSchedulerInstance(BrowserBackedScheduler instance) {
+        SchedulerInstance.instance = instance;
+        setDefaultTimerService();
+    }
+
+    private static void setDefaultTimerService() {
+        low = new SchedulerTimerService(instance, Scheduler.Priority.LOW);
+        high = new SchedulerTimerService(instance, Scheduler.Priority.HIGH);
+        medium = new SchedulerTimerService(instance, 
Scheduler.Priority.MEDIUM);
+    }
+
+    public static TimerService getLowPriorityTimer() {
+        init();
+        return low;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/SchedulerTimerService.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/SchedulerTimerService.java
 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/SchedulerTimerService.java
new file mode 100644
index 0000000..c5f15af
--- /dev/null
+++ 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/SchedulerTimerService.java
@@ -0,0 +1,54 @@
+package app.android.box.waveprotocol.org.androidwave.service.scheduler;
+
+/**
+ * Created by charith on 8/12/15.
+ */
+public class SchedulerTimerService implements TimerService {
+    public SchedulerTimerService(BrowserBackedScheduler instance, Object p1) {
+    }
+
+    @Override
+    public void schedule(Scheduler.Task task) {
+
+    }
+
+    @Override
+    public void schedule(Scheduler.IncrementalTask process) {
+
+    }
+
+    @Override
+    public void scheduleDelayed(Scheduler.Task task, int minimumTime) {
+
+    }
+
+    @Override
+    public void scheduleDelayed(Scheduler.IncrementalTask process, int 
minimumTime) {
+
+    }
+
+    @Override
+    public void scheduleRepeating(Scheduler.IncrementalTask process, int 
minimumTime, int interval) {
+
+    }
+
+    @Override
+    public void cancel(Scheduler.Schedulable job) {
+
+    }
+
+    @Override
+    public boolean isScheduled(Scheduler.Schedulable job) {
+        return false;
+    }
+
+    @Override
+    public int elapsedMillis() {
+        return 0;
+    }
+
+    @Override
+    public double currentTimeMillis() {
+        return 0;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/SimpleTimer.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/SimpleTimer.java
 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/SimpleTimer.java
new file mode 100644
index 0000000..2bf4233
--- /dev/null
+++ 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/SimpleTimer.java
@@ -0,0 +1,18 @@
+package app.android.box.waveprotocol.org.androidwave.service.scheduler;
+
+import java.util.TimerTask;
+
+public interface SimpleTimer {
+
+    public interface Factory {
+        SimpleTimer create(TimerTask runnable);
+    }
+
+    double getTime();
+
+    void schedule();
+
+    void schedule(double when);
+
+    void cancel();
+}

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/TimerService.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/TimerService.java
 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/TimerService.java
new file mode 100644
index 0000000..2d07696
--- /dev/null
+++ 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/service/scheduler/TimerService.java
@@ -0,0 +1,27 @@
+package app.android.box.waveprotocol.org.androidwave.service.scheduler;
+
+import 
app.android.box.waveprotocol.org.androidwave.service.scheduler.Scheduler.Task;
+import 
app.android.box.waveprotocol.org.androidwave.service.scheduler.Scheduler.IncrementalTask;
+import 
app.android.box.waveprotocol.org.androidwave.service.scheduler.Scheduler.Schedulable;
+
+public interface TimerService {
+
+    void schedule(Task task);
+
+    void schedule(IncrementalTask process);
+
+    void scheduleDelayed(Task task, int minimumTime);
+
+    void scheduleDelayed(IncrementalTask process, int minimumTime);
+
+    void scheduleRepeating(IncrementalTask process, int minimumTime, int 
interval);
+
+    void cancel(Schedulable job);
+
+    boolean isScheduled(Schedulable job);
+
+    int elapsedMillis();
+
+    double currentTimeMillis();
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/java/app/android/box/waveprotocol/org/androidwave/util/Util.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/app/android/box/waveprotocol/org/androidwave/util/Util.java 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/util/Util.java
new file mode 100644
index 0000000..01b7fc6
--- /dev/null
+++ 
b/app/src/main/java/app/android/box/waveprotocol/org/androidwave/util/Util.java
@@ -0,0 +1,42 @@
+package app.android.box.waveprotocol.org.androidwave.util;
+
+/**
+ * Created by charith on 8/1/15.
+ */
+public class Util {
+
+    /**
+     * This method get Wave username as input and it split it to username and 
hostname
+     *
+     * @param username Wave user's username
+     * @return hostname and username
+     */
+    public static String[] getHostAndUserNames(String username) {
+
+        String[] usernameAndHost = username.split("@");
+
+        if (usernameAndHost.length > 1) {
+            return usernameAndHost;
+        }
+
+        return null;
+    }
+
+    /**
+     * This method generate http url for given hostname
+     *
+     * @param hostname Apache Wave server name
+     * @return http url of the host
+     */
+    public static String hostCreator(String hostname, String servlet) {
+
+        StringBuilder hostUrl = new StringBuilder();
+
+        if (hostname.equalsIgnoreCase("local.net")) {
+            hostname = "10.0.2.2:9898";
+        }
+
+        return 
hostUrl.append("http://";).append(hostname).append("/").append(servlet).toString();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/anim/move.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/anim/move.xml b/app/src/main/res/anim/move.xml
new file mode 100644
index 0000000..f00fc91
--- /dev/null
+++ b/app/src/main/res/anim/move.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set
+    xmlns:android="http://schemas.android.com/apk/res/android";
+    android:interpolator="@android:anim/linear_interpolator"
+    android:fillAfter="true">
+
+    <translate
+        android:fromYDelta="0%p"
+        android:toYDelta="-30%p"
+        android:duration="2000" />
+</set>

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/anim/rotate.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/anim/rotate.xml b/app/src/main/res/anim/rotate.xml
new file mode 100644
index 0000000..5fad358
--- /dev/null
+++ b/app/src/main/res/anim/rotate.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android";>
+    <rotate android:fromDegrees="0"
+        android:toDegrees="360"
+        android:pivotX="50%"
+        android:pivotY="50%"
+        android:duration="600"
+        android:repeatMode="restart"
+        android:repeatCount="infinite"
+        android:interpolator="@android:anim/cycle_interpolator"/>
+</set>

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable-hdpi/check_sm.9.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable-hdpi/check_sm.9.png 
b/app/src/main/res/drawable-hdpi/check_sm.9.png
new file mode 100644
index 0000000..9981a75
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/check_sm.9.png 
differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable-hdpi/ic_action_search.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable-hdpi/ic_action_search.png 
b/app/src/main/res/drawable-hdpi/ic_action_search.png
new file mode 100644
index 0000000..40f4769
Binary files /dev/null and 
b/app/src/main/res/drawable-hdpi/ic_action_search.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable-mdpi/ic_action_search.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable-mdpi/ic_action_search.png 
b/app/src/main/res/drawable-mdpi/ic_action_search.png
new file mode 100644
index 0000000..43a857b
Binary files /dev/null and 
b/app/src/main/res/drawable-mdpi/ic_action_search.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable-xhdpi/ic_action_search.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable-xhdpi/ic_action_search.png 
b/app/src/main/res/drawable-xhdpi/ic_action_search.png
new file mode 100644
index 0000000..86ce171
Binary files /dev/null and 
b/app/src/main/res/drawable-xhdpi/ic_action_search.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable-xxhdpi/ic_action_search.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_search.png 
b/app/src/main/res/drawable-xxhdpi/ic_action_search.png
new file mode 100644
index 0000000..321e9c1
Binary files /dev/null and 
b/app/src/main/res/drawable-xxhdpi/ic_action_search.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/backgroud.jpg
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/backgroud.jpg 
b/app/src/main/res/drawable/backgroud.jpg
new file mode 100644
index 0000000..ca77967
Binary files /dev/null and b/app/src/main/res/drawable/backgroud.jpg differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/circle.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/circle.xml 
b/app/src/main/res/drawable/circle.xml
new file mode 100644
index 0000000..13c7e63
--- /dev/null
+++ b/app/src/main/res/drawable/circle.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android";>
+
+    <item android:top="8px">
+        <layer-list>
+            <item>
+                <shape android:shape="oval">
+                    <solid android:color="#08000000"/>
+                    <padding
+                        android:bottom="3px"
+                        android:left="3px"
+                        android:right="3px"
+                        android:top="3px"
+                        />
+                </shape>
+            </item>
+            <item>
+                <shape android:shape="oval">
+                    <solid android:color="#09000000"/>
+                    <padding
+                        android:bottom="2px"
+                        android:left="2px"
+                        android:right="2px"
+                        android:top="2px"
+                        />
+                </shape>
+            </item>
+            <item>
+                <shape android:shape="oval">
+                    <solid android:color="#10000000"/>
+                    <padding
+                        android:bottom="2px"
+                        android:left="2px"
+                        android:right="2px"
+                        android:top="2px"
+                        />
+                </shape>
+            </item>
+            <item>
+                <shape android:shape="oval">
+                    <solid android:color="#11000000"/>
+                    <padding
+                        android:bottom="1px"
+                        android:left="1px"
+                        android:right="1px"
+                        android:top="1px"
+                        />
+                </shape>
+            </item>
+            <item>
+                <shape android:shape="oval">
+                    <solid android:color="#12000000"/>
+                    <padding
+                        android:bottom="1px"
+                        android:left="1px"
+                        android:right="1px"
+                        android:top="1px"
+                        />
+                </shape>
+            </item>
+            <item>
+                <shape android:shape="oval">
+                    <solid android:color="#13000000"/>
+                    <padding
+                        android:bottom="1px"
+                        android:left="1px"
+                        android:right="1px"
+                        android:top="1px"
+                        />
+                </shape>
+            </item>
+            <item>
+                <shape android:shape="oval">
+                    <solid android:color="#14000000"/>
+                    <padding
+                        android:bottom="1px"
+                        android:left="1px"
+                        android:right="1px"
+                        android:top="1px"
+                        />
+                </shape>
+            </item>
+            <item>
+                <shape android:shape="oval">
+                    <solid android:color="#15000000"/>
+                    <padding
+                        android:bottom="1px"
+                        android:left="1px"
+                        android:right="1px"
+                        android:top="1px"
+                        />
+                </shape>
+            </item>
+
+        </layer-list>
+    </item>
+
+    <item >
+
+        <ripple xmlns:android="http://schemas.android.com/apk/res/android";
+            android:color="?android:colorControlHighlight">
+            <item android:id="@android:id/mask">
+                <shape android:shape="oval">
+                    <solid android:color="#FFBB00" />
+                </shape>
+            </item>
+            <item>
+                <shape android:shape="oval">
+
+                    <solid android:color="@color/colorPrimary" />
+
+
+                </shape>
+            </item>
+        </ripple>
+
+    </item>
+
+
+</layer-list>

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/ic_action.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/ic_action.png 
b/app/src/main/res/drawable/ic_action.png
new file mode 100644
index 0000000..3acf41b
Binary files /dev/null and b/app/src/main/res/drawable/ic_action.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/ic_action_backward.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/ic_action_backward.png 
b/app/src/main/res/drawable/ic_action_backward.png
new file mode 100644
index 0000000..0118606
Binary files /dev/null and b/app/src/main/res/drawable/ic_action_backward.png 
differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/ic_action_drawer.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/ic_action_drawer.png 
b/app/src/main/res/drawable/ic_action_drawer.png
new file mode 100644
index 0000000..37629fe
Binary files /dev/null and b/app/src/main/res/drawable/ic_action_drawer.png 
differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/ic_action_forword.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/ic_action_forword.png 
b/app/src/main/res/drawable/ic_action_forword.png
new file mode 100644
index 0000000..92b29a6
Binary files /dev/null and b/app/src/main/res/drawable/ic_action_forword.png 
differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/ic_action_next_item.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/ic_action_next_item.png 
b/app/src/main/res/drawable/ic_action_next_item.png
new file mode 100644
index 0000000..5f30474
Binary files /dev/null and b/app/src/main/res/drawable/ic_action_next_item.png 
differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/ic_action_search_back.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/ic_action_search_back.png 
b/app/src/main/res/drawable/ic_action_search_back.png
new file mode 100644
index 0000000..1ea57c7
Binary files /dev/null and 
b/app/src/main/res/drawable/ic_action_search_back.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/ic_action_search_forward.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/ic_action_search_forward.png 
b/app/src/main/res/drawable/ic_action_search_forward.png
new file mode 100644
index 0000000..fd1b3de
Binary files /dev/null and 
b/app/src/main/res/drawable/ic_action_search_forward.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/ic_arrow_forward_white_1.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/ic_arrow_forward_white_1.png 
b/app/src/main/res/drawable/ic_arrow_forward_white_1.png
new file mode 100644
index 0000000..b8c16a3
Binary files /dev/null and 
b/app/src/main/res/drawable/ic_arrow_forward_white_1.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/ic_arrow_forward_white_2.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/ic_arrow_forward_white_2.png 
b/app/src/main/res/drawable/ic_arrow_forward_white_2.png
new file mode 100644
index 0000000..552d40d
Binary files /dev/null and 
b/app/src/main/res/drawable/ic_arrow_forward_white_2.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/ic_launcher.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/ic_launcher.png 
b/app/src/main/res/drawable/ic_launcher.png
new file mode 100644
index 0000000..c877026
Binary files /dev/null and b/app/src/main/res/drawable/ic_launcher.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/ic_profile.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/ic_profile.png 
b/app/src/main/res/drawable/ic_profile.png
new file mode 100644
index 0000000..4957c4a
Binary files /dev/null and b/app/src/main/res/drawable/ic_profile.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/ic_search.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/ic_search.png 
b/app/src/main/res/drawable/ic_search.png
new file mode 100644
index 0000000..dd5adfc
Binary files /dev/null and b/app/src/main/res/drawable/ic_search.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/ic_search2.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/ic_search2.png 
b/app/src/main/res/drawable/ic_search2.png
new file mode 100644
index 0000000..3acabfe
Binary files /dev/null and b/app/src/main/res/drawable/ic_search2.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_a.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_a.png 
b/app/src/main/res/drawable/letter_a.png
new file mode 100644
index 0000000..c148287
Binary files /dev/null and b/app/src/main/res/drawable/letter_a.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_b.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_b.png 
b/app/src/main/res/drawable/letter_b.png
new file mode 100644
index 0000000..40f5ac2
Binary files /dev/null and b/app/src/main/res/drawable/letter_b.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_c.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_c.png 
b/app/src/main/res/drawable/letter_c.png
new file mode 100644
index 0000000..0e2408e
Binary files /dev/null and b/app/src/main/res/drawable/letter_c.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_d.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_d.png 
b/app/src/main/res/drawable/letter_d.png
new file mode 100644
index 0000000..b46d7e3
Binary files /dev/null and b/app/src/main/res/drawable/letter_d.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_e.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_e.png 
b/app/src/main/res/drawable/letter_e.png
new file mode 100644
index 0000000..feb3e1d
Binary files /dev/null and b/app/src/main/res/drawable/letter_e.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_f.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_f.png 
b/app/src/main/res/drawable/letter_f.png
new file mode 100644
index 0000000..20307ec
Binary files /dev/null and b/app/src/main/res/drawable/letter_f.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_g.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_g.png 
b/app/src/main/res/drawable/letter_g.png
new file mode 100644
index 0000000..1a8f373
Binary files /dev/null and b/app/src/main/res/drawable/letter_g.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_h.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_h.png 
b/app/src/main/res/drawable/letter_h.png
new file mode 100644
index 0000000..0980c42
Binary files /dev/null and b/app/src/main/res/drawable/letter_h.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_i.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_i.png 
b/app/src/main/res/drawable/letter_i.png
new file mode 100644
index 0000000..b18910b
Binary files /dev/null and b/app/src/main/res/drawable/letter_i.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_j.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_j.png 
b/app/src/main/res/drawable/letter_j.png
new file mode 100644
index 0000000..2cc1788
Binary files /dev/null and b/app/src/main/res/drawable/letter_j.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_k.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_k.png 
b/app/src/main/res/drawable/letter_k.png
new file mode 100644
index 0000000..befed12
Binary files /dev/null and b/app/src/main/res/drawable/letter_k.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_l.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_l.png 
b/app/src/main/res/drawable/letter_l.png
new file mode 100644
index 0000000..cc7b3c8
Binary files /dev/null and b/app/src/main/res/drawable/letter_l.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_m.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_m.png 
b/app/src/main/res/drawable/letter_m.png
new file mode 100644
index 0000000..c74a90a
Binary files /dev/null and b/app/src/main/res/drawable/letter_m.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_n.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_n.png 
b/app/src/main/res/drawable/letter_n.png
new file mode 100644
index 0000000..65e532d
Binary files /dev/null and b/app/src/main/res/drawable/letter_n.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_o.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_o.png 
b/app/src/main/res/drawable/letter_o.png
new file mode 100644
index 0000000..f3ec11f
Binary files /dev/null and b/app/src/main/res/drawable/letter_o.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_p.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_p.png 
b/app/src/main/res/drawable/letter_p.png
new file mode 100644
index 0000000..0f6fba1
Binary files /dev/null and b/app/src/main/res/drawable/letter_p.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_q.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_q.png 
b/app/src/main/res/drawable/letter_q.png
new file mode 100644
index 0000000..d331416
Binary files /dev/null and b/app/src/main/res/drawable/letter_q.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_r.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_r.png 
b/app/src/main/res/drawable/letter_r.png
new file mode 100644
index 0000000..43f4f5d
Binary files /dev/null and b/app/src/main/res/drawable/letter_r.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_s.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_s.png 
b/app/src/main/res/drawable/letter_s.png
new file mode 100644
index 0000000..3e50227
Binary files /dev/null and b/app/src/main/res/drawable/letter_s.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_t.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_t.png 
b/app/src/main/res/drawable/letter_t.png
new file mode 100644
index 0000000..a5d8a5a
Binary files /dev/null and b/app/src/main/res/drawable/letter_t.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_u.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_u.png 
b/app/src/main/res/drawable/letter_u.png
new file mode 100644
index 0000000..d9372c2
Binary files /dev/null and b/app/src/main/res/drawable/letter_u.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_v.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_v.png 
b/app/src/main/res/drawable/letter_v.png
new file mode 100644
index 0000000..2020a45
Binary files /dev/null and b/app/src/main/res/drawable/letter_v.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_w.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_w.png 
b/app/src/main/res/drawable/letter_w.png
new file mode 100644
index 0000000..5ed2ca5
Binary files /dev/null and b/app/src/main/res/drawable/letter_w.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_x.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_x.png 
b/app/src/main/res/drawable/letter_x.png
new file mode 100644
index 0000000..94ebb41
Binary files /dev/null and b/app/src/main/res/drawable/letter_x.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_y.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_y.png 
b/app/src/main/res/drawable/letter_y.png
new file mode 100644
index 0000000..46f1944
Binary files /dev/null and b/app/src/main/res/drawable/letter_y.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/drawable/letter_z.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/drawable/letter_z.png 
b/app/src/main/res/drawable/letter_z.png
new file mode 100644
index 0000000..61bb0d4
Binary files /dev/null and b/app/src/main/res/drawable/letter_z.png differ

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/layout/chat_activity.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/layout/chat_activity.xml 
b/app/src/main/res/layout/chat_activity.xml
new file mode 100644
index 0000000..6be9e57
--- /dev/null
+++ b/app/src/main/res/layout/chat_activity.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android";
+    android:layout_width="match_parent" android:layout_height="match_parent">
+
+</LinearLayout>

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/layout/chat_fragment.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/layout/chat_fragment.xml 
b/app/src/main/res/layout/chat_fragment.xml
new file mode 100644
index 0000000..6be9e57
--- /dev/null
+++ b/app/src/main/res/layout/chat_fragment.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android";
+    android:layout_width="match_parent" android:layout_height="match_parent">
+
+</LinearLayout>

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/layout/chat_new_friend_activity.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/layout/chat_new_friend_activity.xml 
b/app/src/main/res/layout/chat_new_friend_activity.xml
new file mode 100644
index 0000000..6be9e57
--- /dev/null
+++ b/app/src/main/res/layout/chat_new_friend_activity.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android";
+    android:layout_width="match_parent" android:layout_height="match_parent">
+
+</LinearLayout>

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/layout/chat_new_friend_fragment.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/layout/chat_new_friend_fragment.xml 
b/app/src/main/res/layout/chat_new_friend_fragment.xml
new file mode 100644
index 0000000..6be9e57
--- /dev/null
+++ b/app/src/main/res/layout/chat_new_friend_fragment.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android";
+    android:layout_width="match_parent" android:layout_height="match_parent">
+
+</LinearLayout>

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/layout/chat_new_wave_activtiy.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/layout/chat_new_wave_activtiy.xml 
b/app/src/main/res/layout/chat_new_wave_activtiy.xml
new file mode 100644
index 0000000..31601f8
--- /dev/null
+++ b/app/src/main/res/layout/chat_new_wave_activtiy.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android";
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:id="@+id/drawer_layout">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:id="@+id/container_toolbar"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+            <include
+                android:id="@+id/toolbar"
+                layout="@layout/toolbar" />
+        </LinearLayout>
+
+        <FrameLayout
+            android:id="@+id/container_body_chat_newWave"
+            android:layout_width="fill_parent"
+            android:layout_height="0dp"
+            android:layout_weight="1" />
+
+
+    </LinearLayout>
+</LinearLayout>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/layout/chat_new_wave_fragment.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/layout/chat_new_wave_fragment.xml 
b/app/src/main/res/layout/chat_new_wave_fragment.xml
new file mode 100644
index 0000000..028267f
--- /dev/null
+++ b/app/src/main/res/layout/chat_new_wave_fragment.xml
@@ -0,0 +1,15 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android";
+    xmlns:tools="http://schemas.android.com/tools";
+    android:id="@+id/coordinatorLayout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context="info.androidhive.materialdesign.activity.HomeFragment">
+
+    <ListView
+        android:id="@android:id/list"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" >
+    </ListView>
+
+</RelativeLayout>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/layout/custom_message_row.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/layout/custom_message_row.xml 
b/app/src/main/res/layout/custom_message_row.xml
new file mode 100644
index 0000000..32de049
--- /dev/null
+++ b/app/src/main/res/layout/custom_message_row.xml
@@ -0,0 +1,37 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android";
+    android:id="@+id/coordinatorLayout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="horizontal"
+    >
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:id="@+id/imageViewMessage"
+        android:layout_margin="10dp"
+        />
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:id="@+id/textViewHeader"
+            android:gravity="left"
+            android:textSize="25dp"
+            android:paddingTop="10dp"
+            />
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:id="@+id/textViewContent"
+            android:gravity="left"
+            android:textSize="15dp"
+            />
+    </LinearLayout>
+
+</LinearLayout>

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/layout/custom_row.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/layout/custom_row.xml 
b/app/src/main/res/layout/custom_row.xml
new file mode 100644
index 0000000..6faa338
--- /dev/null
+++ b/app/src/main/res/layout/custom_row.xml
@@ -0,0 +1,22 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android";
+    android:id="@+id/coordinatorLayout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="horizontal"
+    >
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:id="@+id/imageViewFriend"
+        android:layout_margin="10dp"
+        />
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:id="@+id/textViewFriend"
+        android:gravity="center"
+        android:textSize="25dp"
+        android:layout_margin="20dp"
+        />
+</LinearLayout>

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/layout/fragment_navigation_drawer.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/layout/fragment_navigation_drawer.xml 
b/app/src/main/res/layout/fragment_navigation_drawer.xml
new file mode 100644
index 0000000..17dd42a
--- /dev/null
+++ b/app/src/main/res/layout/fragment_navigation_drawer.xml
@@ -0,0 +1,32 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android";
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@android:color/white">
+
+
+    <RelativeLayout
+        android:id="@+id/nav_header_container"
+        android:layout_width="match_parent"
+        android:layout_height="140dp"
+        android:layout_alignParentTop="true"
+        android:background="@drawable/backgroud">
+
+        <ImageView
+            android:layout_width="70dp"
+            android:layout_height="70dp"
+            android:src="@drawable/ic_profile"
+            android:scaleType="fitCenter"
+            android:layout_centerInParent="true" />
+
+    </RelativeLayout>
+
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/drawerList"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/nav_header_container"
+        android:layout_marginTop="15dp" />
+
+
+</RelativeLayout>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-wave-android/blob/514564b1/app/src/main/res/layout/header.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/layout/header.xml 
b/app/src/main/res/layout/header.xml
new file mode 100644
index 0000000..7f43314
--- /dev/null
+++ b/app/src/main/res/layout/header.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android";
+    android:layout_width="match_parent"
+    android:layout_height="190dp"
+    android:background="@color/colorPrimary"
+    android:orientation="vertical">
+
+    <de.hdodenhof.circleimageview.CircleImageView
+        android:id="@+id/profile_image"
+        android:layout_width="76dp"
+        android:layout_height="76dp"
+        android:src="@drawable/ic_launcher"
+        android:layout_marginLeft="24dp"
+        android:layout_centerVertical="true"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentStart="true"
+        android:layout_marginStart="24dp" />
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Apache Wave"
+        android:textSize="14sp"
+        android:textColor="#FFF"
+        android:textStyle="bold"
+        android:gravity="left"
+        android:paddingBottom="4dp"
+        android:id="@+id/username"
+        android:layout_above="@+id/email"
+        android:layout_alignLeft="@+id/profile_image"
+        android:layout_alignStart="@+id/profile_image" />
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="[email protected]"
+        android:id="@+id/email"
+        android:gravity="left"
+        android:layout_marginBottom="8dp"
+        android:textSize="14sp"
+        android:textColor="#fff"
+        android:layout_alignParentBottom="true"
+        android:layout_alignLeft="@+id/username"
+        android:layout_alignStart="@+id/username" />
+
+</RelativeLayout>

Reply via email to