diff --git a/app/src/main/java/com/afollestad/nocknock/NockNockApp.kt b/app/src/main/java/com/afollestad/nocknock/NockNockApp.kt index 6e08bd5..9cc5a8e 100644 --- a/app/src/main/java/com/afollestad/nocknock/NockNockApp.kt +++ b/app/src/main/java/com/afollestad/nocknock/NockNockApp.kt @@ -13,6 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +@file:Suppress("unused") + package com.afollestad.nocknock import android.app.Application @@ -21,7 +23,7 @@ import com.afollestad.nocknock.koin.mainModule import com.afollestad.nocknock.koin.viewModelModule import com.afollestad.nocknock.notifications.NockNotificationManager import com.afollestad.nocknock.notifications.notificationsModule -import com.afollestad.nocknock.utilities.utilitiesModule +import com.afollestad.nocknock.utilities.commonModule import org.koin.android.ext.android.inject import org.koin.android.ext.android.startKoin import timber.log.Timber @@ -42,7 +44,7 @@ class NockNockApp : Application() { val modules = listOf( mainModule, engineModule, - utilitiesModule, + commonModule, notificationsModule, viewModelModule ) 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 9667287..33a3df5 100644 --- a/app/src/main/java/com/afollestad/nocknock/koin/MainModule.kt +++ b/app/src/main/java/com/afollestad/nocknock/koin/MainModule.kt @@ -21,23 +21,19 @@ import android.app.job.JobScheduler import android.content.Context.JOB_SCHEDULER_SERVICE import android.content.Context.NOTIFICATION_SERVICE import androidx.room.Room.databaseBuilder -import com.afollestad.nocknock.R import com.afollestad.nocknock.data.AppDatabase -import com.afollestad.nocknock.notifications.Qualifiers.APP_ICON_RES +import com.afollestad.nocknock.notifications.Qualifiers.MAIN_ACTIVITY_CLASS import com.afollestad.nocknock.ui.main.MainActivity -import com.afollestad.nocknock.utilities.Qualifiers.MAIN_ACTIVITY_CLASS import com.afollestad.nocknock.utilities.ext.systemService import okhttp3.OkHttpClient import org.koin.dsl.module.module -const val MAIN_MODULE = "main" +val mainActivityCls = MainActivity::class.java /** @author Aidan Follestad (@afollestad) */ -val mainModule = module(MAIN_MODULE) { +val mainModule = module { - single(name = APP_ICON_RES) { R.mipmap.ic_launcher } - - single(name = MAIN_ACTIVITY_CLASS) { MainActivity::class.java } + single(name = MAIN_ACTIVITY_CLASS) { mainActivityCls } single { databaseBuilder(get(), AppDatabase::class.java, "NockNock.db").build() } diff --git a/app/src/main/java/com/afollestad/nocknock/koin/ViewModelModule.kt b/app/src/main/java/com/afollestad/nocknock/koin/ViewModelModule.kt index 55c1f57..ab8cd79 100644 --- a/app/src/main/java/com/afollestad/nocknock/koin/ViewModelModule.kt +++ b/app/src/main/java/com/afollestad/nocknock/koin/ViewModelModule.kt @@ -23,10 +23,8 @@ import com.afollestad.nocknock.utilities.Qualifiers.MAIN_DISPATCHER import org.koin.androidx.viewmodel.ext.koin.viewModel import org.koin.dsl.module.module -const val VIEW_MODEL_MODULE = "view_models" - /** @author Aidan Follestad (@afollestad) */ -val viewModelModule = module(VIEW_MODEL_MODULE) { +val viewModelModule = module { viewModel { MainViewModel( 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 4ee0e75..0c9bc7d 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 @@ -50,10 +50,11 @@ class MainActivity : AppCompatActivity() { private lateinit var adapter: ServerAdapter - private val statusUpdateReceiver = + private val statusUpdateReceiver by lazy { StatusUpdateIntentReceiver(application, intentProvider) { viewModel.postSiteUpdate(it) } + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/afollestad/nocknock/ui/viewsite/ViewSiteActivity.kt b/app/src/main/java/com/afollestad/nocknock/ui/viewsite/ViewSiteActivity.kt index c4d9ad4..fddf3d7 100644 --- a/app/src/main/java/com/afollestad/nocknock/ui/viewsite/ViewSiteActivity.kt +++ b/app/src/main/java/com/afollestad/nocknock/ui/viewsite/ViewSiteActivity.kt @@ -58,10 +58,11 @@ class ViewSiteActivity : AppCompatActivity() { internal val viewModel by viewModel() private val intentProvider by inject() - private val statusUpdateReceiver = + private val statusUpdateReceiver by lazy { StatusUpdateIntentReceiver(application, intentProvider) { viewModel.setModel(it) } + } @SuppressLint("SetTextI18n") override fun onCreate(savedInstanceState: Bundle?) { diff --git a/common/src/main/java/com/afollestad/nocknock/utilities/CommonModule.kt b/common/src/main/java/com/afollestad/nocknock/utilities/CommonModule.kt new file mode 100644 index 0000000..49ceb52 --- /dev/null +++ b/common/src/main/java/com/afollestad/nocknock/utilities/CommonModule.kt @@ -0,0 +1,39 @@ +/** + * Designed and developed by Aidan Follestad (@afollestad) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.afollestad.nocknock.utilities + +import com.afollestad.nocknock.utilities.Qualifiers.IO_DISPATCHER +import com.afollestad.nocknock.utilities.Qualifiers.MAIN_DISPATCHER +import com.afollestad.nocknock.utilities.providers.RealStringProvider +import com.afollestad.nocknock.utilities.providers.StringProvider +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers +import org.koin.dsl.module.module + +object Qualifiers { + const val MAIN_DISPATCHER = "main_dispatcher" + const val IO_DISPATCHER = "io_dispatcher" +} + +/** @author Aidan Follestad (@afollestad) */ +val commonModule = module { + + factory(name = MAIN_DISPATCHER) { Dispatchers.Main } + + factory(name = IO_DISPATCHER) { Dispatchers.IO } + + factory { RealStringProvider(get()) } bind StringProvider::class +} diff --git a/common/src/main/java/com/afollestad/nocknock/utilities/UtilitiesModule.kt b/common/src/main/java/com/afollestad/nocknock/utilities/UtilitiesModule.kt deleted file mode 100644 index e48adb3..0000000 --- a/common/src/main/java/com/afollestad/nocknock/utilities/UtilitiesModule.kt +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Designed and developed by Aidan Follestad (@afollestad) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.afollestad.nocknock.utilities - -import com.afollestad.nocknock.utilities.Qualifiers.IO_DISPATCHER -import com.afollestad.nocknock.utilities.Qualifiers.MAIN_ACTIVITY_CLASS -import com.afollestad.nocknock.utilities.Qualifiers.MAIN_DISPATCHER -import com.afollestad.nocknock.utilities.providers.BitmapProvider -import com.afollestad.nocknock.utilities.providers.BundleProvider -import com.afollestad.nocknock.utilities.providers.IntentProvider -import com.afollestad.nocknock.utilities.providers.JobInfoProvider -import com.afollestad.nocknock.utilities.providers.NotificationChannelProvider -import com.afollestad.nocknock.utilities.providers.NotificationProvider -import com.afollestad.nocknock.utilities.providers.RealBitmapProvider -import com.afollestad.nocknock.utilities.providers.RealBundleProvider -import com.afollestad.nocknock.utilities.providers.RealIntentProvider -import com.afollestad.nocknock.utilities.providers.RealJobInfoProvider -import com.afollestad.nocknock.utilities.providers.RealNotificationChannelProvider -import com.afollestad.nocknock.utilities.providers.RealNotificationProvider -import com.afollestad.nocknock.utilities.providers.RealSdkProvider -import com.afollestad.nocknock.utilities.providers.RealStringProvider -import com.afollestad.nocknock.utilities.providers.SdkProvider -import com.afollestad.nocknock.utilities.providers.StringProvider -import kotlinx.coroutines.Dispatchers -import org.koin.dsl.module.module - -const val UTILITIES_MODULE = "utilities" - -object Qualifiers { - const val MAIN_ACTIVITY_CLASS = "main.main_activity_class" - const val MAIN_DISPATCHER = "main.main_dispatcher" - const val IO_DISPATCHER = "main.io_dispatcher" -} - -/** @author Aidan Follestad (@afollestad) */ -val utilitiesModule = module(UTILITIES_MODULE) { - - factory(name = MAIN_DISPATCHER) { Dispatchers.Main } - - factory(name = IO_DISPATCHER) { Dispatchers.IO } - - factory { RealSdkProvider() } bind SdkProvider::class - - factory { RealBitmapProvider(get()) } bind BitmapProvider::class - - factory { RealStringProvider(get()) } bind StringProvider::class - - factory { - RealIntentProvider(get(), get(name = MAIN_ACTIVITY_CLASS)) - } bind IntentProvider::class - - factory { - RealNotificationChannelProvider(get()) - } bind NotificationChannelProvider::class - - factory { RealNotificationProvider(get()) } bind NotificationProvider::class - - factory { RealBundleProvider() } bind BundleProvider::class - - factory { RealJobInfoProvider(get()) } bind JobInfoProvider::class -} diff --git a/common/src/main/java/com/afollestad/nocknock/utilities/providers/BitmapProvider.kt b/common/src/main/java/com/afollestad/nocknock/utilities/providers/BitmapProvider.kt deleted file mode 100644 index 7d87780..0000000 --- a/common/src/main/java/com/afollestad/nocknock/utilities/providers/BitmapProvider.kt +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Designed and developed by Aidan Follestad (@afollestad) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.afollestad.nocknock.utilities.providers - -import android.content.Context -import android.graphics.Bitmap -import android.graphics.BitmapFactory.decodeResource -import androidx.annotation.DrawableRes - -/** @author Aidan Follestad (@afollestad) */ -interface BitmapProvider { - - fun get(@DrawableRes res: Int): Bitmap -} - -/** @author Aidan Follestad (@afollestad) */ -class RealBitmapProvider( - private val context: Context -) : BitmapProvider { - - override fun get(res: Int): Bitmap { - return decodeResource(context.resources, res) - } -} diff --git a/common/src/main/java/com/afollestad/nocknock/utilities/providers/NotificationProvider.kt b/common/src/main/java/com/afollestad/nocknock/utilities/providers/NotificationProvider.kt index e0f45f1..6a85298 100644 --- a/common/src/main/java/com/afollestad/nocknock/utilities/providers/NotificationProvider.kt +++ b/common/src/main/java/com/afollestad/nocknock/utilities/providers/NotificationProvider.kt @@ -31,7 +31,7 @@ interface NotificationProvider { content: String, intent: PendingIntent, smallIcon: Int, - largeIcon: Bitmap + largeIcon: Bitmap? = null ): Notification } @@ -46,7 +46,7 @@ class RealNotificationProvider( content: String, intent: PendingIntent, smallIcon: Int, - largeIcon: Bitmap + largeIcon: Bitmap? ): Notification { return NotificationCompat.Builder(context, channelId) .setContentTitle(title) diff --git a/engine/src/main/java/com/afollestad/nocknock/engine/EngineModule.kt b/engine/src/main/java/com/afollestad/nocknock/engine/EngineModule.kt index e766ca3..fbd3a45 100644 --- a/engine/src/main/java/com/afollestad/nocknock/engine/EngineModule.kt +++ b/engine/src/main/java/com/afollestad/nocknock/engine/EngineModule.kt @@ -19,10 +19,8 @@ import com.afollestad.nocknock.engine.validation.RealValidationManager import com.afollestad.nocknock.engine.validation.ValidationManager import org.koin.dsl.module.module -const val ENGINE_MODULE = "engine" - /** @author Aidan Follestad (@afollestad) */ -val engineModule = module(ENGINE_MODULE) { +val engineModule = module { single { RealValidationManager(get(), get(), get(), get(), get(), get()) diff --git a/notifications/src/main/java/com/afollestad/nocknock/notifications/NockNotificationManager.kt b/notifications/src/main/java/com/afollestad/nocknock/notifications/NockNotificationManager.kt index 981a442..e497151 100644 --- a/notifications/src/main/java/com/afollestad/nocknock/notifications/NockNotificationManager.kt +++ b/notifications/src/main/java/com/afollestad/nocknock/notifications/NockNotificationManager.kt @@ -19,7 +19,6 @@ import android.annotation.TargetApi import android.app.NotificationManager import android.os.Build.VERSION_CODES import com.afollestad.nocknock.notifications.Channel.CheckFailures -import com.afollestad.nocknock.utilities.providers.BitmapProvider import com.afollestad.nocknock.utilities.providers.CanNotifyModel import com.afollestad.nocknock.utilities.providers.IntentProvider import com.afollestad.nocknock.utilities.providers.NotificationChannelProvider @@ -44,9 +43,7 @@ interface NockNotificationManager { /** @author Aidan Follestad (@afollestad) */ class RealNockNotificationManager( - private val appIconRes: Int, private val stockManager: NotificationManager, - private val bitmapProvider: BitmapProvider, private val stringProvider: StringProvider, private val intentProvider: IntentProvider, private val channelProvider: NotificationChannelProvider, @@ -78,8 +75,7 @@ class RealNockNotificationManager( title = model.notifyName(), content = stringProvider.get(R.string.something_wrong), intent = intent, - smallIcon = R.drawable.ic_notification, - largeIcon = bitmapProvider.get(appIconRes) + smallIcon = R.drawable.ic_notification ) stockManager.notify(model.notifyTag(), model.notificationId(), newNotification) diff --git a/notifications/src/main/java/com/afollestad/nocknock/notifications/NotificationsModule.kt b/notifications/src/main/java/com/afollestad/nocknock/notifications/NotificationsModule.kt index 3f2a9a6..73274c5 100644 --- a/notifications/src/main/java/com/afollestad/nocknock/notifications/NotificationsModule.kt +++ b/notifications/src/main/java/com/afollestad/nocknock/notifications/NotificationsModule.kt @@ -15,21 +15,45 @@ */ package com.afollestad.nocknock.notifications -import com.afollestad.nocknock.notifications.Qualifiers.APP_ICON_RES +import com.afollestad.nocknock.notifications.Qualifiers.MAIN_ACTIVITY_CLASS +import com.afollestad.nocknock.utilities.providers.BundleProvider +import com.afollestad.nocknock.utilities.providers.IntentProvider +import com.afollestad.nocknock.utilities.providers.JobInfoProvider +import com.afollestad.nocknock.utilities.providers.NotificationChannelProvider +import com.afollestad.nocknock.utilities.providers.NotificationProvider +import com.afollestad.nocknock.utilities.providers.RealBundleProvider +import com.afollestad.nocknock.utilities.providers.RealIntentProvider +import com.afollestad.nocknock.utilities.providers.RealJobInfoProvider +import com.afollestad.nocknock.utilities.providers.RealNotificationChannelProvider +import com.afollestad.nocknock.utilities.providers.RealNotificationProvider +import com.afollestad.nocknock.utilities.providers.RealSdkProvider +import com.afollestad.nocknock.utilities.providers.SdkProvider import org.koin.dsl.module.module -const val NOTIFICATIONS_MODULE = "notifications" - object Qualifiers { - const val APP_ICON_RES = "main.app_icon_res" + const val MAIN_ACTIVITY_CLASS = "main_activity_class" } -val notificationsModule = module(NOTIFICATIONS_MODULE) { +val notificationsModule = module { + + factory { + RealIntentProvider(get(), get(name = MAIN_ACTIVITY_CLASS)) + } bind IntentProvider::class + + factory { RealSdkProvider() } bind SdkProvider::class + + factory { + RealNotificationChannelProvider(get()) + } bind NotificationChannelProvider::class + + factory { RealNotificationProvider(get()) } bind NotificationProvider::class + + factory { RealBundleProvider() } bind BundleProvider::class + + factory { RealJobInfoProvider(get()) } bind JobInfoProvider::class single { RealNockNotificationManager( - get(name = APP_ICON_RES), - get(), get(), get(), get(), diff --git a/notifications/src/test/java/com/afollestad/nocknock/notifications/NockNotificationManagerTest.kt b/notifications/src/test/java/com/afollestad/nocknock/notifications/NockNotificationManagerTest.kt index de614fa..0f92bc0 100644 --- a/notifications/src/test/java/com/afollestad/nocknock/notifications/NockNotificationManagerTest.kt +++ b/notifications/src/test/java/com/afollestad/nocknock/notifications/NockNotificationManagerTest.kt @@ -19,11 +19,8 @@ import android.app.Notification import android.app.NotificationChannel import android.app.NotificationManager import android.app.PendingIntent -import android.graphics.Bitmap -import com.afollestad.nocknock.data.legacy.ServerModel -import com.afollestad.nocknock.data.model.ValidationMode.STATUS_CODE import com.afollestad.nocknock.notifications.Channel.CheckFailures -import com.afollestad.nocknock.utilities.providers.BitmapProvider +import com.afollestad.nocknock.utilities.providers.CanNotifyModel import com.afollestad.nocknock.utilities.providers.IntentProvider import com.afollestad.nocknock.utilities.providers.NotificationChannelProvider import com.afollestad.nocknock.utilities.providers.NotificationProvider @@ -48,10 +45,6 @@ class NockNotificationManagerTest { private val somethingWentWrong = "something went wrong" private val stockManager = mock() - private val appIcon = mock() - private val bitmapProvider = mock { - on { get(appIconRes) } doReturn appIcon - } private val stringProvider = mock { on { get(R.string.something_wrong) } doReturn somethingWentWrong } @@ -60,9 +53,7 @@ class NockNotificationManagerTest { private val notificationProvider = mock() private val manager = RealNockNotificationManager( - appIconRes, stockManager, - bitmapProvider, stringProvider, intentProvider, channelProvider, @@ -121,19 +112,18 @@ class NockNotificationManagerTest { whenever( notificationProvider.create( CheckFailures.id, - model.name, + "Testing", somethingWentWrong, pendingIntent, - R.drawable.ic_notification, - appIcon + R.drawable.ic_notification ) ).doReturn(notification) manager.postStatusNotification(model) verify(stockManager).notify( - model.url, - BASE_NOTIFICATION_REQUEST_CODE + model.id, + "https://hello.com", + BASE_NOTIFICATION_REQUEST_CODE + 1, notification ) verifyNoMoreInteractions(stockManager) @@ -142,7 +132,7 @@ class NockNotificationManagerTest { @Test fun cancelStatusNotification() { val model = fakeModel() manager.cancelStatusNotification(model) - verify(stockManager).cancel(BASE_NOTIFICATION_REQUEST_CODE + model.id) + verify(stockManager).cancel(BASE_NOTIFICATION_REQUEST_CODE + 1) verifyNoMoreInteractions(stockManager) } @@ -152,10 +142,11 @@ class NockNotificationManagerTest { verifyNoMoreInteractions(stockManager) } - private fun fakeModel() = ServerModel( - id = 1, - url = "https://hello.com", - name = "Testing", - validationMode = STATUS_CODE - ) + private fun fakeModel() = object : CanNotifyModel { + override fun notifyId() = 1 + + override fun notifyName() = "Testing" + + override fun notifyTag() = "https://hello.com" + } }