From c59f3499b8919a463c91673b8336232660c56336 Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Mon, 30 Nov 2015 21:42:54 +0200 Subject: [PATCH 01/14] Fixed tests for Language settings. Fixed Fake Book Data to load correctly. --- .../android/presentation/about/AboutActivityTest.java | 8 +++++++- .../listbooks/OverflowMenuOptionsTest.java | 8 ++++++++ .../presentation/listbooks/ListBooksActivityTest.java | 10 +++++++--- .../org/bookdash/android/domain/pojo/BookDetail.java | 6 ++---- .../presentation/listbooks/ListBooksActivity.java | 4 +++- app/src/main/res/menu/menu_main.xml | 1 + .../Injection.java | 0 .../data/books/FakeBookDetailApiImpl.java | 10 +++++----- .../data/settings/FakeSettingsApiImpl.java | 0 9 files changed, 33 insertions(+), 14 deletions(-) rename app/src/mock/java/{org.bookdash.bookdash => org.bookdash.android}/Injection.java (100%) rename app/src/mock/java/{org.bookdash.bookdash => org.bookdash.android}/data/books/FakeBookDetailApiImpl.java (84%) rename app/src/mock/java/{org.bookdash.bookdash => org.bookdash.android}/data/settings/FakeSettingsApiImpl.java (100%) diff --git a/app/src/androidTest/java/org/bookdash/android/presentation/about/AboutActivityTest.java b/app/src/androidTest/java/org/bookdash/android/presentation/about/AboutActivityTest.java index 76f095c..d24eff9 100644 --- a/app/src/androidTest/java/org/bookdash/android/presentation/about/AboutActivityTest.java +++ b/app/src/androidTest/java/org/bookdash/android/presentation/about/AboutActivityTest.java @@ -11,6 +11,8 @@ import android.text.Html; import android.view.View; +import junit.framework.Assert; + import org.bookdash.android.R; import org.junit.After; import org.junit.Before; @@ -71,11 +73,15 @@ public void loadAboutBookDash_SeeInformation() throws Throwable { @Test public void clickLearnMore_OpenBrowser() throws Throwable { - onView(withText("LEARN MORE")).perform(scrollTo(),click()); + onView(withText(R.string.learn_more)).perform(scrollTo(), click()); intended(allOf(hasAction(Intent.ACTION_VIEW), hasData(Uri.parse("http://bookdash.org")) ) ); } + @Test + public void testGetScreenName(){ + Assert.assertEquals("About Screen",testRule.getActivity().getScreenName()); + } } diff --git a/app/src/androidTest/java/org/bookdash/android/presentation/listbooks/OverflowMenuOptionsTest.java b/app/src/androidTest/java/org/bookdash/android/presentation/listbooks/OverflowMenuOptionsTest.java index 8b29386..ea12d85 100644 --- a/app/src/androidTest/java/org/bookdash/android/presentation/listbooks/OverflowMenuOptionsTest.java +++ b/app/src/androidTest/java/org/bookdash/android/presentation/listbooks/OverflowMenuOptionsTest.java @@ -61,6 +61,14 @@ public void tearDown() { Intents.release(); } + @Test + public void languageItemClick_ShowLanguageChooser() { + //When + onView(withId(R.id.action_language_choice)).perform(click()); + + //Then + onView(withText(R.string.language_selection_heading)).inRoot(isDialog()).check(matches(isDisplayed())); + } @Test public void aboutMenuClick_ShowAboutBookDashScreen() { diff --git a/app/src/androidTestMock/java/org.bookdash.android/presentation/listbooks/ListBooksActivityTest.java b/app/src/androidTestMock/java/org.bookdash.android/presentation/listbooks/ListBooksActivityTest.java index b96a276..e498bea 100644 --- a/app/src/androidTestMock/java/org.bookdash.android/presentation/listbooks/ListBooksActivityTest.java +++ b/app/src/androidTestMock/java/org.bookdash.android/presentation/listbooks/ListBooksActivityTest.java @@ -13,6 +13,8 @@ import android.test.suitebuilder.annotation.LargeTest; import android.view.MenuItem; +import junit.framework.Assert; + import org.bookdash.android.R; import org.bookdash.android.data.settings.FakeSettingsApiImpl; import org.bookdash.android.presentation.about.AboutActivity; @@ -104,9 +106,7 @@ public void openScreen_AppBarTitleIsCorrect() { @Test public void chooseDifferentLanguage_NewBooksLoaded(){ - openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext()); - String title = InstrumentationRegistry.getTargetContext().getString(R.string.action_language_choice); - onView(withText(title)).perform(click()); + onView(withId(R.id.action_language_choice)).perform(click()); //When onView(withText("Zulu")).perform(click()); @@ -118,6 +118,10 @@ public void chooseDifferentLanguage_NewBooksLoaded(){ onView(withText("Why is Nita Upside Down?")).check(doesNotExist()); } + @Test + public void testGetScreenName_IsBookListing(){ + Assert.assertEquals("BookListingScreen", activityTestRule.getActivity().getScreenName()); + } diff --git a/app/src/main/java/org/bookdash/android/domain/pojo/BookDetail.java b/app/src/main/java/org/bookdash/android/domain/pojo/BookDetail.java index f51214e..be0808d 100644 --- a/app/src/main/java/org/bookdash/android/domain/pojo/BookDetail.java +++ b/app/src/main/java/org/bookdash/android/domain/pojo/BookDetail.java @@ -38,7 +38,8 @@ public BookDetail(String title, String bookCoverUrl, String objectId, Language l put(BOOK_TITLE_COL, title); put(BOOK_COVER_PAGE_URL_COL, bookCoverUrl); put(BOOK_LANGUAGE_COL, languageId); - put(OBJECT_ID, objectId); + setObjectId(objectId); + // put(OBJECT_ID, objectId); //put(); } @@ -66,9 +67,6 @@ public String getAboutBook() { return getString(ABOUT_BOOK_COL); } - public String getBookDetailId() { - return getString(OBJECT_ID); - } public String getFolderLocation(String filesDir) { return getFolderLocation(new File(filesDir, getObjectId() + File.separator)); diff --git a/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java b/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java index 0c8edd7..ab99155 100644 --- a/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java +++ b/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java @@ -205,7 +205,9 @@ public void openBookDetails(View v) { Intent intent = new Intent(ListBooksActivity.this, BookInfoActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.putExtra(BookInfoActivity.BOOK_PARCEL, ((BookViewHolder) v.getTag()).bookDetail.toBookParcelable()); + BookViewHolder viewHolder = (BookViewHolder)v.getTag(); + BookDetail bookDetailResult = viewHolder.bookDetail; + intent.putExtra(BookInfoActivity.BOOK_PARCEL, bookDetailResult.toBookParcelable()); startActivity(intent); /* }*/ diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index 4a77d08..6494df1 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -5,6 +5,7 @@ diff --git a/app/src/mock/java/org.bookdash.bookdash/Injection.java b/app/src/mock/java/org.bookdash.android/Injection.java similarity index 100% rename from app/src/mock/java/org.bookdash.bookdash/Injection.java rename to app/src/mock/java/org.bookdash.android/Injection.java diff --git a/app/src/mock/java/org.bookdash.bookdash/data/books/FakeBookDetailApiImpl.java b/app/src/mock/java/org.bookdash.android/data/books/FakeBookDetailApiImpl.java similarity index 84% rename from app/src/mock/java/org.bookdash.bookdash/data/books/FakeBookDetailApiImpl.java rename to app/src/mock/java/org.bookdash.android/data/books/FakeBookDetailApiImpl.java index 2e2d39e..d5d72dd 100644 --- a/app/src/mock/java/org.bookdash.bookdash/data/books/FakeBookDetailApiImpl.java +++ b/app/src/mock/java/org.bookdash.android/data/books/FakeBookDetailApiImpl.java @@ -34,14 +34,14 @@ public FakeBookDetailApiImpl() { languages.add(language1); BookDetail bookDetail = new BookDetail("Searching for Spring", - "http://org.bookdash.android.org/wp-content/uploads/2015/09/searching-for-the-spirit-of-spring_pdf-ebook-20150921_Page_01.jpg", "f4r2gho2h", language); + "http://bookdash.org/wp-content/uploads/2015/09/searching-for-the-spirit-of-spring_pdf-ebook-20150921_Page_01.jpg", "f4r2gho2h", language); BookDetail bookDetail2 = new BookDetail("Why is Nita Upside Down?", - "http://org.bookdash.android.org/wp-content/uploads/2015/09/why-is-nita-upside-down_pdf-ebook_20150920_Page_01.jpg", "12r2gho2h", language); + "http://bookdash.org/wp-content/uploads/2015/09/why-is-nita-upside-down_pdf-ebook_20150920_Page_01.jpg", "12r2gho2h", language); BookDetail bookDetailZu = new BookDetail("[ZULU]isipilingi", - "http://org.bookdash.android.org/wp-content/uploads/2015/09/searching-for-the-spirit-of-spring_pdf-ebook-20150921_Page_01.jpg", "f4r2gho2h", language1); + "http://bookdash.org/wp-content/uploads/2015/09/searching-for-the-spirit-of-spring_pdf-ebook-20150921_Page_01.jpg", "f4r2gho2h", language1); BookDetail bookDetailZu2 = new BookDetail("[ZULU]kubheke phansi", - "http://org.bookdash.android.org/wp-content/uploads/2015/09/why-is-nita-upside-down_pdf-ebook_20150920_Page_01.jpg", "12r2gho2h", language1); + "http://bookdash.org/wp-content/uploads/2015/09/why-is-nita-upside-down_pdf-ebook_20150920_Page_01.jpg", "12r2gho2h", language1); bookDetails.add(bookDetail); bookDetails.add(bookDetail2); @@ -79,7 +79,7 @@ public void getBookDetail(String bookDetailId, BookServiceCallback b bookServiceCallback.onError(new Exception("BOOK DETAIL ERROR")); } else { for (BookDetail b : bookDetails) { - if (b.getBookDetailId().equals(bookDetailId)) { + if (b.getObjectId().equals(bookDetailId)) { bookServiceCallback.onLoaded(b); return; } diff --git a/app/src/mock/java/org.bookdash.bookdash/data/settings/FakeSettingsApiImpl.java b/app/src/mock/java/org.bookdash.android/data/settings/FakeSettingsApiImpl.java similarity index 100% rename from app/src/mock/java/org.bookdash.bookdash/data/settings/FakeSettingsApiImpl.java rename to app/src/mock/java/org.bookdash.android/data/settings/FakeSettingsApiImpl.java From ec8ebc22514f31d9611f7808f320939e830f9cd0 Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Mon, 30 Nov 2015 22:04:35 +0200 Subject: [PATCH 02/14] Added travis.yml file --- .travis.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..10afdf6 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,18 @@ +language: android +android: + components: + # Uncomment the lines below if you want to + # use the latest revision of Android SDK Tools + - platform-tools + - tools + + # The BuildTools version used by your project + - build-tools-23.0.1 + + # The SDK version used to compile your project + - android-23 + + # Additional components + - extra-google-google_play_services + - extra-google-m2repository + - extra-android-m2repository \ No newline at end of file From 27a23f3f5ce4e4e81d381869e326d0ce6616fb8a Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Tue, 1 Dec 2015 18:44:21 +0200 Subject: [PATCH 03/14] Updated proguard and checking if release-keystore.properties file exists to get the signing configs before attempting to use properties from the file. --- app/build.gradle | 31 +++++++++++++++++-------------- app/proguard-rules.pro | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d9f0250..0cc7d20 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -32,19 +32,26 @@ android { versionCode 11 versionName "1.0.11" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + buildConfigField "String", "PARSE_APPLICATION_ID", appConfig.PARSE_APPLICATION_ID + buildConfigField "String", "PARSE_CLIENT_KEY", appConfig.PARSE_CLIENT_KEY + } - signingConfigs { - release { - def props = new Properties() + File signFile = rootProject.file('release-keystore.properties') + if (signFile.exists()) { + signingConfigs { + release { + def props = new Properties() - props.load(new FileInputStream(rootProject.file("release-keystore.properties"))) + props.load(new FileInputStream(signFile)) - storeFile rootProject.file(props.keyStore) - storePassword props.keyStorePassword - keyAlias props.keyAlias - keyPassword props.keyAliasPassword + storeFile rootProject.file(props.keyStore) + storePassword props.keyStorePassword + keyAlias props.keyAlias + keyPassword props.keyAliasPassword + } } } + packagingOptions { exclude 'META-INF/ASL2.0' exclude 'META-INF/LICENSE' @@ -84,16 +91,12 @@ android { buildTypes { release { shrinkResources false - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-project.txt' + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro' signingConfig signingConfigs.release - buildConfigField "String", "PARSE_APPLICATION_ID", appConfig.PARSE_APPLICATION_ID - buildConfigField "String", "PARSE_CLIENT_KEY", appConfig.PARSE_CLIENT_KEY ext.enableCrashlytics = true } debug { - buildConfigField "String", "PARSE_APPLICATION_ID", appConfig.PARSE_APPLICATION_ID - buildConfigField "String", "PARSE_CLIENT_KEY", appConfig.PARSE_CLIENT_KEY ext.enableCrashlytics = false // Run code coverage reports by default on debug builds. testCoverageEnabled = true diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index a8b8aeb..ecf03c4 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -15,5 +15,41 @@ #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} +-ignorewarnings + -keep class me.zhanghai.android.materialprogressbar.** { *; } --keep class com.joanzapata.** { *; } \ No newline at end of file +-keep class com.joanzapata.** { *; } +-keep class com.parse.** { *; } + + + + +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { + **[] $VALUES; + public *; +} + +-keep class com.crashlytics.** { *; } +-keep class com.crashlytics.android.** +-keepattributes SourceFile,LineNumberTable + +-keepattributes Signature +-keepattributes InnerClass +-keep class com.squareup.okhttp.** {*;} +-keep class za.co.riggaroo.materialhelptutorial.view.** { *;} +-keep class mbanje.kurt.fabbutton.** {*;} +-keep class com.google.android.gms.** {*;} +-keep class android.support.v7.** {*;} + +-keep class android.support.design.** {*;} +-keep class android.support.v4.** {*;} +# For using GSON @Expose annotation +-keepattributes *Annotation* + +# Gson specific classes +-keep class sun.misc.Unsafe { *; } +#-keep class com.google.gson.stream.** { *; } + +# Application classes that will be serialized/deserialized over Gson +-keep class org.bookdash.android.domain.pojo.gson.** { *; } \ No newline at end of file From 035a917f637fccefb069e6d625c20eefa9288a23 Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Tue, 1 Dec 2015 19:03:01 +0200 Subject: [PATCH 04/14] Removed appconfig-sample.properties, properties are now defined in the gradle.properties file, and this can be editted to your Parse API key and client id. --- .travis.yml | 2 +- app/build.gradle | 9 +++------ appconfig-sample.properties | 2 -- gradle.properties | 5 ++++- 4 files changed, 8 insertions(+), 10 deletions(-) delete mode 100644 appconfig-sample.properties diff --git a/.travis.yml b/.travis.yml index 10afdf6..15b02d1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ android: - tools # The BuildTools version used by your project - - build-tools-23.0.1 + - build-tools-23.0.2 # The SDK version used to compile your project - android-23 diff --git a/app/build.gradle b/app/build.gradle index 0cc7d20..3b719d6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,13 +17,10 @@ repositories { } -def appConfig = new Properties() - -appConfig.load(new FileInputStream(rootProject.file("appconfig.properties"))) android { compileSdkVersion 23 - buildToolsVersion "23.0.1" + buildToolsVersion "23.0.2" defaultConfig { applicationId "org.bookdash.android" @@ -32,8 +29,8 @@ android { versionCode 11 versionName "1.0.11" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - buildConfigField "String", "PARSE_APPLICATION_ID", appConfig.PARSE_APPLICATION_ID - buildConfigField "String", "PARSE_CLIENT_KEY", appConfig.PARSE_CLIENT_KEY + buildConfigField "String", "PARSE_APPLICATION_ID", "\"${BOOKDASH_PARSE_APP_ID}\"" + buildConfigField "String", "PARSE_CLIENT_KEY", "\"${BOOKDASH_PARSE_CLIENT_ID}\"" } File signFile = rootProject.file('release-keystore.properties') diff --git a/appconfig-sample.properties b/appconfig-sample.properties deleted file mode 100644 index f56ea86..0000000 --- a/appconfig-sample.properties +++ /dev/null @@ -1,2 +0,0 @@ -PARSE_CLIENT_KEY="parseclientkey" -PARSE_APPLICATION_ID="parseapplicationid" \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index e9b5c1c..47c2a41 100644 --- a/gradle.properties +++ b/gradle.properties @@ -34,4 +34,7 @@ org.gradle.parallel=true # Enables new incubating mode that makes Gradle selective when configuring projects. # Only relevant projects are configured which results in faster builds for large multi-projects. # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:configuration_on_demand -org.gradle.configureondemand=true \ No newline at end of file +org.gradle.configureondemand=true + +BOOKDASH_PARSE_CLIENT_ID= +BOOKDASH_PARSE_APP_ID=< parseapplicationid > \ No newline at end of file From 92662b8501bcd98fd87030bb40f6eae5a02e57ad Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Tue, 1 Dec 2015 19:12:13 +0200 Subject: [PATCH 05/14] Only setting signing config when its present in the settings --- app/build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 3b719d6..2b81528 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,6 +47,8 @@ android { keyPassword props.keyAliasPassword } } + buildTypes.release.signingConfig signingConfigs.release + } packagingOptions { @@ -90,7 +92,6 @@ android { shrinkResources false minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro' - signingConfig signingConfigs.release ext.enableCrashlytics = true } debug { From 4a75cff03b9b596f7b6cb0529af5d5afec6a3d85 Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Tue, 1 Dec 2015 19:33:59 +0200 Subject: [PATCH 06/14] up'ed version of build tools in fab button to 23 --- fabbutton/build.gradle | 8 ++++---- .../src/main/java/mbanje/kurt/fabbutton/FabButton.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/fabbutton/build.gradle b/fabbutton/build.gradle index fd0250c..bda068d 100644 --- a/fabbutton/build.gradle +++ b/fabbutton/build.gradle @@ -33,12 +33,12 @@ def siteUrl = 'https://github.com/ckurtm/FabButton' def gitUrl = 'https://github.com/ckurtm/FabButton.git' android { - compileSdkVersion 22 - buildToolsVersion "22.0.1" + compileSdkVersion 23 + buildToolsVersion "23.0.2" defaultConfig { minSdkVersion 14 - targetSdkVersion 22 + targetSdkVersion 23 versionCode 10 versionName version } @@ -51,7 +51,7 @@ android { } dependencies { - compile 'com.android.support:design:22.2.0' + compile 'com.android.support:design:23.1.1' } Properties properties = new Properties() diff --git a/fabbutton/src/main/java/mbanje/kurt/fabbutton/FabButton.java b/fabbutton/src/main/java/mbanje/kurt/fabbutton/FabButton.java index 60a2e26..bfd2b9f 100644 --- a/fabbutton/src/main/java/mbanje/kurt/fabbutton/FabButton.java +++ b/fabbutton/src/main/java/mbanje/kurt/fabbutton/FabButton.java @@ -311,7 +311,7 @@ private void animateIn(FabButton button) { .start(); } else { Animation anim = android.view.animation.AnimationUtils.loadAnimation( - button.getContext(), R.anim.fab_in); + button.getContext(), R.anim.design_fab_in); anim.setDuration(200); anim.setInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR); button.startAnimation(anim); @@ -345,7 +345,7 @@ public void onAnimationEnd(View view) { }).start(); } else { Animation anim = android.view.animation.AnimationUtils.loadAnimation( - button.getContext(), R.anim.fab_out); + button.getContext(), R.anim.design_fab_out); anim.setInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR); anim.setDuration(200); anim.setAnimationListener(new AnimationUtils.AnimationListenerAdapter() { From 12fb099202f8cd3d1a8779ea8059011b59c493be Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Tue, 1 Dec 2015 19:42:22 +0200 Subject: [PATCH 07/14] removed properties check for fab button as its failing the build. --- fabbutton/build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fabbutton/build.gradle b/fabbutton/build.gradle index bda068d..1185e8b 100644 --- a/fabbutton/build.gradle +++ b/fabbutton/build.gradle @@ -53,6 +53,7 @@ android { dependencies { compile 'com.android.support:design:23.1.1' } +/* Properties properties = new Properties() properties.load(project.rootProject.file('local.properties').newDataInputStream()) @@ -120,6 +121,7 @@ task javadocJar(type: Jar, dependsOn: javadoc) { from javadoc.destinationDir } + artifacts { archives javadocJar archives sourcesJar @@ -132,3 +134,4 @@ task findConventions << { task wrapper(type: Wrapper) { } +*/ \ No newline at end of file From e9e97ce4dc25d0926882c296ebfb83c5353ae89c Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Tue, 1 Dec 2015 19:54:18 +0200 Subject: [PATCH 08/14] Removed GA from imports and dependencies --- app/build.gradle | 3 --- .../main/java/org/bookdash/android/BookDashApplication.java | 2 -- .../bookdash/android/presentation/about/AboutPresenter.java | 5 ----- .../android/presentation/activity/BaseAppCompatActivity.java | 2 -- .../android/presentation/listbooks/ListBooksActivity.java | 2 -- .../android/presentation/readbook/BookDetailActivity.java | 2 -- 6 files changed, 16 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2b81528..b1e3997 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,7 +9,6 @@ buildscript { } apply plugin: 'com.android.application' apply plugin: 'com.android.databinding' -apply plugin: 'com.google.gms.google-services' apply plugin: 'io.fabric' repositories { @@ -142,7 +141,6 @@ dependencies { exclude module: 'support-annotations' exclude module: 'support-v4' } - compile 'com.google.android.gms:play-services-analytics:8.3.0' compile fileTree(dir: 'libs', include: ['*.jar']) compile project(':fabbutton') @@ -163,5 +161,4 @@ dependencies { transitive = true; } compile 'za.co.riggaroo:materialhelptutorial:1.0.3' - compile 'com.google.android.gms:play-services-appindexing:8.3.0' } diff --git a/app/src/main/java/org/bookdash/android/BookDashApplication.java b/app/src/main/java/org/bookdash/android/BookDashApplication.java index 4c314fc..2ce5503 100644 --- a/app/src/main/java/org/bookdash/android/BookDashApplication.java +++ b/app/src/main/java/org/bookdash/android/BookDashApplication.java @@ -5,8 +5,6 @@ import com.crashlytics.android.Crashlytics; import com.crashlytics.android.core.CrashlyticsCore; -import com.google.android.gms.analytics.GoogleAnalytics; -import com.google.android.gms.analytics.Tracker; import com.parse.Parse; import com.parse.ParseException; import com.parse.ParseObject; diff --git a/app/src/main/java/org/bookdash/android/presentation/about/AboutPresenter.java b/app/src/main/java/org/bookdash/android/presentation/about/AboutPresenter.java index a586446..13aa4db 100644 --- a/app/src/main/java/org/bookdash/android/presentation/about/AboutPresenter.java +++ b/app/src/main/java/org/bookdash/android/presentation/about/AboutPresenter.java @@ -1,10 +1,5 @@ package org.bookdash.android.presentation.about; -import com.google.android.gms.analytics.HitBuilders; -import com.google.android.gms.analytics.Tracker; - -import org.bookdash.android.BookDashApplication; -import org.bookdash.android.data.utils.GAnalytics; /** * @author rebeccafranks diff --git a/app/src/main/java/org/bookdash/android/presentation/activity/BaseAppCompatActivity.java b/app/src/main/java/org/bookdash/android/presentation/activity/BaseAppCompatActivity.java index 3df5f8d..70dd41d 100644 --- a/app/src/main/java/org/bookdash/android/presentation/activity/BaseAppCompatActivity.java +++ b/app/src/main/java/org/bookdash/android/presentation/activity/BaseAppCompatActivity.java @@ -3,8 +3,6 @@ import android.os.Bundle; import android.support.v7.app.AppCompatActivity; -import com.google.android.gms.analytics.HitBuilders; -import com.google.android.gms.analytics.Tracker; import org.bookdash.android.BookDashApplication; diff --git a/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java b/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java index ab99155..a2353ab 100644 --- a/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java +++ b/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java @@ -20,8 +20,6 @@ import android.widget.LinearLayout; import android.widget.TextView; -import com.google.android.gms.analytics.HitBuilders; -import com.google.android.gms.analytics.Tracker; import org.bookdash.android.BookDashApplication; import org.bookdash.android.BuildConfig; diff --git a/app/src/main/java/org/bookdash/android/presentation/readbook/BookDetailActivity.java b/app/src/main/java/org/bookdash/android/presentation/readbook/BookDetailActivity.java index d80856a..699cde5 100644 --- a/app/src/main/java/org/bookdash/android/presentation/readbook/BookDetailActivity.java +++ b/app/src/main/java/org/bookdash/android/presentation/readbook/BookDetailActivity.java @@ -5,8 +5,6 @@ import android.view.ViewTreeObserver; import android.view.WindowManager; -import com.google.android.gms.analytics.HitBuilders; - import org.bookdash.android.R; import org.bookdash.android.presentation.activity.BaseAppCompatActivity; import org.bookdash.android.domain.pojo.gson.BookPages; From 855e22177ecab3687774413fc854405559da524b Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Sat, 5 Dec 2015 16:17:55 +0200 Subject: [PATCH 09/14] Added deep linking and sharing of the books. At the moment it just shares a link to th e playstore to download the book. Need the website to implement book loading according to the same database before we can do proper deep linked. Sad face. --- app/build.gradle | 2 + app/src/main/AndroidManifest.xml | 23 ++ .../android/domain/pojo/BookDetail.java | 6 + .../domain/pojo/BookDetailParcelable.java | 11 + .../bookinfo/BookInfoActivity.java | 207 ++++++++++-------- .../bookinfo/BookInfoContract.java | 3 + .../bookinfo/BookInfoPresenter.java | 6 + app/src/main/res/drawable/ic_share.xml | 9 + app/src/main/res/menu/menu_book_info.xml | 11 + app/src/main/res/mipmap-hdpi/ic_share.png | Bin 0 -> 569 bytes app/src/main/res/mipmap-mdpi/ic_share.png | Bin 0 -> 410 bytes app/src/main/res/mipmap-xhdpi/ic_share.png | Bin 0 -> 802 bytes app/src/main/res/mipmap-xxhdpi/ic_share.png | Bin 0 -> 1446 bytes app/src/main/res/mipmap-xxxhdpi/ic_share.png | Bin 0 -> 2272 bytes app/src/main/res/values/strings.xml | 3 + 15 files changed, 192 insertions(+), 89 deletions(-) create mode 100644 app/src/main/res/drawable/ic_share.xml create mode 100644 app/src/main/res/menu/menu_book_info.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_share.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_share.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_share.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_share.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_share.png diff --git a/app/build.gradle b/app/build.gradle index b1e3997..35124aa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -161,4 +161,6 @@ dependencies { transitive = true; } compile 'za.co.riggaroo:materialhelptutorial:1.0.3' + + compile 'com.google.android.gms:play-services-appindexing:8.3.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6cb5448..cac59ee 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,24 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/org/bookdash/android/domain/pojo/BookDetail.java b/app/src/main/java/org/bookdash/android/domain/pojo/BookDetail.java index be0808d..aadedc9 100644 --- a/app/src/main/java/org/bookdash/android/domain/pojo/BookDetail.java +++ b/app/src/main/java/org/bookdash/android/domain/pojo/BookDetail.java @@ -26,6 +26,7 @@ public class BookDetail extends ParseObject { public static final String BOOK_ENABLED_COL = "book_enabled"; public static final String CREATED_AT_COL = "createdAt"; public static final String BOOK_INFO_FILE_NAME = "bookdetails.json"; + private static final String WEB_URL_COL = "book_website_link"; private boolean isDownloading = false; @@ -98,6 +99,11 @@ public BookDetailParcelable toBookParcelable() { bookDetailParcelable.setBookTitle(getBookTitle()); bookDetailParcelable.setBookImageUrl(getBookCoverUrl()); bookDetailParcelable.setBookDetailObjectId(getObjectId()); + bookDetailParcelable.setWebUrl(getWebUrl()); return bookDetailParcelable; } + + public String getWebUrl() { + return getString(WEB_URL_COL); + } } \ No newline at end of file diff --git a/app/src/main/java/org/bookdash/android/domain/pojo/BookDetailParcelable.java b/app/src/main/java/org/bookdash/android/domain/pojo/BookDetailParcelable.java index f55ec5e..01cb3ad 100644 --- a/app/src/main/java/org/bookdash/android/domain/pojo/BookDetailParcelable.java +++ b/app/src/main/java/org/bookdash/android/domain/pojo/BookDetailParcelable.java @@ -33,6 +33,7 @@ public void setBookTitle(String bookTitle) { private String bookImageUrl; private String bookDownloadUrl; private String bookTitle; + private String webUrl; public String getBookDetailObjectId() { return bookDetailObjectId; @@ -55,6 +56,7 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeString(this.bookDownloadUrl); dest.writeString(this.bookTitle); dest.writeString(this.bookDetailObjectId); + dest.writeString(this.webUrl); } public BookDetailParcelable() { @@ -65,6 +67,7 @@ protected BookDetailParcelable(Parcel in) { this.bookDownloadUrl = in.readString(); this.bookTitle = in.readString(); this.bookDetailObjectId = in.readString(); + this.webUrl = in.readString(); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { @@ -76,4 +79,12 @@ public BookDetailParcelable[] newArray(int size) { return new BookDetailParcelable[size]; } }; + + public String getWebUrl() { + return webUrl; + } + + public void setWebUrl(String webUrl) { + this.webUrl = webUrl; + } } diff --git a/app/src/main/java/org/bookdash/android/presentation/bookinfo/BookInfoActivity.java b/app/src/main/java/org/bookdash/android/presentation/bookinfo/BookInfoActivity.java index ea28c79..0d478eb 100644 --- a/app/src/main/java/org/bookdash/android/presentation/bookinfo/BookInfoActivity.java +++ b/app/src/main/java/org/bookdash/android/presentation/bookinfo/BookInfoActivity.java @@ -8,6 +8,7 @@ import android.graphics.BitmapFactory; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.GradientDrawable; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; @@ -15,12 +16,15 @@ import android.support.design.widget.CollapsingToolbarLayout; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.Snackbar; +import android.support.v7.app.ActionBar; import android.support.v7.widget.CardView; import android.support.v7.widget.Toolbar; import android.transition.Transition; import android.util.DisplayMetrics; import android.util.Log; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; import android.view.View; import android.view.ViewTreeObserver; import android.view.Window; @@ -33,6 +37,9 @@ import android.widget.ProgressBar; import android.widget.TextView; +import com.google.android.gms.appindexing.Action; +import com.google.android.gms.appindexing.AppIndex; +import com.google.android.gms.common.api.GoogleApiClient; import com.parse.GetDataCallback; import com.parse.ParseException; import com.parse.ParseFile; @@ -78,27 +85,15 @@ public class BookInfoActivity extends BaseAppCompatActivity implements BookInfoC private ProgressBar loadingProgressBar; private CardView contributorCard, mainBookCard; private Toolbar toolbar; - private android.support.v7.app.ActionBar actionBar; + private ActionBar actionBar; private BookDetail bookInfo; - - /* private SharedElementCallback fabLoginSharedElementCallback = new SharedElementCallback() { - @Override - public Parcelable onCaptureSharedElementSnapshot(View sharedElement, - Matrix viewToGlobalMatrix, - RectF screenBounds) { - // store a snapshot of the fab to fade out when morphing to the login dialog - int bitmapWidth = Math.round(screenBounds.width()); - int bitmapHeight = Math.round(screenBounds.height()); - Bitmap bitmap = null; - if (bitmapWidth > 0 && bitmapHeight > 0) { - bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888); - sharedElement.draw(new Canvas(bitmap)); - } - return bitmap; - } - };*/ - - + private Action viewAction; + /** + * ATTENTION: This was auto-generated to implement the App Indexing API. + * See https://g.co/AppIndexing/AndroidStudio for more information. + */ + private GoogleApiClient client; + private Button errorRetryButton; @Override @@ -140,32 +135,13 @@ public void onTransitionResume(Transition transition) { imageViewBook = (ImageView) findViewById(R.id.image_view_book_cover); appBarLayout = (AppBarLayout) findViewById(R.id.app_bar_layout); mainBookCard = (CardView) findViewById(R.id.card_view_main_book_info); - final BookDetailParcelable bookDetailParcelable = getIntent().getParcelableExtra(BOOK_PARCEL); toolbar = (Toolbar) findViewById(R.id.toolbar); coordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinator_layout_content); errorLayout = findViewById(R.id.linear_layout_error); errorText = (TextView) findViewById(R.id.text_view_error_screen); - Button errorRetryButton = (Button) findViewById(R.id.button_retry); - loadingProgressBar = (ProgressBar) findViewById(R.id.activity_loading_book_info); - errorRetryButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - actionsListener.loadBookInformation(bookDetailParcelable.getBookDetailObjectId()); - } - }); - - binding.setVariable(BR.download_click, new View.OnClickListener() { - @Override - public void onClick(View v) { - if (bookInfo == null){ - showSnackBarMessage(R.string.book_not_available); - return; - } - floatingActionButton.showProgress(true); - actionsListener.downloadBook(bookInfo); - } - }); + errorRetryButton = (Button) findViewById(R.id.button_retry); + loadingProgressBar = (ProgressBar) findViewById(R.id.activity_loading_book_info); setSupportActionBar(toolbar); actionBar = getSupportActionBar(); if (actionBar != null) { @@ -177,72 +153,87 @@ public void onClick(View v) { floatingActionButton = (FabButton) findViewById(R.id.fab_download); floatingActionButton.setScaleX(0); floatingActionButton.setScaleY(0); - // floatingActionButton.setPivotX(0.5f); - //floatingActionButton.setPivotY(0.5f); - + binding.setVariable(BR.download_click, new View.OnClickListener() { + @Override + public void onClick(View v) { + if (bookInfo == null) { + showSnackBarMessage(R.string.book_not_available); + return; + } + floatingActionButton.showProgress(true); + actionsListener.downloadBook(bookInfo); + } + }); actionsListener = new BookInfoPresenter(this.getApplicationContext(), this, Injection.provideBookRepo()); - actionsListener.loadBookInformation(bookDetailParcelable.getBookDetailObjectId()); - - actionsListener.loadImage(bookDetailParcelable.getBookImageUrl()); calculateLayoutHeight(); imageViewBook.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver .OnPreDrawListener() { @Override public boolean onPreDraw() { imageViewBook.getViewTreeObserver().removeOnPreDrawListener(this); - /* if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - startPostponedEnterTransition(); - }else {*/ - enterAnimation(); - /* }*/ + enterAnimation(); return true; } }); - // showProgress(false); + final BookDetailParcelable bookDetailParcelable = getIntent().getParcelableExtra(BOOK_PARCEL); + + if (bookDetailParcelable!=null) { + String bookDetailId = bookDetailParcelable.getBookDetailObjectId(); + startLoadingBook(bookDetailId); + actionsListener.loadImage(bookDetailParcelable.getBookImageUrl()); + } else { + onNewIntent(getIntent()); + } + client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); + + } + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_book_info, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + + int id = item.getItemId(); + + if (id == R.id.action_share_book) { + actionsListener.shareBookClicked(bookInfo); + return true; + } + + return super.onOptionsItemSelected(item); + } + private void startLoadingBook(final String bookDetailId) { + errorRetryButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + actionsListener.loadBookInformation(bookDetailId); + } + }); + + actionsListener.loadBookInformation(bookDetailId); showBookDetailView(); + } + + protected void onNewIntent(Intent intent) { + String action = intent.getAction(); + String data = intent.getDataString(); + if (Intent.ACTION_VIEW.equals(action) && data != null) { + String bookId = data.substring(data.lastIndexOf("/") + 1); + startLoadingBook(bookId); + } } - /** - * Animate in the title, description and author – can't do this in a content transition as they - * are within the ListView so do it manually. Also handle the FAB tanslation here so that it - * plays nicely with #calculateFabPosition - */ private void enterAnimation() { - /* if (gradientBackground != null) { - gradientBackground.setAlpha(0); - ObjectAnimator anim = ObjectAnimator.ofFloat(gradientBackground, "alpha", 0f, 1f); - anim.setDuration(500); - anim.setStartDelay(50); - anim.setInterpolator(new DecelerateInterpolator()); - anim.start(); - }*/ + floatingActionButton.setScaleX(0); floatingActionButton.setScaleY(0); floatingActionButton.animate().setStartDelay(500).scaleY(1).scaleX(1).setInterpolator(new OvershootInterpolator()).setDuration(getResources().getInteger(android.R.integer.config_mediumAnimTime)).start(); - //mainBookCard.setTranslationY(mainBookCard.getHeight()); - //mainBookCard.animate().translationY(0).setInterpolator(new DecelerateInterpolator()).start(); - /* scrollView.setAlpha(0); - ObjectAnimator anim2 = ObjectAnimator.ofFloat(scrollView, "alpha", 0f, 1f); - anim2.setDuration(500); - anim2.setStartDelay(50); - anim2.setInterpolator(new DecelerateInterpolator()); - anim2.start(); - // contributorCard.setTranslationY(contributorCard.getHeight()); - // contributorCard.animate().translationY(0).setInterpolator(new DecelerateInterpolator()).start(); - contributorCard.setAlpha(0); - ObjectAnimator animContributor = ObjectAnimator.ofFloat(contributorCard, "alpha", 0f, 1f); - animContributor.setDuration(500); - animContributor.setStartDelay(50); - animContributor.setInterpolator(new DecelerateInterpolator()); - animContributor.start();*/ - - /* ObjectAnimator anim2 = ObjectAnimator.ofFloat(appBarLayout, "alpha", 0f, 1f); - anim2.setDuration(500); - anim2.setStartDelay(50); - anim2.setInterpolator(new DecelerateInterpolator()); - anim2.start();*/ + } @@ -317,7 +308,7 @@ public void showDownloadFinished() { @Override public void setToolbarTitle(String title) { toolbar.setTitle(title); - android.support.v7.app.ActionBar actionBar = getSupportActionBar(); + ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setTitle(title); } @@ -328,8 +319,20 @@ public void setToolbarTitle(String title) { @Override public void setBookInfoBinding(BookDetail bookInfo) { + client.connect(); + this.bookInfo = bookInfo; binding.setVariable(BR.book_info, bookInfo); + actionsListener.loadImage(bookInfo.getBookCoverUrl()); + viewAction = Action.newAction( + Action.TYPE_VIEW, + bookInfo.getBookTitle(), + bookInfo.getWebUrl() == null ? null : Uri.parse(bookInfo.getWebUrl()), + Uri.parse("android-app://org.bookdash.android/http/bookdash.org/books/" + bookInfo.getObjectId()) + ); + if (viewAction!=null) { + AppIndex.AppIndexApi.start(client, viewAction); + } } @Override @@ -405,6 +408,15 @@ public void setToolbarColor(int color) { } } + @Override + public void sendShareEvent(String bookTitle) { + Intent sendIntent = new Intent(); + sendIntent.setAction(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.sharing_book_title,bookTitle)); + sendIntent.setType("text/plain"); + startActivity(sendIntent); + } + private void setContributorInfo(@NonNull View v, @NonNull BookContributor bookContributor) { TextView textViewContributor = (TextView) v.findViewById(R.id.textViewContributorName); TextView textViewRole = (TextView) v.findViewById(R.id.textViewRole); @@ -432,4 +444,21 @@ public void done(byte[] bytes, ParseException e) { }); } + @Override + public void onStart() { + super.onStart(); + + + } + + @Override + public void onStop() { + super.onStop(); + + if (viewAction!=null){ + AppIndex.AppIndexApi.end(client, viewAction); + + } + client.disconnect(); + } } diff --git a/app/src/main/java/org/bookdash/android/presentation/bookinfo/BookInfoContract.java b/app/src/main/java/org/bookdash/android/presentation/bookinfo/BookInfoContract.java index 8e33f75..6120edb 100644 --- a/app/src/main/java/org/bookdash/android/presentation/bookinfo/BookInfoContract.java +++ b/app/src/main/java/org/bookdash/android/presentation/bookinfo/BookInfoContract.java @@ -43,6 +43,8 @@ interface View { void setAccentColor(int accentColor); void setToolbarColor(int color); + + void sendShareEvent(String bookTitle); } interface UserActionsListener { @@ -53,5 +55,6 @@ interface UserActionsListener { void loadImage(String url); + void shareBookClicked(BookDetail bookInfo); } } diff --git a/app/src/main/java/org/bookdash/android/presentation/bookinfo/BookInfoPresenter.java b/app/src/main/java/org/bookdash/android/presentation/bookinfo/BookInfoPresenter.java index 4b79478..0b8ad02 100644 --- a/app/src/main/java/org/bookdash/android/presentation/bookinfo/BookInfoPresenter.java +++ b/app/src/main/java/org/bookdash/android/presentation/bookinfo/BookInfoPresenter.java @@ -130,6 +130,12 @@ public void onResourceReady(Bitmap resource, GlideAnimation glid }); } + @Override + public void shareBookClicked(BookDetail bookInfo) { + + booksView.sendShareEvent(bookInfo.getBookTitle()); + } + private void extractPaletteColors(Bitmap resource) { Palette.from(resource).generate(new Palette.PaletteAsyncListener() { @Override diff --git a/app/src/main/res/drawable/ic_share.xml b/app/src/main/res/drawable/ic_share.xml new file mode 100644 index 0000000..8c4d989 --- /dev/null +++ b/app/src/main/res/drawable/ic_share.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/menu/menu_book_info.xml b/app/src/main/res/menu/menu_book_info.xml new file mode 100644 index 0000000..9bce331 --- /dev/null +++ b/app/src/main/res/menu/menu_book_info.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_share.png b/app/src/main/res/mipmap-hdpi/ic_share.png new file mode 100644 index 0000000000000000000000000000000000000000..82ae2cf14ae00234084ec26ab4830fbd8847d1fc GIT binary patch literal 569 zcmV-90>=G`P)eM~N(0P07+`@{z23tmG>; zJ{H9BOx?wFo9o_t?#OiB=U2booyB>YbI$vodu~n+A%qY@2qAOirwBeN|1?Vps88t;lM+xwGoU>w z0nKX$v@a!~Db0Y^q!fj_ngNZO988r}9e-$s^9;*O45k!D;j0S9h-twTTE*aFn!#Se zLD&P|T!Q(AGp4l=L-0DyU>~dnI+XH!V{-epg0OQ8yG#nF8=j;Y=nI^MCBOW(2KK{A zI1HPzeX!-Q78ZMWw#_=Ku#;Sn7h$C-|9~)@gI6ho{DKKM0Sj!;H^6O&bz=k8nKV5* z;H}GonXslpHC%N#$BDyM({`K|AKUN^e0K=1)5JO@51t07PcGmt*d+mj zx}Jr-AeYO{DnV!0`QQ}!DZZJVot@nzQK?iamFkaWj2Q{hbOrX{7G9wZM=%|N`3bl- z`Fez^^Z*V`u`Wc{JG=}C;6v;xU~IM+-kre? zbPMW#Q;P9fIDx)1*LR=o_sejXG5-u(5{ys6fy;E7)pNTNng5kw1-4<$?vLLvSA%0{ zK@;Y`{5A%=E|aOQU`aw&N8vQ5W^G;XL&Ke-scv9H(nf50_V0VBiyF{eP4@;Ex4nG_ z$`bqcs%Q46q@JF^2M~4%1;2^E(MBIKZFF7YN)#PrWw8g@5JriXh*9ES40F+p)6raL zqPbGWa;XpdSta;~ttg%rT@c|u?&j@_M5R)xRH`576E7eIs_wcMPXGV_07*qoM6N<$ Eg552)6951J literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_share.png b/app/src/main/res/mipmap-xhdpi/ic_share.png new file mode 100644 index 0000000000000000000000000000000000000000..29dce7ef37bc08676144e05d003a52062e8f79c6 GIT binary patch literal 802 zcmV+-1Ks?IP)=6^I9WV^;iNndak6*-(*^`)Pt+p7v3pp z!La;H;%wOXZPG2nwzJM>X)6w=8{Z>c4b=MA(%S;&|B?>ja{8aF^U_QU13&orzFUm9 zNH21j|6MwY)6F}ZQ{LQGWn;vJ)FiaafywBC-_^x$+ zNaxm!M^a6?D_xLw<94HAgVOWBux!#T#JJUH-Uew%Iw>8O_DO3pezwn-gT)r*;+|_g zak_cAsQF*#zkKz-*xr=S?~v}Ke73$__*B}D+l}UJlpbX4G=56w>ie$#X&LvmJdIaA zTsF*`n7`Q{^~lQ&xAz*@G=J~ApDvtEZx3sUJu|-F@5bfU0h}>5e%2ogVF;G-*Z5)iUZ(9?FbfRt}3Yb z&l;C?R2%}=)l?h+7dA!EigIOH#UXHMUj!j=ZDj-@aB*t{A#inZgo`wncLM+b00000 g0000004z8D07A4ZSTq`SRR91007*qoM6N<$f(ck}4FCWD literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_share.png b/app/src/main/res/mipmap-xxhdpi/ic_share.png new file mode 100644 index 0000000000000000000000000000000000000000..02e9456ecf623b893885b8a3980e70f0028f9f31 GIT binary patch literal 1446 zcmaJ>i#O8?9M`BkdU#~=3~eP@Ii|cd^4RizEOAB1MTW4tqvT9i!fm#nyo!-m#%!2p zNRe1|O`h3EW*#e)vAn|N{sDc@`F_9Wd_SLazUT8f=le}|cCAc_TtCTgYv~uV?lkZgn%5r}) zmm7V1;q%PKmwa*ZEB3LKmLYb~tDVKa3Gs&zR5|262oA+z?4{v zBHM-A-6LW$22kacqu6A)cgH=yBbo5Nett!2tGn45{50gA(Z#_@*|OIR zMCI-vQ(d}PCYTn4_bQ9^20aqql^L_&#k~Z*MF?d|tO|Gb=}Ou%t-Hu{8(HeS`D2Qb zrBb(7$n-Rp?*Iq2w93b4tlH8UV1}e$3jC4)-7~Lb7MUVJ`0++jdxY0}BwrzxWKNcs zuvN($_B!4)S=CL4It(4ihql>GGqfj0fp7ZO6&;{Zsc$IeMxfwaAcO^1UGxiVCkByu zxdBc~MjP?yF+xeYqAzj_sll=ia}NmA_RZx3as;Pz`bcpIB`LtE&W#Q(@__OoZY>A4hQ0h;(CK-mX|AeK zdmwzijo-=0O$4L}tf!{x9Rxa&2jP*x5X-0HI*d5z}kC+cE?WCZ8CR3TF z!3-Im3l(`qFl#-(vZ>YM3v2?(RGVxN>_c#~fyZ)$+DxV?CZ>Fj@cv|8eLugeMN{0j zK!Ola*dNvDgX~*ZOh$y7HN*`$3me7Q-(zk}sFtf`Auil`xwS?t?}9p41mTs+j6oXG zHzh^S6yiBJ@vG|Nhh>FNzPYJE-X52x>#5gSwb&=RgFg1`p+J=aV8!~6E%Kr7DoSn{ zz$!aQTCCD_Q9|?r+nc7utn0Wy!}Yf$PRo&zcfX40$t0&$B2H+c+h@p*{pHGCmGSX$H)-ij4LB=q zdKS^Eke0SU7HUZ!8++tj?AjjGrjdvUP|f#$UXrt;z1N#HYytcKgmB=pj9oWGK^98* zX&iX=06NXCfJ8o9xZ)~Yg}mUq6b!nXn&WTB0=Ar+T`r5OV&zL%B@>&v$&6WKk0AK_ zPmH!I9g!X#zVfMS_0})hbEVm9+ZSlfj?NlQvjU*e2G8 zN-hU4Wd(<%v=WV}M)CTCI`zm7C`a{)zyy;tVvSX^Y(mzZXTGqFV$wp{nCY$hu#~z% t@=1+D%eYwO>ztke-H<)Md2S++i)VF}frHzBE7EppC~HS6n&q{G{{XzRyPW_4 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_share.png b/app/src/main/res/mipmap-xxxhdpi/ic_share.png new file mode 100644 index 0000000000000000000000000000000000000000..9b90d65597ac5ca6275b251f48daaf15ea338aa1 GIT binary patch literal 2272 zcmb7F`9Bkm8=s~*+FWC1u8&+(TgyU(xk=W6)Lc0~ zUD9QI6GrA(h?e-sO<(#CKF{m*9IxkjyAI)y63fo&2Bj#i)AI94`Bp<|`04J58j_fL<%gEdqQsTx zE4FL4YvZGD3G+z{!=ZKUm+7$G=Ko!WCyEYJz3E)0-Z$QUn?ub6Xa}8zXWO$eQEpM# z(?%NvHjeFQhBHH-?$H*hDp}j8*`bhYW{aF&iS_L}b+i-gcAd8d#1vvYi&T?nx2f?z zdQiHEq$+Z)W(4z~{2v!mxo))&eCR2R?mT#Av|o?Z%)yNSxo z6C$;2wW!^PD@j?cH(Z;Mloxq0WN?)OVnr`r#DC0SA?<+=FGrf(W+7SpLBCRuEJdPX zR*D;lB|~7m1GKU?b7qmEK=7r-@&ii}Xc3eG(U$^hX1$O79jDTvdUnY|fXC*@a7s@d z&Ts)?CG`vd{3|TERT_sDP$ekF$b?WFgXYXWfz$!AWd!thfJ-#+x#G3>wV+3dBd;hn z42U`^^UP%E{0ZAWr3X#jS9g>eG~F{XORF#gx#E~b(+qn%E{#Vp>-EkEoc4TEnn{|B zk#%m0E3U7E#6hV_ce2)U8=of($6p^y!L;M9J@0pgu1aC7BT&1svUa`)G_7r~*-XaOb=x8l& zQf*|m1;bH|oTH|-qbH5~LHMA5ZdROE7juC6SDSZEW&68FZtFagYcz6eemQ?;*yyBp zw^pahT$}{JEpMNG^W4ami`!f$!C{`pm{B7?&9EWG~p6JJQ?YKP1;gvG& z7Nlbx&3dwZRm1OIf8|q2z>yMBCOt<_FQ)}hsy6vcnCF!tvO9>q)5?E9JI6kW>zkIJ zlksVA<)T zVC3cSuT6!R!-K;b=u-O5NjKYH_~i=Mk=iZZhuR6)&-mVnQ(WWpsgUpxZk{Mi+bx9 zwYaGUvA32n%cCLh#XqOTI`dRdrRqa|M4hA65ttX|V^I}AIQU1zInY}AZ$3RA;o(RC z0k@65N1{>b2{o^pwd2?*HHy$v;d~MvTuIv_NRz!&>5Xj=7|^951)vj?!@x*IS!TP~ zkZ2kyJXyg9KGwhAsxL(fL~T%X>0Rw`JaUj?EF|D?9zwcO6v!)DC>uiB^CU`95v>NxEI%~E>_{CdeK1z$pC#b*cj>!V)0IC{eCLTCmmb@0<6!9+#)ip6!i?tzE0KVOQD2U2SB0?V1lKtz-#_^J~*6-lQG?kFDaEL|@y+m5DqF?M68DObD z=O7F>&^SGZKJWCFtcn!0fLjk4f7s~A#h3mSw{ zENh=J{0kOV5g>t5BqAl0{hbTaJ~H+;>m#;V$_8gCyPHSd`Qlcavkwf&Y!G^d$={M! zT-a9*Hr7W0XQifoAMi50ms5<8dZ$(G-`DvciK-VbOx1yK=SNniz#E!+QvCoE!TzGE zeZu7s&ZnT51Q&OFA4n)JpNJRksS{ZYrGoeY$u8!15epZRNHkQ0mO^e|V3EZ597a~n z6__*3ZsCxvR}|C%Ci!J)z*Gh2G7pvoX=~`n2qC8B z*j`cW(xqaa!R?I5QS7m$Az)u2G9ewrT^8kuXDNlyLeCwvMt;L`zDirA#Md}ovF!f+ zSzFsKT5qXG)$hRD4~Nlb%R-x<-W!|F{2mGMGc*isS!GR(J-7qL1zn3Grv4u_Wby_8 literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fac4fbb..6bcfdb9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -69,5 +69,8 @@ book_background book + View Books + Share + I have just read \"%s\". Download Book Dash now and read it for free! http://play.google.com/store/apps/details?id=org.bookdash.android From d840cc61c4b9d36f9c1a1d50bce4f26bef35e172 Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Sat, 5 Dec 2015 18:05:20 +0200 Subject: [PATCH 10/14] Added App Invites when clicking on the menu option "Invite Friends". --- app/build.gradle | 5 +- .../listbooks/ListBooksActivity.java | 52 ++++++++++++++++--- app/src/main/res/menu/menu_main.xml | 5 ++ app/src/main/res/values/strings.xml | 5 ++ build.gradle | 1 + 5 files changed, 58 insertions(+), 10 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 35124aa..2913caa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,6 +9,7 @@ buildscript { } apply plugin: 'com.android.application' apply plugin: 'com.android.databinding' +apply plugin: 'com.google.gms.google-services' apply plugin: 'io.fabric' repositories { @@ -161,6 +162,6 @@ dependencies { transitive = true; } compile 'za.co.riggaroo:materialhelptutorial:1.0.3' - - compile 'com.google.android.gms:play-services-appindexing:8.3.0' + compile "com.google.android.gms:play-services-appinvite:$rootProject.ext.googlePlayServicesVersion" + compile "com.google.android.gms:play-services-appindexing:$rootProject.ext.googlePlayServicesVersion" } diff --git a/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java b/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java index a2353ab..603371e 100644 --- a/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java +++ b/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java @@ -21,6 +21,8 @@ import android.widget.TextView; +import com.google.android.gms.appinvite.AppInviteInvitation; + import org.bookdash.android.BookDashApplication; import org.bookdash.android.BuildConfig; import org.bookdash.android.Injection; @@ -38,6 +40,7 @@ public class ListBooksActivity extends BaseAppCompatActivity implements ListBooksContract.View { + private static final int INVITE_REQUEST_CODE = 1; private ListBooksContract.UserActionsListener actionsListener; @@ -88,8 +91,6 @@ public void onClick(View v) { private TextView textViewErrorMessage; - - private View.OnClickListener bookClickListener = new View.OnClickListener() { @Override public void onClick(View v) { @@ -132,9 +133,44 @@ public boolean onOptionsItemSelected(MenuItem item) { showThanksPopover(); return true; } + if (id == R.id.action_invite_friends) { + openInvitePage(); + return true; + } return super.onOptionsItemSelected(item); } + private void openInvitePage() { + try { + Intent intent = new AppInviteInvitation.IntentBuilder(getString(R.string.invitation_title)) + .setMessage(getString(R.string.invitation_message)) + .setCallToActionText(getString(R.string.invitation_cta)) + .build(); + startActivityForResult(intent, INVITE_REQUEST_CODE); + } catch (ActivityNotFoundException ac) { + Snackbar.make(mRecyclerView, R.string.common_google_play_services_api_unavailable_text, Snackbar.LENGTH_LONG).show(); + } + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + Log.d(TAG, "onActivityResult: requestCode=" + requestCode + ", resultCode=" + resultCode); + + if (requestCode == INVITE_REQUEST_CODE) { + if (resultCode == RESULT_OK) { + // Check how many invitations were sent and log a message + // The ids array contains the unique invitation ids for each invitation sent + // (one for each contact select by the user). You can use these for analytics + // as the ID will be consistent on the sending and receiving devices. + String[] ids = AppInviteInvitation.getInvitationIds(resultCode, data); + Log.d(TAG, getString(R.string.sent_invitations_fmt, ids.length)); + } else { + // Sending failed or it was canceled, show failure message to the user + Log.d(TAG, "invite send failed:" + requestCode + ",resultCode:" + resultCode); + } + } + } private DialogInterface.OnClickListener languageClickListener = new DialogInterface.OnClickListener() { @Override @@ -201,12 +237,12 @@ public void openBookDetails(View v) { } else {*/ - Intent intent = new Intent(ListBooksActivity.this, BookInfoActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - BookViewHolder viewHolder = (BookViewHolder)v.getTag(); - BookDetail bookDetailResult = viewHolder.bookDetail; - intent.putExtra(BookInfoActivity.BOOK_PARCEL, bookDetailResult.toBookParcelable()); - startActivity(intent); + Intent intent = new Intent(ListBooksActivity.this, BookInfoActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + BookViewHolder viewHolder = (BookViewHolder) v.getTag(); + BookDetail bookDetailResult = viewHolder.bookDetail; + intent.putExtra(BookInfoActivity.BOOK_PARCEL, bookDetailResult.toBookParcelable()); + startActivity(intent); /* }*/ } diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index 6494df1..fdbc559 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -25,5 +25,10 @@ android:orderInCategory="4" android:title="@string/rate_this_app" app:showAsAction="never" /> + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6bcfdb9..54782ab 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -72,5 +72,10 @@ View Books Share I have just read \"%s\". Download Book Dash now and read it for free! http://play.google.com/store/apps/details?id=org.bookdash.android + Download Book Dash + Install + You should install Book Dash for access to some great free books. + Sent invites to %d + Invite Friends diff --git a/build.gradle b/build.gradle index c80fdfe..99ae20a 100644 --- a/build.gradle +++ b/build.gradle @@ -24,6 +24,7 @@ ext { // App dependencies supportLibraryVersion = '23.1.1' + googlePlayServicesVersion = '8.3.0' guavaVersion = '18.0' glideVersion = '3.6.1' junitVersion = '4.12' From af03cbf7f104318a08f9cf8bbdb75f0318851304 Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Sun, 6 Dec 2015 11:36:15 +0200 Subject: [PATCH 11/14] Added app invite deep linking check, if we decide to start sending deep links in app invites the app will work. --- .../bookinfo/BookInfoActivity.java | 19 +++++++--- .../listbooks/ListBooksActivity.java | 38 ++++++++++++++++++- .../presentation/splash/SplashActivity.java | 12 ++++-- 3 files changed, 57 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/bookdash/android/presentation/bookinfo/BookInfoActivity.java b/app/src/main/java/org/bookdash/android/presentation/bookinfo/BookInfoActivity.java index 0d478eb..1f46568 100644 --- a/app/src/main/java/org/bookdash/android/presentation/bookinfo/BookInfoActivity.java +++ b/app/src/main/java/org/bookdash/android/presentation/bookinfo/BookInfoActivity.java @@ -178,7 +178,7 @@ public boolean onPreDraw() { }); final BookDetailParcelable bookDetailParcelable = getIntent().getParcelableExtra(BOOK_PARCEL); - if (bookDetailParcelable!=null) { + if (bookDetailParcelable != null) { String bookDetailId = bookDetailParcelable.getBookDetailObjectId(); startLoadingBook(bookDetailId); actionsListener.loadImage(bookDetailParcelable.getBookImageUrl()); @@ -188,6 +188,7 @@ public boolean onPreDraw() { client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); } + @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_book_info, menu); @@ -206,6 +207,7 @@ public boolean onOptionsItemSelected(MenuItem item) { return super.onOptionsItemSelected(item); } + private void startLoadingBook(final String bookDetailId) { errorRetryButton.setOnClickListener(new View.OnClickListener() { @Override @@ -219,11 +221,16 @@ public void onClick(View v) { } protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); String action = intent.getAction(); String data = intent.getDataString(); - if (Intent.ACTION_VIEW.equals(action) && data != null) { - String bookId = data.substring(data.lastIndexOf("/") + 1); + Log.d(TAG, "onNewIntent() called: action" + action); + if (Intent.ACTION_VIEW.equals(action) && data != null) { + Uri uri = Uri.parse(data); + String bookId = uri.getLastPathSegment(); + String invitationId = uri.getQueryParameter("invitation_id"); + Log.d(TAG, "Action View: book id:" + bookId + ". Full URL:" + uri.toString() + ". InvitationId:" + invitationId); startLoadingBook(bookId); } } @@ -330,7 +337,7 @@ public void setBookInfoBinding(BookDetail bookInfo) { bookInfo.getWebUrl() == null ? null : Uri.parse(bookInfo.getWebUrl()), Uri.parse("android-app://org.bookdash.android/http/bookdash.org/books/" + bookInfo.getObjectId()) ); - if (viewAction!=null) { + if (viewAction != null) { AppIndex.AppIndexApi.start(client, viewAction); } } @@ -412,7 +419,7 @@ public void setToolbarColor(int color) { public void sendShareEvent(String bookTitle) { Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); - sendIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.sharing_book_title,bookTitle)); + sendIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.sharing_book_title, bookTitle)); sendIntent.setType("text/plain"); startActivity(sendIntent); } @@ -455,7 +462,7 @@ public void onStart() { public void onStop() { super.onStop(); - if (viewAction!=null){ + if (viewAction != null) { AppIndex.AppIndexApi.end(client, viewAction); } diff --git a/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java b/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java index 603371e..af296ec 100644 --- a/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java +++ b/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java @@ -21,9 +21,13 @@ import android.widget.TextView; +import com.google.android.gms.appinvite.AppInvite; import com.google.android.gms.appinvite.AppInviteInvitation; +import com.google.android.gms.appinvite.AppInviteInvitationResult; +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.api.GoogleApiClient; +import com.google.android.gms.common.api.ResultCallback; -import org.bookdash.android.BookDashApplication; import org.bookdash.android.BuildConfig; import org.bookdash.android.Injection; import org.bookdash.android.R; @@ -42,6 +46,7 @@ public class ListBooksActivity extends BaseAppCompatActivity implements ListBook private static final int INVITE_REQUEST_CODE = 1; private ListBooksContract.UserActionsListener actionsListener; + private GoogleApiClient googleApiClient; @Override @@ -79,8 +84,36 @@ public void onClick(View v) { actionsListener.loadLanguages(); actionsListener.loadBooksForLanguagePreference(); + checkIfComingFromInvite(); + } - + private void checkIfComingFromInvite(){ + googleApiClient = new GoogleApiClient.Builder(this) + .addApi(AppInvite.API) + .enableAutoManage(this, new GoogleApiClient.OnConnectionFailedListener() { + @Override + public void onConnectionFailed(ConnectionResult connectionResult) { + Log.d(TAG, "onConnectionFailed: onResult:" + connectionResult.toString()); + + } + }) + .build(); + + // Check for App Invite invitations and launch deep-link activity if possible. + // Requires that an Activity is registered in AndroidManifest.xml to handle + // deep-link URLs. + boolean autoLaunchDeepLink = true; + AppInvite.AppInviteApi.getInvitation(googleApiClient, this, autoLaunchDeepLink) + .setResultCallback( + new ResultCallback() { + @Override + public void onResult(AppInviteInvitationResult result) { + Log.d(TAG, "getInvitation:onResult:" + result.getStatus()); + // Because autoLaunchDeepLink = true we don't have to do anything + // here, but we could set that to false and manually choose + // an Activity to launch to handle the deep link here. + } + }); } private static final String TAG = ListBooksActivity.class.getCanonicalName(); @@ -145,6 +178,7 @@ private void openInvitePage() { Intent intent = new AppInviteInvitation.IntentBuilder(getString(R.string.invitation_title)) .setMessage(getString(R.string.invitation_message)) .setCallToActionText(getString(R.string.invitation_cta)) + // .setDeepLink(Uri.parse("http://bookdash.org/books/dK5BJWxPIf")) .build(); startActivityForResult(intent, INVITE_REQUEST_CODE); } catch (ActivityNotFoundException ac) { diff --git a/app/src/main/java/org/bookdash/android/presentation/splash/SplashActivity.java b/app/src/main/java/org/bookdash/android/presentation/splash/SplashActivity.java index f20ac0e..7b23df1 100644 --- a/app/src/main/java/org/bookdash/android/presentation/splash/SplashActivity.java +++ b/app/src/main/java/org/bookdash/android/presentation/splash/SplashActivity.java @@ -16,6 +16,7 @@ * @since 2015/07/16 3:16 PM */ public class SplashActivity extends AppCompatActivity implements SplashContract.View { + private static final int SPLASH_SCREEN_REQUEST_CODE = 1; private SplashContract.UserActionsListener splashPresenter; @Override @@ -23,20 +24,23 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); splashPresenter = new SplashPresenter(this, Injection.provideSettingsRepo(this)); + showSplashAfterDelay(); + } + + private void showSplashAfterDelay(){ (new Handler()).postDelayed(new Runnable() { @Override public void run() { splashPresenter.loadSplash(); } }, 1000); - } + } @Override public void loadTutorial() { Intent mainAct = new Intent(SplashActivity.this, MaterialTutorialActivity.class); mainAct.putParcelableArrayListExtra(MaterialTutorialActivity.MATERIAL_TUTORIAL_ARG_TUTORIAL_ITEMS, splashPresenter.getTutorialItems(this)); - startActivityForResult(mainAct, 4325); - // finish(); + startActivityForResult(mainAct, SPLASH_SCREEN_REQUEST_CODE); } @@ -51,7 +55,7 @@ public void loadMainScreen() { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // super.onActivityResult(requestCode, resultCode, data); - if (resultCode == RESULT_OK && requestCode == 4325){ + if (resultCode == RESULT_OK && requestCode == SPLASH_SCREEN_REQUEST_CODE){ splashPresenter.finishedTutorial(); } From b47e6e59bb2bba92e63925d38e6e721a458479be Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Sun, 6 Dec 2015 19:33:16 +0200 Subject: [PATCH 12/14] Added Google Analytics back to the app. Updated the readme --- README.md | 8 +++++--- app/build.gradle | 2 ++ .../java/org/bookdash/android/BookDashApplication.java | 10 ++++++---- .../presentation/listbooks/ListBooksActivity.java | 10 +--------- app/src/main/res/layout/activity_tutorial.xml | 1 + app/src/main/res/values/strings.xml | 2 +- 6 files changed, 16 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 53bf61f..08f974c 100644 --- a/README.md +++ b/README.md @@ -46,10 +46,12 @@ http://bookdash.org/ /parse_data_example/ If you want to download the actual books, you need to individually download each book and import the files into the parse manually. See the information here: https://www.parse.com/questions/exporting-file-objects-and-importing-to-another-application -4. Change the Parse API Key and Client Key in the file to your unique parse key: /appconfig-sample.properties . +4. Change the Parse API Key and Client Key in the file to your unique parse key: /gradle.properties . 5. Setup a Fabric Account. https://fabric.io/dashboard -6. Get your Fabric API Key and Client key, change it in the file: /app/fabric-sample.properties -7. If you wish to build a release version you will need to create your own keystore file and edit the password values in the following file - (create a version of the file without the .sample extension): release-keystore.properties.sample +6. Get your Fabric API Key and Client key, change it in the file: /app/fabric-sample.properties and rename the file to fabric.properties +7. Go generate a google-services.json file by following the instructions here: https://developers.google.com/mobile/add?platform=android +You will need to select App Invites API and Google Analytics and enter your SHA-1 of your debug keystore. +8. If you wish to build a release version you will need to create your own keystore file and edit the password values in the following file - (create a version of the file without the .sample extension): release-keystore.properties.sample # License Copyright 2015 Book Dash. diff --git a/app/build.gradle b/app/build.gradle index 2913caa..87d72e4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -164,4 +164,6 @@ dependencies { compile 'za.co.riggaroo:materialhelptutorial:1.0.3' compile "com.google.android.gms:play-services-appinvite:$rootProject.ext.googlePlayServicesVersion" compile "com.google.android.gms:play-services-appindexing:$rootProject.ext.googlePlayServicesVersion" + + compile "com.google.android.gms:play-services-analytics:$rootProject.ext.googlePlayServicesVersion" } diff --git a/app/src/main/java/org/bookdash/android/BookDashApplication.java b/app/src/main/java/org/bookdash/android/BookDashApplication.java index 2ce5503..28666ce 100644 --- a/app/src/main/java/org/bookdash/android/BookDashApplication.java +++ b/app/src/main/java/org/bookdash/android/BookDashApplication.java @@ -5,6 +5,8 @@ import com.crashlytics.android.Crashlytics; import com.crashlytics.android.core.CrashlyticsCore; +import com.google.android.gms.analytics.GoogleAnalytics; +import com.google.android.gms.analytics.Tracker; import com.parse.Parse; import com.parse.ParseException; import com.parse.ParseObject; @@ -26,7 +28,7 @@ public class BookDashApplication extends Application { public static boolean isTablet = false; public static String FILES_DIR; - // private Tracker mTracker; + private Tracker mTracker; @Override public void onCreate() { @@ -57,7 +59,7 @@ public void done(ParseException e) { }); isTablet = getResources().getBoolean(R.bool.is_tablet); FILES_DIR = getFilesDir().getPath(); - // getDefaultTracker().enableAutoActivityTracking(true); + getDefaultTracker().enableAutoActivityTracking(true); } @@ -65,12 +67,12 @@ public void done(ParseException e) { * Gets the default {@link Tracker} for this {@link Application}. * @return tracker */ - /* synchronized public Tracker getDefaultTracker() { + synchronized public Tracker getDefaultTracker() { if (mTracker == null) { GoogleAnalytics analytics = GoogleAnalytics.getInstance(this); // To enable debug logging use: adb shell setprop log.tag.GAv4 DEBUG mTracker = analytics.newTracker(R.xml.global_tracker); } return mTracker; - }*/ + } } diff --git a/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java b/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java index af296ec..81bf573 100644 --- a/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java +++ b/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java @@ -98,20 +98,12 @@ public void onConnectionFailed(ConnectionResult connectionResult) { } }) .build(); - - // Check for App Invite invitations and launch deep-link activity if possible. - // Requires that an Activity is registered in AndroidManifest.xml to handle - // deep-link URLs. - boolean autoLaunchDeepLink = true; - AppInvite.AppInviteApi.getInvitation(googleApiClient, this, autoLaunchDeepLink) + AppInvite.AppInviteApi.getInvitation(googleApiClient, this, true) .setResultCallback( new ResultCallback() { @Override public void onResult(AppInviteInvitationResult result) { Log.d(TAG, "getInvitation:onResult:" + result.getStatus()); - // Because autoLaunchDeepLink = true we don't have to do anything - // here, but we could set that to false and manually choose - // an Activity to launch to handle the deep link here. } }); } diff --git a/app/src/main/res/layout/activity_tutorial.xml b/app/src/main/res/layout/activity_tutorial.xml index f81ff83..9f647a5 100644 --- a/app/src/main/res/layout/activity_tutorial.xml +++ b/app/src/main/res/layout/activity_tutorial.xml @@ -89,4 +89,5 @@ + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 54782ab..1d9a544 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -64,7 +64,7 @@ Available in different languages That anyone can freely translate and distribute. On a single day, designers, writers and illustrators meet to create cool books. - On the bus, in a train, wherever you are - the books are there too. + On the bus, in a train, wherever you are - the books are there too. English, Zulu, Afrikaans, Xhosa and more! book_background From 604ff1ed80cee6f82c8fa99dcc80816bddacc85c Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Mon, 28 Dec 2015 20:46:56 +0200 Subject: [PATCH 13/14] Added side navigation to the list books activity. Added an option to view only downloaded books. Fixed tests for side nav. --- app/build.gradle | 3 +- .../listbooks/OverflowMenuOptionsTest.java | 44 ++-- .../bookinfo/BookInfoActivityTest.java | 2 +- .../listbooks/ListBooksActivityTest.java | 7 +- .../listbooks/ListBooksFailActivityTest.java | 2 +- .../data/books/BookDetailRepository.java | 2 +- .../data/books/BookDetailRepositoryImpl.java | 23 ++- .../activity/BaseAppCompatActivity.java | 2 +- .../bookinfo/BookInfoActivity.java | 29 ++- .../presentation/listbooks/BookAdapter.java | 1 + .../listbooks/BookViewHolder.java | 3 + .../listbooks/ListBooksActivity.java | 164 +++++++++++++-- .../listbooks/ListBooksContract.java | 6 +- .../listbooks/ListBooksPresenter.java | 17 +- .../data/BookDetailRepositoryExtenstion.kt | 0 .../main/res/drawable-hdpi/bookdashlogo.png | Bin 0 -> 58866 bytes .../main/res/drawable-hdpi/ic_action_book.png | Bin 412 -> 0 bytes .../res/drawable-hdpi/ic_action_language.png | Bin 1088 -> 0 bytes .../drawable-hdpi/ic_file_cloud_download.png | Bin 1455 -> 0 bytes .../main/res/drawable-mdpi/ic_action_book.png | Bin 273 -> 0 bytes .../res/drawable-mdpi/ic_action_language.png | Bin 660 -> 0 bytes .../drawable-mdpi/ic_file_cloud_download.png | Bin 895 -> 0 bytes .../res/drawable-xhdpi/ic_action_book.png | Bin 576 -> 0 bytes .../res/drawable-xhdpi/ic_action_language.png | Bin 1501 -> 0 bytes .../drawable-xhdpi/ic_file_cloud_download.png | Bin 2171 -> 0 bytes .../res/drawable-xxhdpi/ic_action_book.png | Bin 1005 -> 0 bytes .../drawable-xxhdpi/ic_action_language.png | Bin 2613 -> 0 bytes .../ic_file_cloud_download.png | Bin 3384 -> 0 bytes .../res/drawable-xxxhdpi/ic_action_book.png | Bin 1677 -> 0 bytes .../drawable-xxxhdpi/ic_action_language.png | Bin 4059 -> 0 bytes .../ic_file_cloud_download.png | Bin 5265 -> 0 bytes app/src/main/res/drawable/book_dash_logo.png | Bin 52082 -> 0 bytes .../drawable/ic_check_circle_black_24dp.xml | 9 + .../drawable/ic_cloud_download_black_24dp.xml | 9 + .../ic_collections_bookmark_black_24dp.xml | 9 + .../drawable/ic_file_download_black_24dp.xml | 9 + .../main/res/drawable/ic_grade_black_24dp.xml | 9 + .../res/drawable/ic_group_add_black_24dp.xml | 9 + .../drawable/ic_info_outline_black_24dp.xml | 9 + .../main/res/drawable/ic_menu_black_24dp.xml | 9 + .../drawable/ic_people_outline_black_24dp.xml | 9 + .../res/drawable/ic_public_black_24dp.xml | 9 + .../res/drawable/ic_settings_black_24dp.xml | 9 + .../layout-land/activity_book_information.xml | 3 +- app/src/main/res/layout/activity_about.xml | 2 +- .../res/layout/activity_book_information.xml | 4 +- app/src/main/res/layout/activity_main.xml | 191 ++++++++++-------- app/src/main/res/layout/drawer_header.xml | 19 ++ app/src/main/res/layout/list_item_book.xml | 12 +- app/src/main/res/menu/menu_drawer.xml | 50 +++++ app/src/main/res/menu/menu_main.xml | 22 +- app/src/main/res/values/strings.xml | 4 + .../kurt/fabbutton/ProgressRingView.java | 7 +- gradle.properties | 37 +--- 54 files changed, 540 insertions(+), 215 deletions(-) create mode 100644 app/src/main/kotlin/org.bookdash.android/data/BookDetailRepositoryExtenstion.kt create mode 100644 app/src/main/res/drawable-hdpi/bookdashlogo.png delete mode 100755 app/src/main/res/drawable-hdpi/ic_action_book.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_action_language.png delete mode 100755 app/src/main/res/drawable-hdpi/ic_file_cloud_download.png delete mode 100755 app/src/main/res/drawable-mdpi/ic_action_book.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_action_language.png delete mode 100755 app/src/main/res/drawable-mdpi/ic_file_cloud_download.png delete mode 100755 app/src/main/res/drawable-xhdpi/ic_action_book.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_action_language.png delete mode 100755 app/src/main/res/drawable-xhdpi/ic_file_cloud_download.png delete mode 100755 app/src/main/res/drawable-xxhdpi/ic_action_book.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_action_language.png delete mode 100755 app/src/main/res/drawable-xxhdpi/ic_file_cloud_download.png delete mode 100755 app/src/main/res/drawable-xxxhdpi/ic_action_book.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_action_language.png delete mode 100755 app/src/main/res/drawable-xxxhdpi/ic_file_cloud_download.png delete mode 100644 app/src/main/res/drawable/book_dash_logo.png create mode 100644 app/src/main/res/drawable/ic_check_circle_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_cloud_download_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_collections_bookmark_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_file_download_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_grade_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_group_add_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_info_outline_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_menu_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_people_outline_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_public_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_settings_black_24dp.xml create mode 100644 app/src/main/res/layout/drawer_header.xml create mode 100644 app/src/main/res/menu/menu_drawer.xml diff --git a/app/build.gradle b/app/build.gradle index 87d72e4..95dab12 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -67,7 +67,6 @@ android { productFlavors { mock { - applicationIdSuffix = ".mock" } prod { @@ -164,6 +163,6 @@ dependencies { compile 'za.co.riggaroo:materialhelptutorial:1.0.3' compile "com.google.android.gms:play-services-appinvite:$rootProject.ext.googlePlayServicesVersion" compile "com.google.android.gms:play-services-appindexing:$rootProject.ext.googlePlayServicesVersion" - + compile "com.android.support:design:$rootProject.ext.googlePlayServicesVersion" compile "com.google.android.gms:play-services-analytics:$rootProject.ext.googlePlayServicesVersion" } diff --git a/app/src/androidTest/java/org/bookdash/android/presentation/listbooks/OverflowMenuOptionsTest.java b/app/src/androidTest/java/org/bookdash/android/presentation/listbooks/OverflowMenuOptionsTest.java index ea12d85..6907aa5 100644 --- a/app/src/androidTest/java/org/bookdash/android/presentation/listbooks/OverflowMenuOptionsTest.java +++ b/app/src/androidTest/java/org/bookdash/android/presentation/listbooks/OverflowMenuOptionsTest.java @@ -2,6 +2,7 @@ import android.content.Intent; import android.net.Uri; +import android.support.design.widget.NavigationView; import android.support.test.InstrumentationRegistry; import android.support.test.espresso.intent.Intents; import android.support.test.rule.ActivityTestRule; @@ -28,6 +29,7 @@ import static android.support.test.espresso.intent.matcher.IntentMatchers.hasData; import static android.support.test.espresso.matcher.RootMatchers.isDialog; import static android.support.test.espresso.matcher.RootMatchers.*; +import static android.support.test.espresso.matcher.ViewMatchers.isClickable; import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.withContentDescription; import static android.support.test.espresso.matcher.ViewMatchers.withId; @@ -63,37 +65,25 @@ public void tearDown() { @Test public void languageItemClick_ShowLanguageChooser() { - //When onView(withId(R.id.action_language_choice)).perform(click()); - //Then onView(withText(R.string.language_selection_heading)).inRoot(isDialog()).check(matches(isDisplayed())); } @Test public void aboutMenuClick_ShowAboutBookDashScreen() { - //Given - openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext()); - //When - String title = InstrumentationRegistry.getTargetContext().getString(R.string.action_about); - onView(withText(title)).perform(click()); - + selectNavDrawItem(R.id.action_about); //Then intended(hasComponent(AboutActivity.class.getName())); } - @Test public void rateThisAppClick_ShowPlayStoreDetail() { //Given - openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext()); - //When - String title = InstrumentationRegistry.getTargetContext().getString(R.string.rate_this_app); - onView(withText(title)).perform(click()); - + selectNavDrawItem(R.id.action_rate_app); //Then intended(allOf(hasAction(Intent.ACTION_VIEW), hasData(Uri.parse("market://details?id=" + org.bookdash.android.BuildConfig.APPLICATION_ID)) @@ -103,13 +93,9 @@ public void rateThisAppClick_ShowPlayStoreDetail() { @Test public void contributorsClicked_ShowThanksPopover() { - //Given - openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext()); //When - String title = InstrumentationRegistry.getTargetContext().getString(R.string.settings_thank_yous); - onView(withText(title)).perform(click()); - + selectNavDrawItem(R.id.action_thanks); //Then onView(withText("Contributors")).inRoot(isDialog()).check(matches(isDisplayed())); @@ -117,15 +103,25 @@ public void contributorsClicked_ShowThanksPopover() { @Test public void contributorsOkClick_HideThanksPopover() { - //Given - openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext()); - //When - String title = InstrumentationRegistry.getTargetContext().getString(R.string.settings_thank_yous); - onView(withText(title)).perform(click()); + selectNavDrawItem(R.id.action_thanks); //Then onView(withText(android.R.string.ok)).perform(click()); } + + // Due to the NavigationItem not being exposed, we have to do this work around to test NavigationView + // https://code.google.com/p/android/issues/detail?id=187701 + public void selectNavDrawItem(final int navItemId){ + onView(allOf(withContentDescription(containsString("Navigate up")), isClickable())).perform(click()); + final NavigationView navigation =(NavigationView) mActivityTestRule.getActivity().findViewById(R.id.navigation_view); + mActivityTestRule.getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + navigation.getMenu().performIdentifierAction(navItemId, 0); + navigation.setCheckedItem(navItemId); + } + }); + } } diff --git a/app/src/androidTestMock/java/org.bookdash.android/presentation/bookinfo/BookInfoActivityTest.java b/app/src/androidTestMock/java/org.bookdash.android/presentation/bookinfo/BookInfoActivityTest.java index 92892e8..f8f3420 100644 --- a/app/src/androidTestMock/java/org.bookdash.android/presentation/bookinfo/BookInfoActivityTest.java +++ b/app/src/androidTestMock/java/org.bookdash.android/presentation/bookinfo/BookInfoActivityTest.java @@ -39,7 +39,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.bookdash.android.mock.test.BuildConfig; +import org.bookdash.android.test.BuildConfig; import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom; diff --git a/app/src/androidTestMock/java/org.bookdash.android/presentation/listbooks/ListBooksActivityTest.java b/app/src/androidTestMock/java/org.bookdash.android/presentation/listbooks/ListBooksActivityTest.java index e498bea..03eea6a 100644 --- a/app/src/androidTestMock/java/org.bookdash.android/presentation/listbooks/ListBooksActivityTest.java +++ b/app/src/androidTestMock/java/org.bookdash.android/presentation/listbooks/ListBooksActivityTest.java @@ -3,6 +3,7 @@ import android.content.Intent; import android.net.Uri; import android.os.Build; +import android.support.design.widget.NavigationView; import android.support.test.InstrumentationRegistry; import android.support.test.espresso.ViewInteraction; import android.support.test.espresso.intent.Intents; @@ -27,7 +28,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.bookdash.android.mock.test.BuildConfig; +import org.bookdash.android.test.BuildConfig; import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist; @@ -40,7 +41,9 @@ import static android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent; import static android.support.test.espresso.intent.matcher.IntentMatchers.hasData; import static android.support.test.espresso.matcher.RootMatchers.isDialog; +import static android.support.test.espresso.matcher.ViewMatchers.isClickable; import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withContentDescription; import static android.support.test.espresso.matcher.ViewMatchers.withId; import static android.support.test.espresso.matcher.ViewMatchers.withText; import static android.support.test.espresso.action.ViewActions.click; @@ -104,8 +107,10 @@ public void openScreen_AppBarTitleIsCorrect() { matchToolbarTitle("Book Dash"); } + @Test public void chooseDifferentLanguage_NewBooksLoaded(){ + // selectNavDrawItem(R.id.action_language_choice); onView(withId(R.id.action_language_choice)).perform(click()); //When diff --git a/app/src/androidTestMock/java/org.bookdash.android/presentation/listbooks/ListBooksFailActivityTest.java b/app/src/androidTestMock/java/org.bookdash.android/presentation/listbooks/ListBooksFailActivityTest.java index ed1022d..ef42c54 100644 --- a/app/src/androidTestMock/java/org.bookdash.android/presentation/listbooks/ListBooksFailActivityTest.java +++ b/app/src/androidTestMock/java/org.bookdash.android/presentation/listbooks/ListBooksFailActivityTest.java @@ -42,7 +42,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.bookdash.android.mock.test.BuildConfig; +import org.bookdash.android.test.BuildConfig; import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom; diff --git a/app/src/main/java/org/bookdash/android/data/books/BookDetailRepository.java b/app/src/main/java/org/bookdash/android/data/books/BookDetailRepository.java index ed74446..3717b1a 100644 --- a/app/src/main/java/org/bookdash/android/data/books/BookDetailRepository.java +++ b/app/src/main/java/org/bookdash/android/data/books/BookDetailRepository.java @@ -16,7 +16,7 @@ */ public interface BookDetailRepository { - void getBooksForLanguage(String language, @NonNull GetBooksForLanguageCallback booksForLanguageCallback); + void getBooksForLanguage(String language, boolean downloadedOnly, @NonNull GetBooksForLanguageCallback booksForLanguageCallback); interface GetBooksForLanguageCallback { void onBooksLoaded(List books); diff --git a/app/src/main/java/org/bookdash/android/data/books/BookDetailRepositoryImpl.java b/app/src/main/java/org/bookdash/android/data/books/BookDetailRepositoryImpl.java index 83325c4..6bd32d6 100644 --- a/app/src/main/java/org/bookdash/android/data/books/BookDetailRepositoryImpl.java +++ b/app/src/main/java/org/bookdash/android/data/books/BookDetailRepositoryImpl.java @@ -8,10 +8,12 @@ import org.bookdash.android.domain.pojo.Language; import org.bookdash.android.domain.pojo.gson.BookPages; +import java.util.ArrayList; import java.util.List; /** * Can add caching here or fetching from db instead of from service + * * @author rebeccafranks * @since 15/11/03. */ @@ -19,17 +21,21 @@ public class BookDetailRepositoryImpl implements BookDetailRepository { private final BookDetailApi bookDetailApi; - public BookDetailRepositoryImpl(@NonNull BookDetailApi bookDetailApi){ + public BookDetailRepositoryImpl(@NonNull BookDetailApi bookDetailApi) { this.bookDetailApi = bookDetailApi; } @Override - public void getBooksForLanguage(@NonNull String language, @NonNull final GetBooksForLanguageCallback booksForLanguageCallback) { + public void getBooksForLanguage(@NonNull String language, final boolean downloadedOnly, @NonNull final GetBooksForLanguageCallback booksForLanguageCallback) { bookDetailApi.getBooksForLanguages(language, new BookDetailApi.BookServiceCallback>() { @Override public void onLoaded(List result) { - booksForLanguageCallback.onBooksLoaded(result); + if (downloadedOnly) { + booksForLanguageCallback.onBooksLoaded(filterOnlyDownloadedBooks(result)); + } else { + booksForLanguageCallback.onBooksLoaded(result); + } } @Override @@ -39,6 +45,16 @@ public void onError(Exception error) { }); } + private List filterOnlyDownloadedBooks(List bookDetails){ + List bookDetailsDownloaded = new ArrayList<>(); + + for (BookDetail b: bookDetails){ + if (b.isDownloadedAlready() || b.isDownloading()){ + bookDetailsDownloaded.add(b); + } + } + return bookDetailsDownloaded; + } @Override public void getBookDetail(String bookDetailId, @NonNull final GetBookDetailCallback bookDetailCallback) { bookDetailApi.getBookDetail(bookDetailId, new BookDetailApi.BookServiceCallback() { @@ -70,7 +86,6 @@ public void onError(Exception error) { } - @Override public void getLanguages(@NonNull final GetLanguagesCallback languagesCallback) { bookDetailApi.getLanguages(new BookDetailApi.BookServiceCallback>() { diff --git a/app/src/main/java/org/bookdash/android/presentation/activity/BaseAppCompatActivity.java b/app/src/main/java/org/bookdash/android/presentation/activity/BaseAppCompatActivity.java index 70dd41d..9e7d2d8 100644 --- a/app/src/main/java/org/bookdash/android/presentation/activity/BaseAppCompatActivity.java +++ b/app/src/main/java/org/bookdash/android/presentation/activity/BaseAppCompatActivity.java @@ -13,7 +13,7 @@ public abstract class BaseAppCompatActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - BookDashApplication application = (BookDashApplication) getApplication(); +// BookDashApplication application = (BookDashApplication) getApplication(); /* tracker = application.getDefaultTracker(); tracker.setScreenName(getScreenName()); tracker.send(new HitBuilders.ScreenViewBuilder().build());*/ diff --git a/app/src/main/java/org/bookdash/android/presentation/bookinfo/BookInfoActivity.java b/app/src/main/java/org/bookdash/android/presentation/bookinfo/BookInfoActivity.java index 1f46568..4c1da09 100644 --- a/app/src/main/java/org/bookdash/android/presentation/bookinfo/BookInfoActivity.java +++ b/app/src/main/java/org/bookdash/android/presentation/bookinfo/BookInfoActivity.java @@ -160,7 +160,11 @@ public void onClick(View v) { showSnackBarMessage(R.string.book_not_available); return; } - floatingActionButton.showProgress(true); + if (!bookInfo.isDownloadedAlready()){ + floatingActionButton.resetIcon(); + floatingActionButton.showProgress(true); + floatingActionButton.setProgress(0, true); + } actionsListener.downloadBook(bookInfo); } }); @@ -296,12 +300,21 @@ public void showSnackBarMessage(int message) { Snackbar.make(scrollView, message, Snackbar.LENGTH_LONG).show(); } - + private int progress= 0; @Override - public void showDownloadProgress(int downloadProgress) { - + public void showDownloadProgress(final int downloadProgress) { + if (progress == downloadProgress){ + return; + } + progress = downloadProgress; Log.d(TAG, "Download progress:" + downloadProgress); - floatingActionButton.setProgress(downloadProgress, true); + + runOnUiThread(new Runnable() { + @Override + public void run() { + floatingActionButton.setProgress(downloadProgress, true); + } + }); } @@ -326,7 +339,9 @@ public void setToolbarTitle(String title) { @Override public void setBookInfoBinding(BookDetail bookInfo) { - client.connect(); + if (client!=null) { + client.connect(); + } this.bookInfo = bookInfo; binding.setVariable(BR.book_info, bookInfo); @@ -337,7 +352,7 @@ public void setBookInfoBinding(BookDetail bookInfo) { bookInfo.getWebUrl() == null ? null : Uri.parse(bookInfo.getWebUrl()), Uri.parse("android-app://org.bookdash.android/http/bookdash.org/books/" + bookInfo.getObjectId()) ); - if (viewAction != null) { + if (viewAction != null && client!=null) { AppIndex.AppIndexApi.start(client, viewAction); } } diff --git a/app/src/main/java/org/bookdash/android/presentation/listbooks/BookAdapter.java b/app/src/main/java/org/bookdash/android/presentation/listbooks/BookAdapter.java index 7abd524..a22d43a 100644 --- a/app/src/main/java/org/bookdash/android/presentation/listbooks/BookAdapter.java +++ b/app/src/main/java/org/bookdash/android/presentation/listbooks/BookAdapter.java @@ -42,6 +42,7 @@ public void onBindViewHolder(BookViewHolder holder, int position) { holder.mTextView.setText(bookDetail.getBookTitle()); Glide.with(context).load(bookDetail.getBookCoverUrl()).into(holder.mImageView); holder.bookDetail = bookDetail; + holder.mImageViewDownloaded.setVisibility(bookDetail.isDownloadedAlready() ? View.VISIBLE : View.INVISIBLE); holder.mCardView.setTag(holder); holder.mCardView.setOnClickListener(onClickListener); diff --git a/app/src/main/java/org/bookdash/android/presentation/listbooks/BookViewHolder.java b/app/src/main/java/org/bookdash/android/presentation/listbooks/BookViewHolder.java index d5fa977..586264d 100644 --- a/app/src/main/java/org/bookdash/android/presentation/listbooks/BookViewHolder.java +++ b/app/src/main/java/org/bookdash/android/presentation/listbooks/BookViewHolder.java @@ -1,5 +1,6 @@ package org.bookdash.android.presentation.listbooks; +import android.media.Image; import android.support.v7.widget.CardView; import android.support.v7.widget.RecyclerView; import android.view.View; @@ -19,11 +20,13 @@ public class BookViewHolder extends RecyclerView.ViewHolder { public ImageView mImageView; public CardView mCardView; public BookDetail bookDetail; + public ImageView mImageViewDownloaded; public BookViewHolder(View v) { super(v); mCardView = (CardView) v.findViewById(R.id.card_view); mTextView = (TextView) v.findViewById(R.id.textViewBookName); mImageView = (ImageView) v.findViewById(R.id.imageViewBookCover); mTextViewBookAuthor = (TextView) v.findViewById(R.id.textViewAuthor); + mImageViewDownloaded = (ImageView) v.findViewById(R.id.imageViewBookDownloaded); } } diff --git a/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java b/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java index 81bf573..d6a5e95 100644 --- a/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java +++ b/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksActivity.java @@ -6,7 +6,11 @@ import android.graphics.Rect; import android.net.Uri; import android.os.Bundle; +import android.support.design.widget.NavigationView; import android.support.design.widget.Snackbar; +import android.support.v4.view.GravityCompat; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; @@ -47,20 +51,31 @@ public class ListBooksActivity extends BaseAppCompatActivity implements ListBook private static final int INVITE_REQUEST_CODE = 1; private ListBooksContract.UserActionsListener actionsListener; private GoogleApiClient googleApiClient; - + private Toolbar toolbar; + private DrawerLayout drawerLayout; + private NavigationView navigationView; + private Button buttonRetry; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); actionsListener = new ListBooksPresenter(this, Injection.provideBookRepo(), Injection.provideSettingsRepo(this)); - - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + toolbar = (Toolbar) findViewById(R.id.toolbar); + navigationView = (NavigationView) findViewById(R.id.navigation_view); setSupportActionBar(toolbar); + final ActionBar actionBar = getSupportActionBar(); + + if (actionBar != null) { + actionBar.setHomeAsUpIndicator(R.drawable.ic_menu_black_24dp); + actionBar.setDisplayHomeAsUpEnabled(true); + } + setUpNavDrawer(); circularProgressBar = (CircularProgressBar) findViewById(R.id.activity_loading_books); linearLayoutErrorScreen = (LinearLayout) findViewById(R.id.linear_layout_error); - Button buttonRetry = (Button) findViewById(R.id.button_retry); + buttonRetry = (Button) findViewById(R.id.button_retry); textViewErrorMessage = (TextView) findViewById(R.id.text_view_error_screen); mRecyclerView = (AutofitRecyclerView) findViewById(R.id.recycler_view_books); @@ -78,34 +93,115 @@ public void getItemOffsets(Rect outRect, View view, RecyclerView parent, Recycle @Override public void onClick(View v) { Log.d(TAG, "Retry button clicked"); - actionsListener.loadBooksForLanguagePreference(); + actionsListener.loadBooksForLanguagePreference(false); } }); actionsListener.loadLanguages(); - actionsListener.loadBooksForLanguagePreference(); + actionsListener.loadBooksForLanguagePreference(false); checkIfComingFromInvite(); } - private void checkIfComingFromInvite(){ + private void setUpNavDrawer() { + if (toolbar != null) { + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + drawerLayout.openDrawer(GravityCompat.START); + } + }); + } + navigationView.setCheckedItem(R.id.action_all_books); + navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { + @Override + public boolean onNavigationItemSelected(MenuItem menuItem) { + menuItem.setChecked(true); + switch (menuItem.getItemId()) { + + case R.id.action_all_books: { + showAllBooks(); + break; + } + case R.id.action_downloads: + showDownloadedBooks(); + break; + case R.id.action_about: + showAboutPage(); + break; + case R.id.action_settings: { + showSettingsScreen(); + break; + } + case R.id.action_thanks: { + showThanksPopover(); + break; + } + case R.id.action_invite_friends: { + openInvitePage(); + break; + } + case R.id.action_rate_app: { + showRatingPlayStore(); + break; + } + default: + + } + drawerLayout.closeDrawers(); + return true; + } + + + }); + } + + private void showDownloadedBooks() { + downloadOnly = true; + + actionsListener.loadBooksForLanguagePreference(downloadOnly); + } + + private void showAllBooks() { + downloadOnly = false; + actionsListener.loadBooksForLanguagePreference(downloadOnly); + } + + private void showSettingsScreen() { + + } + + private void checkIfComingFromInvite() { googleApiClient = new GoogleApiClient.Builder(this) .addApi(AppInvite.API) - .enableAutoManage(this, new GoogleApiClient.OnConnectionFailedListener() { + .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() { @Override public void onConnectionFailed(ConnectionResult connectionResult) { Log.d(TAG, "onConnectionFailed: onResult:" + connectionResult.toString()); } }) + /* .enableAutoManage(this, new GoogleApiClient.OnConnectionFailedListener() { + @Override + public void onConnectionFailed(ConnectionResult connectionResult) { + Log.d(TAG, "onConnectionFailed: onResult:" + connectionResult.toString()); + + } + })*/ .build(); - AppInvite.AppInviteApi.getInvitation(googleApiClient, this, true) - .setResultCallback( - new ResultCallback() { - @Override - public void onResult(AppInviteInvitationResult result) { - Log.d(TAG, "getInvitation:onResult:" + result.getStatus()); - } - }); + if (googleApiClient != null) { + googleApiClient.connect(); + + AppInvite.AppInviteApi.getInvitation(googleApiClient, this, true) + .setResultCallback( + new ResultCallback() { + @Override + public void onResult(AppInviteInvitationResult result) { + Log.d(TAG, "getInvitation:onResult:" + result.getStatus()); + } + }); + } } private static final String TAG = ListBooksActivity.class.getCanonicalName(); @@ -115,6 +211,23 @@ public void onResult(AppInviteInvitationResult result) { private LinearLayout linearLayoutErrorScreen; private TextView textViewErrorMessage; + @Override + protected void onStop() { + super.onStop(); + if (googleApiClient != null) { + + googleApiClient.disconnect(); + + } + } + + @Override + protected void onStart() { + super.onStart(); + if (googleApiClient != null) { + googleApiClient.connect(); + } + } private View.OnClickListener bookClickListener = new View.OnClickListener() { @Override @@ -170,7 +283,7 @@ private void openInvitePage() { Intent intent = new AppInviteInvitation.IntentBuilder(getString(R.string.invitation_title)) .setMessage(getString(R.string.invitation_message)) .setCallToActionText(getString(R.string.invitation_cta)) - // .setDeepLink(Uri.parse("http://bookdash.org/books/dK5BJWxPIf")) + // .setDeepLink(Uri.parse("http://bookdash.org/books/dK5BJWxPIf")) .build(); startActivityForResult(intent, INVITE_REQUEST_CODE); } catch (ActivityNotFoundException ac) { @@ -198,13 +311,15 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { } } + private boolean downloadOnly = false; private DialogInterface.OnClickListener languageClickListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (dialog != null) { dialog.dismiss(); } - actionsListener.saveSelectedLanguage(which); + + actionsListener.saveSelectedLanguage(which, downloadOnly); /* tracker.send(new HitBuilders.EventBuilder() .setCategory("LanguageChange") @@ -288,12 +403,13 @@ public void showRatingPlayStore() { } @Override - public void showErrorScreen(boolean show, String errorMessage) { + public void showErrorScreen(boolean show, String errorMessage, boolean showRetryButton) { if (show) { linearLayoutErrorScreen.setVisibility(View.VISIBLE); } else { linearLayoutErrorScreen.setVisibility(View.GONE); } + buttonRetry.setVisibility(showRetryButton ? View.VISIBLE : View.GONE); textViewErrorMessage.setText(errorMessage); } @@ -307,6 +423,16 @@ public void showLoading(boolean visible) { @Override public void showBooks(List bookDetailList) { + if (bookDetailList.isEmpty()) { + if (downloadOnly) { + showErrorScreen(true, getString(R.string.no_books_downloaded), false); + + } else { + showErrorScreen(true, getString(R.string.no_books_available), true); + + } + // return; + } RecyclerView.Adapter mAdapter = new BookAdapter(bookDetailList, ListBooksActivity.this, bookClickListener); mRecyclerView.setAdapter(mAdapter); mRecyclerView.scheduleLayoutAnimation(); diff --git a/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksContract.java b/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksContract.java index e811c82..ccbf536 100644 --- a/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksContract.java +++ b/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksContract.java @@ -14,7 +14,7 @@ interface View { void showThanksPopover(); void showAboutPage(); void showRatingPlayStore(); - void showErrorScreen(boolean show, String errorMessage); + void showErrorScreen(boolean show, String errorMessage, boolean showRetryButton); void showLoading(boolean visible); void showBooks(List bookDetailList); void showSnackBarError(int message); @@ -23,8 +23,8 @@ interface View { interface UserActionsListener { void loadLanguages(); - void saveSelectedLanguage(int indexOfLanguage); - void loadBooksForLanguagePreference(); + void saveSelectedLanguage(int indexOfLanguage, boolean downloadOnly); + void loadBooksForLanguagePreference(boolean downloadedOnly); void clickOpenLanguagePopover(); } diff --git a/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksPresenter.java b/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksPresenter.java index 923483e..f24280f 100644 --- a/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksPresenter.java +++ b/app/src/main/java/org/bookdash/android/presentation/listbooks/ListBooksPresenter.java @@ -26,25 +26,26 @@ public ListBooksPresenter(ListBooksContract.View listBooksView, BookDetailReposi this.settingsRepository = settingsRepository; } @Override - public void loadBooksForLanguagePreference() { + public void loadBooksForLanguagePreference(boolean downloadedOnly) { String languagePreference = settingsRepository.getLanguagePreference(); - loadBooksForLanguage(languagePreference); + loadBooksForLanguage(languagePreference, downloadedOnly); } - private void loadBooksForLanguage(String language) { + private void loadBooksForLanguage(String language, boolean downloadedOnly) { listBooksView.showLoading(true); - bookDetailRepository.getBooksForLanguage(language, new BookDetailRepository.GetBooksForLanguageCallback() { + listBooksView.showErrorScreen(false, "", false); + bookDetailRepository.getBooksForLanguage(language,downloadedOnly, new BookDetailRepository.GetBooksForLanguageCallback() { @Override public void onBooksLoaded(List books) { listBooksView.showLoading(false); - listBooksView.showErrorScreen(false, ""); + listBooksView.showErrorScreen(false, "", false); listBooksView.showBooks(books); } @Override public void onBooksLoadError(Exception e) { listBooksView.showLoading(false); - listBooksView.showErrorScreen(true, e.getMessage().toUpperCase()); + listBooksView.showErrorScreen(true, e.getMessage().toUpperCase(), true); } }); @@ -68,10 +69,10 @@ public void onLanguagesLoadError(Exception e) { } @Override - public void saveSelectedLanguage(int indexOfLanguage) { + public void saveSelectedLanguage(int indexOfLanguage, boolean downloadOnly) { settingsRepository.saveLanguagePreference(languages.get(indexOfLanguage).getLanguageName()); - loadBooksForLanguage(languages.get(indexOfLanguage).getLanguageName()); + loadBooksForLanguage(languages.get(indexOfLanguage).getLanguageName(), downloadOnly); } @Override diff --git a/app/src/main/kotlin/org.bookdash.android/data/BookDetailRepositoryExtenstion.kt b/app/src/main/kotlin/org.bookdash.android/data/BookDetailRepositoryExtenstion.kt new file mode 100644 index 0000000..e69de29 diff --git a/app/src/main/res/drawable-hdpi/bookdashlogo.png b/app/src/main/res/drawable-hdpi/bookdashlogo.png new file mode 100644 index 0000000000000000000000000000000000000000..e01d9963f2a75a8db01003a4faa6c1a7e85ea63b GIT binary patch literal 58866 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�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 m``%CcBNiWoy|MQM{~`y!5ngT&vJTME?gPG?hpI literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_action_book.png b/app/src/main/res/drawable-hdpi/ic_action_book.png deleted file mode 100755 index 0b605fd296e1d71a2a6b9a1c57869efb730ede9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 412 zcmV;N0b~A&P)-*B4q1cBx$FS5%B~(PAz^c=agI} z30v?s=S_IeesoLkY1HQ5Ji|%jhzKt&FD)24q3!E%L|gzLlD-Gx%?gf)Q{Z8FyaP9q z-kKB)TmjF(<;olngkON+sb}&-#!+8~vzvY_&VrM!{>zO=vX;>>6HdBn!b#)SZY{Gp zytGyv@C+y0$TOTY&NG}fZdaUVIO%A~8Sd^ye0QH(`udob9I1nc6`SFMSDrkf1t*QG zCd`DZL6t1jgpQ z5gFYGMTRJZ5Oh=BbS?@>QnIj`cwttofBEl!ul4U`?oE4O!(QwA)_n8M>6;lb;G_YU zpCN$5ZNZ@hh8E~i149?;q`-(c3OFv;_euJ*M`e%td21Gkh_ir;f%AZ~fyuz}dFo!^ z2jB}}7qCszS8V|589+pw2`m7v2Trdk)R(||U|p|3#tk4Mj!ePt1kULoc;x#|=X?sR z240f%cTMmkwv7uwL>vn|06YRCZu9Se69KQAw&nVT`TQI33vg;l3Jd-?@QkGWO+hpU zkistm?f`5BYuTDy3s{)t3E(GSP6F5roD3L%fgh39J2wSBkd}D3DTqb@(rq3C7Nzh$ z|25z~U^nn4a77BWM$)bR9}zDC3-kTEz*Pz8SzvAn#1ddh6L)F~zyiHca+~{sRgw-w z#O1)2)b2juQb{`#z;s|MFe$AxOVWE0F#)&-csfDYg11XrQ`ePh1ITP+0d01>&FjF8 z7Cwcv5OxpKCg6r5_otv6O4?o~$yT&=48j@d+Wgk;Xn?iSY!d)Wfrs*t&(aOPFJ+mx zfEfwS?(#-Oi`M|wtj~Nu-r`8OJ!1o&t2eeiQ-(+R*S`EI2o2Y4$0-f>_hr<;MdD_oxgY$cN~rBxkHwGy0$ zO|O=eQf$8xcsU=oNSfU z>Ixqhf*)oP_%SeD(qChN=;}fdVY51)J3}})FOcMt;a`df=lDzV#XL#A+(rX%9k4MM zwo1CJ!sj$#dj|XG!1Lsv?q8$FeMfFGUWocD`#YN47G zb06gQor*d41n%~_Qr9$EaHy2ie(jRETu!@7docI+UpbvtxD9x|<%Z^7z~D`XuAxZ) z?turlrA!c>IMiwCU1_?hH}ywTUy28Vu)i-9`bRuEiwS%~t4oZV9 zk5`KE$U)okMSl&p%2Jj_i}Ok?XSeis_(zMQSY)i>?yta)eL39ir0U9eeQ&qMq?^e) zt&ckf#(QAf-wgq@t diff --git a/app/src/main/res/drawable-hdpi/ic_file_cloud_download.png b/app/src/main/res/drawable-hdpi/ic_file_cloud_download.png deleted file mode 100755 index 6897d945147454323bfdc0a2e695b1fa6cec7199..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1455 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 diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_book.png b/app/src/main/res/drawable-xxhdpi/ic_action_book.png deleted file mode 100755 index dae1f50716b796c0c58884548f20a219ebdbb1d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1005 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q}r7FmLg6aSW-5dpp;*?}~#+%WKyI zk|#O@1?|fp_&+IN=(y2iEWjwquAt6P$f3X}IJuB*+KRybGS;TZ?Y4E7ZwLR<@qJRZ z`}OMZ-2UsEWs^3m30!+6pw45a&%|>qp_u8}Cl3R**}?|X-J1+=%xTzZBh+*78Oxcc z6BBsM)D!gjS&}zcG8R{=NHm}2oN-$DphS+}ffzYX;gU*-E_ z#+lWxGEIM8%kY%D_(0iH-_85bnU6BAM^?|w-EAU$@qz!Ob>)Hc>nEKTEL7fq`);+& z#Rv15?**Jyt&tI&{><#%#XOhh(`F9^H-3)r){Oprhy8)+<2$D-zFmAd%kI2UGOq2^7CwF)n zaQf+K3hDfdxv_QGGXG=WAH*2%V0-@QiQcZG#hFdsnqOsCuur<@=29#9cYm+uF4w(} z|EaP~4|?ZWrTMaJ$@@w3+>ZRNZ|^=R%bPPdtMA~_DOnk{|9`xj_V1qOs`u*Qhs~wg zwy!9^W1srrWXT_&puawU!&dIA`n{*_)s|j}rb9iy>wS-}&GY-7zbx0&^lGe`T#1Rn zcc0sKGRG5m?zzX#z4`oL4gWi@)T1Xo3^?Ng?N0Nn9y~qMSI)7?v!KY+x7@vHa^d6z zp*b-@Dm(Nqi0)6mcids-qRA_bT#a4Tr;7xa#4qrW`k=y#s0JB=uG$;aY=dFwrGZT^OqgIoAOq#Re8JMfrQVy4p1Xi6V4Fd ZrLQH_cAVar5C+V~44$rjF6*2UngC5(#yS81 diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_language.png b/app/src/main/res/drawable-xxhdpi/ic_action_language.png deleted file mode 100644 index 8600b662144fb339df87f390ece6804c0698c6d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2613 zcmaKuS3^_j0!6 z``_Ffh5(><@RldfM|#b9#B?|GNyq(l%kl{X+q~(9)+P1sSUB9buu6PX0QL3yDeUT$ zO&ecgTj>(dt2$`f9yzc1n}vvi$^ew@Upjhdd1rQ^AbgxNz8%|Tv~9Lc`fXurreIre@JAwjQr8KQak*y+532rw?sXvyZX+Sjy%9aDcEFcnN|L!+_RZu1fTCzI0}JB`uJsw5kGaQ$0tLW$ zBd#-L>fsLuFmpY3`8imFqT=sTt@1yL0K5$I1|p!p>GfFaG9VoXt3#IC>zUUSt&R6H z@o2|20+2;UV!&R*?;mz(oAi@Q=~mFFPP+#XG}(I~+Qi73RD2NmV8s!1ovXNX5RT9g zAuou?xGYD^7R8?oTc&7hp?F&|uXiMw&d}Z`1Hok^H%aDYxCz++ej93Ozm`JJ5GRXu zXm@1P9wXaG&8@3MEw&G80q<}hEp@8_c$C-e zH=(;)ohd7eCmV=Tliu_bC~gP(@ZJYNdHYODJQ`)regobXike5u32|V_C|I#bbzN zveVn1Za^W$<@DJs#rlj`k36<+ZT0Fq&wdF;vkYHW9?Nrcl%+ljOhPHMDo6CtX>_D_ zkudFR8=Y~(Co_#dB&aQW*rV_OaVGJ{ZLnJ)-`04tzE*oUp#&3?^g9L^_GZ+Sw#ZfK zb{~L#9J!FP1-Mmare)IZycE=!P1r;EHn|xuX|i~x(Q7DC$gsZ}!Z{>WvB3@>^Fe8@ zdv|D@5cetMbd$jbqx-m_SUGpD_H1jAi>mzvVRDA?($xDZ_hn{>2}i-(HaG7qlIy=K zFOjCSdp)HrRevAvq4i_jZBU@)o5}7#=R}+VyZ@xlzHhY{Xz5IV!GV$Iw)6U0uq1p4U5YoW=3KI%Sm z2Ovg&Yc9k&NV@CCuCfkd_v6;;A#u~g*9oXI%r-d|c z@4HrkJ>8`;^lV-p(9bRDNmb46DR6aLJg)*~RVY2LO4G3B-fWWak#E(21ls&;V4S~H zF@zg_7xBdk3jdru*$sChcxl#&QuwXZSGFi6%Js|orxi2a)(56gIa3H`W*DUl%a1*X zP=3G|5&-2C(;8btSYP;cshR?rkS;H@pNxs0_xPsJ-N#otI(R~t3&GX0G;LQKH*J;n zVEWTjk^V3NPkc%HRcl%mCioQQLa`F&6~Py@rsaXd)PMrENy4fV*qnyLul*5aWI}mM zwT%|~ekVxEihnt!E(BE*~UBy)JHz8wJa}edz5LjlZWBt`=DPDJ{mKQ0z$=>WyxF>Vk0a& z#(w>|m+ID=qpaRx;~M?(3PaE+{KY|vc2quQ(xt^!MQ>36@^txh)~r-z+&pZ%pLHyt zTNYGCGK?FOe@q32>AAojn;S2z<8wreRKZm@4Bv+c+r-52>EPQp4c_)*3|7d9b z?WW07OEs?oeBy=hzgwfyLobcWqExKIJe_B?cb(x+?7nj{@ARNpO%2Bvo8`XWn@877 zVSy}}t?9@Hl(;!B!BmCZ`iRuPc{rK=V3*?%@qMYRTGAQMujX`a$}_;$!wN2BM0;+? z{C<{h0F&@VP3wcpNG9z}j)v{*K?)4BK9dg9me?^*$Khe5CFblA$sVVrLWsZ5bmZfQ}9%*ED zyrgymdBDBv@GeQ7yuQ(+d+;lbM_ZWb4y?Qq^z)`i&G(UzP9=@S>AP~WEpr7!p0nr{MV_5$YOi0bI9;@hEQQaO0x$4Hs=4k&Wll;qL)QPo_o%=6c+rKW{q>GKp zB{~7Y;f!r+vwBlu*}@Rwih)ER(*Yw%#L;*;a%krWt_rxXI-k`XKPt^|R_x}`26~)6hc;EaFvPjQp diff --git a/app/src/main/res/drawable-xxhdpi/ic_file_cloud_download.png b/app/src/main/res/drawable-xxhdpi/ic_file_cloud_download.png deleted file mode 100755 index 26c0146ad3092c43909dbd02d8e38a8c80b9914e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3384 zcmd^?_g9li7suyG2ti5`MNsKT6Y!-9QZ$snN;CpXM@oWVP(o1ZpQH&t1pC{ul>V*QW{V}DnAZGEOo zw%c`OU1Q2)*4bTmY_Os|cIS5G;C9zKl^Zf}VVM-&Prak19cPB$et+FSZENRlUM3dI z#4OGFNEW5={Y8J)VH&=F}Q8RTPV(!c{6K_SJ!5XJkuYONi$iiJ&~abZpb2uAV3 zfZ4JcYXv_rI4~#-V@5;hcyx_4oB>5D!d_5dP2s$3@)yW+2gd;nvo?m~=54)_K<0}W z{jkktz>@;&=*SJ3!Jg3h0w`J*(MXJY*b`d&YRe9SdX=QvUmpP+h9?Q^zWm;?-|m}7 zQ60!7EhSsKHe0?1ywlZc1z`N@jKrW07ff&v=dB< zaAbkuL8CM5{ju2d8gL4$g~3jy+zWzga2ZWe8}Xa25{P&)ZI(scdenR>uiXFIr#x}+ z`m8T~>(x^3V&$8cq1zS{n>hF|Yhxijes38U#o0c8EOgJG+A{A$5J=^+xtJ}sQ?qZ9`@7+ssN|)TVRa6)i7!#<)N9< zLo)#Y^v5KTGax@(St$lh3t_cWc5!Qcim?bgy5&s-v}(FVNsQGTxjCJb73Xa_GypP3 zmq85RTp*`$F3C4o^zjrY?Ca)4;`YC+!M zzFqr$-=S^1Q&o6}_|9ofa|y(|)UGAr)!aB)n=N9zO%_;{gqeDoP4HfA)kZFA{#@Ii zyZNbCL0eyobWk`?fi+V zvs#;fMxM&4AXXpqE!g&9$?t6zC)JygK~r_(mhDuA>No3>A?f1^gCep2Yce3WOI)$2P!axO>tr@C6o+x_c5($Q{J+%!;C#!a zyh`Q8`@eKc+?l55=yq71fqYtDL-M0HBBDqS$ln!oyYe&8(WiQEYy^vKK3aMj(R>v; zfAW&*+Jnh|4n>}JU_v3MhiZUsw zBnSmBW^9W%+Qn?Ui{jwe-D3y)!jM@$A|Gf8@_0hSgB2q_PXVWX5jZ;`#{y_cvWhsQX-E7pdZ0IKG zyql(eoFFP|yI;HgdQcI#xJ1+vC`Z;NvV3jwYig}GPYeJ~FmRk|V1yC`Y+~Ndf47kv zFl%)s)(L`Gq1wE6ehNaYjr`W(wDIsyhZd>#1%YFfSd*4PPNIVSQZv3Gb-XP0N_8|{ z3>5!R3_Q~T(-np8ZY*}RDq~xjRS@EI-7;NyJ6o^Ef}peJ$~gLCq)ZC5>_f8Z{D!Sw z8KNx)rc+Sn(;s>tkO;M(9IH<*up^G>8iC0$ z{hLIUS`&dCEVE8VFAi3Mat-%(203|(#VL1ltMcuZ5XFVca7?5gpvpcy9z_ya7)vnUn;VTl+!h47#!Uz(9N3KykbmlXUcsoS-u%aPXw#~&~86={`Oqa zCUZmgI!U_`71%o=81&Ai3OAIKV3De`HjysRik_q`UX*ZcMqR|e=mJJDvxQP+vB5$t z)pifJGp@hhgTTI^)JN_lvdKl)E2LDTwU3lPsiw{BuLpn{J}*3J&`e+8M%q+mbLMoL z!I6q9nAza?AuQoiT1$AQi>SrYbi@v3|E<>~RIddO1=^Ne!vW(D6THCj7*8}Ug5~^~ zm2wxRFOxxtw6S8>*_ctytE||1*}=QkKRP=F5b8~DEG<#D_WZP=JnCOXX%8#f`DDm% z=)z`+_d_#G6mP+?P8M%oI86;|t=_I>OCwx!e` zuE*%;$C_UB>2rPP`hf3bGHBpEc*z63?QF(+YD=NJ#L7MsLf~eK3Bb_%vMZh-~|Hi*n z@kk%SW_O7%2+(GN8ACx}_197kdZc7sL?Vovp0{ZwU%-`?n}m?5i75e&8VCmGdwO$5 zdnPAp_0vVqn3Ou%V+73YeI;D7P^dzR+8yCC7zhPaJlAkE2kCPU9W3~-Ws4+dw==>* zuwI^%MhOa~Q1VE)oB~1i#c9Ve&gMYCz{Tf|x&nB0(V?`EpH|qZQK84DX4z^;I6)9$ yz%9YK7zPLW$whG*3Ls9Zyyn$z0{E|*ui{a?8jH6g8ix2kB0#pbwW_kD#r+>2RN|um diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_book.png b/app/src/main/res/drawable-xxxhdpi/ic_action_book.png deleted file mode 100755 index cd6e4599c6f89be4d46f12c1116f17457ee79675..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1677 zcmd5-`BPH|5YBr(F=0>=f}@EA6}ifhgfovwIK-9_1EE%Ei%sYlMGoO1#fZuk zJb`s*(nnS7OFGyXITE1 zgwye075eoGNCp4RJuRQh+Dw!6BEg{ct1pY-~OY-3Kg#ii#LO1RuvLUkmj^yr;S zx05e%b>il9R?kV|Awa-xZh8m1sI{+(A6L+<s!{_b8R@yI8ZcvD^aT?kghZLO}NM9RAqU#{@#$7WGxkSwU|RAkkj@YwA7tcOI``S z@n%(RsZ+5qjs)hdwKvIwPV89IXhG<{b5alV1I1|F-L?ZXz%5aXmSQZ1iTxKP-F!VX z$V5L*V1c(cke_BlBhL}=07wH6EPT&b@_aozf^m2-m9X;XZF`+fYEP~ubQ4ZMFtEEI zYt#=s@CF9l((_T6_X*<31LWF_(>t=Wx~ zv6J>am^4PB0<`neB6^4NxJoj^*F|gH%O4(dwT|qOK6(--_B=JI9HeyFMf3{9p81pI zC3E$yJbvVhJ1sI-&^Az)nYhnuq*o7h6Sovhrpu7Fo1P~R(plPviVH@Ivb5#<9S~(?}J$hCmL=p5LassAyMq41grLQ%jtr#6=_d? z2^#K)dFwjnW8{Ubx!7723ExC%txRSZn4{qmyc5mgj>MdhRNj=L~bReCsDv{L_#BER7mafc~U-?TgH0F{kE` z_t}?eutvx19eh4gN8aO&Z$f@UZp4XgjZ<7Dw(=`5cNMec+ukFj*R2a3)eRcS>%+48 zGd1d+v$WG5$OC6bk33<*=v0c`?Xh@ptZjd$ZxewkwOF2M1`+KuHh8EY;=Sx+H;h1h zF|$Cz2l2yxzR?B%q>u&#IRlWe{Jebz4vYz|s62xMn?pj1nK;1VV%LK}9H6?mPC-Rc zvoMWj4T|!^Ok;=)%;={{A(_E&-eBl}r}7MTBsKrv<*-&w{z7e|7v;SE&EODUj?ZN; H-r;`$=8)3? diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_language.png b/app/src/main/res/drawable-xxxhdpi/ic_action_language.png deleted file mode 100644 index 8012927cb943ad4c28b1d75f81fa8eecbd601a30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4059 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 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_file_cloud_download.png b/app/src/main/res/drawable-xxxhdpi/ic_file_cloud_download.png deleted file mode 100755 index 5f8be807e0b6b74bcc8916d9591209bff53e735d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5265 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 diff --git a/app/src/main/res/drawable/book_dash_logo.png b/app/src/main/res/drawable/book_dash_logo.png deleted file mode 100644 index cd13c19d40e522e9a18d745e67a107f38eadba7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52082 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 + + diff --git a/app/src/main/res/drawable/ic_cloud_download_black_24dp.xml b/app/src/main/res/drawable/ic_cloud_download_black_24dp.xml new file mode 100644 index 0000000..261c312 --- /dev/null +++ b/app/src/main/res/drawable/ic_cloud_download_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_collections_bookmark_black_24dp.xml b/app/src/main/res/drawable/ic_collections_bookmark_black_24dp.xml new file mode 100644 index 0000000..ef14799 --- /dev/null +++ b/app/src/main/res/drawable/ic_collections_bookmark_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_file_download_black_24dp.xml b/app/src/main/res/drawable/ic_file_download_black_24dp.xml new file mode 100644 index 0000000..492b41d --- /dev/null +++ b/app/src/main/res/drawable/ic_file_download_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_grade_black_24dp.xml b/app/src/main/res/drawable/ic_grade_black_24dp.xml new file mode 100644 index 0000000..a87ca09 --- /dev/null +++ b/app/src/main/res/drawable/ic_grade_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_group_add_black_24dp.xml b/app/src/main/res/drawable/ic_group_add_black_24dp.xml new file mode 100644 index 0000000..2de3e0e --- /dev/null +++ b/app/src/main/res/drawable/ic_group_add_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_info_outline_black_24dp.xml b/app/src/main/res/drawable/ic_info_outline_black_24dp.xml new file mode 100644 index 0000000..8d4f1ce --- /dev/null +++ b/app/src/main/res/drawable/ic_info_outline_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_menu_black_24dp.xml b/app/src/main/res/drawable/ic_menu_black_24dp.xml new file mode 100644 index 0000000..04ee485 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_people_outline_black_24dp.xml b/app/src/main/res/drawable/ic_people_outline_black_24dp.xml new file mode 100644 index 0000000..9aca56e --- /dev/null +++ b/app/src/main/res/drawable/ic_people_outline_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_public_black_24dp.xml b/app/src/main/res/drawable/ic_public_black_24dp.xml new file mode 100644 index 0000000..60e024f --- /dev/null +++ b/app/src/main/res/drawable/ic_public_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_settings_black_24dp.xml b/app/src/main/res/drawable/ic_settings_black_24dp.xml new file mode 100644 index 0000000..c11919c --- /dev/null +++ b/app/src/main/res/drawable/ic_settings_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout-land/activity_book_information.xml b/app/src/main/res/layout-land/activity_book_information.xml index 4d0d5f0..540241a 100644 --- a/app/src/main/res/layout-land/activity_book_information.xml +++ b/app/src/main/res/layout-land/activity_book_information.xml @@ -275,8 +275,7 @@ app:fbb_endBitmap="@drawable/ic_open_book" app:fbb_hideProgressOnComplete="true" app:fbb_progressColor="?attr/colorAccent" - app:fbb_progressWidthRatio="0.125" - app:fbb_autoStart="true" + app:fbb_progressWidthRatio="0.1" app:fbb_showEndBitmap="true" app:fbb_showShadow="true" app:layout_anchor="@id/rel_top_title_section" diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index 3a64f80..ee60dcc 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -94,7 +94,7 @@ android:layout_height="200dp" android:layout_gravity="center" android:layout_marginBottom="8dp" - android:src="@drawable/book_dash_logo" + android:src="@drawable/bookdashlogo" android:layout_marginTop="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" /> diff --git a/app/src/main/res/layout/activity_book_information.xml b/app/src/main/res/layout/activity_book_information.xml index 7897150..d1c89ce 100644 --- a/app/src/main/res/layout/activity_book_information.xml +++ b/app/src/main/res/layout/activity_book_information.xml @@ -261,10 +261,10 @@ android:visibility="visible" app:fbb_endBitmap="@drawable/ic_open_book" app:fbb_hideProgressOnComplete="true" + app:fbb_autoStart="true" app:fbb_progressColor="?attr/colorAccent" - app:fbb_progressWidthRatio="0.125" + app:fbb_progressWidthRatio="0.1" app:fbb_showEndBitmap="true" - app:fbb_autoStart="true" app:fbb_showShadow="true" app:layout_anchor="@id/app_bar_layout" app:layout_anchorGravity="bottom|right|end" /> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index ae37b17..5415bf9 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,98 +1,115 @@ - + android:fitsSystemWindows="true"> - + android:layout_height="match_parent" + android:background="@color/background_light_grey" + tools:context=".MainActivity"> - - - - + android:layout_height="match_parent"> - - - - - - - - - - - - - + android:layout_height="match_parent" + android:layout_gravity="center_horizontal" + + android:clipToPadding="false" + android:columnWidth="@dimen/book_column_width_padding" + android:gravity="center_horizontal" + android:layoutAnimation="@anim/grid_layout_animation" + android:paddingLeft="@dimen/book_list_padding" + android:paddingRight="@dimen/book_list_padding" + android:scrollbars="vertical" + android:visibility="visible" + app:layout_behavior="@string/appbar_scrolling_view_behavior" + tools:listitem="@layout/list_item_book" /> + + + + + -