diff --git a/app/build.gradle b/app/build.gradle index 7e04aaf..ae96ef1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,6 +66,9 @@ dependencies { // afollestad implementation 'com.afollestad.material-dialogs:core:' + versions.materialDialogs + // Misc + implementation 'com.github.okdroid:checkablechipview:' + versions.chipView + // Debugging implementation 'com.jakewharton.timber:timber:' + versions.timber implementation("com.crashlytics.sdk.android:crashlytics:${versions.fabric}") { diff --git a/app/src/main/java/com/afollestad/nocknock/koin/MainModule.kt b/app/src/main/java/com/afollestad/nocknock/koin/MainModule.kt index ba6dc40..647281b 100644 --- a/app/src/main/java/com/afollestad/nocknock/koin/MainModule.kt +++ b/app/src/main/java/com/afollestad/nocknock/koin/MainModule.kt @@ -23,6 +23,7 @@ import android.content.Context.NOTIFICATION_SERVICE import androidx.room.Room.databaseBuilder import com.afollestad.nocknock.data.AppDatabase import com.afollestad.nocknock.data.Database1to2Migration +import com.afollestad.nocknock.data.Database2to3Migration import com.afollestad.nocknock.notifications.Qualifiers.MAIN_ACTIVITY_CLASS import com.afollestad.nocknock.ui.main.MainActivity import com.afollestad.nocknock.utilities.ext.systemService @@ -38,7 +39,10 @@ val mainModule = module { single { databaseBuilder(get(), AppDatabase::class.java, "NockNock.db") - .addMigrations(Database1to2Migration()) + .addMigrations( + Database1to2Migration(), + Database2to3Migration() + ) .build() } diff --git a/app/src/test/java/com/afollestad/nocknock/TestData.kt b/app/src/test/java/com/afollestad/nocknock/TestData.kt index e8fb914..74fe5bb 100644 --- a/app/src/test/java/com/afollestad/nocknock/TestData.kt +++ b/app/src/test/java/com/afollestad/nocknock/TestData.kt @@ -83,6 +83,7 @@ fun fakeModel(id: Long) = Site( id = id, name = "Test", url = "https://test.com", + tags = "", settings = fakeSettingsModel(id), lastResult = fakeResultModel(id), retryPolicy = fakeRetryPolicy(id) diff --git a/data/src/androidTest/AndroidManifest.xml b/data/src/androidTest/AndroidManifest.xml index 17a2157..c83c51d 100644 --- a/data/src/androidTest/AndroidManifest.xml +++ b/data/src/androidTest/AndroidManifest.xml @@ -4,7 +4,7 @@ diff --git a/data/src/androidTest/java/com/afollestad/nocknock/data/AppDatabaseTest.kt b/data/src/androidTest/java/com/afollestad/nocknock/data/AppDatabaseTest.kt index bfad8f7..bd249bc 100644 --- a/data/src/androidTest/java/com/afollestad/nocknock/data/AppDatabaseTest.kt +++ b/data/src/androidTest/java/com/afollestad/nocknock/data/AppDatabaseTest.kt @@ -59,9 +59,7 @@ class AppDatabaseTest() { @After @Throws(IOException::class) - fun destroy() { - db.close() - } + fun destroy() = db.close() // SiteDao @@ -69,6 +67,7 @@ class AppDatabaseTest() { val model1 = Site( name = "Test 1", url = "https://test1.com", + tags = "", settings = null, lastResult = null, retryPolicy = null @@ -79,6 +78,7 @@ class AppDatabaseTest() { val model2 = Site( name = "Test 2", url = "https://test2.com", + tags = "", settings = null, lastResult = null, retryPolicy = null @@ -96,6 +96,7 @@ class AppDatabaseTest() { val model = Site( name = "Test", url = "https://test.com", + tags = "", settings = null, lastResult = null, retryPolicy = null @@ -111,6 +112,7 @@ class AppDatabaseTest() { val initialModel = Site( name = "Test 1", url = "https://test1.com", + tags = "", settings = null, lastResult = null, retryPolicy = null @@ -135,6 +137,7 @@ class AppDatabaseTest() { val model1 = Site( name = "Test 1", url = "https://test1.com", + tags = "", settings = null, lastResult = null, retryPolicy = null @@ -145,6 +148,7 @@ class AppDatabaseTest() { val model2 = Site( name = "Test 2", url = "https://test2.com", + tags = "", settings = null, lastResult = null, retryPolicy = null @@ -292,7 +296,7 @@ class AppDatabaseTest() { val newId = retryDao.insert(model) assertThat(newId).isEqualTo(1) - val finalModel = resultsDao.forSite(newId) + val finalModel = retryDao.forSite(newId) .single() assertThat(finalModel).isEqualTo(model.copy(siteId = newId)) } @@ -348,6 +352,25 @@ class AppDatabaseTest() { assertThat(allSites[2]).isEqualTo(MOCK_MODEL_3) } + @Test fun extension_put_and_allSites_withTag() { + val model1 = MOCK_MODEL_1.copy(tags = "one,two,three") + val model2 = MOCK_MODEL_2.copy(tags = "four,five,six") + val model3 = MOCK_MODEL_3.copy(tags = "seven,eight,nine") + + db.putSite(model1) + db.putSite(model2) + db.putSite(model3) + + val allSites1 = db.allSites(forTag = "one") + assertThat(allSites1.single()).isEqualTo(model1) + + val allSites2 = db.allSites(forTag = "five") + assertThat(allSites2.single()).isEqualTo(model2) + + val allSites3 = db.allSites(forTag = "nine") + assertThat(allSites3.single()).isEqualTo(model3) + } + @Test fun extension_put_getSite() { db.putSite(MOCK_MODEL_1) db.putSite(MOCK_MODEL_2) diff --git a/data/src/androidTest/java/com/afollestad/nocknock/data/TestUtil.kt b/data/src/androidTest/java/com/afollestad/nocknock/data/TestUtil.kt index 15ec3e6..9cfe214 100644 --- a/data/src/androidTest/java/com/afollestad/nocknock/data/TestUtil.kt +++ b/data/src/androidTest/java/com/afollestad/nocknock/data/TestUtil.kt @@ -62,6 +62,7 @@ fun fakeModel(id: Long) = Site( id = id, name = "Test", url = "https://test.com", + tags = "", settings = fakeSettingsModel(id), lastResult = fakeResultModel(id), retryPolicy = fakeRetryPolicy(id) diff --git a/data/src/main/java/com/afollestad/nocknock/data/AppDatabase.kt b/data/src/main/java/com/afollestad/nocknock/data/AppDatabase.kt index 86e6c4c..61c035d 100644 --- a/data/src/main/java/com/afollestad/nocknock/data/AppDatabase.kt +++ b/data/src/main/java/com/afollestad/nocknock/data/AppDatabase.kt @@ -52,21 +52,28 @@ abstract class AppDatabase : RoomDatabase() { * * @author Aidan Follestad (@afollestad) */ -fun AppDatabase.allSites(): List { - return siteDao().all() - .map { - val settings = siteSettingsDao().forSite(it.id) - .single() - val lastResult = validationResultsDao().forSite(it.id) - .singleOrNull() - val retryPolicy = retryPolicyDao().forSite(it.id) - .singleOrNull() - return@map it.copy( - settings = settings, - lastResult = lastResult, - retryPolicy = retryPolicy - ) - } +fun AppDatabase.allSites(forTag: String = ""): List { + val lowercaseTag = forTag.toLowerCase() + var all = siteDao().all() + if (!forTag.isEmpty()) { + all = all.filter { + forTag.isEmpty() || + it.tags.toLowerCase().split(",").contains(lowercaseTag) + } + } + return all.map { + val settings = siteSettingsDao().forSite(it.id) + .single() + val lastResult = validationResultsDao().forSite(it.id) + .singleOrNull() + val retryPolicy = retryPolicyDao().forSite(it.id) + .singleOrNull() + return@map it.copy( + settings = settings, + lastResult = lastResult, + retryPolicy = retryPolicy + ) + } } /** diff --git a/data/src/main/java/com/afollestad/nocknock/data/DatabaseMigrations.kt b/data/src/main/java/com/afollestad/nocknock/data/DatabaseMigrations.kt index 53a9275..a7f4d2e 100644 --- a/data/src/main/java/com/afollestad/nocknock/data/DatabaseMigrations.kt +++ b/data/src/main/java/com/afollestad/nocknock/data/DatabaseMigrations.kt @@ -31,3 +31,15 @@ class Database1to2Migration : Migration(1, 2) { ) } } + +/** + * Migrates the database from version 2 to 3. + * + * @author Aidan Follestad (@afollestad) + */ +class Database2to3Migration : Migration(1, 2) { + + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("ALTER TABLE `sites` ADD COLUMN tags TEXT NOT NULL") + } +} diff --git a/data/src/main/java/com/afollestad/nocknock/data/model/Site.kt b/data/src/main/java/com/afollestad/nocknock/data/model/Site.kt index d78ecb4..1fe0f08 100644 --- a/data/src/main/java/com/afollestad/nocknock/data/model/Site.kt +++ b/data/src/main/java/com/afollestad/nocknock/data/model/Site.kt @@ -31,8 +31,10 @@ data class Site( @PrimaryKey(autoGenerate = true) var id: Long = 0, /** The site's user-given name. */ var name: String, - /** The URl at which validation attempts are made to. */ + /** The URL at which validation attempts are made to. */ var url: String, + /** Comma separated tags for this site. */ + var tags: String, /** Settings for the site. */ @Ignore var settings: SiteSettings?, /** The last validation attempt result for the site, if any. */ @@ -41,7 +43,7 @@ data class Site( @Ignore var retryPolicy: RetryPolicy? ) : CanNotifyModel { - constructor() : this(0, "", "", null, null, null) + constructor() : this(0, "", "", "", null, null, null) override fun notifyId(): Int = id.toInt() diff --git a/dependencies.gradle b/dependencies.gradle index 9432a8e..1c34978 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -15,6 +15,7 @@ ext.versions = [ // Misc okHttp : '3.12.1', rhino : '1.7.10', + chipView : '1.0.3', // Kotlin kotlin : '1.3.11',