+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..8d1ed3f
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,24 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 17
+ buildToolsVersion "22.0.1"
+
+ defaultConfig {
+ applicationId "ca.ualberta.ssrg.androidelasticsearch"
+ minSdkVersion 8
+ targetSdkVersion 17
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
+ }
+ }
+}
+
+dependencies {
+ compile 'com.android.support:support-v4:18.0.0'
+ compile 'com.google.code.gson:gson:2.3'
+}
diff --git a/app/build/generated/source/buildConfig/androidTest/debug/ca/ualberta/ssrg/androidelasticsearch/test/BuildConfig.java b/app/build/generated/source/buildConfig/androidTest/debug/ca/ualberta/ssrg/androidelasticsearch/test/BuildConfig.java
new file mode 100644
index 0000000..f510697
--- /dev/null
+++ b/app/build/generated/source/buildConfig/androidTest/debug/ca/ualberta/ssrg/androidelasticsearch/test/BuildConfig.java
@@ -0,0 +1,13 @@
+/**
+ * Automatically generated file. DO NOT MODIFY
+ */
+package ca.ualberta.ssrg.androidelasticsearch.test;
+
+public final class BuildConfig {
+ public static final boolean DEBUG = Boolean.parseBoolean("true");
+ public static final String APPLICATION_ID = "ca.ualberta.ssrg.androidelasticsearch.test";
+ public static final String BUILD_TYPE = "debug";
+ public static final String FLAVOR = "";
+ public static final int VERSION_CODE = -1;
+ public static final String VERSION_NAME = "";
+}
diff --git a/app/build/generated/source/buildConfig/debug/ca/ualberta/ssrg/androidelasticsearch/BuildConfig.java b/app/build/generated/source/buildConfig/debug/ca/ualberta/ssrg/androidelasticsearch/BuildConfig.java
new file mode 100644
index 0000000..3744d13
--- /dev/null
+++ b/app/build/generated/source/buildConfig/debug/ca/ualberta/ssrg/androidelasticsearch/BuildConfig.java
@@ -0,0 +1,13 @@
+/**
+ * Automatically generated file. DO NOT MODIFY
+ */
+package ca.ualberta.ssrg.androidelasticsearch;
+
+public final class BuildConfig {
+ public static final boolean DEBUG = Boolean.parseBoolean("true");
+ public static final String APPLICATION_ID = "ca.ualberta.ssrg.androidelasticsearch";
+ public static final String BUILD_TYPE = "debug";
+ public static final String FLAVOR = "";
+ public static final int VERSION_CODE = 1;
+ public static final String VERSION_NAME = "";
+}
diff --git a/app/build/generated/source/r/debug/ca/ualberta/ssrg/androidelasticsearch/R.java b/app/build/generated/source/r/debug/ca/ualberta/ssrg/androidelasticsearch/R.java
new file mode 100644
index 0000000..5e5951e
--- /dev/null
+++ b/app/build/generated/source/r/debug/ca/ualberta/ssrg/androidelasticsearch/R.java
@@ -0,0 +1,77 @@
+/* AUTO-GENERATED FILE. DO NOT MODIFY.
+ *
+ * This class was automatically generated by the
+ * aapt tool from the resource data it found. It
+ * should not be modified by hand.
+ */
+
+package ca.ualberta.ssrg.androidelasticsearch;
+
+public final class R {
+ public static final class attr {
+ }
+ public static final class dimen {
+ public static final int activity_horizontal_margin=0x7f040000;
+ public static final int activity_vertical_margin=0x7f040001;
+ }
+ public static final class drawable {
+ public static final int ic_launcher=0x7f020000;
+ }
+ public static final class id {
+ public static final int action_settings=0x7f08000f;
+ public static final int add=0x7f08000e;
+ public static final int button1=0x7f08000d;
+ public static final int detailsDirector=0x7f080007;
+ public static final int detailsDirectorText=0x7f080002;
+ public static final int detailsGenre=0x7f080009;
+ public static final int detailsGenreText=0x7f080004;
+ public static final int detailsIdText=0x7f080000;
+ public static final int detailsTitle=0x7f080006;
+ public static final int detailsTitleText=0x7f080001;
+ public static final int detailsYear=0x7f080008;
+ public static final int detailsYearText=0x7f080003;
+ public static final int editText1=0x7f08000c;
+ public static final int linearLayout1=0x7f08000a;
+ public static final int movieList=0x7f08000b;
+ public static final int save=0x7f080005;
+ }
+ public static final class layout {
+ public static final int activity_add=0x7f030000;
+ public static final int activity_details=0x7f030001;
+ public static final int activity_main=0x7f030002;
+ public static final int list_item=0x7f030003;
+ }
+ public static final class menu {
+ public static final int add=0x7f070000;
+ public static final int details=0x7f070001;
+ public static final int main=0x7f070002;
+ }
+ public static final class string {
+ public static final int action_settings=0x7f060000;
+ public static final int app_name=0x7f060001;
+ public static final int button_add=0x7f060002;
+ public static final int button_save=0x7f060003;
+ public static final int button_search=0x7f060004;
+ public static final int label_director=0x7f060005;
+ public static final int label_genre=0x7f060006;
+ public static final int label_id=0x7f060007;
+ public static final int label_title=0x7f060008;
+ public static final int label_year=0x7f060009;
+ public static final int title_activity_add=0x7f06000a;
+ public static final int title_activity_details=0x7f06000b;
+ }
+ public static final class style {
+ /** API 11 theme customizations can go here.
+ API 14 theme customizations can go here.
+
+ Theme customizations available in newer API levels can go in
+ res/values-vXX/styles.xml, while customizations related to
+ backward-compatibility can go here.
+
+ */
+ public static final int AppBaseTheme=0x7f050000;
+ /** All customizations that are NOT specific to a particular API-level can go here.
+ */
+ public static final int AppTheme=0x7f050001;
+ }
+}
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/BuildConfig.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/BuildConfig.class
new file mode 100644
index 0000000..7596003
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/BuildConfig.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$attr.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$attr.class
new file mode 100644
index 0000000..e1d8bc2
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$attr.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$dimen.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$dimen.class
new file mode 100644
index 0000000..3d589a7
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$dimen.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$drawable.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$drawable.class
new file mode 100644
index 0000000..3d80f27
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$drawable.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$id.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$id.class
new file mode 100644
index 0000000..4b9429b
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$id.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$layout.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$layout.class
new file mode 100644
index 0000000..f271480
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$layout.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$menu.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$menu.class
new file mode 100644
index 0000000..1cfe9ec
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$menu.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$string.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$string.class
new file mode 100644
index 0000000..550202c
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$string.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$style.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$style.class
new file mode 100644
index 0000000..88df732
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R$style.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R.class
new file mode 100644
index 0000000..5657b44
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/androidelasticsearch/R.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/AddActivity$1.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/AddActivity$1.class
new file mode 100644
index 0000000..ef63b93
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/AddActivity$1.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/AddActivity$AddThread.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/AddActivity$AddThread.class
new file mode 100644
index 0000000..af618fe
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/AddActivity$AddThread.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/AddActivity.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/AddActivity.class
new file mode 100644
index 0000000..e9cc590
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/AddActivity.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/DetailsActivity$1.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/DetailsActivity$1.class
new file mode 100644
index 0000000..e25bfb8
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/DetailsActivity$1.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/DetailsActivity$GetThread.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/DetailsActivity$GetThread.class
new file mode 100644
index 0000000..60fb364
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/DetailsActivity$GetThread.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/DetailsActivity.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/DetailsActivity.class
new file mode 100644
index 0000000..0f0114e
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/DetailsActivity.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/ESMovieManager$1.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/ESMovieManager$1.class
new file mode 100644
index 0000000..c07f215
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/ESMovieManager$1.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/ESMovieManager$2.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/ESMovieManager$2.class
new file mode 100644
index 0000000..91a8a28
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/ESMovieManager$2.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/ESMovieManager.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/ESMovieManager.class
new file mode 100644
index 0000000..695424a
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/ESMovieManager.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MainActivity$1.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MainActivity$1.class
new file mode 100644
index 0000000..5259c64
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MainActivity$1.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MainActivity$2.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MainActivity$2.class
new file mode 100644
index 0000000..43162b9
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MainActivity$2.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MainActivity$3.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MainActivity$3.class
new file mode 100644
index 0000000..2e55e09
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MainActivity$3.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MainActivity$DeleteThread.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MainActivity$DeleteThread.class
new file mode 100644
index 0000000..796512f
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MainActivity$DeleteThread.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MainActivity$SearchThread.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MainActivity$SearchThread.class
new file mode 100644
index 0000000..9b659a4
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MainActivity$SearchThread.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MainActivity.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MainActivity.class
new file mode 100644
index 0000000..db1ffac
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MainActivity.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/Movie.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/Movie.class
new file mode 100644
index 0000000..d105e38
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/Movie.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/Movies.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/Movies.class
new file mode 100644
index 0000000..1c193e7
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/Movies.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MoviesController.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MoviesController.class
new file mode 100644
index 0000000..470e3af
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/MoviesController.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/Observable.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/Observable.class
new file mode 100644
index 0000000..a6398dc
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/Observable.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/Observer.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/Observer.class
new file mode 100644
index 0000000..fb2708e
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/Observer.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/ESMovieManager$1.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/ESMovieManager$1.class
new file mode 100644
index 0000000..bda7141
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/ESMovieManager$1.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/ESMovieManager$2.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/ESMovieManager$2.class
new file mode 100644
index 0000000..b4e7ae8
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/ESMovieManager$2.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/ESMovieManager.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/ESMovieManager.class
new file mode 100644
index 0000000..8ef738d
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/ESMovieManager.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/Movie.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/Movie.class
new file mode 100644
index 0000000..92e8d34
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/Movie.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/Movies.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/Movies.class
new file mode 100644
index 0000000..068ce22
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/Movies.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/MoviesController.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/MoviesController.class
new file mode 100644
index 0000000..f503213
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/MoviesController.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/Hits.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/Hits.class
new file mode 100644
index 0000000..8089a4b
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/Hits.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/SearchHit.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/SearchHit.class
new file mode 100644
index 0000000..9ceac70
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/SearchHit.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/SearchResponse.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/SearchResponse.class
new file mode 100644
index 0000000..f6ac508
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/SearchResponse.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/Shard.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/Shard.class
new file mode 100644
index 0000000..0ae2ea5
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/Shard.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/SimpleSearchCommand$SimpleSearchQuery$SimpleSearchQueryString.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/SimpleSearchCommand$SimpleSearchQuery$SimpleSearchQueryString.class
new file mode 100644
index 0000000..7b11fe5
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/SimpleSearchCommand$SimpleSearchQuery$SimpleSearchQueryString.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/SimpleSearchCommand$SimpleSearchQuery.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/SimpleSearchCommand$SimpleSearchQuery.class
new file mode 100644
index 0000000..b6c8a1a
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/SimpleSearchCommand$SimpleSearchQuery.class differ
diff --git a/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/SimpleSearchCommand.class b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/SimpleSearchCommand.class
new file mode 100644
index 0000000..5a49c97
Binary files /dev/null and b/app/build/intermediates/classes/debug/ca/ualberta/ssrg/movies/es/data/SimpleSearchCommand.class differ
diff --git a/app/build/intermediates/dex/debug/classes.dex b/app/build/intermediates/dex/debug/classes.dex
new file mode 100644
index 0000000..3778080
Binary files /dev/null and b/app/build/intermediates/dex/debug/classes.dex differ
diff --git a/app/build/intermediates/incremental/aidl/androidTest/debug/dependency.store b/app/build/intermediates/incremental/aidl/androidTest/debug/dependency.store
new file mode 100644
index 0000000..8b8400d
Binary files /dev/null and b/app/build/intermediates/incremental/aidl/androidTest/debug/dependency.store differ
diff --git a/app/build/intermediates/incremental/aidl/debug/dependency.store b/app/build/intermediates/incremental/aidl/debug/dependency.store
new file mode 100644
index 0000000..8b8400d
Binary files /dev/null and b/app/build/intermediates/incremental/aidl/debug/dependency.store differ
diff --git a/app/build/intermediates/incremental/mergeAssets/androidTest/debug/merger.xml b/app/build/intermediates/incremental/mergeAssets/androidTest/debug/merger.xml
new file mode 100644
index 0000000..b9e2da8
--- /dev/null
+++ b/app/build/intermediates/incremental/mergeAssets/androidTest/debug/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/app/build/intermediates/incremental/mergeAssets/debug/merger.xml b/app/build/intermediates/incremental/mergeAssets/debug/merger.xml
new file mode 100644
index 0000000..26b9427
--- /dev/null
+++ b/app/build/intermediates/incremental/mergeAssets/debug/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/app/build/intermediates/incremental/mergeResourcesandroidTest/debug/merger.xml b/app/build/intermediates/incremental/mergeResourcesandroidTest/debug/merger.xml
new file mode 100644
index 0000000..012fb6b
--- /dev/null
+++ b/app/build/intermediates/incremental/mergeResourcesandroidTest/debug/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/app/build/intermediates/incremental/mergeResourcesdebug/merger.xml b/app/build/intermediates/incremental/mergeResourcesdebug/merger.xml
new file mode 100644
index 0000000..7077542
--- /dev/null
+++ b/app/build/intermediates/incremental/mergeResourcesdebug/merger.xml
@@ -0,0 +1,14 @@
+
+16dp16dpDirectorIdSettingsSearchGenreMovie CatalogSaveAdd new...Movie DetailsAdd MovieTitleYear128dp
\ No newline at end of file
diff --git a/app/build/intermediates/manifest/androidTest/debug/AndroidManifest.xml b/app/build/intermediates/manifest/androidTest/debug/AndroidManifest.xml
new file mode 100644
index 0000000..15b7a59
--- /dev/null
+++ b/app/build/intermediates/manifest/androidTest/debug/AndroidManifest.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/build/intermediates/manifests/full/debug/AndroidManifest.xml b/app/build/intermediates/manifests/full/debug/AndroidManifest.xml
new file mode 100644
index 0000000..cfa756b
--- /dev/null
+++ b/app/build/intermediates/manifests/full/debug/AndroidManifest.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build/intermediates/pre-dexed/debug/gson-2.3-51e221afde6a75d616562722a0f06dad8f124f68.jar b/app/build/intermediates/pre-dexed/debug/gson-2.3-51e221afde6a75d616562722a0f06dad8f124f68.jar
new file mode 100644
index 0000000..2c4d5ca
Binary files /dev/null and b/app/build/intermediates/pre-dexed/debug/gson-2.3-51e221afde6a75d616562722a0f06dad8f124f68.jar differ
diff --git a/app/build/intermediates/pre-dexed/debug/support-v4-18.0.0-6fe1f8ef58248cf0e2ea5e03b1a99f674e0ec0f2.jar b/app/build/intermediates/pre-dexed/debug/support-v4-18.0.0-6fe1f8ef58248cf0e2ea5e03b1a99f674e0ec0f2.jar
new file mode 100644
index 0000000..ec033a0
Binary files /dev/null and b/app/build/intermediates/pre-dexed/debug/support-v4-18.0.0-6fe1f8ef58248cf0e2ea5e03b1a99f674e0ec0f2.jar differ
diff --git a/app/build/intermediates/res/merged/debug/drawable-hdpi/ic_launcher.png b/app/build/intermediates/res/merged/debug/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..efa7c5f
Binary files /dev/null and b/app/build/intermediates/res/merged/debug/drawable-hdpi/ic_launcher.png differ
diff --git a/app/build/intermediates/res/merged/debug/drawable-mdpi/ic_launcher.png b/app/build/intermediates/res/merged/debug/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..ec27f2e
Binary files /dev/null and b/app/build/intermediates/res/merged/debug/drawable-mdpi/ic_launcher.png differ
diff --git a/app/build/intermediates/res/merged/debug/drawable-xhdpi/ic_launcher.png b/app/build/intermediates/res/merged/debug/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..92fc57d
Binary files /dev/null and b/app/build/intermediates/res/merged/debug/drawable-xhdpi/ic_launcher.png differ
diff --git a/app/build/intermediates/res/merged/debug/drawable-xxhdpi/ic_launcher.png b/app/build/intermediates/res/merged/debug/drawable-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..b6f8f4e
Binary files /dev/null and b/app/build/intermediates/res/merged/debug/drawable-xxhdpi/ic_launcher.png differ
diff --git a/app/build/intermediates/res/merged/debug/layout/activity_add.xml b/app/build/intermediates/res/merged/debug/layout/activity_add.xml
new file mode 100644
index 0000000..d9f31c0
--- /dev/null
+++ b/app/build/intermediates/res/merged/debug/layout/activity_add.xml
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build/intermediates/res/merged/debug/layout/activity_details.xml b/app/build/intermediates/res/merged/debug/layout/activity_details.xml
new file mode 100644
index 0000000..ac5756d
--- /dev/null
+++ b/app/build/intermediates/res/merged/debug/layout/activity_details.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build/intermediates/res/merged/debug/layout/activity_main.xml b/app/build/intermediates/res/merged/debug/layout/activity_main.xml
new file mode 100644
index 0000000..6ae1615
--- /dev/null
+++ b/app/build/intermediates/res/merged/debug/layout/activity_main.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build/intermediates/res/merged/debug/layout/list_item.xml b/app/build/intermediates/res/merged/debug/layout/list_item.xml
new file mode 100644
index 0000000..53489d5
--- /dev/null
+++ b/app/build/intermediates/res/merged/debug/layout/list_item.xml
@@ -0,0 +1,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/build/intermediates/res/merged/debug/menu/add.xml b/app/build/intermediates/res/merged/debug/menu/add.xml
new file mode 100644
index 0000000..c5da3b0
--- /dev/null
+++ b/app/build/intermediates/res/merged/debug/menu/add.xml
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/app/build/intermediates/res/merged/debug/menu/details.xml b/app/build/intermediates/res/merged/debug/menu/details.xml
new file mode 100644
index 0000000..e52b832
--- /dev/null
+++ b/app/build/intermediates/res/merged/debug/menu/details.xml
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/app/build/intermediates/res/merged/debug/menu/main.xml b/app/build/intermediates/res/merged/debug/menu/main.xml
new file mode 100644
index 0000000..97097b6
--- /dev/null
+++ b/app/build/intermediates/res/merged/debug/menu/main.xml
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/app/build/intermediates/res/merged/debug/values-sw720dp-land/values-sw720dp-land.xml b/app/build/intermediates/res/merged/debug/values-sw720dp-land/values-sw720dp-land.xml
new file mode 100644
index 0000000..d25f427
--- /dev/null
+++ b/app/build/intermediates/res/merged/debug/values-sw720dp-land/values-sw720dp-land.xml
@@ -0,0 +1,6 @@
+
+
+
+
+ 128dp
+
\ No newline at end of file
diff --git a/app/build/intermediates/res/merged/debug/values-v11/values-v11.xml b/app/build/intermediates/res/merged/debug/values-v11/values-v11.xml
new file mode 100644
index 0000000..d67f706
--- /dev/null
+++ b/app/build/intermediates/res/merged/debug/values-v11/values-v11.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build/intermediates/res/merged/debug/values-v14/values-v14.xml b/app/build/intermediates/res/merged/debug/values-v14/values-v14.xml
new file mode 100644
index 0000000..561c312
--- /dev/null
+++ b/app/build/intermediates/res/merged/debug/values-v14/values-v14.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build/intermediates/res/merged/debug/values/values.xml b/app/build/intermediates/res/merged/debug/values/values.xml
new file mode 100644
index 0000000..3dc074d
--- /dev/null
+++ b/app/build/intermediates/res/merged/debug/values/values.xml
@@ -0,0 +1,33 @@
+
+
+
+
+ 16dp
+ 16dp
+
+
+ Settings
+ Movie Catalog
+ Add new...
+ Save
+ Search
+ Director
+ Genre
+ Id
+ Title
+ Year
+ Add Movie
+ Movie Details
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build/intermediates/res/resources-debug-androidTest.ap_ b/app/build/intermediates/res/resources-debug-androidTest.ap_
new file mode 100644
index 0000000..0fea3a9
Binary files /dev/null and b/app/build/intermediates/res/resources-debug-androidTest.ap_ differ
diff --git a/app/build/intermediates/res/resources-debug.ap_ b/app/build/intermediates/res/resources-debug.ap_
new file mode 100644
index 0000000..ab5041c
Binary files /dev/null and b/app/build/intermediates/res/resources-debug.ap_ differ
diff --git a/app/build/outputs/apk/app-debug-unaligned.apk b/app/build/outputs/apk/app-debug-unaligned.apk
new file mode 100644
index 0000000..9209c0d
Binary files /dev/null and b/app/build/outputs/apk/app-debug-unaligned.apk differ
diff --git a/app/build/outputs/apk/app-debug.apk b/app/build/outputs/apk/app-debug.apk
new file mode 100644
index 0000000..ed5481f
Binary files /dev/null and b/app/build/outputs/apk/app-debug.apk differ
diff --git a/app/build/outputs/logs/manifest-merger-debug-report.txt b/app/build/outputs/logs/manifest-merger-debug-report.txt
new file mode 100644
index 0000000..1ce84cc
--- /dev/null
+++ b/app/build/outputs/logs/manifest-merger-debug-report.txt
@@ -0,0 +1,67 @@
+-- Merging decision tree log ---
+manifest
+ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:2:1-37:12
+ xmlns:android
+ ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:2:11-69
+ package
+ ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:3:5-52
+ INJECTED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml
+ INJECTED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml
+ android:versionName
+ ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:5:5-30
+ android:versionCode
+ ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:4:5-28
+ INJECTED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml
+ INJECTED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml
+uses-sdk
+ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:7:5-9:41
+ android:targetSdkVersion
+ ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:9:9-38
+ INJECTED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml
+ INJECTED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml
+ android:minSdkVersion
+ ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:8:9-34
+ INJECTED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml
+ INJECTED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml
+uses-permission#android.permission.INTERNET
+ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:11:5-67
+ android:name
+ ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:11:22-64
+application
+ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:13:5-35:19
+ android:label
+ ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:16:9-41
+ android:allowBackup
+ ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:14:9-35
+ android:icon
+ ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:15:9-45
+ android:theme
+ ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:17:9-40
+activity#ca.ualberta.ssrg.movies.MainActivity
+ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:18:9-26:20
+ android:label
+ ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:20:13-45
+ android:name
+ ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:19:13-64
+intent-filter#android.intent.action.MAIN+android.intent.category.LAUNCHER
+ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:21:13-25:29
+action#android.intent.action.MAIN
+ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:22:17-69
+ android:name
+ ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:22:25-66
+category#android.intent.category.LAUNCHER
+ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:24:17-77
+ android:name
+ ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:24:27-74
+activity#ca.ualberta.ssrg.movies.DetailsActivity
+ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:27:9-30:20
+ android:label
+ ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:29:13-59
+ android:name
+ ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:28:13-67
+activity#ca.ualberta.ssrg.movies.AddActivity
+ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:31:9-34:20
+ android:label
+ ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:33:13-55
+ android:name
+ ADDED from /cshome/joshua2/AndroidElasticSearch/app/src/main/AndroidManifest.xml:32:13-63
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..cfa756b
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/ca/ualberta/ssrg/movies/AddActivity.java b/app/src/main/java/ca/ualberta/ssrg/movies/AddActivity.java
new file mode 100644
index 0000000..82feac6
--- /dev/null
+++ b/app/src/main/java/ca/ualberta/ssrg/movies/AddActivity.java
@@ -0,0 +1,80 @@
+package ca.ualberta.ssrg.movies;
+
+import java.util.Arrays;
+import java.util.List;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.TextView;
+import ca.ualberta.ssrg.androidelasticsearch.R;
+
+public class AddActivity extends Activity {
+
+
+ // Thread that close the activity after finishing add
+ private Runnable doFinishAdd = new Runnable() {
+ public void run() {
+ finish();
+ }
+ };
+
+ private MoviesController moviesController;
+ private Movies movies;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_add);
+ movies = new Movies();
+ moviesController = new MoviesController(movies);
+ }
+
+ public void save(View view) {
+ TextView id = (TextView) findViewById(R.id.detailsIdText);
+ TextView title = (TextView) findViewById(R.id.detailsTitleText);
+ TextView director = (TextView) findViewById(R.id.detailsDirectorText);
+ TextView year = (TextView) findViewById(R.id.detailsYearText);
+ TextView genre = (TextView) findViewById(R.id.detailsGenreText);
+
+ // Create movie object
+ Movie newMovie = new Movie();
+ newMovie.setId(Integer.parseInt(id.getText().toString()));
+ newMovie.setTitle(title.getText().toString());
+ newMovie.setDirector(director.getText().toString());
+ newMovie.setYear(Integer.parseInt(year.getText().toString()));
+
+ String genresString = genre.getText().toString();
+ String[] genresArray = genresString.split(",");
+ List genres = Arrays.asList(genresArray);
+ newMovie.setGenres(genres);
+
+ // Execute the thread
+ Thread thread = new AddThread(newMovie);
+ thread.start();
+ }
+
+ class AddThread extends Thread {
+ private Movie movie;
+
+ public AddThread(Movie movie) {
+ this.movie = movie;
+ }
+
+ @Override
+ public void run() {
+ moviesController.addMovie(movie);
+
+ // Give some time to get updated info
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ runOnUiThread(doFinishAdd);
+ }
+ }
+}
+
+
diff --git a/app/src/main/java/ca/ualberta/ssrg/movies/DetailsActivity.java b/app/src/main/java/ca/ualberta/ssrg/movies/DetailsActivity.java
new file mode 100644
index 0000000..0b83a0b
--- /dev/null
+++ b/app/src/main/java/ca/ualberta/ssrg/movies/DetailsActivity.java
@@ -0,0 +1,69 @@
+package ca.ualberta.ssrg.movies;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.widget.TextView;
+import ca.ualberta.ssrg.androidelasticsearch.R;
+
+public class DetailsActivity extends Activity {
+ public static String MOVIE_ID = "MOVIE_ID";
+
+ private ESMovieManager movieManager;
+ private Movie movie;
+
+ private Runnable doUpdateGUIDetails = new Runnable() {
+ public void run() {
+ TextView title = (TextView) findViewById(R.id.detailsTitle);
+ TextView director = (TextView) findViewById(R.id.detailsDirector);
+ TextView year = (TextView) findViewById(R.id.detailsYear);
+ TextView genre = (TextView) findViewById(R.id.detailsGenre);
+
+ title.setText(movie.getTitle());
+ director.setText(movie.getDirector());
+ year.setText(String.valueOf(movie.getYear()));
+ genre.setText(movie.getGenres().toString());
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_details);
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+
+ movieManager = new ESMovieManager("");
+ Intent intent = getIntent();
+
+ if (intent != null) {
+ Bundle extras = intent.getExtras();
+
+ if (extras != null) {
+ int movieId = extras.getInt(MOVIE_ID);
+
+ Thread thread = new GetThread(movieId);
+ thread.start();
+ }
+ }
+ }
+
+ class GetThread extends Thread {
+ private int id;
+
+ public GetThread(int id) {
+ this.id = id;
+ }
+
+ @Override
+ public void run() {
+ movie = movieManager.getMovie(id);
+
+ runOnUiThread(doUpdateGUIDetails);
+ }
+ }
+
+}
diff --git a/app/src/main/java/ca/ualberta/ssrg/movies/ESMovieManager.java b/app/src/main/java/ca/ualberta/ssrg/movies/ESMovieManager.java
new file mode 100644
index 0000000..527f5be
--- /dev/null
+++ b/app/src/main/java/ca/ualberta/ssrg/movies/ESMovieManager.java
@@ -0,0 +1,154 @@
+package ca.ualberta.ssrg.movies;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Type;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.DefaultHttpClient;
+
+import android.util.Log;
+
+import ca.ualberta.ssrg.movies.es.data.SearchHit;
+import ca.ualberta.ssrg.movies.es.data.SearchResponse;
+import ca.ualberta.ssrg.movies.es.data.SimpleSearchCommand;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonIOException;
+import com.google.gson.JsonSyntaxException;
+import com.google.gson.reflect.TypeToken;
+
+public class ESMovieManager {
+
+ private static final String TAG = "MovieSearch";
+ private Gson gson;
+ private Movies movies = new Movies();
+
+ public Movies getMovies() {
+ return movies;
+ }
+
+ public ESMovieManager(String search) {
+ gson = new Gson();
+ }
+
+ /**
+ * Get a movie with the specified id
+ */
+ public Movie getMovie(int id) {
+ SearchHit sr = null;
+ HttpClient httpClient = new DefaultHttpClient();
+ HttpGet httpGet = new HttpGet(movies.getResourceUrl() + id);
+
+ HttpResponse response = null;
+
+ try {
+ response = httpClient.execute(httpGet);
+ } catch (ClientProtocolException e1) {
+ throw new RuntimeException(e1);
+ } catch (IOException e1) {
+ throw new RuntimeException(e1);
+ }
+
+ Type searchHitType = new TypeToken>() {}.getType();
+
+ try {
+ sr = gson.fromJson(
+ new InputStreamReader(response.getEntity().getContent()),
+ searchHitType);
+ } catch (JsonIOException e) {
+ throw new RuntimeException(e);
+ } catch (JsonSyntaxException e) {
+ throw new RuntimeException(e);
+ } catch (IllegalStateException e) {
+ throw new RuntimeException(e);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ return sr.getSource();
+
+ }
+
+ /**
+ * Get movies with the specified search string. If the search does not
+ * specify fields, it searches on all the fields.
+ */
+ public Movies searchMovies(String searchString, String field) {
+ Movies result = new Movies();
+
+ /**
+ * Creates a search request from a search string and a field
+ */
+
+ HttpPost searchRequest = new HttpPost(movies.getSearchUrl());
+
+ String[] fields = null;
+ if (field != null) {
+ throw new UnsupportedOperationException("Not implemented!");
+ }
+
+ SimpleSearchCommand command = new SimpleSearchCommand(searchString);
+
+ String query = gson.toJson(command);
+ Log.i(TAG, "Json command: " + query);
+
+ StringEntity stringEntity = null;
+ try {
+ stringEntity = new StringEntity(query);
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+
+ searchRequest.setHeader("Accept", "application/json");
+ searchRequest.setEntity(stringEntity);
+
+ HttpClient httpClient = new DefaultHttpClient();
+
+ HttpResponse response = null;
+ try {
+ response = httpClient.execute(searchRequest);
+ } catch (ClientProtocolException e) {
+ throw new RuntimeException(e);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ /**
+ * Parses the response of a search
+ */
+ Type searchResponseType = new TypeToken>() {
+ }.getType();
+
+ SearchResponse esResponse;
+
+ try {
+ esResponse = gson.fromJson(
+ new InputStreamReader(response.getEntity().getContent()),
+ searchResponseType);
+ } catch (JsonIOException e) {
+ throw new RuntimeException(e);
+ } catch (JsonSyntaxException e) {
+ throw new RuntimeException(e);
+ } catch (IllegalStateException e) {
+ throw new RuntimeException(e);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+
+ for (SearchHit hit : esResponse.getHits().getHits()) {
+ result.add(hit.getSource());
+ }
+
+ result.notifyObservers();
+
+ return result;
+ }
+}
diff --git a/app/src/main/java/ca/ualberta/ssrg/movies/MainActivity.java b/app/src/main/java/ca/ualberta/ssrg/movies/MainActivity.java
new file mode 100644
index 0000000..c37e606
--- /dev/null
+++ b/app/src/main/java/ca/ualberta/ssrg/movies/MainActivity.java
@@ -0,0 +1,169 @@
+package ca.ualberta.ssrg.movies;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.AdapterView.OnItemLongClickListener;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+import android.widget.Toast;
+import ca.ualberta.ssrg.androidelasticsearch.R;
+
+public class MainActivity extends Activity {
+
+ private ListView movieList;
+ private Movies movies;
+ private ArrayAdapter moviesViewAdapter;
+ private ESMovieManager movieManager;
+ private MoviesController moviesController;
+
+ private Context mContext = this;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+
+ movieList = (ListView) findViewById(R.id.movieList);
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+
+ movies = new Movies();
+ moviesViewAdapter = new ArrayAdapter(this, R.layout.list_item,movies);
+ movieList.setAdapter(moviesViewAdapter);
+ movieManager = new ESMovieManager("");
+
+ // Show details when click on a movie
+ movieList.setOnItemClickListener(new OnItemClickListener() {
+
+ @Override
+ public void onItemClick(AdapterView> parent, View view, int pos, long id) {
+ int movieId = movies.get(pos).getId();
+ startDetailsActivity(movieId);
+ }
+
+ });
+
+ // Delete movie on long click
+ movieList.setOnItemLongClickListener(new OnItemLongClickListener() {
+
+ @Override
+ public boolean onItemLongClick(AdapterView> parent, View view, int position, long id) {
+ Movie movie = movies.get(position);
+ Toast.makeText(mContext, "Deleting " + movie.getTitle(), Toast.LENGTH_LONG).show();
+
+ Thread thread = new DeleteThread(movie.getId());
+ thread.start();
+
+ return true;
+ }
+ });
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+
+ SearchThread thread = new SearchThread("*");
+
+ thread.start();
+
+
+ }
+
+ /**
+ * Called when the model changes
+ */
+ public void notifyUpdated() {
+ // Thread to update adapter after an operation
+ Runnable doUpdateGUIList = new Runnable() {
+ public void run() {
+ moviesViewAdapter.notifyDataSetChanged();
+ }
+ };
+
+ runOnUiThread(doUpdateGUIList);
+ }
+
+ /**
+ * Search for movies with a given word(s) in the text view
+ * @param view
+ */
+ public void search(View view) {
+ movies.clear();
+
+ // TODO: Extract search query from text view
+
+ // TODO: Run the search thread
+
+ }
+
+ /**
+ * Starts activity with details for a movie
+ * @param movieId Movie id
+ */
+ public void startDetailsActivity(int movieId) {
+ Intent intent = new Intent(mContext, DetailsActivity.class);
+ intent.putExtra(DetailsActivity.MOVIE_ID, movieId);
+
+ startActivity(intent);
+ }
+
+ /**
+ * Starts activity to add a new movie
+ * @param view
+ */
+ public void add(View view) {
+ Intent intent = new Intent(mContext, AddActivity.class);
+ startActivity(intent);
+ }
+
+
+ class SearchThread extends Thread {
+ private String search;
+
+ public SearchThread(String search) {
+ this.search = search;
+ }
+
+ @Override
+ public void run() {
+ movies.clear();
+ movies.addAll(movieManager.searchMovies(search, null));
+ notifyUpdated();
+ }
+
+ }
+
+
+ class DeleteThread extends Thread {
+ private int movieId;
+
+ public DeleteThread(int movieId) {
+ this.movieId = movieId;
+ }
+
+ @Override
+ public void run() {
+ moviesController.deleteMovie(movieId);
+
+ // Remove movie from local list
+ for (int i = 0; i < movies.size(); i++) {
+ Movie m = movies.get(i);
+
+ if (m.getId() == movieId) {
+ movies.remove(m);
+ break;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/ca/ualberta/ssrg/movies/Movie.java b/app/src/main/java/ca/ualberta/ssrg/movies/Movie.java
new file mode 100644
index 0000000..0ecb162
--- /dev/null
+++ b/app/src/main/java/ca/ualberta/ssrg/movies/Movie.java
@@ -0,0 +1,58 @@
+package ca.ualberta.ssrg.movies;
+
+import java.util.Collection;
+
+public class Movie {
+ public int id;
+ private String title;
+ private String director;
+ private int year;
+ private Collection genres;
+
+ public Movie() {}
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getDirector() {
+ return director;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public int getYear() {
+ return year;
+ }
+
+ public void setYear(int year) {
+ this.year = year;
+ }
+
+ public Collection getGenres() {
+ return genres;
+ }
+
+ public void setGenres(Collection genres) {
+ this.genres = genres;
+ }
+
+ @Override
+ public String toString() {
+ return title + " (" + year + ")";
+ }
+}
diff --git a/app/src/main/java/ca/ualberta/ssrg/movies/Movies.java b/app/src/main/java/ca/ualberta/ssrg/movies/Movies.java
new file mode 100644
index 0000000..e03f0ed
--- /dev/null
+++ b/app/src/main/java/ca/ualberta/ssrg/movies/Movies.java
@@ -0,0 +1,40 @@
+package ca.ualberta.ssrg.movies;
+
+import java.util.ArrayList;
+
+public class Movies extends ArrayList implements Observable {
+ private volatile ArrayList observers = new ArrayList();
+ private static final String RESOURCE_URL = "http://cmput301.softwareprocess.es:8080/testing/movie/";
+ private static final String SEARCH_URL = "http://cmput301.softwareprocess.es:8080/testing/movie/_search";
+
+ @Override
+ public void addObserver(Observer o) {
+ observers.add(o);
+ }
+
+ @Override
+ public void deleteObserver(Observer o) {
+ observers.remove(o);
+ }
+
+ @Override
+ public void notifyObservers() {
+ for (Observer o : observers) {
+ o.notifyUpdated(this);
+ }
+ }
+
+ public String getResourceUrl() {
+ return RESOURCE_URL;
+ }
+
+ public String getSearchUrl() {
+ return SEARCH_URL;
+ }
+
+ /**
+ * Java wants this, we don't need it for Gson/Json
+ */
+ private static final long serialVersionUID = 3199561696102797345L;
+
+}
diff --git a/app/src/main/java/ca/ualberta/ssrg/movies/MoviesController.java b/app/src/main/java/ca/ualberta/ssrg/movies/MoviesController.java
new file mode 100644
index 0000000..8deda82
--- /dev/null
+++ b/app/src/main/java/ca/ualberta/ssrg/movies/MoviesController.java
@@ -0,0 +1,66 @@
+package ca.ualberta.ssrg.movies;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.DefaultHttpClient;
+
+import com.google.gson.Gson;
+
+import android.util.Log;
+
+public class MoviesController {
+ private Gson gson = new Gson();
+ private Movies movies;
+ private static final String TAG = "MoviesController";
+
+
+ public MoviesController(Movies movies) {
+ super();
+ this.movies = movies;
+ }
+
+ /**
+ * Adds a new movie
+ */
+ public void addMovie(Movie movie) {
+ HttpClient httpClient = new DefaultHttpClient();
+
+ try {
+ HttpPost addRequest = new HttpPost(movies.getResourceUrl() + movie.getId());
+
+ StringEntity stringEntity = new StringEntity(gson.toJson(movie));
+ addRequest.setEntity(stringEntity);
+ addRequest.setHeader("Accept", "application/json");
+
+ HttpResponse response = httpClient.execute(addRequest);
+ String status = response.getStatusLine().toString();
+ Log.i(TAG, status);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Deletes the movie with the specified id
+ */
+ public void deleteMovie(int movieId) {
+ HttpClient httpClient = new DefaultHttpClient();
+
+ try {
+ HttpDelete deleteRequest = new HttpDelete(movies.getResourceUrl() + movieId);
+ deleteRequest.setHeader("Accept", "application/json");
+
+ HttpResponse response = httpClient.execute(deleteRequest);
+ String status = response.getStatusLine().toString();
+ Log.i(TAG, status);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+}
diff --git a/app/src/main/java/ca/ualberta/ssrg/movies/Observable.java b/app/src/main/java/ca/ualberta/ssrg/movies/Observable.java
new file mode 100644
index 0000000..3ca2f7a
--- /dev/null
+++ b/app/src/main/java/ca/ualberta/ssrg/movies/Observable.java
@@ -0,0 +1,7 @@
+package ca.ualberta.ssrg.movies;
+
+public interface Observable {
+ public void addObserver(Observer o);
+ public void deleteObserver(Observer o);
+ public void notifyObservers();
+}
diff --git a/app/src/main/java/ca/ualberta/ssrg/movies/Observer.java b/app/src/main/java/ca/ualberta/ssrg/movies/Observer.java
new file mode 100644
index 0000000..6f18e57
--- /dev/null
+++ b/app/src/main/java/ca/ualberta/ssrg/movies/Observer.java
@@ -0,0 +1,5 @@
+package ca.ualberta.ssrg.movies;
+
+public interface Observer {
+ public void notifyUpdated(Observable o);
+}
diff --git a/app/src/main/java/ca/ualberta/ssrg/movies/es/data/Hits.java b/app/src/main/java/ca/ualberta/ssrg/movies/es/data/Hits.java
new file mode 100644
index 0000000..8c101eb
--- /dev/null
+++ b/app/src/main/java/ca/ualberta/ssrg/movies/es/data/Hits.java
@@ -0,0 +1,42 @@
+package ca.ualberta.ssrg.movies.es.data;
+
+import java.util.List;
+
+
+public class Hits {
+ private int total;
+ private float max_score;
+ private List> hits;
+
+ public Hits() {}
+
+ public int getTotal() {
+ return total;
+ }
+
+ public void setTotal(int total) {
+ this.total = total;
+ }
+
+ public float getMax_score() {
+ return max_score;
+ }
+
+ public void setMax_score(float max_score) {
+ this.max_score = max_score;
+ }
+
+ public List> getHits() {
+ return hits;
+ }
+
+ public void setHits(List> hits) {
+ this.hits = hits;
+ }
+
+ @Override
+ public String toString() {
+ return "Hits [total=" + total + ", max_score=" + max_score + ", hits="
+ + hits + "]";
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/ca/ualberta/ssrg/movies/es/data/SearchHit.java b/app/src/main/java/ca/ualberta/ssrg/movies/es/data/SearchHit.java
new file mode 100644
index 0000000..328910d
--- /dev/null
+++ b/app/src/main/java/ca/ualberta/ssrg/movies/es/data/SearchHit.java
@@ -0,0 +1,71 @@
+package ca.ualberta.ssrg.movies.es.data;
+
+public class SearchHit {
+ private String _index;
+ private String _type;
+ private String _id;
+ private String _version;
+ private boolean found;
+ private T _source;
+
+ public SearchHit() {
+
+ }
+
+ public String get_index() {
+ return _index;
+ }
+
+ public void set_index(String _index) {
+ this._index = _index;
+ }
+
+ public String get_type() {
+ return _type;
+ }
+
+ public void set_type(String _type) {
+ this._type = _type;
+ }
+
+ public String get_id() {
+ return _id;
+ }
+
+ public void set_id(String _id) {
+ this._id = _id;
+ }
+
+ public String get_version() {
+ return _version;
+ }
+
+ public void set_version(String _version) {
+ this._version = _version;
+ }
+
+ public boolean isFound() {
+ return found;
+ }
+
+ public void setFound(boolean found) {
+ this.found = found;
+ }
+
+ public T getSource() {
+ return _source;
+ }
+
+ public void setSource(T source) {
+ this._source = source;
+ }
+
+ @Override
+ public String toString() {
+ return "SimpleElasticSearchResponse [_index=" + _index + ", _type="
+ + _type + ", _id=" + _id + ", _version=" + _version
+ + ", found=" + found + ", _source=" + _source + "]";
+ }
+
+
+}
diff --git a/app/src/main/java/ca/ualberta/ssrg/movies/es/data/SearchResponse.java b/app/src/main/java/ca/ualberta/ssrg/movies/es/data/SearchResponse.java
new file mode 100644
index 0000000..c63bcc7
--- /dev/null
+++ b/app/src/main/java/ca/ualberta/ssrg/movies/es/data/SearchResponse.java
@@ -0,0 +1,73 @@
+package ca.ualberta.ssrg.movies.es.data;
+
+
+public class SearchResponse {
+
+ private int took;
+ private boolean timed_out;
+ private Shard _shards;
+ private Hits hits;
+
+ public SearchResponse() {}
+
+ public int getTook() {
+ return took;
+ }
+
+ public void setTook(int took) {
+ this.took = took;
+ }
+
+ public boolean isTimed_out() {
+ return timed_out;
+ }
+
+ public void setTimed_out(boolean timed_out) {
+ this.timed_out = timed_out;
+ }
+
+ public Shard get_shards() {
+ return _shards;
+ }
+
+ public void set_shards(Shard _shards) {
+ this._shards = _shards;
+ }
+
+ public Hits getHits() {
+ return hits;
+ }
+
+ public void setHits(Hits hits) {
+ this.hits = hits;
+ }
+}
+
+
+
+class Shard {
+ private int total;
+ private int successful;
+ private int failed;
+
+ public Shard() {}
+
+ public int getTotal() {
+ return total;
+ }
+ public void setTotal(int total) {
+ this.total = total;
+ }
+ public int getSuccessful() {
+ return successful;
+ }
+ public void setSuccessful(int successful) {
+ this.successful = successful;
+ }
+ public int getFailed() {
+ return failed;
+ }
+ public void setFailed(int failed) {
+ this.failed = failed;
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/ca/ualberta/ssrg/movies/es/data/SimpleSearchCommand.java b/app/src/main/java/ca/ualberta/ssrg/movies/es/data/SimpleSearchCommand.java
new file mode 100644
index 0000000..09563dc
--- /dev/null
+++ b/app/src/main/java/ca/ualberta/ssrg/movies/es/data/SimpleSearchCommand.java
@@ -0,0 +1,57 @@
+package ca.ualberta.ssrg.movies.es.data;
+
+public class SimpleSearchCommand {
+ private SimpleSearchQuery query;
+
+ public SimpleSearchCommand(String query) {
+ super();
+ this.query = new SimpleSearchQuery(query);
+ }
+
+ public SimpleSearchCommand(String query, String[] fields) {
+ super();
+ throw new UnsupportedOperationException("Fields not yet implemented.");
+ }
+
+ public SimpleSearchQuery getQuery() {
+ return query;
+ }
+
+ public void setQuery(SimpleSearchQuery query) {
+ this.query = query;
+ }
+
+ static class SimpleSearchQuery {
+ private SimpleSearchQueryString queryString;
+
+ public SimpleSearchQuery(String query) {
+ super();
+ this.queryString = new SimpleSearchQueryString(query);
+ }
+
+ public SimpleSearchQueryString getQueryString() {
+ return queryString;
+ }
+
+ public void setQueryString(SimpleSearchQueryString queryString) {
+ this.queryString = queryString;
+ }
+
+ static class SimpleSearchQueryString {
+ private String query;
+
+ public SimpleSearchQueryString(String query) {
+ super();
+ this.query = query;
+ }
+
+ public String getQuery() {
+ return query;
+ }
+
+ public void setQuery(String query) {
+ this.query = query;
+ }
+ }
+ }
+}
diff --git a/app/src/main/res/drawable-hdpi/ic_launcher.png b/app/src/main/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..288b665
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_launcher.png b/app/src/main/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..6ae570b
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_launcher.png b/app/src/main/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..d4fb7cd
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_launcher.png b/app/src/main/res/drawable-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..85a6081
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/layout/activity_add.xml b/app/src/main/res/layout/activity_add.xml
new file mode 100644
index 0000000..81bf675
--- /dev/null
+++ b/app/src/main/res/layout/activity_add.xml
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_details.xml b/app/src/main/res/layout/activity_details.xml
new file mode 100644
index 0000000..8f370a7
--- /dev/null
+++ b/app/src/main/res/layout/activity_details.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..52b5fe2
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/list_item.xml b/app/src/main/res/layout/list_item.xml
new file mode 100644
index 0000000..b2b6084
--- /dev/null
+++ b/app/src/main/res/layout/list_item.xml
@@ -0,0 +1,7 @@
+
+
+
diff --git a/app/src/main/res/menu/add.xml b/app/src/main/res/menu/add.xml
new file mode 100644
index 0000000..c002028
--- /dev/null
+++ b/app/src/main/res/menu/add.xml
@@ -0,0 +1,9 @@
+
diff --git a/app/src/main/res/menu/details.xml b/app/src/main/res/menu/details.xml
new file mode 100644
index 0000000..c002028
--- /dev/null
+++ b/app/src/main/res/menu/details.xml
@@ -0,0 +1,9 @@
+
diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml
new file mode 100644
index 0000000..c002028
--- /dev/null
+++ b/app/src/main/res/menu/main.xml
@@ -0,0 +1,9 @@
+
diff --git a/app/src/main/res/values-sw600dp/dimens.xml b/app/src/main/res/values-sw600dp/dimens.xml
new file mode 100644
index 0000000..44f01db
--- /dev/null
+++ b/app/src/main/res/values-sw600dp/dimens.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
diff --git a/app/src/main/res/values-sw720dp-land/dimens.xml b/app/src/main/res/values-sw720dp-land/dimens.xml
new file mode 100644
index 0000000..61e3fa8
--- /dev/null
+++ b/app/src/main/res/values-sw720dp-land/dimens.xml
@@ -0,0 +1,9 @@
+
+
+
+ 128dp
+
+
diff --git a/app/src/main/res/values-v11/styles.xml b/app/src/main/res/values-v11/styles.xml
new file mode 100644
index 0000000..3c02242
--- /dev/null
+++ b/app/src/main/res/values-v11/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/values-v14/styles.xml b/app/src/main/res/values-v14/styles.xml
new file mode 100644
index 0000000..a91fd03
--- /dev/null
+++ b/app/src/main/res/values-v14/styles.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..55c1e59
--- /dev/null
+++ b/app/src/main/res/values/dimens.xml
@@ -0,0 +1,7 @@
+
+
+
+ 16dp
+ 16dp
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..4bb2eae
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,17 @@
+
+
+
+ Movie Catalog
+ Settings
+ Movie Details
+ Add Movie
+ Id
+ Title
+ Director
+ Year
+ Genre
+ Add new...
+ Search
+ Save
+
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..6ce89c7
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..6a5c233
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,15 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+buildscript {
+ repositories {
+ jcenter()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:1.3.0'
+ }
+}
+
+allprojects {
+ repositories {
+ jcenter()
+ }
+}
diff --git a/build/intermediates/dex-cache/cache.xml b/build/intermediates/dex-cache/cache.xml
new file mode 100644
index 0000000..6171f2c
--- /dev/null
+++ b/build/intermediates/dex-cache/cache.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/intermediates/gradle_project_sync_data.bin b/build/intermediates/gradle_project_sync_data.bin
new file mode 100644
index 0000000..dde6aa5
Binary files /dev/null and b/build/intermediates/gradle_project_sync_data.bin differ
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..8c0fb64
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..0c71e76
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Apr 10 15:27:10 PDT 2013
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..91a7e26
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+ [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..aec9973
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/import-summary.txt b/import-summary.txt
new file mode 100644
index 0000000..13159ab
--- /dev/null
+++ b/import-summary.txt
@@ -0,0 +1,60 @@
+ECLIPSE ANDROID PROJECT IMPORT SUMMARY
+======================================
+
+Ignored Files:
+--------------
+The following files were *not* copied into the new Gradle project; you
+should evaluate whether these are still needed in your project and if
+so manually move them:
+
+* ic_launcher-web.png
+* proguard-project.txt
+
+Replaced Jars with Dependencies:
+--------------------------------
+The importer recognized the following .jar files as third party
+libraries and replaced them with Gradle dependencies instead. This has
+the advantage that more explicit version information is known, and the
+libraries can be updated automatically. However, it is possible that
+the .jar file in your project was of an older version than the
+dependency we picked, which could render the project not compileable.
+You can disable the jar replacement in the import wizard and try again:
+
+android-support-v4.jar => com.android.support:support-v4:18.0.0
+gson-2.3.jar => com.google.code.gson:gson:2.3
+
+Potentially Missing Dependency:
+-------------------------------
+When we replaced the following .jar files with a Gradle dependency, we
+inferred the dependency version number from the filename. This
+specific version may not actually be available from the repository.
+If you get a build error stating that the dependency is missing, edit
+the version number to for example "+" to pick up the latest version
+instead. (This may require you to update your code if the library APIs
+have changed.)
+
+gson-2.3.jar => version 2.3 in com.google.code.gson:gson:2.3
+
+Moved Files:
+------------
+Android Gradle projects use a different directory structure than ADT
+Eclipse projects. Here's how the projects were restructured:
+
+* AndroidManifest.xml => app/src/main/AndroidManifest.xml
+* res/ => app/src/main/res/
+* src/ => app/src/main/java/
+
+Next Steps:
+-----------
+You can now build the project. The Gradle project needs network
+connectivity to download dependencies.
+
+Bugs:
+-----
+If for some reason your project does not build, and you determine that
+it is due to a bug or limitation of the Eclipse to Gradle importer,
+please file a bug at http://b.android.com with category
+Component-Tools.
+
+(This import summary is for your information only, and can be deleted
+after import once you are satisfied with the results.)
diff --git a/local.properties b/local.properties
new file mode 100644
index 0000000..672e325
--- /dev/null
+++ b/local.properties
@@ -0,0 +1,11 @@
+## This file is automatically generated by Android Studio.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must *NOT* be checked into Version Control Systems,
+# as it contains information specific to your local configuration.
+#
+# Location of the SDK. This is only used by Gradle.
+# For customization when using a Version Control System, please read the
+# header note.
+#Mon Oct 26 17:44:41 MDT 2015
+sdk.dir=/usr/local/share/android-sdk-linux
diff --git a/project.properties b/project.properties
index 4ab1256..a3ee5ab 100644
--- a/project.properties
+++ b/project.properties
@@ -11,4 +11,4 @@
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
-target=android-19
+target=android-17
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..e7b4def
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1 @@
+include ':app'
diff --git a/src/ca/ualberta/ssrg/movies/AddActivity.java b/src/ca/ualberta/ssrg/movies/AddActivity.java
index ee837f3..7d7cf56 100644
--- a/src/ca/ualberta/ssrg/movies/AddActivity.java
+++ b/src/ca/ualberta/ssrg/movies/AddActivity.java
@@ -8,13 +8,12 @@
import android.view.View;
import android.widget.TextView;
import ca.ualberta.ssrg.androidelasticsearch.R;
-import ca.ualberta.ssrg.movies.es.ESMovieManager;
import ca.ualberta.ssrg.movies.es.Movie;
-import ca.ualberta.ssrg.movies.es.IMovieManager;
+import ca.ualberta.ssrg.movies.es.Movies;
+import ca.ualberta.ssrg.movies.es.MoviesController;
public class AddActivity extends Activity {
- private IMovieManager movieManager;
// Thread that close the activity after finishing add
private Runnable doFinishAdd = new Runnable() {
@@ -22,13 +21,16 @@ public void run() {
finish();
}
};
+
+ private MoviesController moviesController;
+ private Movies movies;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
-
- movieManager = new ESMovieManager();
+ movies = new Movies();
+ moviesController = new MoviesController(movies);
}
public void save(View view) {
@@ -64,7 +66,7 @@ public AddThread(Movie movie) {
@Override
public void run() {
- movieManager.addMovie(movie);
+ moviesController.addMovie(movie);
// Give some time to get updated info
try {
diff --git a/src/ca/ualberta/ssrg/movies/DetailsActivity.java b/src/ca/ualberta/ssrg/movies/DetailsActivity.java
index c6e3462..77c4c9f 100644
--- a/src/ca/ualberta/ssrg/movies/DetailsActivity.java
+++ b/src/ca/ualberta/ssrg/movies/DetailsActivity.java
@@ -7,12 +7,11 @@
import ca.ualberta.ssrg.androidelasticsearch.R;
import ca.ualberta.ssrg.movies.es.ESMovieManager;
import ca.ualberta.ssrg.movies.es.Movie;
-import ca.ualberta.ssrg.movies.es.IMovieManager;
public class DetailsActivity extends Activity {
public static String MOVIE_ID = "MOVIE_ID";
- private IMovieManager movieManager;
+ private ESMovieManager movieManager;
private Movie movie;
private Runnable doUpdateGUIDetails = new Runnable() {
@@ -39,7 +38,7 @@ protected void onCreate(Bundle savedInstanceState) {
protected void onStart() {
super.onStart();
- movieManager = new ESMovieManager();
+ movieManager = new ESMovieManager("");
Intent intent = getIntent();
if (intent != null) {
diff --git a/src/ca/ualberta/ssrg/movies/MainActivity.java b/src/ca/ualberta/ssrg/movies/MainActivity.java
index 9b4bf5a..b49d543 100644
--- a/src/ca/ualberta/ssrg/movies/MainActivity.java
+++ b/src/ca/ualberta/ssrg/movies/MainActivity.java
@@ -1,8 +1,5 @@
package ca.ualberta.ssrg.movies;
-import java.util.ArrayList;
-import java.util.List;
-
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
@@ -12,31 +9,24 @@
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
-import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import ca.ualberta.ssrg.androidelasticsearch.R;
import ca.ualberta.ssrg.movies.es.ESMovieManager;
-import ca.ualberta.ssrg.movies.es.IMovieManager;
import ca.ualberta.ssrg.movies.es.Movie;
+import ca.ualberta.ssrg.movies.es.Movies;
+import ca.ualberta.ssrg.movies.es.MoviesController;
public class MainActivity extends Activity {
private ListView movieList;
- private List movies;
+ private Movies movies;
private ArrayAdapter moviesViewAdapter;
-
- private IMovieManager movieManager;
+ private ESMovieManager movieManager;
+ private MoviesController moviesController;
private Context mContext = this;
- // Thread to update adapter after an operation
- private Runnable doUpdateGUIList = new Runnable() {
- public void run() {
- moviesViewAdapter.notifyDataSetChanged();
- }
- };
-
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -49,10 +39,10 @@ protected void onCreate(Bundle savedInstanceState) {
protected void onStart() {
super.onStart();
- movies = new ArrayList();
+ movies = new Movies();
moviesViewAdapter = new ArrayAdapter(this, R.layout.list_item,movies);
movieList.setAdapter(moviesViewAdapter);
- movieManager = new ESMovieManager();
+ movieManager = new ESMovieManager("");
// Show details when click on a movie
movieList.setOnItemClickListener(new OnItemClickListener() {
@@ -84,11 +74,27 @@ public boolean onItemLongClick(AdapterView> parent, View view, int position, l
@Override
protected void onResume() {
super.onResume();
+
+
// Refresh the list when visible
// TODO: Search all
}
+
+ /**
+ * Called when the model changes
+ */
+ public void notifyUpdated() {
+ // Thread to update adapter after an operation
+ Runnable doUpdateGUIList = new Runnable() {
+ public void run() {
+ moviesViewAdapter.notifyDataSetChanged();
+ }
+ };
+
+ runOnUiThread(doUpdateGUIList);
+ }
/**
* Search for movies with a given word(s) in the text view
@@ -139,7 +145,7 @@ public DeleteThread(int movieId) {
@Override
public void run() {
- movieManager.deleteMovie(movieId);
+ moviesController.deleteMovie(movieId);
// Remove movie from local list
for (int i = 0; i < movies.size(); i++) {
@@ -150,8 +156,6 @@ public void run() {
break;
}
}
-
- runOnUiThread(doUpdateGUIList);
}
}
}
\ No newline at end of file
diff --git a/src/ca/ualberta/ssrg/movies/Observable.java b/src/ca/ualberta/ssrg/movies/Observable.java
new file mode 100644
index 0000000..3ca2f7a
--- /dev/null
+++ b/src/ca/ualberta/ssrg/movies/Observable.java
@@ -0,0 +1,7 @@
+package ca.ualberta.ssrg.movies;
+
+public interface Observable {
+ public void addObserver(Observer o);
+ public void deleteObserver(Observer o);
+ public void notifyObservers();
+}
diff --git a/src/ca/ualberta/ssrg/movies/Observer.java b/src/ca/ualberta/ssrg/movies/Observer.java
new file mode 100644
index 0000000..6f18e57
--- /dev/null
+++ b/src/ca/ualberta/ssrg/movies/Observer.java
@@ -0,0 +1,5 @@
+package ca.ualberta.ssrg.movies;
+
+public interface Observer {
+ public void notifyUpdated(Observable o);
+}
diff --git a/src/ca/ualberta/ssrg/movies/es/ESMovieManager.java b/src/ca/ualberta/ssrg/movies/es/ESMovieManager.java
index ab95ee1..4aec8bf 100644
--- a/src/ca/ualberta/ssrg/movies/es/ESMovieManager.java
+++ b/src/ca/ualberta/ssrg/movies/es/ESMovieManager.java
@@ -1,16 +1,13 @@
package ca.ualberta.ssrg.movies.es;
-import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.List;
import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
@@ -23,167 +20,129 @@
import ca.ualberta.ssrg.movies.es.data.SimpleSearchCommand;
import com.google.gson.Gson;
+import com.google.gson.JsonIOException;
+import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken;
-public class ESMovieManager implements IMovieManager {
+public class ESMovieManager {
- private static final String SEARCH_URL = "http://cmput301.softwareprocess.es:8080/testing/movie/_search";
- private static final String RESOURCE_URL = "http://cmput301.softwareprocess.es:8080/testing/movie/";
private static final String TAG = "MovieSearch";
-
private Gson gson;
+ private Movies movies = new Movies();
+
+ public Movies getMovies() {
+ return movies;
+ }
- public ESMovieManager() {
+ public ESMovieManager(String search) {
gson = new Gson();
+ searchMovies(search, null);
}
/**
* Get a movie with the specified id
*/
public Movie getMovie(int id) {
-
+ SearchHit sr = null;
HttpClient httpClient = new DefaultHttpClient();
- HttpGet httpGet = new HttpGet(RESOURCE_URL + id);
+ HttpGet httpGet = new HttpGet(movies.getResourceUrl() + id);
- HttpResponse response;
+ HttpResponse response = null;
try {
response = httpClient.execute(httpGet);
- SearchHit sr = parseMovieHit(response);
- return sr.getSource();
-
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- return null;
- }
-
-
-
- /**
- * Get movies with the specified search string. If the search does not
- * specify fields, it searches on all the fields.
- */
- public List searchMovies(String searchString, String field) {
- List result = new ArrayList();
-
- // TODO: Implement search movies using ElasticSearch
+ } catch (ClientProtocolException e1) {
+ throw new RuntimeException(e1);
+ } catch (IOException e1) {
+ throw new RuntimeException(e1);
+ }
- return result;
- }
-
- /**
- * Adds a new movie
- */
- public void addMovie(Movie movie) {
- HttpClient httpClient = new DefaultHttpClient();
+ Type searchHitType = new TypeToken>() {}.getType();
try {
- HttpPost addRequest = new HttpPost(RESOURCE_URL + movie.getId());
-
- StringEntity stringEntity = new StringEntity(gson.toJson(movie));
- addRequest.setEntity(stringEntity);
- addRequest.setHeader("Accept", "application/json");
+ sr = gson.fromJson(
+ new InputStreamReader(response.getEntity().getContent()),
+ searchHitType);
+ } catch (JsonIOException e) {
+ throw new RuntimeException(e);
+ } catch (JsonSyntaxException e) {
+ throw new RuntimeException(e);
+ } catch (IllegalStateException e) {
+ throw new RuntimeException(e);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
- HttpResponse response = httpClient.execute(addRequest);
- String status = response.getStatusLine().toString();
- Log.i(TAG, status);
+ return sr.getSource();
- } catch (Exception e) {
- e.printStackTrace();
- }
}
/**
- * Deletes the movie with the specified id
+ * Get movies with the specified search string. If the search does not
+ * specify fields, it searches on all the fields.
*/
- public void deleteMovie(int movieId) {
- HttpClient httpClient = new DefaultHttpClient();
+ public void searchMovies(String searchString, String field) {
+ Movies result = new Movies();
- try {
- HttpDelete deleteRequest = new HttpDelete(RESOURCE_URL + movieId);
- deleteRequest.setHeader("Accept", "application/json");
+ /**
+ * Creates a search request from a search string and a field
+ */
- HttpResponse response = httpClient.execute(deleteRequest);
- String status = response.getStatusLine().toString();
- Log.i(TAG, status);
-
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- /**
- * Creates a search request from a search string and a field
- */
- private HttpPost createSearchRequest(String searchString, String field) throws UnsupportedEncodingException {
-
- HttpPost searchRequest = new HttpPost(SEARCH_URL);
+ HttpPost searchRequest = new HttpPost(movies.getSearchUrl());
String[] fields = null;
if (field != null) {
- fields = new String[1];
- fields[0] = field;
+ throw new UnsupportedOperationException("Not implemented!");
}
-
- SimpleSearchCommand command = new SimpleSearchCommand(searchString, fields);
-
- String query = command.getJsonCommand();
+
+ SimpleSearchCommand command = new SimpleSearchCommand(searchString);
+
+ String query = gson.toJson(command);
Log.i(TAG, "Json command: " + query);
- StringEntity stringEntity;
- stringEntity = new StringEntity(query);
+ StringEntity stringEntity = null;
+ try {
+ stringEntity = new StringEntity(query);
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
searchRequest.setHeader("Accept", "application/json");
searchRequest.setEntity(stringEntity);
-
- return searchRequest;
- }
-
- private SearchHit parseMovieHit(HttpResponse response) {
+ HttpClient httpClient = new DefaultHttpClient();
+
+ HttpResponse response = null;
try {
- String json = getEntityContent(response);
- Type searchHitType = new TypeToken>() {}.getType();
-
- SearchHit sr = gson.fromJson(json, searchHitType);
- return sr;
- }
- catch (IOException e) {
- e.printStackTrace();
+ response = httpClient.execute(searchRequest);
+ } catch (ClientProtocolException e) {
+ throw new RuntimeException(e);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
}
- return null;
- }
-
- /**
- * Parses the response of a search
- */
- private SearchResponse parseSearchResponse(HttpResponse response) throws IOException {
- String json;
- json = getEntityContent(response);
-
+ /**
+ * Parses the response of a search
+ */
Type searchResponseType = new TypeToken>() {
}.getType();
- SearchResponse esResponse = gson.fromJson(json, searchResponseType);
-
- return esResponse;
- }
-
- /**
- * Gets content from an HTTP response
- */
- public String getEntityContent(HttpResponse response) throws IOException {
- BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
-
- StringBuffer result = new StringBuffer();
- String line = "";
- while ((line = rd.readLine()) != null) {
- result.append(line);
+ try {
+ SearchResponse esResponse = gson.fromJson(
+ new InputStreamReader(response.getEntity().getContent()),
+ searchResponseType);
+ } catch (JsonIOException e) {
+ throw new RuntimeException(e);
+ } catch (JsonSyntaxException e) {
+ throw new RuntimeException(e);
+ } catch (IllegalStateException e) {
+ throw new RuntimeException(e);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
}
+
+ // Extract the movies from the esResponse and put them in result
- return result.toString();
+ movies.notifyObservers();
}
}
diff --git a/src/ca/ualberta/ssrg/movies/es/IMovieManager.java b/src/ca/ualberta/ssrg/movies/es/IMovieManager.java
deleted file mode 100644
index 448c45d..0000000
--- a/src/ca/ualberta/ssrg/movies/es/IMovieManager.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package ca.ualberta.ssrg.movies.es;
-
-import java.util.List;
-
-
-public interface IMovieManager {
-
- public List searchMovies(String searchString, String field);
- public Movie getMovie(int id);
- public void addMovie(Movie movie);
- public void deleteMovie(int id);
-}
diff --git a/src/ca/ualberta/ssrg/movies/es/Movies.java b/src/ca/ualberta/ssrg/movies/es/Movies.java
new file mode 100644
index 0000000..2a950fd
--- /dev/null
+++ b/src/ca/ualberta/ssrg/movies/es/Movies.java
@@ -0,0 +1,43 @@
+package ca.ualberta.ssrg.movies.es;
+
+import java.util.ArrayList;
+
+import ca.ualberta.ssrg.movies.Observable;
+import ca.ualberta.ssrg.movies.Observer;
+
+public class Movies extends ArrayList implements Observable {
+ private volatile ArrayList observers = new ArrayList();
+ private static final String RESOURCE_URL = "http://cmput301.softwareprocess.es:8080/testing/movie/";
+ private static final String SEARCH_URL = "http://cmput301.softwareprocess.es:8080/testing/movie/_search";
+
+ @Override
+ public void addObserver(Observer o) {
+ observers.add(o);
+ }
+
+ @Override
+ public void deleteObserver(Observer o) {
+ observers.remove(o);
+ }
+
+ @Override
+ public void notifyObservers() {
+ for (Observer o : observers) {
+ o.notifyUpdated(this);
+ }
+ }
+
+ public String getResourceUrl() {
+ return RESOURCE_URL;
+ }
+
+ public String getSearchUrl() {
+ return SEARCH_URL;
+ }
+
+ /**
+ * Java wants this, we don't need it for Gson/Json
+ */
+ private static final long serialVersionUID = 3199561696102797345L;
+
+}
diff --git a/src/ca/ualberta/ssrg/movies/es/MoviesController.java b/src/ca/ualberta/ssrg/movies/es/MoviesController.java
new file mode 100644
index 0000000..a15ceb5
--- /dev/null
+++ b/src/ca/ualberta/ssrg/movies/es/MoviesController.java
@@ -0,0 +1,66 @@
+package ca.ualberta.ssrg.movies.es;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.DefaultHttpClient;
+
+import com.google.gson.Gson;
+
+import android.util.Log;
+
+public class MoviesController {
+ private Gson gson = new Gson();
+ private Movies movies;
+ private static final String TAG = "MoviesController";
+
+
+ public MoviesController(Movies movies) {
+ super();
+ this.movies = movies;
+ }
+
+ /**
+ * Adds a new movie
+ */
+ public void addMovie(Movie movie) {
+ HttpClient httpClient = new DefaultHttpClient();
+
+ try {
+ HttpPost addRequest = new HttpPost(movies.getResourceUrl() + movie.getId());
+
+ StringEntity stringEntity = new StringEntity(gson.toJson(movie));
+ addRequest.setEntity(stringEntity);
+ addRequest.setHeader("Accept", "application/json");
+
+ HttpResponse response = httpClient.execute(addRequest);
+ String status = response.getStatusLine().toString();
+ Log.i(TAG, status);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Deletes the movie with the specified id
+ */
+ public void deleteMovie(int movieId) {
+ HttpClient httpClient = new DefaultHttpClient();
+
+ try {
+ HttpDelete deleteRequest = new HttpDelete(movies.getResourceUrl() + movieId);
+ deleteRequest.setHeader("Accept", "application/json");
+
+ HttpResponse response = httpClient.execute(deleteRequest);
+ String status = response.getStatusLine().toString();
+ Log.i(TAG, status);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+}
diff --git a/src/ca/ualberta/ssrg/movies/es/data/SimpleSearchCommand.java b/src/ca/ualberta/ssrg/movies/es/data/SimpleSearchCommand.java
index a550550..09563dc 100644
--- a/src/ca/ualberta/ssrg/movies/es/data/SimpleSearchCommand.java
+++ b/src/ca/ualberta/ssrg/movies/es/data/SimpleSearchCommand.java
@@ -1,37 +1,57 @@
package ca.ualberta.ssrg.movies.es.data;
public class SimpleSearchCommand {
-
- private String query;
- private String[] fields;
-
+ private SimpleSearchQuery query;
+
public SimpleSearchCommand(String query) {
- this(query, null);
+ super();
+ this.query = new SimpleSearchQuery(query);
}
public SimpleSearchCommand(String query, String[] fields) {
- this.query = query;
- this.fields = fields;
+ super();
+ throw new UnsupportedOperationException("Fields not yet implemented.");
}
- public String getJsonCommand() {
- StringBuffer command = new StringBuffer(
- "{\"query\" : {\"query_string\" : {\"query\" : \"" + query
- + "\"");
+ public SimpleSearchQuery getQuery() {
+ return query;
+ }
- if (fields != null) {
- command.append(", \"fields\": [");
+ public void setQuery(SimpleSearchQuery query) {
+ this.query = query;
+ }
- for (int i = 0; i < fields.length; i++) {
- command.append("\"" + fields[i] + "\", ");
- }
- command.delete(command.length() - 2, command.length());
+ static class SimpleSearchQuery {
+ private SimpleSearchQueryString queryString;
+
+ public SimpleSearchQuery(String query) {
+ super();
+ this.queryString = new SimpleSearchQueryString(query);
+ }
- command.append("]");
+ public SimpleSearchQueryString getQueryString() {
+ return queryString;
}
- command.append("}}}");
+ public void setQueryString(SimpleSearchQueryString queryString) {
+ this.queryString = queryString;
+ }
+
+ static class SimpleSearchQueryString {
+ private String query;
+
+ public SimpleSearchQueryString(String query) {
+ super();
+ this.query = query;
+ }
- return command.toString();
+ public String getQuery() {
+ return query;
+ }
+
+ public void setQuery(String query) {
+ this.query = query;
+ }
+ }
}
}