From 6e904e094e31bb6c9c77b3bd4d68d5b1da188c1b Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Sat, 17 Feb 2018 22:11:44 +0200 Subject: [PATCH 1/4] Updated libraries in gradle and fixed "no books" message. --- app/build.gradle | 18 +-- .../firebase/FirebaseBookDatabase.java | 144 ------------------ .../database/firebase/FirebaseBookDatabase.kt | 112 ++++++++++++++ .../presentation/readbook/PageFragment.kt | 8 +- app/src/main/res/values/strings.xml | 6 +- build.gradle | 10 +- fabbutton/build.gradle | 8 +- gradle/wrapper/gradle-wrapper.properties | 4 +- 8 files changed, 137 insertions(+), 173 deletions(-) delete mode 100644 app/src/main/java/org/bookdash/android/data/database/firebase/FirebaseBookDatabase.java create mode 100644 app/src/main/java/org/bookdash/android/data/database/firebase/FirebaseBookDatabase.kt diff --git a/app/build.gradle b/app/build.gradle index 107d50b..78319c2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,7 +4,7 @@ buildscript { } dependencies { - classpath 'io.fabric.tools:gradle:1.24.2' + classpath 'io.fabric.tools:gradle:1.25.1' } } apply plugin: 'com.android.application' @@ -23,7 +23,7 @@ repositories { android { compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion '26.0.2' + buildToolsVersion '27.0.3' defaultConfig { applicationId "org.bookdash.android" @@ -180,7 +180,7 @@ dependencies { implementation('com.crashlytics.sdk.android:crashlytics:2.5.3@aar') { transitive = true } - implementation('za.co.riggaroo:materialhelptutorial:1.2.0') { + implementation('za.co.riggaroo:materialhelptutorial:1.6.0') { exclude module: 'support-v4' } @@ -202,18 +202,14 @@ dependencies { exclude module: 'support-v4' } - kapt "com.android.databinding:compiler:3.0.0" implementation 'io.reactivex:rxandroid:1.2.1' implementation 'io.reactivex:rxjava:1.2.5' implementation 'com.jakewharton.threetenabp:threetenabp:1.0.5' - implementation 'com.jakewharton.timber:timber:4.5.1' - implementation 'com.android.support.constraint:constraint-layout:1.1.0-beta3' - implementation "android.arch.lifecycle:extensions:1.0.0-rc1" - compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" + implementation 'com.jakewharton.timber:timber:4.6.0' + implementation 'com.android.support.constraint:constraint-layout:1.1.0-beta5' + implementation "android.arch.lifecycle:extensions:1.1.0" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" } - - - apply plugin: 'com.google.gms.google-services' \ No newline at end of file diff --git a/app/src/main/java/org/bookdash/android/data/database/firebase/FirebaseBookDatabase.java b/app/src/main/java/org/bookdash/android/data/database/firebase/FirebaseBookDatabase.java deleted file mode 100644 index f1432d7..0000000 --- a/app/src/main/java/org/bookdash/android/data/database/firebase/FirebaseBookDatabase.java +++ /dev/null @@ -1,144 +0,0 @@ -package org.bookdash.android.data.database.firebase; - -import android.util.Log; - -import com.google.firebase.database.DataSnapshot; -import com.google.firebase.database.DatabaseReference; -import com.google.firebase.database.FirebaseDatabase; - -import org.bookdash.android.data.utils.firebase.FirebaseObservableListeners; -import org.bookdash.android.domain.model.firebase.FireBookDetails; -import org.bookdash.android.domain.model.firebase.FireContributor; -import org.bookdash.android.domain.model.firebase.FireLanguage; -import org.bookdash.android.domain.model.firebase.FireRole; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import rx.Observable; -import rx.functions.Func1; - - -public class FirebaseBookDatabase implements BookDatabase { - - private static final String TAG = "FirebaseBookDatabase"; - private final DatabaseReference booksTable; - private final DatabaseReference languagesTable; - private final FirebaseObservableListeners firebaseObservableListeners; - private final DatabaseReference contributorsTable; - private final DatabaseReference roleTable; - - public FirebaseBookDatabase(FirebaseDatabase firebaseDatabase, - FirebaseObservableListeners firebaseObservableListeners) { - this.booksTable = firebaseDatabase.getReference(FireBookDetails.TABLE_NAME); - this.languagesTable = firebaseDatabase.getReference(FireLanguage.TABLE_NAME); - this.contributorsTable = firebaseDatabase.getReference(FireContributor.TABLE_NAME); - this.roleTable = firebaseDatabase.getReference(FireRole.TABLE_NAME); - this.firebaseObservableListeners = firebaseObservableListeners; - } - - @Override - public Observable> getLanguages() { - return firebaseObservableListeners.listenToValueEvents(languagesTable, asLanguages()); - } - - @Override - public Observable> getBooks() { - return firebaseObservableListeners - .listenToValueEvents(booksTable.orderByChild(FireBookDetails.BOOK_COLUMN_CREATED_DATE), asBooks()); - } - - @Override - public Observable getContributorById(final String contributorId) { - return firebaseObservableListeners - .listenToSingleValueEvents(contributorsTable.child(contributorId), asContributor()); - } - - @Override - public Observable getRoleById(final String roleId) { - return firebaseObservableListeners.listenToSingleValueEvents(roleTable.child(roleId), asRole()); - } - - @Override - public Observable> getBooksByLanguage(final FireLanguage fireLanguage) { - return firebaseObservableListeners.listenToSingleValueEvents( - booksTable.orderByChild(FireBookDetails.BOOK_LANGUAGE_FIELD).equalTo(fireLanguage.getId()), asBooks()); - } - - - - private Func1 asRole() { - return new Func1() { - @Override - public FireRole call(final DataSnapshot dataSnapshot) { - return dataSnapshot.getValue(FireRole.class); - } - }; - } - - private Func1 asContributor() { - return new Func1() { - @Override - public FireContributor call(DataSnapshot dataSnapshot) { - FireContributor contributor = dataSnapshot.getValue(FireContributor.class); - contributor.setId(dataSnapshot.getKey()); - Log.d(TAG, "Contributor:" + contributor.getName() + ", " + contributor.getAvatar()); - List keys = new ArrayList<>(); - if (dataSnapshot.child(FireContributor.ROLES_SECTION).hasChildren()) { - Iterable children = dataSnapshot.child(FireContributor.ROLES_SECTION).getChildren(); - for (DataSnapshot child : children) { - keys.add(child.getKey()); - } - } - contributor.setRoleIds(keys); - return contributor; - } - }; - } - - private Func1> asBooks() { - return new Func1>() { - @Override - public List call(DataSnapshot dataSnapshot) { - - List fireBookDetails = new ArrayList<>(); - for (DataSnapshot snap : dataSnapshot.getChildren()) { - FireBookDetails bookDetails = snap.getValue(FireBookDetails.class); - Log.d(TAG, "Book Details:" + bookDetails.getBookTitle() + ". Book URL:" + bookDetails - .getBookCoverPageUrl()); - bookDetails.setBookId(snap.getKey()); - List keys = new ArrayList<>(); - if (snap.child(FireBookDetails.CONTRIBUTORS_ITEM_NAME).hasChildren()) { - Iterable children = snap.child(FireBookDetails.CONTRIBUTORS_ITEM_NAME) - .getChildren(); - for (DataSnapshot child : children) { - keys.add(child.getKey()); - } - } - bookDetails.setContributorsIndexedKeys(keys); - fireBookDetails.add(bookDetails); - - } - Collections.sort(fireBookDetails, FireBookDetails.COMPARATOR); - return fireBookDetails; - } - }; - } - - private Func1> asLanguages() { - return new Func1>() { - @Override - public List call(DataSnapshot dataSnapshot) { - List fireLanguages = new ArrayList<>(); - for (DataSnapshot snap : dataSnapshot.getChildren()) { - FireLanguage language = snap.getValue(FireLanguage.class); - language.setId(snap.getKey()); - fireLanguages.add(language); - } - return fireLanguages; - } - }; - } - -} diff --git a/app/src/main/java/org/bookdash/android/data/database/firebase/FirebaseBookDatabase.kt b/app/src/main/java/org/bookdash/android/data/database/firebase/FirebaseBookDatabase.kt new file mode 100644 index 0000000..7a1882e --- /dev/null +++ b/app/src/main/java/org/bookdash/android/data/database/firebase/FirebaseBookDatabase.kt @@ -0,0 +1,112 @@ +package org.bookdash.android.data.database.firebase + +import android.util.Log + +import com.google.firebase.database.DataSnapshot +import com.google.firebase.database.DatabaseReference +import com.google.firebase.database.FirebaseDatabase + +import org.bookdash.android.data.utils.firebase.FirebaseObservableListeners +import org.bookdash.android.domain.model.firebase.FireBookDetails +import org.bookdash.android.domain.model.firebase.FireContributor +import org.bookdash.android.domain.model.firebase.FireLanguage +import org.bookdash.android.domain.model.firebase.FireRole + +import java.util.ArrayList +import java.util.Collections + +import rx.Observable +import rx.functions.Func1 + + +class FirebaseBookDatabase(firebaseDatabase: FirebaseDatabase, + private val firebaseObservableListeners: FirebaseObservableListeners) : BookDatabase { + private val booksTable: DatabaseReference = firebaseDatabase.getReference(FireBookDetails.TABLE_NAME) + private val languagesTable: DatabaseReference = firebaseDatabase.getReference(FireLanguage.TABLE_NAME) + private val contributorsTable: DatabaseReference = firebaseDatabase.getReference(FireContributor.TABLE_NAME) + private val roleTable: DatabaseReference = firebaseDatabase.getReference(FireRole.TABLE_NAME) + + override fun getLanguages(): Observable> { + return firebaseObservableListeners.listenToValueEvents(languagesTable, asLanguages()) + } + + override fun getBooks(): Observable> { + return firebaseObservableListeners + .listenToValueEvents(booksTable.orderByChild(FireBookDetails.BOOK_COLUMN_CREATED_DATE), asBooks()) + } + + override fun getContributorById(contributorId: String): Observable { + return firebaseObservableListeners + .listenToSingleValueEvents(contributorsTable.child(contributorId), asContributor()) + } + + override fun getRoleById(roleId: String): Observable { + return firebaseObservableListeners.listenToSingleValueEvents(roleTable.child(roleId), asRole()) + } + + override fun getBooksByLanguage(fireLanguage: FireLanguage): Observable> { + return firebaseObservableListeners.listenToSingleValueEvents( + booksTable.orderByChild(FireBookDetails.BOOK_LANGUAGE_FIELD).equalTo(fireLanguage.id), asBooks()) + } + + + private fun asRole(): Func1 { + return Func1 { dataSnapshot -> dataSnapshot.getValue(FireRole::class.java) } + } + + private fun asContributor(): Func1 { + return Func1 { dataSnapshot -> + val contributor = dataSnapshot.getValue(FireContributor::class.java) + contributor?.setId(dataSnapshot.key) + Log.d(TAG, "Contributor:" + contributor?.name + ", " + contributor?.avatar) + val keys = ArrayList() + if (dataSnapshot.child(FireContributor.ROLES_SECTION).hasChildren()) { + val children = dataSnapshot.child(FireContributor.ROLES_SECTION).children + children.mapTo(keys) { it.key } + } + contributor?.roleIds = keys + contributor + } + } + + private fun asBooks(): Func1> { + return Func1 { dataSnapshot -> + val fireBookDetails = ArrayList() + for (snap in dataSnapshot.children) { + val bookDetails = snap.getValue(FireBookDetails::class.java) + Log.d(TAG, "Book Details:" + bookDetails?.bookTitle + ". Book URL:" + bookDetails + ?.bookCoverPageUrl) + bookDetails?.bookId = snap.key + val keys = ArrayList() + if (snap.child(FireBookDetails.CONTRIBUTORS_ITEM_NAME).hasChildren()) { + val children = snap.child(FireBookDetails.CONTRIBUTORS_ITEM_NAME) + .children + children.mapTo(keys) { it.key } + } + bookDetails?.setContributorsIndexedKeys(keys) + fireBookDetails.add(bookDetails!!) + + } + Collections.sort(fireBookDetails, FireBookDetails.COMPARATOR) + fireBookDetails + } + } + + private fun asLanguages(): Func1> { + return Func1 { dataSnapshot -> + val fireLanguages = ArrayList() + for (snap in dataSnapshot.children) { + val language = snap.getValue(FireLanguage::class.java) + language?.id = snap.key + fireLanguages.add(language!!) + } + fireLanguages + } + } + + companion object { + + private const val TAG = "FirebaseBookDatabase" + } + +} diff --git a/app/src/main/java/org/bookdash/android/presentation/readbook/PageFragment.kt b/app/src/main/java/org/bookdash/android/presentation/readbook/PageFragment.kt index 9fac704..af915e4 100644 --- a/app/src/main/java/org/bookdash/android/presentation/readbook/PageFragment.kt +++ b/app/src/main/java/org/bookdash/android/presentation/readbook/PageFragment.kt @@ -27,7 +27,7 @@ class PageFragment : Fragment() { binding.page = page binding.page2 = page2 - val readBookViewModel = ViewModelProviders.of(activity).get(ReadBookViewModel::class.java) + val readBookViewModel = ViewModelProviders.of(activity!!).get(ReadBookViewModel::class.java) binding.nextClickListener = View.OnClickListener { Log.d(TAG, "Next Clicked") @@ -44,9 +44,9 @@ class PageFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - page = arguments.getParcelable(PAGE_ARG) - page2 = arguments.getParcelable(PAGE_2_ARG) - bookLocation = arguments.getString(ARG_BOOK_LOCATION) + page = arguments?.getParcelable(PAGE_ARG) + page2 = arguments?.getParcelable(PAGE_2_ARG) + bookLocation = arguments?.getString(ARG_BOOK_LOCATION) } companion object { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aaf4cfc..1dbcd3c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -81,9 +81,9 @@ Invite Friends All Books Downloaded Books - Oh no! You haven\'t \n\r downloaded any books.\n\r Head to the \"All Books\" \n\r section to download some! + Oh no! You haven\'t \n downloaded any books.\n Head to the \"All Books\" \n section to download some! No books available at the moment. Check back soon! - Book information is still loading... + Book information is still loading… Downloads Delete Downloaded Book Are you sure you want to delete \'%s\'? @@ -99,7 +99,7 @@ Check your connection and try again later. Check your internet connection and try again. No results found that match your query. - Search books... + Search books… Show Tutorial Display the tutorial for this app Settings diff --git a/build.gradle b/build.gradle index b4e6c83..39582fb 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,13 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.1.51' + ext.kotlin_version = '1.2.0' repositories { jcenter() google() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.0' + classpath 'com.android.tools.build:gradle:3.2.0-alpha03' classpath 'com.google.gms:google-services:3.1.1' classpath 'com.github.triplet.gradle:play-publisher:1.2.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" @@ -25,9 +25,9 @@ allprojects { ext { versionCode = 32 versionName = "2.6.1" - compileSdkVersion = 26 - buildToolsVersion = "26.0.1" - supportLibraryVersion = '26.1.0' + compileSdkVersion = 27 + buildToolsVersion = "27.0.3" + supportLibraryVersion = '27.0.2' googlePlayServicesVersion = '11.4.2' guavaVersion = '18.0' glideVersion = '3.7.0' diff --git a/fabbutton/build.gradle b/fabbutton/build.gradle index 8fb2ac6..47ca51f 100644 --- a/fabbutton/build.gradle +++ b/fabbutton/build.gradle @@ -26,12 +26,12 @@ apply plugin: 'com.android.library' version = "1.2.0" android { - compileSdkVersion 26 - buildToolsVersion '26.0.2' + compileSdkVersion 27 + buildToolsVersion '27.0.3' defaultConfig { minSdkVersion 14 - targetSdkVersion 26 + targetSdkVersion 27 versionCode 10 versionName version } @@ -44,5 +44,5 @@ android { } dependencies { - compile 'com.android.support:design:26.0.1' + implementation 'com.android.support:design:27.0.2' } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3004ed2..bd203c4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Oct 16 10:54:17 SAST 2017 +#Sat Feb 17 21:49:02 SAST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.5-all.zip From 3fb773c12f1f9c8a8453b0815e0a7035d4865754 Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Sat, 17 Feb 2018 22:17:14 +0200 Subject: [PATCH 2/4] Added Firebase Performance --- app/build.gradle | 3 ++- build.gradle | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 78319c2..bcda2c7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'io.fabric' apply plugin: 'com.github.triplet.play' - +apply plugin: 'com.google.firebase.firebase-perf' apply plugin: 'kotlin-kapt' repositories { @@ -201,6 +201,7 @@ dependencies { implementation('com.firebaseui:firebase-ui-storage:0.6.1') { exclude module: 'support-v4' } + implementation "com.google.firebase:firebase-perf:${rootProject.ext.googlePlayServicesVersion}" implementation 'io.reactivex:rxandroid:1.2.1' implementation 'io.reactivex:rxjava:1.2.5' diff --git a/build.gradle b/build.gradle index 39582fb..d78f610 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.2.0' + ext.kotlin_version = '1.2.21' repositories { jcenter() google() @@ -11,7 +11,7 @@ buildscript { classpath 'com.google.gms:google-services:3.1.1' classpath 'com.github.triplet.gradle:play-publisher:1.2.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - + classpath 'com.google.firebase:firebase-plugins:1.1.5' } } @@ -28,7 +28,7 @@ ext { compileSdkVersion = 27 buildToolsVersion = "27.0.3" supportLibraryVersion = '27.0.2' - googlePlayServicesVersion = '11.4.2' + googlePlayServicesVersion = '11.8.0' guavaVersion = '18.0' glideVersion = '3.7.0' junitVersion = '4.12' From 4253a9fb3d13a885541a3b5e23dc166af670481b Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Sat, 17 Feb 2018 22:19:56 +0200 Subject: [PATCH 3/4] Added circle.ci build server --- .circleci/config.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .circleci/config.yml diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..5516604 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,30 @@ +version: 2 +jobs: + build: + working_directory: ~/bookdash-android-app + docker: + - image: circleci/android:api-25-alpha + environment: + JVM_OPTS: -Xmx3200m + steps: + - checkout + - restore_cache: + key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }} + - run: + name: Chmod permissions #if permission for Gradlew Dependencies fail, use this. + command: sudo chmod +x ./gradlew + - run: + name: Download Dependencies + command: ./gradlew androidDependencies + - save_cache: + paths: + - ~/.gradle + key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }} + - run: + name: Run Tests + command: ./gradlew build lint test + - store_artifacts: + path: app/build/outputs + destination: outputs + - store_test_results: + path: app/build/test-results \ No newline at end of file From 92f68bde0a454066eaeb24b7290677c96f84bad4 Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Sat, 17 Feb 2018 22:29:25 +0200 Subject: [PATCH 4/4] release 2.7.0 --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index d78f610..f35c3cf 100644 --- a/build.gradle +++ b/build.gradle @@ -23,8 +23,8 @@ allprojects { } ext { - versionCode = 32 - versionName = "2.6.1" + versionCode = 33 + versionName = "2.7.0" compileSdkVersion = 27 buildToolsVersion = "27.0.3" supportLibraryVersion = '27.0.2'