diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..771dddf
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,22 @@
+language: android
+jdk: oraclejdk8
+
+env:
+ matrix:
+ - ANDROID_TARGET=android-21 ANDROID_ABI=armeabi-v7a
+
+android:
+ components:
+ - tools # to get the new `repository-11.xml`
+ - tools # see https://github.com/travis-ci/travis-ci/issues/6040#issuecomment-219367943)
+ - platform-tools
+ - build-tools-28.0.3
+ - android-28
+
+ licenses:
+ - '.+'
+
+before_install:
+ - yes | sdkmanager "platforms;android-28"
+script:
+ - ./gradlew build connectedCheck
diff --git a/README.md b/README.md
index 84ee16c..156123f 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,6 @@
## Nock Nock
+[](https://travis-ci.org/afollestad/nock-nock)
[](https://www.apache.org/licenses/LICENSE-2.0.html)

diff --git a/app/build.gradle b/app/build.gradle
index d6b315e..4b02af4 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -20,10 +20,6 @@ android {
sourceCompatibility 1.8
targetCompatibility 1.8
}
-
- packagingOptions {
- exclude 'META-INF/atomicfu.kotlin_module'
- }
}
dependencies {
diff --git a/app/src/main/java/com/afollestad/nocknock/ui/DarkModeSwitchActivity.kt b/app/src/main/java/com/afollestad/nocknock/ui/DarkModeSwitchActivity.kt
index 3220567..bf5422d 100644
--- a/app/src/main/java/com/afollestad/nocknock/ui/DarkModeSwitchActivity.kt
+++ b/app/src/main/java/com/afollestad/nocknock/ui/DarkModeSwitchActivity.kt
@@ -55,7 +55,8 @@ abstract class DarkModeSwitchActivity : AppCompatActivity() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
return UNKNOWN
}
- return when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) {
+ val currentNightMode = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
+ return when (currentNightMode) {
Configuration.UI_MODE_NIGHT_YES -> return ENABLED
Configuration.UI_MODE_NIGHT_NO -> return DISABLED
else -> UNKNOWN
diff --git a/app/src/main/java/com/afollestad/nocknock/ui/main/MainActivity.kt b/app/src/main/java/com/afollestad/nocknock/ui/main/MainActivity.kt
index aec76d8..7b59bf1 100644
--- a/app/src/main/java/com/afollestad/nocknock/ui/main/MainActivity.kt
+++ b/app/src/main/java/com/afollestad/nocknock/ui/main/MainActivity.kt
@@ -24,6 +24,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager.HORIZONTAL
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.list.listItems
+import com.afollestad.materialdialogs.list.listItemsSingleChoice
import com.afollestad.nocknock.R
import com.afollestad.nocknock.adapter.SiteAdapter
import com.afollestad.nocknock.adapter.TagAdapter
@@ -34,6 +35,9 @@ import com.afollestad.nocknock.notifications.NockNotificationManager
import com.afollestad.nocknock.ui.DarkModeSwitchActivity
import com.afollestad.nocknock.ui.NightMode.UNKNOWN
import com.afollestad.nocknock.utilities.providers.IntentProvider
+import com.afollestad.nocknock.utilities.ui.toast
+import com.afollestad.nocknock.viewUrl
+import com.afollestad.nocknock.viewUrlWithApp
import com.afollestad.nocknock.viewcomponents.livedata.toViewVisibility
import kotlinx.android.synthetic.main.activity_main.fab
import kotlinx.android.synthetic.main.activity_main.list
@@ -101,6 +105,7 @@ class MainActivity : DarkModeSwitchActivity() {
when (item.itemId) {
R.id.about -> AboutDialog.show(this@MainActivity)
R.id.dark_mode -> toggleDarkMode()
+ R.id.support_me -> supportMe()
}
return@setOnMenuItemClickListener true
}
@@ -146,4 +151,20 @@ class MainActivity : DarkModeSwitchActivity() {
viewSite(model)
}
}
+
+ private fun supportMe() {
+ MaterialDialog(this).show {
+ title(R.string.support_me)
+ message(R.string.support_me_message, html = true, lineHeightMultiplier = 1.4f)
+ listItemsSingleChoice(R.array.donation_options) { _, index, _ ->
+ when (index) {
+ 0 -> viewUrl("https://paypal.me/AidanFollestad")
+ 1 -> viewUrlWithApp("https://cash.me/\$afollestad", pkg = "com.squareup.cash")
+ 2 -> viewUrlWithApp("https://venmo.com/afollestad", pkg = "com.venmo")
+ }
+ toast(R.string.thank_you)
+ }
+ positiveButton(R.string.next)
+ }
+ }
}
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
index 5f2f23f..b3b1727 100644
--- a/app/src/main/res/menu/menu_main.xml
+++ b/app/src/main/res/menu/menu_main.xml
@@ -7,4 +7,7 @@
android:id="@+id/dark_mode"
android:checkable="true"
android:title="@string/dark_mode"/>
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
deleted file mode 100644
index 80b730f..0000000
--- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
deleted file mode 100644
index 80b730f..0000000
--- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
index a86dbab..d1698c3 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
deleted file mode 100644
index eb43a7b..0000000
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
deleted file mode 100644
index 4567198..0000000
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
index 60056be..cccfa5b 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
deleted file mode 100644
index 666c904..0000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
deleted file mode 100644
index 3baff41..0000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index 27f30d2..a4f8356 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
deleted file mode 100644
index 4224797..0000000
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
deleted file mode 100644
index 1d29a54..0000000
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index 60a8d1a..49dd226 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
deleted file mode 100644
index 7cf19eb..0000000
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
deleted file mode 100644
index 1548eb9..0000000
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index ac61bd3..bd57c86 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
deleted file mode 100644
index 9c43fc9..0000000
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
deleted file mode 100644
index 04806fd..0000000
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index 84ad226..db28598 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -13,4 +13,10 @@
- JavaScript Evaluation
+
+ - via PayPal
+ - via Cash App
+ - via Venmo
+
+
diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml
deleted file mode 100644
index 70daa76..0000000
--- a/app/src/main/res/values/ic_launcher_background.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
- #758F9A
-
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 3ac40a0..2267417 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -14,7 +14,6 @@
LinkedIn
Nock Nock is open source! Check out the GitHub page!
Icon by Kevin Aguilar of 221 Pixels.
-
View the Privacy Policy.
]]>
Dark Mode
@@ -85,6 +84,14 @@
exception to pass custom error messages to Nock Nock.
+ Donate
+ Nock Nock was created and is maintained by one person. Donations are much
+ appreciated and encourage continued support.
+ ]]>
+ Thank you very much!
+ Next
+
Please install a web browser app, such as Google Chrome.
diff --git a/common/build.gradle b/common/build.gradle
index 5004349..76d7d02 100644
--- a/common/build.gradle
+++ b/common/build.gradle
@@ -12,10 +12,6 @@ android {
versionName versions.publishVersion
}
- packagingOptions {
- exclude 'META-INF/atomicfu.kotlin_module'
- }
-
// For Mozilla Rhino
lintOptions {
abortOnError false
diff --git a/data/build.gradle b/data/build.gradle
index e413d4c..5512756 100644
--- a/data/build.gradle
+++ b/data/build.gradle
@@ -14,10 +14,6 @@ android {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
-
- packagingOptions {
- exclude 'META-INF/atomicfu.kotlin_module'
- }
}
dependencies {
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 e7d4400..db9edd7 100644
--- a/data/src/androidTest/java/com/afollestad/nocknock/data/AppDatabaseTest.kt
+++ b/data/src/androidTest/java/com/afollestad/nocknock/data/AppDatabaseTest.kt
@@ -431,30 +431,9 @@ class AppDatabaseTest() {
val allSites = db.allSites()
assertThat(allSites.size).isEqualTo(3)
- assertThat(allSites[0]).isEqualTo(
- MOCK_MODEL_1.copy(
- headers = listOf(
- MOCK_MODEL_1.headers.first().copy(id = 1),
- MOCK_MODEL_1.headers.last().copy(id = 2)
- )
- )
- )
- assertThat(allSites[1]).isEqualTo(
- MOCK_MODEL_2.copy(
- headers = listOf(
- MOCK_MODEL_2.headers.first().copy(id = 3),
- MOCK_MODEL_2.headers.last().copy(id = 4)
- )
- )
- )
- assertThat(allSites[2]).isEqualTo(
- MOCK_MODEL_3.copy(
- headers = listOf(
- MOCK_MODEL_3.headers.first().copy(id = 5),
- MOCK_MODEL_3.headers.last().copy(id = 6)
- )
- )
- )
+ assertThat(allSites[0]).isEqualTo(MOCK_MODEL_1)
+ assertThat(allSites[1]).isEqualTo(MOCK_MODEL_2)
+ assertThat(allSites[2]).isEqualTo(MOCK_MODEL_3)
}
@Test fun extension_put_getSite() {
@@ -491,12 +470,10 @@ class AppDatabaseTest() {
)
val updatedHeaders = listOf(
modelToUpdate.headers.first().copy(
- id = 7,
key = "One",
value = "Hello"
),
modelToUpdate.headers.last().copy(
- id = 8,
key = "Two",
value = "Hey"
)
diff --git a/dependencies.gradle b/dependencies.gradle
index e0e2412..4225186 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -3,23 +3,23 @@ ext.versions = [
minSdk : 21,
compileSdk : 28,
buildTools : '28.0.3',
- publishVersion : '0.8.8',
- publishVersionCode : 46,
+ publishVersion : '0.8.7',
+ publishVersionCode : 43,
// Plugins
- gradlePlugin : '3.4.0',
- spotlessPlugin : '3.22.0',
+ gradlePlugin : '3.3.2',
+ spotlessPlugin : '3.19.0',
versionPlugin : '0.21.0',
googleServices : '4.2.0',
fabricPlugin : '1.+',
// Misc
- okHttp : '3.14.1',
+ okHttp : '3.14.0',
rhino : '1.7.10',
// Kotlin
- kotlin : '1.3.30',
- coroutines : '1.2.0',
+ kotlin : '1.3.21',
+ coroutines : '1.1.1',
koin : '1.0.2',
// Google/AndroidX
@@ -30,16 +30,16 @@ ext.versions = [
googleMaterial : '1.0.0',
room : '2.0.0',
lifecycle : '2.0.0',
- firebaseCore : '16.0.8',
+ firebaseCore : '16.0.7',
// Rx
- rxJava : '2.2.8',
+ rxJava : '2.2.7',
rxBinding : '3.0.0-alpha1',
// afollestad
- materialDialogs : '2.8.1',
+ materialDialogs : '2.0.3',
rxkPrefs : '1.2.5',
- vvalidator : '0.4.1',
+ vvalidator : '0.3.1',
// Debugging
timber : '4.7.1',
@@ -47,12 +47,12 @@ ext.versions = [
// Unit testing
junit : '4.12',
- mockito : '2.27.0',
+ mockito : '2.25.0',
mockitoKotlin : '2.1.0',
- truth : '0.44',
+ truth : '0.43',
// UI testing
androidxTestRunner : '1.1.1',
androidxTest : '1.1.0',
- archTesting : '2.0.1'
+ archTesting : '2.0.0'
]
diff --git a/ic_web.png b/ic_web.png
index d54b6ec..509177f 100644
Binary files a/ic_web.png and b/ic_web.png differ
diff --git a/viewcomponents/src/main/java/com/afollestad/nocknock/viewcomponents/headers/HeaderStackLayout.kt b/viewcomponents/src/main/java/com/afollestad/nocknock/viewcomponents/headers/HeaderStackLayout.kt
index 6abff33..092d416 100644
--- a/viewcomponents/src/main/java/com/afollestad/nocknock/viewcomponents/headers/HeaderStackLayout.kt
+++ b/viewcomponents/src/main/java/com/afollestad/nocknock/viewcomponents/headers/HeaderStackLayout.kt
@@ -56,22 +56,9 @@ class HeaderStackLayout(
override fun onClick(v: View) {
val index = v.tag as Int
- check(index >= 0 || index < list.childCount) {
- "Index $index is out of bounds in the header stack (size ${list.childCount})."
- }
- list.post {
- list.removeViewAt(index)
- headers.removeAt(index)
- invalidateTags()
- postLiveData()
- }
- }
-
- private fun invalidateTags() {
- for (i in 0 until list.childCount) {
- val entry = list.getChildAt(i) as HeaderItemLayout
- entry.btnRemove.tag = i
- }
+ list.removeViewAt(index)
+ headers.removeAt(index)
+ postLiveData()
}
private fun addEntry(forHeader: Header) {
@@ -80,7 +67,9 @@ class HeaderStackLayout(
val li = LayoutInflater.from(context)
val entry = li.inflate(R.layout.header_stack_item, list, false) as HeaderItemLayout
- list.addView(entry.apply {
+ list.addView(entry)
+
+ entry.run {
inputKey.setText(forHeader.key)
inputKey.post { entry.inputKey.requestFocus() }
attachHeader(forHeader, this@HeaderStackLayout)
@@ -88,6 +77,6 @@ class HeaderStackLayout(
btnRemove.tag = headers.size - 1
btnRemove.setOnClickListener(this@HeaderStackLayout)
- })
+ }
}
}