From bc8c0cfc33a39859f01ffec793c8c78beaa7de65 Mon Sep 17 00:00:00 2001 From: Abhriya Date: Thu, 14 Jan 2021 12:56:17 +0530 Subject: [PATCH] Setup contacts and other lists for store resources --- app/build.gradle.kts | 6 +- .../callblockr/NotificationProvider.kt | 21 +++- .../com/abhriya/callblockr/PhoneReceiver.kt | 11 +- .../HiltBroadCastReceiver.kt | 3 +- .../PhoneStateChangeBroadcastReceiver.kt | 3 +- .../entity}/DeviceContactsEntity.kt | 2 +- .../data/mapper/ContactEntityMapper.kt | 9 +- .../{ => repository}/ContactsRepository.kt | 15 ++- .../source/CallLogDataSource.kt} | 8 +- .../source/ContactsDataSource.kt} | 15 ++- .../com/abhriya/callblockr/di/AppModule.kt | 39 ++++-- .../com/abhriya/callblockr/di/DomainModule.kt | 2 +- .../callblockr/di/ViewModelProviderFactory.kt | 1 - .../callblockr/domain/ContactsUseCase.kt | 4 +- .../callblockr/domain/model/CallLogModel.kt | 2 +- .../callblockr/domain/model/ContactModel.kt | 2 +- .../service/ForegroundKeepAppAliveService.kt | 2 +- .../callblockr/ui/BlockedContactsViewModel.kt | 118 ------------------ .../abhriya/callblockr/ui/CallLogViewModel.kt | 14 --- .../com/abhriya/callblockr/ui/MainActivity.kt | 85 ++----------- .../ui/{ => adapter}/CallLogAdapter.kt | 32 +++-- .../ui/{ => adapter}/ContactListAdapter.kt | 29 +++-- .../{ => allcontacts}/ContactListFragment.kt | 55 ++------ .../BlockContactFragment.kt | 24 ++-- .../BlockedContactsFragment.kt | 56 ++++----- .../ui/{ => calllog}/CallLogFragment.kt | 26 ++-- .../abhriya/callblockr/util/ActivityUtil.kt | 2 +- .../util/ContactListDiffUtilCallback.kt | 25 ---- .../callblockr/viewmodel/ContactsViewModel.kt | 68 +++++++--- app/src/main/res/layout/fragment_call_log.xml | 2 +- buildSrc/src/main/java/Dependencies.kt | 5 + commons/build.gradle.kts | 8 ++ .../java/com/abhriya/commons/DialogHelper.kt | 28 ----- .../commons/di/CommonsProviderModule.kt | 11 -- .../com/abhriya/commons}/util/ContextUtil.kt | 2 +- .../com/abhriya/commons}/util/FragmentUtil.kt | 2 +- .../com/abhriya/commons}/util/KeyboardUtil.kt | 5 +- .../com/abhriya/commons}/util/LiveDataUtil.kt | 2 +- .../abhriya/commons}/util/ResourceState.kt | 6 +- .../com/abhriya/commons}/util/StringUtil.kt | 2 +- .../com/abhriya/commons}/util/ViewUtil.kt | 2 +- commons/src/main/res/values/strings.xml | 2 + datasource/build.gradle.kts | 10 +- .../datasource/local/LocalDataSource.kt | 7 +- 44 files changed, 282 insertions(+), 491 deletions(-) rename app/src/main/java/com/abhriya/callblockr/{model => data/entity}/DeviceContactsEntity.kt (66%) rename app/src/main/java/com/abhriya/callblockr/data/{ => repository}/ContactsRepository.kt (84%) rename app/src/main/java/com/abhriya/callblockr/{calllogprovider/CallLogProvider.kt => data/source/CallLogDataSource.kt} (94%) rename app/src/main/java/com/abhriya/callblockr/{contactsprovider/ContactsProvider.kt => data/source/ContactsDataSource.kt} (90%) delete mode 100644 app/src/main/java/com/abhriya/callblockr/ui/BlockedContactsViewModel.kt delete mode 100644 app/src/main/java/com/abhriya/callblockr/ui/CallLogViewModel.kt rename app/src/main/java/com/abhriya/callblockr/ui/{ => adapter}/CallLogAdapter.kt (84%) rename app/src/main/java/com/abhriya/callblockr/ui/{ => adapter}/ContactListAdapter.kt (77%) rename app/src/main/java/com/abhriya/callblockr/ui/{ => allcontacts}/ContactListFragment.kt (84%) rename app/src/main/java/com/abhriya/callblockr/ui/{ => blockcontact}/BlockContactFragment.kt (78%) rename app/src/main/java/com/abhriya/callblockr/ui/{ => blockedcontacts}/BlockedContactsFragment.kt (84%) rename app/src/main/java/com/abhriya/callblockr/ui/{ => calllog}/CallLogFragment.kt (90%) delete mode 100644 app/src/main/java/com/abhriya/callblockr/util/ContactListDiffUtilCallback.kt delete mode 100644 commons/src/main/java/com/abhriya/commons/DialogHelper.kt rename {app/src/main/java/com/abhriya/callblockr => commons/src/main/java/com/abhriya/commons}/util/ContextUtil.kt (94%) rename {app/src/main/java/com/abhriya/callblockr => commons/src/main/java/com/abhriya/commons}/util/FragmentUtil.kt (86%) rename {app/src/main/java/com/abhriya/callblockr => commons/src/main/java/com/abhriya/commons}/util/KeyboardUtil.kt (91%) rename {app/src/main/java/com/abhriya/callblockr => commons/src/main/java/com/abhriya/commons}/util/LiveDataUtil.kt (87%) rename {app/src/main/java/com/abhriya/callblockr => commons/src/main/java/com/abhriya/commons}/util/ResourceState.kt (86%) rename {app/src/main/java/com/abhriya/callblockr => commons/src/main/java/com/abhriya/commons}/util/StringUtil.kt (71%) rename {app/src/main/java/com/abhriya/callblockr => commons/src/main/java/com/abhriya/commons}/util/ViewUtil.kt (91%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 86bbec0..f359040 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -63,8 +63,6 @@ dependencies { implementation(Libs.coroutineAndroid) // Lifecycle components implementation(Libs.lifecycleComponentExtension) - implementation("org.jetbrains.kotlin:kotlin-stdlib:${rootProject.extra["kotlin_version"]}") - implementation("androidx.legacy:legacy-support-v4:1.0.0") kapt(Libs.lifecycleComponentExtension) // Viewmodel implementation(Libs.viewmodel) @@ -96,8 +94,8 @@ dependencies { implementation(Libs.fuzzySearch) - implementation(project(":commons")) - implementation(project(":datasource")) + implementation(project(Modules.commons)) + implementation(project(Modules.datasource)) } \ No newline at end of file diff --git a/app/src/main/java/com/abhriya/callblockr/NotificationProvider.kt b/app/src/main/java/com/abhriya/callblockr/NotificationProvider.kt index bdde277..c553afb 100644 --- a/app/src/main/java/com/abhriya/callblockr/NotificationProvider.kt +++ b/app/src/main/java/com/abhriya/callblockr/NotificationProvider.kt @@ -7,8 +7,8 @@ import android.content.Intent import android.os.Build import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat -import com.abhriya.callblockr.util.stringRes import com.abhriya.commons.SystemPermissionUtil +import com.abhriya.commons.util.stringRes interface NotificationProvider { fun showCallBlockNotification( @@ -17,7 +17,11 @@ interface NotificationProvider { number: String ) - fun showKeepAppAliveForegroundNotification(context: Context, service: Service, onNotificationClickIntent: Intent) + fun showKeepAppAliveForegroundNotification( + context: Context, + service: Service, + onNotificationClickIntent: Intent + ) } const val NOTIFICATION_ID = "notif_id" @@ -26,7 +30,8 @@ const val NOTIFICATION_CHANNEL_DESCRIPTION = "Call blocked" const val NOTIFICATION_CHANNEL_ID = "call_blocker_defaul_channel" const val DEFAULT_CHANNEL_GROUP = "defaul_group" -class NotificationsProviderImpl(private val systemPermissionUtil: SystemPermissionUtil) : NotificationProvider { +class NotificationsProviderImpl(private val systemPermissionUtil: SystemPermissionUtil) : + NotificationProvider { private var serviceKeepAliveDescriptiontext = "" @@ -75,12 +80,18 @@ class NotificationsProviderImpl(private val systemPermissionUtil: SystemPermissi service: Service, onNotificationClickIntent: Intent ) { - val contentText = if(systemPermissionUtil.getMissingPermissionsArray(systemPermissionUtil.checkPermissions(context, getListOfRequiredPermissions())).isNotEmpty()){ + val contentText = if (systemPermissionUtil.getMissingPermissionsArray( + systemPermissionUtil.checkPermissions( + context, + getListOfRequiredPermissions() + ) + ).isNotEmpty() + ) { service.stringRes(R.string.call_blocker_not_running_due_to_missing_permission) } else { service.stringRes(R.string.call_blocker_running) } - if(contentText!=serviceKeepAliveDescriptiontext){ + if (contentText != serviceKeepAliveDescriptiontext) { serviceKeepAliveDescriptiontext = contentText if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val notificationManager = diff --git a/app/src/main/java/com/abhriya/callblockr/PhoneReceiver.kt b/app/src/main/java/com/abhriya/callblockr/PhoneReceiver.kt index 99eb28e..a44ff19 100644 --- a/app/src/main/java/com/abhriya/callblockr/PhoneReceiver.kt +++ b/app/src/main/java/com/abhriya/callblockr/PhoneReceiver.kt @@ -8,7 +8,7 @@ import android.telecom.TelecomManager import android.telephony.TelephonyManager import androidx.annotation.NonNull import androidx.annotation.RequiresApi -import com.abhriya.callblockr.util.stringRes +import com.abhriya.commons.util.stringRes import com.abhriya.datasource.local.LocalDataSource import com.android.internal.telephony.ITelephony import kotlinx.coroutines.GlobalScope @@ -58,14 +58,13 @@ class PhoneReceiverImpl( ?: return false if (incomingNumber.isNotBlank()) { val contactData = localDataSource.getBlockedContactByNumber(incomingNumber) - println("contact data obtained $contactData") return contactData != null } return false } @SuppressLint("MissingPermission") - private fun rejectCall( + private suspend fun rejectCall( @NonNull context: Context, intent: Intent, onNotificationClickIntent: Intent @@ -81,11 +80,13 @@ class PhoneReceiverImpl( // Handle accordingly } } + val notificationBodyIdentifier: String? = + localDataSource.getBlockedContactByNumber(intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER))?.name + ?: intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER) notificationProvider.showCallBlockNotification( context, onNotificationClickIntent, - intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER) - ?: context.stringRes(R.string.unknown) + notificationBodyIdentifier ?: context.stringRes(R.string.unknown) ) } diff --git a/app/src/main/java/com/abhriya/callblockr/broadcastreceiver/HiltBroadCastReceiver.kt b/app/src/main/java/com/abhriya/callblockr/broadcastreceiver/HiltBroadCastReceiver.kt index e6cd4ec..b8d3d21 100644 --- a/app/src/main/java/com/abhriya/callblockr/broadcastreceiver/HiltBroadCastReceiver.kt +++ b/app/src/main/java/com/abhriya/callblockr/broadcastreceiver/HiltBroadCastReceiver.kt @@ -7,5 +7,6 @@ import androidx.annotation.CallSuper abstract class HiltBroadcastReceiver : BroadcastReceiver() { @CallSuper - override fun onReceive(context: Context, intent: Intent) {} + override fun onReceive(context: Context, intent: Intent) { + } } \ No newline at end of file diff --git a/app/src/main/java/com/abhriya/callblockr/broadcastreceiver/PhoneStateChangeBroadcastReceiver.kt b/app/src/main/java/com/abhriya/callblockr/broadcastreceiver/PhoneStateChangeBroadcastReceiver.kt index 1e6434c..2051f0b 100644 --- a/app/src/main/java/com/abhriya/callblockr/broadcastreceiver/PhoneStateChangeBroadcastReceiver.kt +++ b/app/src/main/java/com/abhriya/callblockr/broadcastreceiver/PhoneStateChangeBroadcastReceiver.kt @@ -1,10 +1,9 @@ package com.abhriya.callblockr.broadcastreceiver -import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import com.abhriya.callblockr.ui.MainActivity import com.abhriya.callblockr.PhoneReceiver +import com.abhriya.callblockr.ui.MainActivity import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject diff --git a/app/src/main/java/com/abhriya/callblockr/model/DeviceContactsEntity.kt b/app/src/main/java/com/abhriya/callblockr/data/entity/DeviceContactsEntity.kt similarity index 66% rename from app/src/main/java/com/abhriya/callblockr/model/DeviceContactsEntity.kt rename to app/src/main/java/com/abhriya/callblockr/data/entity/DeviceContactsEntity.kt index 35d4606..722f83e 100644 --- a/app/src/main/java/com/abhriya/callblockr/model/DeviceContactsEntity.kt +++ b/app/src/main/java/com/abhriya/callblockr/data/entity/DeviceContactsEntity.kt @@ -1,4 +1,4 @@ -package com.abhriya.callblockr.model +package com.abhriya.callblockr.data.entity data class DeviceContactsEntity( val name: String?, diff --git a/app/src/main/java/com/abhriya/callblockr/data/mapper/ContactEntityMapper.kt b/app/src/main/java/com/abhriya/callblockr/data/mapper/ContactEntityMapper.kt index d1e07ec..d7068dd 100644 --- a/app/src/main/java/com/abhriya/callblockr/data/mapper/ContactEntityMapper.kt +++ b/app/src/main/java/com/abhriya/callblockr/data/mapper/ContactEntityMapper.kt @@ -1,8 +1,8 @@ package com.abhriya.callblockr.data.mapper import com.abhriya.callblockr.data.entity.ContactEntity -import com.abhriya.callblockr.util.removeAllWhiteSpaces -import com.abhriya.callblockr.model.DeviceContactsEntity +import com.abhriya.callblockr.data.entity.DeviceContactsEntity +import com.abhriya.commons.util.removeAllWhiteSpaces import com.abhriya.datasource.local.entity.ContactDbEntity internal object ContactEntityMapper { @@ -19,7 +19,10 @@ internal object ContactEntityMapper { internal fun mapToDeviceContactEntityFromContactEntity(contactEntity: ContactEntity): DeviceContactsEntity = contactEntity.let { - DeviceContactsEntity(it.name, it.number) + DeviceContactsEntity( + it.name, + it.number + ) } internal fun mapToContactEntityFromDeviceContactEntity(deviceContactsEntity: DeviceContactsEntity): ContactEntity = diff --git a/app/src/main/java/com/abhriya/callblockr/data/ContactsRepository.kt b/app/src/main/java/com/abhriya/callblockr/data/repository/ContactsRepository.kt similarity index 84% rename from app/src/main/java/com/abhriya/callblockr/data/ContactsRepository.kt rename to app/src/main/java/com/abhriya/callblockr/data/repository/ContactsRepository.kt index 04fb28b..50d0334 100644 --- a/app/src/main/java/com/abhriya/callblockr/data/ContactsRepository.kt +++ b/app/src/main/java/com/abhriya/callblockr/data/repository/ContactsRepository.kt @@ -1,12 +1,11 @@ -package com.abhriya.callblockr.data +package com.abhriya.callblockr.data.repository -import com.abhriya.callblockr.calllogprovider.CallLogProvider -import com.abhriya.callblockr.contactsprovider.ContactsProvider import com.abhriya.callblockr.data.entity.CallLogEntity import com.abhriya.callblockr.data.entity.ContactEntity import com.abhriya.callblockr.data.exception.DataLayerException import com.abhriya.callblockr.data.mapper.ContactEntityMapper -import com.abhriya.callblockr.domain.model.CallLogModel +import com.abhriya.callblockr.data.source.CallLogDataSource +import com.abhriya.callblockr.data.source.ContactsDataSource import com.abhriya.datasource.local.LocalDataSource import com.abhriya.datasource.local.exception.DatabaseException @@ -20,8 +19,8 @@ interface ContactsRepository { class ContactsRepositoryImpl( private val localDataSource: LocalDataSource, - private val contactsProvider: ContactsProvider, - private val callLogProvider: CallLogProvider, + private val contactsDataSource: ContactsDataSource, + private val callLogDataSource: CallLogDataSource ) : ContactsRepository { override suspend fun saveBlockedContact(contactEntity: ContactEntity) { try { @@ -55,13 +54,13 @@ class ContactsRepositoryImpl( } override suspend fun getAllContactsFromDevice(): List { - return contactsProvider.getAllContactsFromDevice() + return contactsDataSource.getAllContactsFromDevice() .map { ContactEntityMapper.mapToContactEntityFromDeviceContactEntity(it) } } override suspend fun getAllCallLogs(): List { - return callLogProvider.getCallLog() + return callLogDataSource.getCallLog() } } \ No newline at end of file diff --git a/app/src/main/java/com/abhriya/callblockr/calllogprovider/CallLogProvider.kt b/app/src/main/java/com/abhriya/callblockr/data/source/CallLogDataSource.kt similarity index 94% rename from app/src/main/java/com/abhriya/callblockr/calllogprovider/CallLogProvider.kt rename to app/src/main/java/com/abhriya/callblockr/data/source/CallLogDataSource.kt index 177c87a..2b282db 100644 --- a/app/src/main/java/com/abhriya/callblockr/calllogprovider/CallLogProvider.kt +++ b/app/src/main/java/com/abhriya/callblockr/data/source/CallLogDataSource.kt @@ -1,4 +1,4 @@ -package com.abhriya.callblockr.calllogprovider +package com.abhriya.callblockr.data.source import android.Manifest import android.content.Context @@ -9,14 +9,14 @@ import com.abhriya.callblockr.data.entity.CallType import com.abhriya.commons.SystemPermissionUtil import dagger.hilt.android.qualifiers.ApplicationContext -interface CallLogProvider { +interface CallLogDataSource { fun getCallLog(): List } -class CallLogProviderImpl( +class CallLogDataSourceImpl( @ApplicationContext private val context: Context, private val systemPermissionUtil: SystemPermissionUtil -) : CallLogProvider { +) : CallLogDataSource { override fun getCallLog(): List { if (systemPermissionUtil.checkPermission(context, Manifest.permission.READ_CALL_LOG)) { val c = context.applicationContext diff --git a/app/src/main/java/com/abhriya/callblockr/contactsprovider/ContactsProvider.kt b/app/src/main/java/com/abhriya/callblockr/data/source/ContactsDataSource.kt similarity index 90% rename from app/src/main/java/com/abhriya/callblockr/contactsprovider/ContactsProvider.kt rename to app/src/main/java/com/abhriya/callblockr/data/source/ContactsDataSource.kt index 4b64e8b..cc3275b 100644 --- a/app/src/main/java/com/abhriya/callblockr/contactsprovider/ContactsProvider.kt +++ b/app/src/main/java/com/abhriya/callblockr/data/source/ContactsDataSource.kt @@ -1,24 +1,27 @@ -package com.abhriya.callblockr.contactsprovider +package com.abhriya.callblockr.data.source import android.Manifest import android.content.ContentResolver import android.content.Context import android.database.Cursor import android.provider.ContactsContract -import com.abhriya.callblockr.model.DeviceContactsEntity +import com.abhriya.callblockr.data.entity.DeviceContactsEntity import com.abhriya.commons.SystemPermissionUtil import me.xdrop.fuzzywuzzy.FuzzySearch -interface ContactsProvider { +interface ContactsDataSource { suspend fun getAllContactsFromDevice(): List - suspend fun searchContact(charSequence: CharSequence, allContactList: List): List + suspend fun searchContact( + charSequence: CharSequence, + allContactList: List + ): List } -class ContactsProviderImpl( +class ContactsDataSourceImpl( private val context: Context, private val permissionUtil: SystemPermissionUtil -) : ContactsProvider { +) : ContactsDataSource { override suspend fun getAllContactsFromDevice(): List { if (permissionUtil.checkPermissions( diff --git a/app/src/main/java/com/abhriya/callblockr/di/AppModule.kt b/app/src/main/java/com/abhriya/callblockr/di/AppModule.kt index dbbf47d..f9d6ac5 100644 --- a/app/src/main/java/com/abhriya/callblockr/di/AppModule.kt +++ b/app/src/main/java/com/abhriya/callblockr/di/AppModule.kt @@ -6,14 +6,14 @@ import com.abhriya.callblockr.NotificationProvider import com.abhriya.callblockr.NotificationsProviderImpl import com.abhriya.callblockr.PhoneReceiver import com.abhriya.callblockr.PhoneReceiverImpl -import com.abhriya.callblockr.calllogprovider.CallLogProvider -import com.abhriya.callblockr.calllogprovider.CallLogProviderImpl -import com.abhriya.callblockr.contactsprovider.ContactsProvider -import com.abhriya.callblockr.contactsprovider.ContactsProviderImpl -import com.abhriya.callblockr.data.ContactsRepository -import com.abhriya.callblockr.data.ContactsRepositoryImpl -import com.abhriya.datasource.local.LocalDataSource +import com.abhriya.callblockr.data.repository.ContactsRepository +import com.abhriya.callblockr.data.repository.ContactsRepositoryImpl +import com.abhriya.callblockr.data.source.CallLogDataSource +import com.abhriya.callblockr.data.source.CallLogDataSourceImpl +import com.abhriya.callblockr.data.source.ContactsDataSource +import com.abhriya.callblockr.data.source.ContactsDataSourceImpl import com.abhriya.commons.SystemPermissionUtil +import com.abhriya.datasource.local.LocalDataSource import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -34,10 +34,14 @@ class AppModule { @Singleton fun providesContactRepository( localDataSource: LocalDataSource, - contactsProvider: ContactsProvider, - callLogProvider: CallLogProvider + contactsDataSource: ContactsDataSource, + callLogDataSource: CallLogDataSource ): ContactsRepository = - ContactsRepositoryImpl(localDataSource, contactsProvider, callLogProvider) + ContactsRepositoryImpl( + localDataSource, + contactsDataSource, + callLogDataSource + ) @Provides @Singleton @@ -48,20 +52,29 @@ class AppModule { @Provides @Singleton - fun providesNotificationsProvider(systemPermissionUtil: SystemPermissionUtil): NotificationProvider = NotificationsProviderImpl(systemPermissionUtil) + fun providesNotificationsProvider(systemPermissionUtil: SystemPermissionUtil): NotificationProvider = + NotificationsProviderImpl(systemPermissionUtil) @Provides @Singleton fun providesContactProvider( @ApplicationContext context: Context, permissionUtil: SystemPermissionUtil - ): ContactsProvider = ContactsProviderImpl(context, permissionUtil) + ): ContactsDataSource = + ContactsDataSourceImpl( + context, + permissionUtil + ) @Provides @Singleton fun providesCallLogProvider( @ApplicationContext context: Context, systemPermissionUtil: SystemPermissionUtil - ): CallLogProvider = CallLogProviderImpl(context, systemPermissionUtil) + ): CallLogDataSource = + CallLogDataSourceImpl( + context, + systemPermissionUtil + ) } \ No newline at end of file diff --git a/app/src/main/java/com/abhriya/callblockr/di/DomainModule.kt b/app/src/main/java/com/abhriya/callblockr/di/DomainModule.kt index be5b63c..fdba6ef 100644 --- a/app/src/main/java/com/abhriya/callblockr/di/DomainModule.kt +++ b/app/src/main/java/com/abhriya/callblockr/di/DomainModule.kt @@ -1,6 +1,6 @@ package com.abhriya.callblockr.di -import com.abhriya.callblockr.data.ContactsRepository +import com.abhriya.callblockr.data.repository.ContactsRepository import com.abhriya.callblockr.domain.ContactsInteractor import com.abhriya.callblockr.domain.ContactsUseCase import dagger.Module diff --git a/app/src/main/java/com/abhriya/callblockr/di/ViewModelProviderFactory.kt b/app/src/main/java/com/abhriya/callblockr/di/ViewModelProviderFactory.kt index 8ba9cc0..4b1fb8a 100644 --- a/app/src/main/java/com/abhriya/callblockr/di/ViewModelProviderFactory.kt +++ b/app/src/main/java/com/abhriya/callblockr/di/ViewModelProviderFactory.kt @@ -1,6 +1,5 @@ package com.abhriya.callblockr.di -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.abhriya.callblockr.viewmodel.ContactsViewModel diff --git a/app/src/main/java/com/abhriya/callblockr/domain/ContactsUseCase.kt b/app/src/main/java/com/abhriya/callblockr/domain/ContactsUseCase.kt index da9d571..57f99b0 100644 --- a/app/src/main/java/com/abhriya/callblockr/domain/ContactsUseCase.kt +++ b/app/src/main/java/com/abhriya/callblockr/domain/ContactsUseCase.kt @@ -1,6 +1,6 @@ package com.abhriya.callblockr.domain -import com.abhriya.callblockr.data.ContactsRepository +import com.abhriya.callblockr.data.repository.ContactsRepository import com.abhriya.callblockr.domain.mapper.ContactsModelMapper import com.abhriya.callblockr.domain.model.CallLogModel import com.abhriya.callblockr.domain.model.ContactModel @@ -38,7 +38,7 @@ class ContactsInteractor(private val contactsRepository: ContactsRepository) : C } override suspend fun getAllSavedContacts(): List { - val savedContacts : List = contactsRepository.getAllContactsFromDevice() + val savedContacts: List = contactsRepository.getAllContactsFromDevice() .map { ContactsModelMapper.mapToContactsModelFromContactEntity( it, diff --git a/app/src/main/java/com/abhriya/callblockr/domain/model/CallLogModel.kt b/app/src/main/java/com/abhriya/callblockr/domain/model/CallLogModel.kt index 57f979a..fac646b 100644 --- a/app/src/main/java/com/abhriya/callblockr/domain/model/CallLogModel.kt +++ b/app/src/main/java/com/abhriya/callblockr/domain/model/CallLogModel.kt @@ -8,5 +8,5 @@ data class CallLogModel( val callType: CallType, val timeStampInMillis: String, val callDuration: String, - val isNumberBlocked : Boolean + val isNumberBlocked: Boolean ) \ No newline at end of file diff --git a/app/src/main/java/com/abhriya/callblockr/domain/model/ContactModel.kt b/app/src/main/java/com/abhriya/callblockr/domain/model/ContactModel.kt index df370b0..1c00cf2 100644 --- a/app/src/main/java/com/abhriya/callblockr/domain/model/ContactModel.kt +++ b/app/src/main/java/com/abhriya/callblockr/domain/model/ContactModel.kt @@ -5,7 +5,7 @@ data class ContactModel( val name: String? = null, val phoneNumber: String, val contactModelType: ContactModelType, - val isContactBlocked : Boolean = false + val isContactBlocked: Boolean = false ) : Comparable { override fun compareTo(other: ContactModel): Int { return if (name == other.name && phoneNumber == other.phoneNumber && contactModelType == other.contactModelType) { diff --git a/app/src/main/java/com/abhriya/callblockr/service/ForegroundKeepAppAliveService.kt b/app/src/main/java/com/abhriya/callblockr/service/ForegroundKeepAppAliveService.kt index 519b6cd..843b989 100644 --- a/app/src/main/java/com/abhriya/callblockr/service/ForegroundKeepAppAliveService.kt +++ b/app/src/main/java/com/abhriya/callblockr/service/ForegroundKeepAppAliveService.kt @@ -3,8 +3,8 @@ package com.abhriya.callblockr.service import android.app.Service import android.content.Intent import android.os.IBinder -import com.abhriya.callblockr.ui.MainActivity import com.abhriya.callblockr.NotificationProvider +import com.abhriya.callblockr.ui.MainActivity import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject diff --git a/app/src/main/java/com/abhriya/callblockr/ui/BlockedContactsViewModel.kt b/app/src/main/java/com/abhriya/callblockr/ui/BlockedContactsViewModel.kt deleted file mode 100644 index b251a65..0000000 --- a/app/src/main/java/com/abhriya/callblockr/ui/BlockedContactsViewModel.kt +++ /dev/null @@ -1,118 +0,0 @@ -//package com.abhriya.callblockr.ui -// -//import androidx.hilt.lifecycle.ViewModelInject -//import androidx.lifecycle.LiveData -//import androidx.lifecycle.MutableLiveData -//import androidx.lifecycle.ViewModel -//import androidx.lifecycle.viewModelScope -//import com.abhriya.callblockr.data.exception.DataLayerException -//import com.abhriya.callblockr.domain.ContactsUseCase -//import com.abhriya.callblockr.domain.model.ContactModel -//import com.abhriya.callblockr.util.ResourceState -//import kotlinx.coroutines.Dispatchers -//import kotlinx.coroutines.async -//import kotlinx.coroutines.launch -//import java.lang.Exception -// -//class BlockedContactsViewModel -//@ViewModelInject constructor(private val contactsUseCase: ContactsUseCase) : ViewModel() { -// -// private var _blockedContactsLiveData = MutableLiveData>>() -// val blockedContactLiveData: LiveData>> -// get() = _blockedContactsLiveData -// -// private var _savedAvailableContactsLiveData = -// MutableLiveData>>() -// -// fun getAllBlockedContacts() { -// viewModelScope.launch(Dispatchers.IO) { -// _blockedContactsLiveData.postValue(ResourceState.loading()) -// try { -// with(contactsUseCase.getAllBlockedContacts()) { -// _blockedContactsLiveData.postValue( -// ResourceState.success(this) -// ) -// } -// } catch (dataLayerException: DataLayerException) { -// _blockedContactsLiveData.postValue( -// ResourceState.error( -// dataLayerException.message, -// dataLayerException -// ) -// ) -// } -// } -// } -// -// fun unblockContact( -// contactModel: ContactModel, -// updateReceiver: LiveData>> -// ) { -// when (updateReceiver) { -// blockedContactLiveData -> _blockedContactsLiveData -// else -> _savedAvailableContactsLiveData -// }.let { -// try { -// viewModelScope.launch(Dispatchers.IO) { -// it.postValue(ResourceState.loading()) -// try { -// contactsUseCase.unBlockContact(contactModel) -// getAllBlockedContacts() -// getAllSavedAvailableContacts() -// } catch (dataLayerException: DataLayerException) { -// it.postValue( -// ResourceState.error(dataLayerException.message, dataLayerException) -// ) -// } -// } -// } catch (e: Exception) { -// e.printStackTrace() -// } -// } -// } -// -// fun blockContact( -// contactModel: ContactModel, -// updateReceiver: LiveData>> -// ) { -// when (updateReceiver) { -// blockedContactLiveData -> _blockedContactsLiveData -// else -> _savedAvailableContactsLiveData -// }.let { -// viewModelScope.launch(Dispatchers.IO) { -// it.postValue(ResourceState.loading()) -// try { -// contactsUseCase.saveBlockedContact(contactModel) -// val blockedContacts = async { getAllBlockedContacts() } -// val availableContacts = async { getAllSavedAvailableContacts() } -// availableContacts.await() -// blockedContacts.await() -// } catch (dataLayerException: DataLayerException) { -// it.postValue( -// ResourceState.error( -// dataLayerException.message, -// dataLayerException -// ) -// ) -// } -// } -// } -// } -// -// fun getAllSavedAvailableContacts() { -// viewModelScope.launch(Dispatchers.IO) { -// _savedAvailableContactsLiveData.postValue(ResourceState.loading()) -// try { -// contactsUseCase.getAllSavedAvailableContacts() -// .also { -// _savedAvailableContactsLiveData.postValue(ResourceState.success(it)) -// } -// } catch (dataLayerException: DataLayerException) { -// _savedAvailableContactsLiveData.postValue( -// ResourceState.error(dataLayerException.message, dataLayerException) -// ) -// } -// } -// } -// -//} \ No newline at end of file diff --git a/app/src/main/java/com/abhriya/callblockr/ui/CallLogViewModel.kt b/app/src/main/java/com/abhriya/callblockr/ui/CallLogViewModel.kt deleted file mode 100644 index e427d35..0000000 --- a/app/src/main/java/com/abhriya/callblockr/ui/CallLogViewModel.kt +++ /dev/null @@ -1,14 +0,0 @@ -//package com.abhriya.callblockr.ui -// -//import androidx.hilt.lifecycle.ViewModelInject -//import androidx.lifecycle.MutableLiveData -//import androidx.lifecycle.ViewModel -//import androidx.lifecycle.viewModelScope -//import com.abhriya.callblockr.domain.ContactsUseCase -//import com.abhriya.callblockr.domain.model.CallLogModel -//import kotlinx.coroutines.launch -// -//class CallLogViewModel @ViewModelInject constructor(private val contactsUseCase: ContactsUseCase) : ViewModel(){ -// -// -//} \ No newline at end of file diff --git a/app/src/main/java/com/abhriya/callblockr/ui/MainActivity.kt b/app/src/main/java/com/abhriya/callblockr/ui/MainActivity.kt index c363cf7..e206e6b 100644 --- a/app/src/main/java/com/abhriya/callblockr/ui/MainActivity.kt +++ b/app/src/main/java/com/abhriya/callblockr/ui/MainActivity.kt @@ -1,20 +1,18 @@ package com.abhriya.callblockr.ui -import android.app.Activity import android.content.Intent import android.os.Build import android.os.Bundle import android.view.Menu import androidx.appcompat.app.AppCompatActivity -import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.content.ContextCompat import androidx.viewpager.widget.ViewPager import com.abhriya.callblockr.R import com.abhriya.callblockr.databinding.ActivityMainBinding import com.abhriya.callblockr.service.ForegroundKeepAppAliveService -import com.abhriya.callblockr.util.openAppSettings -import com.abhriya.commons.util.stringRes -import com.google.android.material.snackbar.Snackbar +import com.abhriya.callblockr.ui.allcontacts.ContactListFragment +import com.abhriya.callblockr.ui.blockedcontacts.BlockedContactsFragment +import com.abhriya.callblockr.ui.calllog.CallLogFragment import com.iammert.library.readablebottombar.ReadableBottomBar import com.ogaclejapan.smarttablayout.utils.v4.FragmentPagerItemAdapter import com.ogaclejapan.smarttablayout.utils.v4.FragmentPagerItems @@ -23,7 +21,6 @@ import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class MainActivity : AppCompatActivity() { - private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { @@ -40,29 +37,15 @@ class MainActivity : AppCompatActivity() { return true } -// override fun onRequestPermissionsResult( -// requestCode: Int, -// permissions: Array, -// grantResults: IntArray -// ) { -// super.onRequestPermissionsResult(requestCode, permissions, grantResults) -// for (i in permissions.indices) { -// val permission = permissions[i] -// if (grantResults[i] == PackageManager.PERMISSION_DENIED) { -// val showRationale = -// ActivityCompat.shouldShowRequestPermissionRationale(this, permission) -// if (!showRationale) { -// showOpenSettingsSnackBar(this, binding.rootLayout) -// } else { -// showGrantPermissionSnackBar( -// this, -// binding.rootLayout, -// permissions.toList() -// ) -// } -// } -// } -// } + fun startKeepAppAliveService() { + Intent(this, ForegroundKeepAppAliveService::class.java).let { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + ContextCompat.startForegroundService(this, it); + } else { + startService(it) + } + } + } private fun decorateViewPager() { val adapter = FragmentPagerItemAdapter( @@ -98,50 +81,6 @@ class MainActivity : AppCompatActivity() { }) } - fun startKeepAppAliveService() { - Intent(this, ForegroundKeepAppAliveService::class.java).let { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - ContextCompat.startForegroundService(this, it); -// startForegroundService(this) - } else { - startService(it) - } - } - } - - private fun showOpenSettingsSnackBar( - activity: Activity, - coordinatorLayout: CoordinatorLayout - ) { - Snackbar.make( - coordinatorLayout, - activity.stringRes(R.string.accept_permission_from_settings), - Snackbar.LENGTH_INDEFINITE - ).setAction( - activity.stringRes(R.string.open_settings) - ) { - openAppSettings() - }.show() - } - -// private fun showGrantPermissionSnackBar( -// activity: Activity, -// coordinatorLayout: CoordinatorLayout, -// permissionList: List -// ) { -// Snackbar.make( -// coordinatorLayout, -// activity.stringRes(R.string.accept_permission), -// Snackbar.LENGTH_INDEFINITE -// ).setAction( -// activity.stringRes(R.string.grant_permission) -// ) { -// permissionsHandler.requestPermission( -// activity, permissionList.map { it to false } -// ) -// }.show() -// } - private fun initBottomBarListener() { binding.bottomBar.setOnItemSelectListener(object : ReadableBottomBar.ItemSelectListener { override fun onItemSelected(index: Int) { diff --git a/app/src/main/java/com/abhriya/callblockr/ui/CallLogAdapter.kt b/app/src/main/java/com/abhriya/callblockr/ui/adapter/CallLogAdapter.kt similarity index 84% rename from app/src/main/java/com/abhriya/callblockr/ui/CallLogAdapter.kt rename to app/src/main/java/com/abhriya/callblockr/ui/adapter/CallLogAdapter.kt index 1a9779e..fa17cb1 100644 --- a/app/src/main/java/com/abhriya/callblockr/ui/CallLogAdapter.kt +++ b/app/src/main/java/com/abhriya/callblockr/ui/adapter/CallLogAdapter.kt @@ -1,4 +1,4 @@ -package com.abhriya.callblockr.ui +package com.abhriya.callblockr.ui.adapter import android.content.Context import android.view.LayoutInflater @@ -8,15 +8,10 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import com.abhriya.callblockr.R import com.abhriya.callblockr.data.entity.CallType -import com.abhriya.callblockr.data.entity.ContactEntity import com.abhriya.callblockr.domain.model.CallLogModel -import com.abhriya.callblockr.domain.model.ContactModel -import com.abhriya.callblockr.domain.model.ContactModelType -import com.abhriya.callblockr.util.drawableRes -import com.abhriya.callblockr.util.stringRes +import com.abhriya.commons.util.* import kotlinx.android.synthetic.main.item_call_log.view.* import kotlinx.android.synthetic.main.item_call_log.view.actionImage -import kotlinx.android.synthetic.main.item_contacts_list.view.* import kotlinx.android.synthetic.main.item_contacts_list.view.contactAvatar import kotlinx.android.synthetic.main.item_contacts_list.view.rootLayout import kotlinx.android.synthetic.main.item_contacts_list.view.subTitleTextView @@ -69,7 +64,7 @@ class CallLogViewHolder( RecyclerView.ViewHolder(itemView) { fun decorateItem(callLogModel: CallLogModel) { - itemView.titleTextView.text = if(callLogModel.contactName.isNotBlank()){ + itemView.titleTextView.text = if (callLogModel.contactName.isNotBlank()) { callLogModel.contactName } else { context.stringRes(R.string.unknown) @@ -77,32 +72,34 @@ class CallLogViewHolder( itemView.subTitleTextView.text = callLogModel.contactNumber itemView.contactAvatar.setText(itemView.titleTextView.text.toString()) when (callLogModel.callType) { - CallType.INCOMING_CALL-> { + CallType.INCOMING_CALL -> { itemView.callTypeTextView.text = context.stringRes(R.string.incoming) } - CallType.OUTGOING_CALL-> { + CallType.OUTGOING_CALL -> { itemView.callTypeTextView.text = context.stringRes(R.string.outgoing) } - CallType.MISSED_CALL-> { + CallType.MISSED_CALL -> { itemView.callTypeTextView.text = context.stringRes(R.string.missed) } - CallType.VOICE_MAIL-> { + CallType.VOICE_MAIL -> { itemView.callTypeTextView.text = context.stringRes(R.string.voiceMail) } - CallType.REJECTED_CALL-> { + CallType.REJECTED_CALL -> { itemView.callTypeTextView.text = context.stringRes(R.string.rejected) } - CallType.BLOCKED_CALL-> { + CallType.BLOCKED_CALL -> { itemView.callTypeTextView.text = context.stringRes(R.string.blocked) } } - if(!callLogModel.isNumberBlocked){ + if (!callLogModel.isNumberBlocked) { itemView.actionImage.setImageDrawable( context.drawableRes( R.drawable.ic_black_block_24 - )) + ) + ) + itemView.actionImage.visible() } else { - itemView.actionImage.setImageDrawable(null) + itemView.actionImage.invisible() } } @@ -133,6 +130,7 @@ class CallLogDiffUtilCallback( override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { return oldList[oldItemPosition].contactNumber == newList[newItemPosition].contactNumber + && oldList[oldItemPosition].contactName == newList[newItemPosition].contactName && oldList[oldItemPosition].timeStampInMillis == newList[newItemPosition].timeStampInMillis && oldList[oldItemPosition].isNumberBlocked == newList[newItemPosition].isNumberBlocked } diff --git a/app/src/main/java/com/abhriya/callblockr/ui/ContactListAdapter.kt b/app/src/main/java/com/abhriya/callblockr/ui/adapter/ContactListAdapter.kt similarity index 77% rename from app/src/main/java/com/abhriya/callblockr/ui/ContactListAdapter.kt rename to app/src/main/java/com/abhriya/callblockr/ui/adapter/ContactListAdapter.kt index 0c4f753..ef380e7 100644 --- a/app/src/main/java/com/abhriya/callblockr/ui/ContactListAdapter.kt +++ b/app/src/main/java/com/abhriya/callblockr/ui/adapter/ContactListAdapter.kt @@ -1,4 +1,4 @@ -package com.abhriya.callblockr.ui +package com.abhriya.callblockr.ui.adapter import android.content.Context import android.view.LayoutInflater @@ -9,9 +9,14 @@ import androidx.recyclerview.widget.RecyclerView import com.abhriya.callblockr.R import com.abhriya.callblockr.domain.model.ContactModel import com.abhriya.callblockr.domain.model.ContactModelType -import com.abhriya.callblockr.util.drawableRes -import com.abhriya.callblockr.util.stringRes +import com.abhriya.commons.util.* +import kotlinx.android.synthetic.main.item_call_log.view.* import kotlinx.android.synthetic.main.item_contacts_list.view.* +import kotlinx.android.synthetic.main.item_contacts_list.view.actionImage +import kotlinx.android.synthetic.main.item_contacts_list.view.contactAvatar +import kotlinx.android.synthetic.main.item_contacts_list.view.rootLayout +import kotlinx.android.synthetic.main.item_contacts_list.view.subTitleTextView +import kotlinx.android.synthetic.main.item_contacts_list.view.titleTextView class ContactListAdapter( private val context: Context, @@ -70,18 +75,23 @@ class ContactListViewHolder( ) ) ContactModelType.ALL_CONTACT -> { - if(!contactModel.isContactBlocked) - itemView.actionImage.setImageDrawable( - context.drawableRes( - R.drawable.ic_black_block_24 + if (!contactModel.isContactBlocked) { + itemView.actionImage.setImageDrawable( + context.drawableRes( + R.drawable.ic_black_block_24 + ) ) - ) + itemView.actionImage.visible() + } else { + itemView.actionImage.invisible() + + } } } } fun attachActionItemClickListener(contactModel: ContactModel) { - if(!contactModel.isContactBlocked) { + if (!contactModel.isContactBlocked) { itemView.rootLayout.setOnClickListener { handleItemClick.handleActionImageClick(adapterPosition, contactModel) } @@ -109,6 +119,7 @@ class ContactListDiffUtilCallback( override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { return oldList[oldItemPosition].phoneNumber == newList[newItemPosition].phoneNumber + && oldList[oldItemPosition].name == newList[newItemPosition].name && oldList[oldItemPosition].name == newList[newItemPosition].name && oldList[oldItemPosition].isContactBlocked == newList[newItemPosition].isContactBlocked } diff --git a/app/src/main/java/com/abhriya/callblockr/ui/ContactListFragment.kt b/app/src/main/java/com/abhriya/callblockr/ui/allcontacts/ContactListFragment.kt similarity index 84% rename from app/src/main/java/com/abhriya/callblockr/ui/ContactListFragment.kt rename to app/src/main/java/com/abhriya/callblockr/ui/allcontacts/ContactListFragment.kt index e5d6c2c..89743c3 100644 --- a/app/src/main/java/com/abhriya/callblockr/ui/ContactListFragment.kt +++ b/app/src/main/java/com/abhriya/callblockr/ui/allcontacts/ContactListFragment.kt @@ -1,4 +1,4 @@ -package com.abhriya.callblockr.ui +package com.abhriya.callblockr.ui.allcontacts import android.Manifest import android.content.pm.PackageManager @@ -20,9 +20,12 @@ import androidx.recyclerview.widget.RecyclerView import com.abhriya.callblockr.R import com.abhriya.callblockr.databinding.FragmentContactListBinding import com.abhriya.callblockr.domain.model.ContactModel -import com.abhriya.callblockr.util.* +import com.abhriya.callblockr.ui.adapter.ContactListAdapter +import com.abhriya.callblockr.ui.adapter.HandleItemClick +import com.abhriya.callblockr.util.openAppSettings import com.abhriya.callblockr.viewmodel.ContactsViewModel import com.abhriya.commons.SystemPermissionUtil +import com.abhriya.commons.util.* import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @@ -83,11 +86,6 @@ class ContactListFragment : Fragment(), HandleItemClick { ) if (!showRationale) { showOpenSettingsSnackBar(requireActivity().findViewById(R.id.rootLayout)) -// } else { -// showGrantPermissionSnackBar( -// requireActivity().findViewById(R.id.rootLayout), -// permissions.toList() -// ) } } } @@ -97,7 +95,10 @@ class ContactListFragment : Fragment(), HandleItemClick { binding.recyclerView.layoutManager = LinearLayoutManager(requireActivity(), RecyclerView.VERTICAL, false) recyclerViewAdapter = - ContactListAdapter(requireContext(), this) + ContactListAdapter( + requireContext(), + this + ) binding.recyclerView.adapter = recyclerViewAdapter binding.recyclerView.setHasFixedSize(true) } @@ -154,24 +155,6 @@ class ContactListFragment : Fragment(), HandleItemClick { viewModel.closeSearch() true } - -// binding.searchBar.setOnSearchActionListener(object : MaterialSearchBar.OnSearchActionListener{ -// override fun onButtonClicked(buttonCode: Int) { -// when (buttonCode) { -// MaterialSearchBar.BUTTON_BACK -> viewModel.searchAllContacts(null) -// } -// } -// -// override fun onSearchConfirmed(text: CharSequence?) { -// viewModel.searchAllContacts(text) -// } -// -// override fun onSearchStateChanged(enabled: Boolean) { -// if(!enabled) { -// viewModel.searchAllContacts(null) -// } -// } -// }) } private fun checkForPermission() { @@ -270,7 +253,7 @@ class ContactListFragment : Fragment(), HandleItemClick { private fun showEmptyState() { binding.permissionRequiredLayout.permissionRequiredViewGroup.gone() binding.searchView.visible() - binding.stateView.text = stringRes(R.string.wow_so_empty) + binding.stateView.text = stringRes(R.string.contacts_on_your_contact_list_will_show_up_here) binding.stateView.visible() } @@ -286,24 +269,6 @@ class ContactListFragment : Fragment(), HandleItemClick { }.show() } -// private fun showGrantPermissionSnackBar( -// coordinatorLayout: CoordinatorLayout, -// permissionList: List -// ) { -// Snackbar.make( -// coordinatorLayout, -// stringRes(R.string.accept_permission), -// Snackbar.LENGTH_INDEFINITE -// ).setAction( -// stringRes(R.string.grant_permission) -// ) { -// requestPermissions( -// permissionList.toTypedArray(), -// BLOCKED_CONTACTS_FRAGMENT_PERMISSION_REQUEST_VALUE -// ) -// }.show() -// } - private fun showContactBlockedSnackBar(coordinatorLayout: CoordinatorLayout) { Snackbar.make( coordinatorLayout, diff --git a/app/src/main/java/com/abhriya/callblockr/ui/BlockContactFragment.kt b/app/src/main/java/com/abhriya/callblockr/ui/blockcontact/BlockContactFragment.kt similarity index 78% rename from app/src/main/java/com/abhriya/callblockr/ui/BlockContactFragment.kt rename to app/src/main/java/com/abhriya/callblockr/ui/blockcontact/BlockContactFragment.kt index 106064e..e2ad075 100644 --- a/app/src/main/java/com/abhriya/callblockr/ui/BlockContactFragment.kt +++ b/app/src/main/java/com/abhriya/callblockr/ui/blockcontact/BlockContactFragment.kt @@ -1,37 +1,31 @@ -package com.abhriya.callblockr.ui +package com.abhriya.callblockr.ui.blockcontact import android.app.Dialog import android.content.DialogInterface import android.view.LayoutInflater -import android.view.View -import android.widget.LinearLayout -import android.widget.RelativeLayout -import androidx.constraintlayout.widget.ConstraintLayout import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.lifecycle.ViewModelProvider -import androidx.navigation.fragment.findNavController import com.abhriya.callblockr.R import com.abhriya.callblockr.databinding.FragmentBlockContactBinding -import com.abhriya.callblockr.databinding.FragmentBlockedContactsBinding import com.abhriya.callblockr.domain.model.ContactModel import com.abhriya.callblockr.domain.model.ContactModelType -import com.abhriya.callblockr.util.KeyboardUtil -import com.abhriya.callblockr.util.stringRes -import com.abhriya.callblockr.util.withDelayOnMain import com.abhriya.callblockr.viewmodel.ContactsViewModel +import com.abhriya.commons.util.KeyboardUtil +import com.abhriya.commons.util.stringRes +import com.abhriya.commons.util.withDelayOnMain import com.allattentionhere.fabulousfilter.AAH_FabulousFragment -import com.bumptech.glide.util.Util import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class BlockContactFragment : AAH_FabulousFragment() { - lateinit var binding : FragmentBlockContactBinding + lateinit var binding: FragmentBlockContactBinding private lateinit var viewModel: ContactsViewModel override fun setupDialog(dialog: Dialog, style: Int) { - binding = FragmentBlockContactBinding.inflate(LayoutInflater.from(requireContext()), null, false) + binding = + FragmentBlockContactBinding.inflate(LayoutInflater.from(requireContext()), null, false) viewModel = requireActivity().run { ViewModelProvider(this)[ContactsViewModel::class.java] } @@ -39,7 +33,7 @@ class BlockContactFragment : AAH_FabulousFragment() { binding.lifecycleOwner = this binding.confirmButton.setOnClickListener { KeyboardUtil.hideKeyboard(it) - withDelayOnMain(300){ + withDelayOnMain(300) { viewModel.blockContact( ContactModel( phoneNumber = viewModel.inputNumberToBlock.value!!, @@ -64,7 +58,7 @@ class BlockContactFragment : AAH_FabulousFragment() { // setViewgroupStatic(ll_buttons) // optional; layout to stick at bottom on slide // setViewPager(vp_types) //optional; if you use viewpager that has scrollview setViewMain(binding.mainConstraintView) //necessary; main bottomsheet view - setMainContentView(binding.root ) // necessary; call at end before super + setMainContentView(binding.root) // necessary; call at end before super super.setupDialog(dialog, style) //call super at last } diff --git a/app/src/main/java/com/abhriya/callblockr/ui/BlockedContactsFragment.kt b/app/src/main/java/com/abhriya/callblockr/ui/blockedcontacts/BlockedContactsFragment.kt similarity index 84% rename from app/src/main/java/com/abhriya/callblockr/ui/BlockedContactsFragment.kt rename to app/src/main/java/com/abhriya/callblockr/ui/blockedcontacts/BlockedContactsFragment.kt index 732c899..4588b2c 100644 --- a/app/src/main/java/com/abhriya/callblockr/ui/BlockedContactsFragment.kt +++ b/app/src/main/java/com/abhriya/callblockr/ui/blockedcontacts/BlockedContactsFragment.kt @@ -1,4 +1,4 @@ -package com.abhriya.callblockr.ui +package com.abhriya.callblockr.ui.blockedcontacts import android.Manifest import android.content.pm.PackageManager @@ -11,7 +11,6 @@ import android.view.animation.AnimationUtils import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.app.ActivityCompat import androidx.fragment.app.Fragment -import androidx.fragment.app.viewModels import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager @@ -19,10 +18,14 @@ import androidx.recyclerview.widget.RecyclerView import com.abhriya.callblockr.R import com.abhriya.callblockr.databinding.FragmentBlockedContactsBinding import com.abhriya.callblockr.domain.model.ContactModel -import com.abhriya.callblockr.util.* +import com.abhriya.callblockr.ui.MainActivity +import com.abhriya.callblockr.ui.adapter.ContactListAdapter +import com.abhriya.callblockr.ui.adapter.HandleItemClick +import com.abhriya.callblockr.ui.blockcontact.BlockContactFragment +import com.abhriya.callblockr.util.openAppSettings import com.abhriya.callblockr.viewmodel.ContactsViewModel -import com.abhriya.commons.DialogHelper import com.abhriya.commons.SystemPermissionUtil +import com.abhriya.commons.util.* import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @@ -33,9 +36,6 @@ const val BLOCKED_CONTACTS_FRAGMENT_PERMISSION_REQUEST_VALUE = 3 class BlockedContactsFragment : Fragment(), HandleItemClick { - @Inject - internal lateinit var dialogHelper: DialogHelper - @Inject internal lateinit var systemPermissionUtil: SystemPermissionUtil private lateinit var viewModel: ContactsViewModel @@ -103,13 +103,13 @@ class BlockedContactsFragment : Fragment(), } } - private fun checkForPermission(){ + private fun checkForPermission() { systemPermissionUtil.checkPermissions( requireContext(), getListOfRequiredPermissions() ).also { if (systemPermissionUtil.getMissingPermissionsArray(it).isNotEmpty()) { - if(!isPermissionDeniedBefore) { + if (!isPermissionDeniedBefore) { isPermissionDeniedBefore = true obtainPermission() } @@ -129,34 +129,17 @@ class BlockedContactsFragment : Fragment(), getListOfRequiredPermissions() ) ).run { - requestPermissions( - this, - BLOCKED_CONTACTS_FRAGMENT_PERMISSION_REQUEST_VALUE - ) - } + requestPermissions( + this, + BLOCKED_CONTACTS_FRAGMENT_PERMISSION_REQUEST_VALUE + ) } + } private fun attachClickListeners() { binding.fab.setOnClickListener { -// dialogHelper.showInputDialog( -// requireContext(), -// requireContext().stringRes(R.string.input_number_to_block), -// requireContext().stringRes(R.string.block_number), -// InputType.TYPE_CLASS_PHONE, -// object : InputValueListener { -// override fun onInputSubmitted(inputText: String) { -// viewModel.blockContact( -// ContactModel( -// phoneNumber = inputText, -// contactModelType = ContactModelType.BLOCKED_CONTACT -// ), -// viewModel.blockedContactLiveData -// ) -// } -// } -// ) - - val dialogFrag = BlockContactFragment() + val dialogFrag = + BlockContactFragment() dialogFrag.setParentFab(binding.fab) dialogFrag.show(requireFragmentManager(), dialogFrag.tag) } @@ -170,7 +153,10 @@ class BlockedContactsFragment : Fragment(), binding.recyclerView.layoutManager = LinearLayoutManager(requireActivity(), RecyclerView.VERTICAL, false) recyclerViewAdapter = - ContactListAdapter(requireContext(), this) + ContactListAdapter( + requireContext(), + this + ) binding.recyclerView.adapter = recyclerViewAdapter binding.recyclerView.setHasFixedSize(true) } @@ -224,7 +210,7 @@ class BlockedContactsFragment : Fragment(), } private fun showEmptyState() { - binding.stateView.text = stringRes(R.string.wow_so_empty) + binding.stateView.text = stringRes(R.string.your_blocked_contacts_show_up_here) binding.stateView.visible() } diff --git a/app/src/main/java/com/abhriya/callblockr/ui/CallLogFragment.kt b/app/src/main/java/com/abhriya/callblockr/ui/calllog/CallLogFragment.kt similarity index 90% rename from app/src/main/java/com/abhriya/callblockr/ui/CallLogFragment.kt rename to app/src/main/java/com/abhriya/callblockr/ui/calllog/CallLogFragment.kt index b29505c..28d2984 100644 --- a/app/src/main/java/com/abhriya/callblockr/ui/CallLogFragment.kt +++ b/app/src/main/java/com/abhriya/callblockr/ui/calllog/CallLogFragment.kt @@ -1,4 +1,4 @@ -package com.abhriya.callblockr.ui +package com.abhriya.callblockr.ui.calllog import android.Manifest import android.content.pm.PackageManager @@ -10,7 +10,6 @@ import android.view.animation.AnimationUtils import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.app.ActivityCompat import androidx.fragment.app.Fragment -import androidx.fragment.app.viewModels import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager @@ -20,15 +19,22 @@ import com.abhriya.callblockr.databinding.FragmentCallLogBinding import com.abhriya.callblockr.domain.model.CallLogModel import com.abhriya.callblockr.domain.model.ContactModel import com.abhriya.callblockr.domain.model.ContactModelType -import com.abhriya.callblockr.util.* +import com.abhriya.callblockr.ui.adapter.CallLogAdapter +import com.abhriya.callblockr.ui.adapter.HandleCallLogItemClick +import com.abhriya.callblockr.util.openAppSettings import com.abhriya.callblockr.viewmodel.ContactsViewModel import com.abhriya.commons.SystemPermissionUtil +import com.abhriya.commons.util.ResourceState +import com.abhriya.commons.util.gone +import com.abhriya.commons.util.stringRes +import com.abhriya.commons.util.visible import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @AndroidEntryPoint -class CallLogFragment : Fragment(), HandleCallLogItemClick { +class CallLogFragment : Fragment(), + HandleCallLogItemClick { @Inject internal lateinit var systemPermissionUtil: SystemPermissionUtil @@ -100,14 +106,15 @@ class CallLogFragment : Fragment(), HandleCallLogItemClick { private fun setupObservers() { viewModel.callLogList.observe(viewLifecycleOwner, Observer { - if(it.isEmpty()){ + if (it.isEmpty()) { binding.emptyCallLogTextView.visible() binding.recyclerView.gone() } else { binding.emptyCallLogTextView.gone() binding.recyclerView.visible() binding.recyclerView.layoutAnimation = - AnimationUtils.loadLayoutAnimation(context, + AnimationUtils.loadLayoutAnimation( + context, R.anim.recyclerview_layout_anim ) recyclerViewAdapter.setCallLogList(it) @@ -115,7 +122,7 @@ class CallLogFragment : Fragment(), HandleCallLogItemClick { }) viewModel.blockedContactLiveData.observe(viewLifecycleOwner, Observer { - if(it is ResourceState.Success){ + if (it is ResourceState.Success) { checkForPermission() } }) @@ -125,7 +132,10 @@ class CallLogFragment : Fragment(), HandleCallLogItemClick { binding.recyclerView.layoutManager = LinearLayoutManager(requireActivity(), RecyclerView.VERTICAL, false) recyclerViewAdapter = - CallLogAdapter(requireContext(), this) + CallLogAdapter( + requireContext(), + this + ) binding.recyclerView.adapter = recyclerViewAdapter binding.recyclerView.setHasFixedSize(true) } diff --git a/app/src/main/java/com/abhriya/callblockr/util/ActivityUtil.kt b/app/src/main/java/com/abhriya/callblockr/util/ActivityUtil.kt index 2173583..cfbb49b 100644 --- a/app/src/main/java/com/abhriya/callblockr/util/ActivityUtil.kt +++ b/app/src/main/java/com/abhriya/callblockr/util/ActivityUtil.kt @@ -5,7 +5,7 @@ import android.content.Intent import android.net.Uri import android.provider.Settings -fun Activity.openAppSettings(){ +fun Activity.openAppSettings() { val intent = Intent( Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:$packageName") diff --git a/app/src/main/java/com/abhriya/callblockr/util/ContactListDiffUtilCallback.kt b/app/src/main/java/com/abhriya/callblockr/util/ContactListDiffUtilCallback.kt deleted file mode 100644 index 36a3820..0000000 --- a/app/src/main/java/com/abhriya/callblockr/util/ContactListDiffUtilCallback.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.abhriya.callblockr.util - -import androidx.recyclerview.widget.DiffUtil -import com.abhriya.callblockr.domain.model.ContactModel - -class ContactListDiffUtilCallback( - private val newList: List, - private val oldList: List -) : DiffUtil.Callback() { - - - override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { - return oldList[oldItemPosition].phoneNumber == newList[newItemPosition].phoneNumber - } - - override fun getOldListSize() = oldList.size - - override fun getNewListSize() = newList.size - - override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { - return oldList[oldItemPosition].phoneNumber == newList[newItemPosition].phoneNumber - && oldList[oldItemPosition].name == newList[newItemPosition].name - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/abhriya/callblockr/viewmodel/ContactsViewModel.kt b/app/src/main/java/com/abhriya/callblockr/viewmodel/ContactsViewModel.kt index 366acea..b4b9b24 100644 --- a/app/src/main/java/com/abhriya/callblockr/viewmodel/ContactsViewModel.kt +++ b/app/src/main/java/com/abhriya/callblockr/viewmodel/ContactsViewModel.kt @@ -5,11 +5,13 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.abhriya.callblockr.data.entity.CallType import com.abhriya.callblockr.data.exception.DataLayerException import com.abhriya.callblockr.domain.ContactsUseCase import com.abhriya.callblockr.domain.model.CallLogModel import com.abhriya.callblockr.domain.model.ContactModel -import com.abhriya.callblockr.util.ResourceState +import com.abhriya.callblockr.domain.model.ContactModelType +import com.abhriya.commons.util.ResourceState import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.launch @@ -17,7 +19,7 @@ import kotlinx.coroutines.launch class ContactsViewModel @ViewModelInject constructor(private val contactsUseCase: ContactsUseCase) : ViewModel() { - val inputNumberToBlock : MutableLiveData = MutableLiveData() + val inputNumberToBlock: MutableLiveData = MutableLiveData() private var _blockedContactsLiveData = MutableLiveData>>() val blockedContactLiveData: LiveData>> @@ -28,8 +30,8 @@ class ContactsViewModel @ViewModelInject constructor(private val contactsUseCase val allContactsToShowLiveData: LiveData>> get() = _allContactsToShowLiveData - private val _callLogList : MutableLiveData> = MutableLiveData() - val callLogList : MutableLiveData> = _callLogList + private val _callLogList: MutableLiveData> = MutableLiveData() + val callLogList: MutableLiveData> = _callLogList private var allContactsList = listOf() @@ -43,7 +45,12 @@ class ContactsViewModel @ViewModelInject constructor(private val contactsUseCase ) } } catch (dataLayerException: DataLayerException) { - _blockedContactsLiveData.postValue(ResourceState.error(dataLayerException.message, dataLayerException)) + _blockedContactsLiveData.postValue( + ResourceState.error( + dataLayerException.message, + dataLayerException + ) + ) } } } @@ -67,7 +74,12 @@ class ContactsViewModel @ViewModelInject constructor(private val contactsUseCase blockedContacts.await() callLog.await() } catch (dataLayerException: DataLayerException) { - it.postValue(ResourceState.error(dataLayerException.message, dataLayerException)) + it.postValue( + ResourceState.error( + dataLayerException.message, + dataLayerException + ) + ) } } } @@ -106,14 +118,23 @@ class ContactsViewModel @ViewModelInject constructor(private val contactsUseCase try { contactsUseCase.getAllSavedContacts() .let { - val list= it.toMutableList() - list.sortWith(Comparator { o1, o2 -> - o1.name?.compareTo(o2.name?:"")?:0 + val list = it.toMutableList() + list.sortWith(Comparator { o1, o2 -> + o1.name?.compareTo(o2.name ?: "") ?: 0 }) list }.also { - allContactsList = it - _allContactsToShowLiveData.postValue(ResourceState.success(it)) + val here = mutableListOf( + ContactModel("Donal Trump", "+1 889-290-029", ContactModelType.ALL_CONTACT, false), + ContactModel("Cristian Ronaldo", "+2848940183", ContactModelType.ALL_CONTACT, false), + ContactModel("Joe Bide", "+1 889-290-029", ContactModelType.ALL_CONTACT, false), + ContactModel("Justin Trude", "+2848940183", ContactModelType.ALL_CONTACT, false), + ContactModel("Lionel Mess", "+1 889-290-029", ContactModelType.ALL_CONTACT, false), + ContactModel("Mamata Banner", "+91 11 0202 011", ContactModelType.ALL_CONTACT, false), + ContactModel("Narendra Mod", "+91 11 0202 020 ", ContactModelType.ALL_CONTACT, false), + ) + allContactsList = here + _allContactsToShowLiveData.postValue(ResourceState.success(here)) } } catch (dataLayerException: DataLayerException) { _allContactsToShowLiveData.postValue( @@ -123,17 +144,27 @@ class ContactsViewModel @ViewModelInject constructor(private val contactsUseCase } } - fun getCallLog(){ + fun getCallLog() { viewModelScope.launch(Dispatchers.IO) { - _callLogList.postValue(contactsUseCase.getCallLog()) + val here = mutableListOf( + CallLogModel("Donal Trump", "+1 889-290-029", CallType.REJECTED_CALL, "1610205717","0", false), + CallLogModel("Cristian Ronaldo", "+2848940183", CallType.OUTGOING_CALL, "1610205417","160", false), + CallLogModel("Joe Bide", "+1 889-290-029", CallType.OUTGOING_CALL, "1610203717","10", false), + CallLogModel("Justin Trude", "+1 889-290-029", CallType.MISSED_CALL, "1610200717","0", false), + CallLogModel("Lionel Mess", "+1 889-290-029", CallType.INCOMING_CALL, "1610195717","160", false), + CallLogModel("Mamata Banner", "+91 11 0202 011", CallType.INCOMING_CALL, "1610194717","120", false), + CallLogModel("Narendra Mod", "+91 11 0202 011", CallType.INCOMING_CALL, "1610193617","132", false), + ) +// _callLogList.postValue(contactsUseCase.getCallLog()) + _callLogList.postValue(here) } } - fun searchAllContacts(stringToSearch : String?){ - if(stringToSearch?.isNullOrEmpty()!=true){ + fun searchAllContacts(stringToSearch: String?) { + if (stringToSearch?.isNullOrEmpty() != true) { viewModelScope.launch(Dispatchers.IO) { fuzzySearch(stringToSearch).let { - if(it!=null) { + if (it != null) { _allContactsToShowLiveData.postValue(ResourceState.success(it)) } else { _allContactsToShowLiveData.postValue(ResourceState.success(listOf())) @@ -145,7 +176,7 @@ class ContactsViewModel @ViewModelInject constructor(private val contactsUseCase } } - fun closeSearch(){ + fun closeSearch() { _allContactsToShowLiveData.value = ResourceState.success(allContactsList) } @@ -168,7 +199,8 @@ class ContactsViewModel @ViewModelInject constructor(private val contactsUseCase } else { for (contact in allContactsList) { if (contact.phoneNumber != null && contact.name != null) { - val isNameContains: Boolean = contact.name.toLowerCase().contains(str.toLowerCase()) + val isNameContains: Boolean = + contact.name.toLowerCase().contains(str.toLowerCase()) val isSortKeyContains: Boolean = contact.name.toLowerCase().replace(" ", "") .contains(str.toLowerCase()) diff --git a/app/src/main/res/layout/fragment_call_log.xml b/app/src/main/res/layout/fragment_call_log.xml index 8101e9f..3a7698c 100644 --- a/app/src/main/res/layout/fragment_call_log.xml +++ b/app/src/main/res/layout/fragment_call_log.xml @@ -8,7 +8,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="?attr/colorPrimary" - tools:context=".ui.CallLogFragment"> + tools:context=".ui.calllog.CallLogFragment"> - inputValueListener.onInputSubmitted(text.toString()) - } - title(text = titleText) - positiveButton(text = submitButtonText) - } - } -} - -interface InputValueListener { - fun onInputSubmitted(inputText: String) -} \ No newline at end of file diff --git a/commons/src/main/java/com/abhriya/commons/di/CommonsProviderModule.kt b/commons/src/main/java/com/abhriya/commons/di/CommonsProviderModule.kt index e4603f5..59dd0ba 100644 --- a/commons/src/main/java/com/abhriya/commons/di/CommonsProviderModule.kt +++ b/commons/src/main/java/com/abhriya/commons/di/CommonsProviderModule.kt @@ -1,6 +1,5 @@ package com.abhriya.commons.di -import com.abhriya.commons.DialogHelper import com.abhriya.commons.SystemPermissionUtil import com.abhriya.commons.SystemPermissionUtilImpl import dagger.Module @@ -13,16 +12,6 @@ import javax.inject.Singleton @Module class CommonsProviderModule { - @Singleton - @Provides - fun providesDialogHelper(): DialogHelper = DialogHelper() - - -// @Provides -// @Singleton -// fun providesSystemPermissionsHandler(permissionUtil: SystemPermissionUtil): SystemPermissionsHandler = -// SystemPermissionsHandlerImpl(permissionUtil) - @Provides @Singleton fun providesSystemPermissionUtil(): SystemPermissionUtil = SystemPermissionUtilImpl() diff --git a/app/src/main/java/com/abhriya/callblockr/util/ContextUtil.kt b/commons/src/main/java/com/abhriya/commons/util/ContextUtil.kt similarity index 94% rename from app/src/main/java/com/abhriya/callblockr/util/ContextUtil.kt rename to commons/src/main/java/com/abhriya/commons/util/ContextUtil.kt index 0c00445..341a775 100644 --- a/app/src/main/java/com/abhriya/callblockr/util/ContextUtil.kt +++ b/commons/src/main/java/com/abhriya/commons/util/ContextUtil.kt @@ -1,4 +1,4 @@ -package com.abhriya.callblockr.util +package com.abhriya.commons.util import android.content.Context import android.graphics.Color diff --git a/app/src/main/java/com/abhriya/callblockr/util/FragmentUtil.kt b/commons/src/main/java/com/abhriya/commons/util/FragmentUtil.kt similarity index 86% rename from app/src/main/java/com/abhriya/callblockr/util/FragmentUtil.kt rename to commons/src/main/java/com/abhriya/commons/util/FragmentUtil.kt index 35c8b8c..0a73cc5 100644 --- a/app/src/main/java/com/abhriya/callblockr/util/FragmentUtil.kt +++ b/commons/src/main/java/com/abhriya/commons/util/FragmentUtil.kt @@ -1,4 +1,4 @@ -package com.abhriya.callblockr.util +package com.abhriya.commons.util import androidx.annotation.ColorRes import androidx.annotation.StringRes diff --git a/app/src/main/java/com/abhriya/callblockr/util/KeyboardUtil.kt b/commons/src/main/java/com/abhriya/commons/util/KeyboardUtil.kt similarity index 91% rename from app/src/main/java/com/abhriya/callblockr/util/KeyboardUtil.kt rename to commons/src/main/java/com/abhriya/commons/util/KeyboardUtil.kt index fb818dd..118e97c 100644 --- a/app/src/main/java/com/abhriya/callblockr/util/KeyboardUtil.kt +++ b/commons/src/main/java/com/abhriya/commons/util/KeyboardUtil.kt @@ -1,4 +1,4 @@ -package com.abhriya.callblockr.util +package com.abhriya.commons.util import android.app.Activity import android.content.Context @@ -48,7 +48,8 @@ object KeyboardUtil { fun hideKeyboard(view: View?) { if (view != null) { val inputManager = - view!!.getContext().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + view!!.getContext() + .getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager if (inputManager != null) { inputManager!!.hideSoftInputFromWindow(view!!.getWindowToken(), 0) } diff --git a/app/src/main/java/com/abhriya/callblockr/util/LiveDataUtil.kt b/commons/src/main/java/com/abhriya/commons/util/LiveDataUtil.kt similarity index 87% rename from app/src/main/java/com/abhriya/callblockr/util/LiveDataUtil.kt rename to commons/src/main/java/com/abhriya/commons/util/LiveDataUtil.kt index cd432d6..5e701f7 100644 --- a/app/src/main/java/com/abhriya/callblockr/util/LiveDataUtil.kt +++ b/commons/src/main/java/com/abhriya/commons/util/LiveDataUtil.kt @@ -1,4 +1,4 @@ -package com.abhriya.callblockr.util +package com.abhriya.commons.util import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LiveData diff --git a/app/src/main/java/com/abhriya/callblockr/util/ResourceState.kt b/commons/src/main/java/com/abhriya/commons/util/ResourceState.kt similarity index 86% rename from app/src/main/java/com/abhriya/callblockr/util/ResourceState.kt rename to commons/src/main/java/com/abhriya/commons/util/ResourceState.kt index 5e43151..150b55b 100644 --- a/app/src/main/java/com/abhriya/callblockr/util/ResourceState.kt +++ b/commons/src/main/java/com/abhriya/commons/util/ResourceState.kt @@ -1,6 +1,4 @@ -package com.abhriya.callblockr.util - -import java.lang.Exception +package com.abhriya.commons.util /** * Data and UI State management @@ -32,7 +30,7 @@ sealed class ResourceState { * Returns [ResourceState.Error] instance. * @param message Description of failure. */ - fun error(message: String?, error : Exception) = + fun error(message: String?, error: Exception) = Error( message, error diff --git a/app/src/main/java/com/abhriya/callblockr/util/StringUtil.kt b/commons/src/main/java/com/abhriya/commons/util/StringUtil.kt similarity index 71% rename from app/src/main/java/com/abhriya/callblockr/util/StringUtil.kt rename to commons/src/main/java/com/abhriya/commons/util/StringUtil.kt index f889de4..5149283 100644 --- a/app/src/main/java/com/abhriya/callblockr/util/StringUtil.kt +++ b/commons/src/main/java/com/abhriya/commons/util/StringUtil.kt @@ -1,4 +1,4 @@ -package com.abhriya.callblockr.util +package com.abhriya.commons.util fun String.removeAllWhiteSpaces(): String { return this.replace("\\s".toRegex(), "") diff --git a/app/src/main/java/com/abhriya/callblockr/util/ViewUtil.kt b/commons/src/main/java/com/abhriya/commons/util/ViewUtil.kt similarity index 91% rename from app/src/main/java/com/abhriya/callblockr/util/ViewUtil.kt rename to commons/src/main/java/com/abhriya/commons/util/ViewUtil.kt index 5cbb773..9b48b19 100644 --- a/app/src/main/java/com/abhriya/callblockr/util/ViewUtil.kt +++ b/commons/src/main/java/com/abhriya/commons/util/ViewUtil.kt @@ -1,4 +1,4 @@ -package com.abhriya.callblockr.util +package com.abhriya.commons.util import android.os.Handler import android.os.Looper diff --git a/commons/src/main/res/values/strings.xml b/commons/src/main/res/values/strings.xml index 12b5b69..cd4df0f 100644 --- a/commons/src/main/res/values/strings.xml +++ b/commons/src/main/res/values/strings.xml @@ -10,6 +10,8 @@ Unblock Unknown Wow! So empty… + Your blocked contacts will show up here + Contacts on your contact list will show up here Something went wrong Please grant permission Please grant permissions from settings diff --git a/datasource/build.gradle.kts b/datasource/build.gradle.kts index 4abdb34..e15c842 100644 --- a/datasource/build.gradle.kts +++ b/datasource/build.gradle.kts @@ -19,6 +19,14 @@ android { ) } } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } } dependencies { @@ -37,5 +45,5 @@ dependencies { api(Libs.roomKts) kapt(Libs.roomCompiler) - implementation(project(":commons")) + implementation(project(Modules.commons)) } \ No newline at end of file diff --git a/datasource/src/main/java/com/abhriya/datasource/local/LocalDataSource.kt b/datasource/src/main/java/com/abhriya/datasource/local/LocalDataSource.kt index 2404029..1bb42f4 100644 --- a/datasource/src/main/java/com/abhriya/datasource/local/LocalDataSource.kt +++ b/datasource/src/main/java/com/abhriya/datasource/local/LocalDataSource.kt @@ -12,7 +12,7 @@ interface LocalDataSource { suspend fun saveToBlockedContactsDb(contactListToBlock: List) suspend fun removeBlockedContactsFromDb(contactListToUnBlock: List) suspend fun getAllBlockedContacts(): List - suspend fun getBlockedContactByNumber(phoneNumber: String): ContactDbEntity? + suspend fun getBlockedContactByNumber(phoneNumber: String?): ContactDbEntity? } class LocalDataSourceImpl(applicationContext: Context) : @@ -58,7 +58,10 @@ class LocalDataSourceImpl(applicationContext: Context) : } } - override suspend fun getBlockedContactByNumber(phoneNumber: String): ContactDbEntity? { + override suspend fun getBlockedContactByNumber(phoneNumber: String?): ContactDbEntity? { + if(phoneNumber.isNullOrEmpty()){ + return null + } try { return blockedContactsDb.contactsDao().getAll() .find {