TODOs: Use Higher-Level API Skeleton
This commit shows that we can actually import the higher-level syncbase
API. The commit also includes the intended usage of the API.
Starts from 0.1.1 (0.1.0 didn't quite have the right level of method
exposure)
Change-Id: Ied34fcd964585eb03407896baf9fa4f86ed912ab
diff --git a/app/build.gradle b/app/build.gradle
index 119d275..7cc822e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -22,6 +22,9 @@
syncbase {
applicationId "io.v.todos.syncbase"
}
+ syncbase2 {
+ applicationId "io.v.todos.syncbase2"
+ }
mock {
applicationId "io.v.todos.mock"
}
@@ -80,4 +83,5 @@
)
firebaseCompile 'com.firebase:firebase-client-android:2.5.2'
syncbaseCompile 'io.v:vanadium-android:2.1.+'
+ syncbase2Compile 'io.v:syncbase:0.1.1'
}
diff --git a/app/src/syncbase2/java/io/v/todos/persistence/PersistenceFactory.java b/app/src/syncbase2/java/io/v/todos/persistence/PersistenceFactory.java
new file mode 100644
index 0000000..4fa6849
--- /dev/null
+++ b/app/src/syncbase2/java/io/v/todos/persistence/PersistenceFactory.java
@@ -0,0 +1,53 @@
+// Copyright 2016 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package io.v.todos.persistence;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import io.v.impl.google.services.syncbase.SyncbaseServer;
+import io.v.todos.model.ListMetadata;
+import io.v.todos.persistence.syncbase.SyncbaseMain;
+import io.v.todos.persistence.syncbase.SyncbaseTodoList;
+import io.v.v23.verror.VException;
+
+public final class PersistenceFactory {
+ private PersistenceFactory(){}
+
+ /**
+ * Indicates whether {@link #getMainPersistence(Activity, Bundle, ListEventListener)} may block.
+ * This can affect whether a progress indicator is shown and whether a worker thread is used.
+ */
+ public static boolean mightGetMainPersistenceBlock() {
+ return !SyncbaseMain.isInitialized();
+ }
+
+ /**
+ * Instantiates a persistence object that can be used to manipulate todo lists.
+ */
+ public static MainPersistence getMainPersistence(
+ Activity activity, Bundle savedInstanceState, ListEventListener<ListMetadata> listener)
+ throws VException, SyncbaseServer.StartException {
+ return new SyncbaseMain(activity, savedInstanceState, listener);
+ }
+
+ /**
+ * Indicates whether {@link #getTodoListPersistence(Activity, Bundle, String, TodoListListener)}
+ * may block. This can affect whether a progress indicator is shown and whether a worker thread
+ * is used.
+ */
+ public static boolean mightGetTodoListPersistenceBlock() {
+ return !SyncbaseTodoList.isInitialized();
+ }
+
+ /**
+ * Instantiates a persistence object that can be used to manipulate a todo list.
+ */
+ public static TodoListPersistence getTodoListPersistence(
+ Activity activity, Bundle savedInstanceState, String key, TodoListListener listener)
+ throws VException, SyncbaseServer.StartException {
+ return new SyncbaseTodoList(activity, savedInstanceState, key, listener);
+ }
+}
diff --git a/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbaseMain.java b/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbaseMain.java
new file mode 100644
index 0000000..69956e3
--- /dev/null
+++ b/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbaseMain.java
@@ -0,0 +1,30 @@
+// Copyright 2016 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package io.v.todos.persistence.syncbase;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import io.v.todos.model.ListMetadata;
+import io.v.todos.model.ListSpec;
+import io.v.todos.persistence.ListEventListener;
+import io.v.todos.persistence.MainPersistence;
+
+public class SyncbaseMain extends SyncbasePersistence implements MainPersistence {
+ public SyncbaseMain(Activity activity, Bundle savedInstanceState,
+ ListEventListener<ListMetadata> listener) {
+ super(activity, savedInstanceState);
+ }
+
+ @Override
+ public String addTodoList(ListSpec listSpec) {
+ return null;
+ }
+
+ @Override
+ public void deleteTodoList(String key) {
+
+ }
+}
diff --git a/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbasePersistence.java b/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbasePersistence.java
new file mode 100644
index 0000000..d22f28a
--- /dev/null
+++ b/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbasePersistence.java
@@ -0,0 +1,80 @@
+// Copyright 2016 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package io.v.todos.persistence.syncbase;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import java.util.Iterator;
+
+import io.v.syncbase.Database;
+import io.v.syncbase.Syncbase;
+
+import io.v.syncbase.SyncgroupInvite;
+import io.v.syncbase.WatchChange;
+import io.v.todos.persistence.Persistence;
+
+public class SyncbasePersistence implements Persistence {
+ protected static boolean sInitialized = false;
+ protected static Database sDb;
+
+ public SyncbasePersistence(Activity activity, Bundle savedInstanceState) {
+ /**
+ * Initializes Syncbase Server
+ * Starts up a watch stream to watch all the data with methods to access/modify the data.
+ * This watch stream will also allow us to "watch" who has been shared to, if we desire.
+ * Starts up an invite handler to automatically accept invitations.
+ */
+ Syncbase.DatabaseOptions dbOpts = new Syncbase.DatabaseOptions();
+ dbOpts.rootDir = activity.getFilesDir().getAbsolutePath();
+
+ // Start Syncbase Server
+ // sDb = Syncbase.database(dbOpts); // TODO(alexfandrianto): This will crash though.
+
+ // Watch everything.
+ sDb.addWatchChangeHandler(new Database.WatchChangeHandler() {
+ @Override
+ public void onInitialState(Iterator<WatchChange> values) {
+
+ }
+
+ @Override
+ public void onChangeBatch(Iterator<WatchChange> changes) {
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ }
+ }, new Database.AddWatchChangeHandlerOptions());
+
+
+ // Automatically accept invitations.
+ sDb.addSyncgroupInviteHandler(new Database.SyncgroupInviteHandler() {
+ @Override
+ public void onInvite(SyncgroupInvite invite) {
+ }
+
+ @Override
+ public void onError(Throwable e) {
+ }
+ }, new Database.AddSyncgroupInviteHandlerOptions());
+
+ sInitialized = true;
+ }
+
+ public static boolean isInitialized() {
+ return sInitialized;
+ }
+
+ @Override
+ public void close() {
+
+ }
+
+ @Override
+ public String debugDetails() {
+ return null;
+ }
+}
diff --git a/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbaseTodoList.java b/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbaseTodoList.java
new file mode 100644
index 0000000..b29b794
--- /dev/null
+++ b/app/src/syncbase2/java/io/v/todos/persistence/syncbase/SyncbaseTodoList.java
@@ -0,0 +1,56 @@
+// Copyright 2016 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package io.v.todos.persistence.syncbase;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import io.v.todos.model.ListSpec;
+import io.v.todos.model.Task;
+import io.v.todos.model.TaskSpec;
+import io.v.todos.persistence.TodoListListener;
+import io.v.todos.persistence.TodoListPersistence;
+
+public class SyncbaseTodoList extends SyncbasePersistence implements TodoListPersistence {
+ public SyncbaseTodoList(Activity activity, Bundle savedInstanceState, String key,
+ TodoListListener listener) {
+ super(activity, savedInstanceState);
+ }
+
+ @Override
+ public void updateTodoList(ListSpec listSpec) {
+
+ }
+
+ @Override
+ public void deleteTodoList() {
+
+ }
+
+ @Override
+ public void completeTodoList() {
+
+ }
+
+ @Override
+ public void addTask(TaskSpec task) {
+
+ }
+
+ @Override
+ public void updateTask(Task task) {
+
+ }
+
+ @Override
+ public void deleteTask(String key) {
+
+ }
+
+ @Override
+ public void setShowDone(boolean showDone) {
+
+ }
+}
diff --git a/app/src/syncbase2/res/drawable-hdpi/ic_advertise_neighborhood_off_white_24dp.png b/app/src/syncbase2/res/drawable-hdpi/ic_advertise_neighborhood_off_white_24dp.png
new file mode 100644
index 0000000..6e61f95
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-hdpi/ic_advertise_neighborhood_off_white_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-hdpi/ic_advertise_neighborhood_on_white_24dp.png b/app/src/syncbase2/res/drawable-hdpi/ic_advertise_neighborhood_on_white_24dp.png
new file mode 100644
index 0000000..6c0314a
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-hdpi/ic_advertise_neighborhood_on_white_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-hdpi/ic_expand_less_black_24dp.png b/app/src/syncbase2/res/drawable-hdpi/ic_expand_less_black_24dp.png
new file mode 100644
index 0000000..57139a7
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-hdpi/ic_expand_less_black_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-hdpi/ic_expand_more_black_24dp.png b/app/src/syncbase2/res/drawable-hdpi/ic_expand_more_black_24dp.png
new file mode 100644
index 0000000..9625f14
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-hdpi/ic_expand_more_black_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-hdpi/ic_gps_fixed_white_24dp.png b/app/src/syncbase2/res/drawable-hdpi/ic_gps_fixed_white_24dp.png
new file mode 100644
index 0000000..745db48
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-hdpi/ic_gps_fixed_white_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-mdpi/ic_advertise_neighborhood_off_white_24dp.png b/app/src/syncbase2/res/drawable-mdpi/ic_advertise_neighborhood_off_white_24dp.png
new file mode 100644
index 0000000..ab03ab5
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-mdpi/ic_advertise_neighborhood_off_white_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-mdpi/ic_advertise_neighborhood_on_white_24dp.png b/app/src/syncbase2/res/drawable-mdpi/ic_advertise_neighborhood_on_white_24dp.png
new file mode 100644
index 0000000..8dec6e0
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-mdpi/ic_advertise_neighborhood_on_white_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-mdpi/ic_expand_less_black_24dp.png b/app/src/syncbase2/res/drawable-mdpi/ic_expand_less_black_24dp.png
new file mode 100644
index 0000000..08c16a3
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-mdpi/ic_expand_less_black_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-mdpi/ic_expand_more_black_24dp.png b/app/src/syncbase2/res/drawable-mdpi/ic_expand_more_black_24dp.png
new file mode 100644
index 0000000..feb85a7
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-mdpi/ic_expand_more_black_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-mdpi/ic_gps_fixed_white_24dp.png b/app/src/syncbase2/res/drawable-mdpi/ic_gps_fixed_white_24dp.png
new file mode 100644
index 0000000..d1c563c
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-mdpi/ic_gps_fixed_white_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-xhdpi/ic_advertise_neighborhood_off_white_24dp.png b/app/src/syncbase2/res/drawable-xhdpi/ic_advertise_neighborhood_off_white_24dp.png
new file mode 100644
index 0000000..e21ea70
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-xhdpi/ic_advertise_neighborhood_off_white_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-xhdpi/ic_advertise_neighborhood_on_white_24dp.png b/app/src/syncbase2/res/drawable-xhdpi/ic_advertise_neighborhood_on_white_24dp.png
new file mode 100644
index 0000000..cb07640
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-xhdpi/ic_advertise_neighborhood_on_white_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-xhdpi/ic_expand_less_black_24dp.png b/app/src/syncbase2/res/drawable-xhdpi/ic_expand_less_black_24dp.png
new file mode 100644
index 0000000..323360e
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-xhdpi/ic_expand_less_black_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-xhdpi/ic_expand_more_black_24dp.png b/app/src/syncbase2/res/drawable-xhdpi/ic_expand_more_black_24dp.png
new file mode 100644
index 0000000..d3ee65e
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-xhdpi/ic_expand_more_black_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-xhdpi/ic_gps_fixed_white_24dp.png b/app/src/syncbase2/res/drawable-xhdpi/ic_gps_fixed_white_24dp.png
new file mode 100644
index 0000000..ffab865
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-xhdpi/ic_gps_fixed_white_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-xxhdpi/ic_advertise_neighborhood_off_white_24dp.png b/app/src/syncbase2/res/drawable-xxhdpi/ic_advertise_neighborhood_off_white_24dp.png
new file mode 100644
index 0000000..8735faa
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-xxhdpi/ic_advertise_neighborhood_off_white_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-xxhdpi/ic_advertise_neighborhood_on_white_24dp.png b/app/src/syncbase2/res/drawable-xxhdpi/ic_advertise_neighborhood_on_white_24dp.png
new file mode 100644
index 0000000..9e9560c
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-xxhdpi/ic_advertise_neighborhood_on_white_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-xxhdpi/ic_expand_less_black_24dp.png b/app/src/syncbase2/res/drawable-xxhdpi/ic_expand_less_black_24dp.png
new file mode 100644
index 0000000..ee92f4e
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-xxhdpi/ic_expand_less_black_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-xxhdpi/ic_expand_more_black_24dp.png b/app/src/syncbase2/res/drawable-xxhdpi/ic_expand_more_black_24dp.png
new file mode 100644
index 0000000..5cd142c
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-xxhdpi/ic_expand_more_black_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-xxhdpi/ic_gps_fixed_white_24dp.png b/app/src/syncbase2/res/drawable-xxhdpi/ic_gps_fixed_white_24dp.png
new file mode 100644
index 0000000..387ecdf
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-xxhdpi/ic_gps_fixed_white_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-xxxhdpi/ic_advertise_neighborhood_off_white_24dp.png b/app/src/syncbase2/res/drawable-xxxhdpi/ic_advertise_neighborhood_off_white_24dp.png
new file mode 100644
index 0000000..e28418e
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-xxxhdpi/ic_advertise_neighborhood_off_white_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-xxxhdpi/ic_advertise_neighborhood_on_white_24dp.png b/app/src/syncbase2/res/drawable-xxxhdpi/ic_advertise_neighborhood_on_white_24dp.png
new file mode 100644
index 0000000..f992b16
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-xxxhdpi/ic_advertise_neighborhood_on_white_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-xxxhdpi/ic_expand_less_black_24dp.png b/app/src/syncbase2/res/drawable-xxxhdpi/ic_expand_less_black_24dp.png
new file mode 100644
index 0000000..99c6e3e
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-xxxhdpi/ic_expand_less_black_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-xxxhdpi/ic_expand_more_black_24dp.png b/app/src/syncbase2/res/drawable-xxxhdpi/ic_expand_more_black_24dp.png
new file mode 100644
index 0000000..ad852e3
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-xxxhdpi/ic_expand_more_black_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/drawable-xxxhdpi/ic_gps_fixed_white_24dp.png b/app/src/syncbase2/res/drawable-xxxhdpi/ic_gps_fixed_white_24dp.png
new file mode 100644
index 0000000..c55220a
--- /dev/null
+++ b/app/src/syncbase2/res/drawable-xxxhdpi/ic_gps_fixed_white_24dp.png
Binary files differ
diff --git a/app/src/syncbase2/res/layout/sharing.xml b/app/src/syncbase2/res/layout/sharing.xml
new file mode 100644
index 0000000..af1fffe
--- /dev/null
+++ b/app/src/syncbase2/res/layout/sharing.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <android.support.v7.widget.RecyclerView
+ android:id="@+id/recycler"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="8dp"
+ app:layoutManager="LinearLayoutManager"/>
+
+ <android.support.design.widget.TextInputLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingEnd="20dp"
+ android:paddingStart="20dp"
+ android:paddingTop="8dp">
+
+ <EditText
+ android:id="@+id/custom_email"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom"
+ android:hint="@string/sharing_custom_hint"
+ android:imeOptions="actionSend"
+ android:inputType="textEmailAddress"
+ android:textColor="#000000"
+ android:textSize="22sp"
+ android:textStyle="bold"/>
+ </android.support.design.widget.TextInputLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/syncbase2/res/layout/sharing_entry.xml b/app/src/syncbase2/res/layout/sharing_entry.xml
new file mode 100644
index 0000000..a2eb525
--- /dev/null
+++ b/app/src/syncbase2/res/layout/sharing_entry.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="48dp"
+ android:paddingEnd="24dp"
+ android:paddingStart="24dp">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:id="@+id/name"
+ android:layout_gravity="center_vertical"
+ android:textSize="16sp"/>
+</FrameLayout>
\ No newline at end of file
diff --git a/app/src/syncbase2/res/layout/sharing_subheader.xml b/app/src/syncbase2/res/layout/sharing_subheader.xml
new file mode 100644
index 0000000..50c81c0
--- /dev/null
+++ b/app/src/syncbase2/res/layout/sharing_subheader.xml
@@ -0,0 +1,19 @@
+<?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="48dp"
+ android:orientation="horizontal"
+ android:paddingEnd="24dp"
+ android:paddingStart="24dp">
+
+ <TextView
+ android:id="@+id/category"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_weight="1"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textSize="14sp"
+ android:textStyle="bold"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/syncbase2/res/menu/menu_share.xml b/app/src/syncbase2/res/menu/menu_share.xml
new file mode 100644
index 0000000..90f5725
--- /dev/null
+++ b/app/src/syncbase2/res/menu/menu_share.xml
@@ -0,0 +1,11 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ tools:context="io.v.todos.TodoListActivity">
+ <item
+ android:id="@+id/action_share"
+ android:orderInCategory="101"
+ android:title="@string/action_share"
+ android:icon="@drawable/ic_person_add_white_24dp"
+ android:showAsAction="always" />
+</menu>
diff --git a/app/src/syncbase2/res/menu/neighborhood.xml b/app/src/syncbase2/res/menu/neighborhood.xml
new file mode 100644
index 0000000..b7d77d8
--- /dev/null
+++ b/app/src/syncbase2/res/menu/neighborhood.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+ <item android:id="@+id/advertise_neighborhood"
+ android:orderInCategory="103"
+ android:checkable="true"
+ android:icon="@drawable/ic_advertise_neighborhood_off_white_24dp"
+ android:title="@string/share_location"
+ android:showAsAction="always"/>
+</menu>
\ No newline at end of file
diff --git a/app/src/syncbase2/res/mipmap-hdpi/launcher.png b/app/src/syncbase2/res/mipmap-hdpi/launcher.png
new file mode 100644
index 0000000..9d5e0d6
--- /dev/null
+++ b/app/src/syncbase2/res/mipmap-hdpi/launcher.png
Binary files differ
diff --git a/app/src/syncbase2/res/mipmap-mdpi/launcher.png b/app/src/syncbase2/res/mipmap-mdpi/launcher.png
new file mode 100644
index 0000000..66f1514
--- /dev/null
+++ b/app/src/syncbase2/res/mipmap-mdpi/launcher.png
Binary files differ
diff --git a/app/src/syncbase2/res/mipmap-xhdpi/launcher.png b/app/src/syncbase2/res/mipmap-xhdpi/launcher.png
new file mode 100644
index 0000000..9dfa8d7
--- /dev/null
+++ b/app/src/syncbase2/res/mipmap-xhdpi/launcher.png
Binary files differ
diff --git a/app/src/syncbase2/res/mipmap-xxhdpi/launcher.png b/app/src/syncbase2/res/mipmap-xxhdpi/launcher.png
new file mode 100644
index 0000000..3c7d066
--- /dev/null
+++ b/app/src/syncbase2/res/mipmap-xxhdpi/launcher.png
Binary files differ
diff --git a/app/src/syncbase2/res/values/strings.xml b/app/src/syncbase2/res/values/strings.xml
new file mode 100644
index 0000000..b0e644b
--- /dev/null
+++ b/app/src/syncbase2/res/values/strings.xml
@@ -0,0 +1,13 @@
+<resources>
+ <string name="app_name">Syncbase Todos</string>
+ <string name="share_location">Share Presence</string>
+ <!-- For Sharing Menu -->
+ <string name="sharing_already">Shared With</string>
+ <string name="sharing_possible">Available</string>
+ <string name="sharing_custom_hint">Add an email address…</string>
+ <!-- Errors -->
+ <string name="err_share_location">Could not share location</string>
+ <string name="err_scan_nearby">Unable to scan for nearby users</string>
+ <string name="err_scan_lists">Unable to scan for todo lists shared with you</string>
+ <string name="err_advertise_list">Unable to send todo list invitation(s)</string>
+</resources>