diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ca838bc..c7f16e3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -2,7 +2,7 @@ plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.compose) - alias(libs.plugins.dagger.hilt) + // alias(libs.plugins.dagger.hilt) alias(libs.plugins.triplet.play) alias(libs.plugins.ksp) } @@ -155,9 +155,9 @@ dependencies { implementation(libs.orbit.viewmodel) // DAGGER SETUP - implementation(libs.dagger.hilt.android) - implementation(libs.androidx.hilt.nav.compose) - ksp(libs.dagger.hilt.compiler) + //implementation(libs.dagger.hilt.android) + //implementation(libs.androidx.hilt.nav.compose) + //ksp(libs.dagger.hilt.compiler) // EXTRA ICONS implementation(libs.simple.icons) @@ -177,6 +177,12 @@ dependencies { implementation(libs.io.coil) implementation(libs.androidx.compose.foundation) implementation(libs.kotlinx.serialization) + + // Koin Dependency Injection + implementation(libs.io.koin.core) + implementation(libs.io.koin.android) + implementation(libs.io.koin.compose) + implementation(libs.io.koin.test) } tasks.named("clean") { diff --git a/app/src/main/java/dev/arkbuilders/drop/app/data/datasource/ProfileLocalDataSource.kt b/app/src/main/java/dev/arkbuilders/drop/app/data/datasource/ProfileLocalDataSource.kt index c33b2c4..2138d23 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/data/datasource/ProfileLocalDataSource.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/data/datasource/ProfileLocalDataSource.kt @@ -2,19 +2,16 @@ package dev.arkbuilders.drop.app.data.datasource import android.content.Context import android.content.SharedPreferences -import dagger.hilt.android.qualifiers.ApplicationContext -import kotlinx.serialization.encodeToString -import kotlinx.serialization.json.Json -import javax.inject.Inject import androidx.core.content.edit import dev.arkbuilders.drop.app.data.model.UserAvatarDto import dev.arkbuilders.drop.app.data.model.UserProfileDto import dev.arkbuilders.drop.app.domain.AvatarHelper import dev.arkbuilders.drop.app.domain.model.UserAvatar import dev.arkbuilders.drop.app.domain.model.UserProfile +import kotlinx.serialization.json.Json -class ProfileLocalDataSource @Inject constructor( - @ApplicationContext private val context: Context, +class ProfileLocalDataSource( + private val context: Context, private val avatarHelper: AvatarHelper, ) { private val prefs: SharedPreferences = diff --git a/app/src/main/java/dev/arkbuilders/drop/app/data/datasource/TransferHistoryItemLocalDataSource.kt b/app/src/main/java/dev/arkbuilders/drop/app/data/datasource/TransferHistoryItemLocalDataSource.kt index bd27f23..94c743c 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/data/datasource/TransferHistoryItemLocalDataSource.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/data/datasource/TransferHistoryItemLocalDataSource.kt @@ -7,7 +7,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import javax.inject.Inject -class TransferHistoryItemLocalDataSource @Inject constructor( +class TransferHistoryItemLocalDataSource( private val dao: TransferHistoryItemDao ) { fun flow(): Flow> = diff --git a/app/src/main/java/dev/arkbuilders/drop/app/data/helper/AvatarHelperImpl.kt b/app/src/main/java/dev/arkbuilders/drop/app/data/helper/AvatarHelperImpl.kt index 6a48ba1..6961beb 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/data/helper/AvatarHelperImpl.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/data/helper/AvatarHelperImpl.kt @@ -9,17 +9,14 @@ import android.net.Uri import android.util.Base64 import androidx.core.graphics.scale import androidx.core.net.toUri -import dagger.hilt.android.qualifiers.ApplicationContext import dev.arkbuilders.drop.app.domain.AvatarHelper import dev.arkbuilders.drop.app.domain.AvatarHelper.Companion.JPEG_QUALITY import dev.arkbuilders.drop.app.domain.AvatarHelper.Companion.MAX_FILE_SIZE import dev.arkbuilders.drop.app.domain.AvatarHelper.Companion.MAX_IMAGE_SIZE import java.io.ByteArrayOutputStream import java.io.IOException -import javax.inject.Inject -class AvatarHelperImpl @Inject constructor( - @ApplicationContext +class AvatarHelperImpl( private val context: Context, ) : AvatarHelper { diff --git a/app/src/main/java/dev/arkbuilders/drop/app/data/helper/PermissionsHelperImpl.kt b/app/src/main/java/dev/arkbuilders/drop/app/data/helper/PermissionsHelperImpl.kt index ccb739d..5bf4a60 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/data/helper/PermissionsHelperImpl.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/data/helper/PermissionsHelperImpl.kt @@ -4,12 +4,10 @@ import android.Manifest import android.content.Context import android.content.pm.PackageManager import androidx.core.content.ContextCompat -import dagger.hilt.android.qualifiers.ApplicationContext import dev.arkbuilders.drop.app.domain.PermissionsHelper -import javax.inject.Inject -class PermissionsHelperImpl @Inject constructor( - @ApplicationContext private val ctx: Context, +class PermissionsHelperImpl( + private val ctx: Context, ): PermissionsHelper { override fun isCameraGranted(): Boolean { return ContextCompat.checkSelfPermission( diff --git a/app/src/main/java/dev/arkbuilders/drop/app/data/helper/ResourcesHelperImpl.kt b/app/src/main/java/dev/arkbuilders/drop/app/data/helper/ResourcesHelperImpl.kt index 7fd137d..779f1dc 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/data/helper/ResourcesHelperImpl.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/data/helper/ResourcesHelperImpl.kt @@ -3,13 +3,11 @@ package dev.arkbuilders.drop.app.data.helper import android.content.Context import android.provider.OpenableColumns import androidx.core.net.toUri -import dagger.hilt.android.qualifiers.ApplicationContext import dev.arkbuilders.drop.app.domain.ResourcesHelper import timber.log.Timber -import javax.inject.Inject -class ResourcesHelperImpl @Inject constructor( - @ApplicationContext private val context: Context, +class ResourcesHelperImpl( + private val context: Context, ) : ResourcesHelper { override fun getFileName(uri: String): String? { return try { diff --git a/app/src/main/java/dev/arkbuilders/drop/app/data/repository/NetworkStatusImpl.kt b/app/src/main/java/dev/arkbuilders/drop/app/data/repository/NetworkStatusImpl.kt index cf75c58..ed6c9f8 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/data/repository/NetworkStatusImpl.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/data/repository/NetworkStatusImpl.kt @@ -1,20 +1,17 @@ package dev.arkbuilders.drop.app.data.repository -import android.annotation.SuppressLint import android.content.Context import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkRequest import android.os.Build -import dagger.hilt.android.qualifiers.ApplicationContext import dev.arkbuilders.drop.app.domain.repository.NetworkStatus import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow -import javax.inject.Inject -class NetworkStatusImpl @Inject constructor( - @ApplicationContext private val context: Context, +class NetworkStatusImpl( + private val context: Context, ) : NetworkStatus { private val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager diff --git a/app/src/main/java/dev/arkbuilders/drop/app/data/repository/ProfileRepoImpl.kt b/app/src/main/java/dev/arkbuilders/drop/app/data/repository/ProfileRepoImpl.kt index 1284115..ce45bc8 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/data/repository/ProfileRepoImpl.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/data/repository/ProfileRepoImpl.kt @@ -1,7 +1,6 @@ package dev.arkbuilders.drop.app.data.repository import android.content.Context -import dagger.hilt.android.qualifiers.ApplicationContext import dev.arkbuilders.drop.app.data.datasource.ProfileLocalDataSource import dev.arkbuilders.drop.app.domain.model.UserAvatar import dev.arkbuilders.drop.app.domain.model.UserProfile @@ -9,13 +8,10 @@ import dev.arkbuilders.drop.app.domain.repository.ProfileRepo import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow -import javax.inject.Inject -import javax.inject.Singleton -@Singleton -class ProfileRepoImpl @Inject constructor( +class ProfileRepoImpl( private val localDataSource: ProfileLocalDataSource, - @ApplicationContext private val context: Context, + private val context: Context, ) : ProfileRepo { private val _profile = MutableStateFlow(localDataSource.loadProfile()) diff --git a/app/src/main/java/dev/arkbuilders/drop/app/data/repository/TransferHistoryItemRepositoryImpl.kt b/app/src/main/java/dev/arkbuilders/drop/app/data/repository/TransferHistoryItemRepositoryImpl.kt index abc4d35..3aa0f96 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/data/repository/TransferHistoryItemRepositoryImpl.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/data/repository/TransferHistoryItemRepositoryImpl.kt @@ -7,11 +7,8 @@ import dev.arkbuilders.drop.app.domain.model.TransferType import dev.arkbuilders.drop.app.domain.repository.TransferHistoryItemRepository import kotlinx.coroutines.flow.Flow import java.time.OffsetDateTime -import javax.inject.Inject -import javax.inject.Singleton -@Singleton -class TransferHistoryItemRepositoryImpl @Inject constructor( +class TransferHistoryItemRepositoryImpl( private val localSource: TransferHistoryItemLocalDataSource ): TransferHistoryItemRepository { override val historyItems: Flow> = localSource.flow() diff --git a/app/src/main/java/dev/arkbuilders/drop/app/data/repository/TransferManager.kt b/app/src/main/java/dev/arkbuilders/drop/app/data/repository/TransferManager.kt index f7c4e3b..da10374 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/data/repository/TransferManager.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/data/repository/TransferManager.kt @@ -7,32 +7,30 @@ import android.os.Environment import android.provider.MediaStore import android.provider.OpenableColumns import android.util.Log -import dagger.hilt.android.EntryPointAccessors -import dagger.hilt.android.qualifiers.ApplicationContext import dev.arkbuilders.drop.ReceiveFilesBubble import dev.arkbuilders.drop.SendFilesBubble import dev.arkbuilders.drop.app.data.ReceiveFilesSubscriberImpl import dev.arkbuilders.drop.app.data.ReceivingProgress import dev.arkbuilders.drop.app.data.SendFilesSubscriberImpl import dev.arkbuilders.drop.app.data.SendingProgress -import dev.arkbuilders.drop.app.di.TmpEntryPoint import dev.arkbuilders.drop.app.domain.model.TransferStatus import dev.arkbuilders.drop.app.domain.repository.ProfileRepo import dev.arkbuilders.drop.app.domain.repository.TransferHistoryItemRepository +import dev.arkbuilders.drop.app.domain.usecase.ReceiveFilesUseCase +import dev.arkbuilders.drop.app.domain.usecase.SendFilesUseCase import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.withContext +import org.koin.core.component.KoinComponent +import org.koin.core.component.get import java.io.File import java.io.FileOutputStream -import javax.inject.Inject -import javax.inject.Singleton -@Singleton -class TransferManager @Inject constructor( - @ApplicationContext private val context: Context, +class TransferManager( + private val context: Context, private val profileRepo: ProfileRepo, private val transferHistoryRepository: TransferHistoryItemRepository, -) { +): KoinComponent { companion object { private const val TAG = "TransferManager" } @@ -49,11 +47,8 @@ class TransferManager @Inject constructor( get() = receiveSubscriber?.progress suspend fun sendFiles(fileUris: List): SendFilesBubble? = withContext(Dispatchers.IO) { - val entryPoint = EntryPointAccessors.fromApplication( - context.applicationContext, - TmpEntryPoint::class.java - ) - val sendUseCase = entryPoint.sendFilesUseCase() + val sendUseCase: SendFilesUseCase = get() + sendUseCase.invoke(fileUris).fold( onSuccess = { bubble -> currentSendBubble = bubble @@ -70,11 +65,7 @@ class TransferManager @Inject constructor( suspend fun receiveFiles(ticket: String, confirmation: UByte): ReceiveFilesBubble? = withContext(Dispatchers.IO) { - val entryPoint = EntryPointAccessors.fromApplication( - context.applicationContext, - TmpEntryPoint::class.java - ) - val receiveFilesUseCase = entryPoint.receiveFilesUseCase() + val receiveFilesUseCase: ReceiveFilesUseCase = get() receiveFilesUseCase.invoke(ticket, confirmation).fold( onSuccess = { bubble -> diff --git a/app/src/main/java/dev/arkbuilders/drop/app/di/AppModule.kt b/app/src/main/java/dev/arkbuilders/drop/app/di/AppModule.kt index 67baada..4d622e6 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/di/AppModule.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/di/AppModule.kt @@ -1,28 +1,46 @@ package dev.arkbuilders.drop.app.di -import android.content.Context -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.qualifiers.ApplicationContext -import dagger.hilt.components.SingletonComponent -import dev.arkbuilders.drop.app.data.repository.TransferManager -import dev.arkbuilders.drop.app.data.helper.ResourcesHelperImpl +import dev.arkbuilders.drop.app.data.datasource.ProfileLocalDataSource +import dev.arkbuilders.drop.app.data.datasource.TransferHistoryItemLocalDataSource import dev.arkbuilders.drop.app.data.db.Database +import dev.arkbuilders.drop.app.data.db.dao.TransferHistoryItemDao import dev.arkbuilders.drop.app.data.helper.AvatarHelperImpl import dev.arkbuilders.drop.app.data.helper.PermissionsHelperImpl +import dev.arkbuilders.drop.app.data.helper.ResourcesHelperImpl import dev.arkbuilders.drop.app.data.repository.NetworkStatusImpl import dev.arkbuilders.drop.app.data.repository.ProfileRepoImpl import dev.arkbuilders.drop.app.data.repository.TransferHistoryItemRepositoryImpl +import dev.arkbuilders.drop.app.data.repository.TransferManager import dev.arkbuilders.drop.app.domain.AvatarHelper import dev.arkbuilders.drop.app.domain.PermissionsHelper import dev.arkbuilders.drop.app.domain.ResourcesHelper import dev.arkbuilders.drop.app.domain.repository.NetworkStatus import dev.arkbuilders.drop.app.domain.repository.ProfileRepo import dev.arkbuilders.drop.app.domain.repository.TransferHistoryItemRepository -import javax.inject.Singleton +import dev.arkbuilders.drop.app.domain.usecase.ReceiveFilesUseCase +import dev.arkbuilders.drop.app.domain.usecase.SendFilesUseCase +import org.koin.dsl.module + +val appModule = module { + single { ProfileRepoImpl(get(), get()) } + single { TransferManager(get(), get(), get()) } + single { ResourcesHelperImpl(get()) } + single { Database.build(get()) } + single { TransferHistoryItemRepositoryImpl(get()) } + single { PermissionsHelperImpl(get()) } + single { NetworkStatusImpl(get()) } + single { AvatarHelperImpl(get()) } + single{ ProfileLocalDataSource(get(), get()) } + single{ TransferHistoryItemLocalDataSource(get()) } + factory { + val db: Database = get() + db.transferHistoryDao() + } + factory { SendFilesUseCase(get(), get(), get()) } + factory { ReceiveFilesUseCase(get(), get(), get()) } +} -@Module +/*@Module @InstallIn(SingletonComponent::class) object AppModule { @@ -81,3 +99,4 @@ object AppModule { impl: AvatarHelperImpl ): AvatarHelper = impl } +*/ \ No newline at end of file diff --git a/app/src/main/java/dev/arkbuilders/drop/app/di/TmpEntryPoint.kt b/app/src/main/java/dev/arkbuilders/drop/app/di/TmpEntryPoint.kt deleted file mode 100644 index 28ac3ee..0000000 --- a/app/src/main/java/dev/arkbuilders/drop/app/di/TmpEntryPoint.kt +++ /dev/null @@ -1,18 +0,0 @@ -package dev.arkbuilders.drop.app.di - -import dagger.hilt.EntryPoint -import dagger.hilt.InstallIn -import dagger.hilt.components.SingletonComponent -import dev.arkbuilders.drop.app.domain.AvatarHelper -import dev.arkbuilders.drop.app.domain.ResourcesHelper -import dev.arkbuilders.drop.app.domain.usecase.ReceiveFilesUseCase -import dev.arkbuilders.drop.app.domain.usecase.SendFilesUseCase - -@EntryPoint -@InstallIn(SingletonComponent::class) -interface TmpEntryPoint { - fun avatarHelper(): AvatarHelper - fun resourcesHelper(): ResourcesHelper - fun sendFilesUseCase(): SendFilesUseCase - fun receiveFilesUseCase(): ReceiveFilesUseCase -} \ No newline at end of file diff --git a/app/src/main/java/dev/arkbuilders/drop/app/di/ViewModelsModule.kt b/app/src/main/java/dev/arkbuilders/drop/app/di/ViewModelsModule.kt new file mode 100644 index 0000000..4d2cc38 --- /dev/null +++ b/app/src/main/java/dev/arkbuilders/drop/app/di/ViewModelsModule.kt @@ -0,0 +1,17 @@ +package dev.arkbuilders.drop.app.di + +import dev.arkbuilders.drop.app.presentation.home.HomeViewModel +import dev.arkbuilders.drop.app.presentation.history.HistoryViewModel +import dev.arkbuilders.drop.app.presentation.profile.EditProfileViewModel +import dev.arkbuilders.drop.app.presentation.receive.ReceiveViewModel +import dev.arkbuilders.drop.app.presentation.send.SendViewModel +import org.koin.core.module.dsl.viewModel +import org.koin.dsl.module + +val viewModelsModule = module { + viewModel { HistoryViewModel(get()) } + viewModel { HomeViewModel(get(), get()) } + viewModel { EditProfileViewModel(get(), get()) } + viewModel { ReceiveViewModel(get(), get()) } + viewModel { SendViewModel(get(), get(), get()) } +} \ No newline at end of file diff --git a/app/src/main/java/dev/arkbuilders/drop/app/domain/usecase/ReceiveFilesUseCase.kt b/app/src/main/java/dev/arkbuilders/drop/app/domain/usecase/ReceiveFilesUseCase.kt index bf6bcd2..c214f06 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/domain/usecase/ReceiveFilesUseCase.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/domain/usecase/ReceiveFilesUseCase.kt @@ -1,7 +1,6 @@ package dev.arkbuilders.drop.app.domain.usecase import android.content.Context -import dagger.hilt.android.qualifiers.ApplicationContext import dev.arkbuilders.drop.ReceiveFilesBubble import dev.arkbuilders.drop.ReceiveFilesRequest import dev.arkbuilders.drop.ReceiverConfig @@ -12,10 +11,9 @@ import dev.arkbuilders.drop.receiveFiles import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import timber.log.Timber -import javax.inject.Inject -class ReceiveFilesUseCase @Inject constructor( - @ApplicationContext private val context: Context, +class ReceiveFilesUseCase( + private val context: Context, private val profileRepo: ProfileRepo, private val resourcesHelper: ResourcesHelper, ) { diff --git a/app/src/main/java/dev/arkbuilders/drop/app/domain/usecase/SendFilesUseCase.kt b/app/src/main/java/dev/arkbuilders/drop/app/domain/usecase/SendFilesUseCase.kt index a468a91..ee1edfc 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/domain/usecase/SendFilesUseCase.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/domain/usecase/SendFilesUseCase.kt @@ -2,7 +2,6 @@ package dev.arkbuilders.drop.app.domain.usecase import android.content.Context import android.net.Uri -import dagger.hilt.android.qualifiers.ApplicationContext import dev.arkbuilders.drop.SendFilesBubble import dev.arkbuilders.drop.SendFilesRequest import dev.arkbuilders.drop.SenderConfig @@ -15,10 +14,9 @@ import dev.arkbuilders.drop.sendFiles import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import timber.log.Timber -import javax.inject.Inject -class SendFilesUseCase @Inject constructor( - @ApplicationContext private val context: Context, +class SendFilesUseCase( + private val context: Context, private val profileRepo: ProfileRepo, private val resourcesHelper: ResourcesHelper, ) { diff --git a/app/src/main/java/dev/arkbuilders/drop/app/presentation/DropApplication.kt b/app/src/main/java/dev/arkbuilders/drop/app/presentation/DropApplication.kt index f5eceb3..59c4266 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/presentation/DropApplication.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/presentation/DropApplication.kt @@ -1,13 +1,20 @@ package dev.arkbuilders.drop.app.presentation import android.app.Application -import dagger.hilt.android.HiltAndroidApp +import dev.arkbuilders.drop.app.di.appModule +import dev.arkbuilders.drop.app.di.viewModelsModule +import org.koin.android.ext.koin.androidContext +import org.koin.core.context.startKoin import timber.log.Timber -@HiltAndroidApp class DropApplication : Application() { override fun onCreate() { super.onCreate() Timber.Forest.plant(Timber.DebugTree()) + + startKoin { + androidContext(this@DropApplication) + modules(appModule, viewModelsModule) + } } } \ No newline at end of file diff --git a/app/src/main/java/dev/arkbuilders/drop/app/presentation/MainActivity.kt b/app/src/main/java/dev/arkbuilders/drop/app/presentation/MainActivity.kt index 99d47f5..bbf8de2 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/presentation/MainActivity.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/presentation/MainActivity.kt @@ -14,30 +14,25 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import androidx.navigation.navDeepLink -import dagger.hilt.android.AndroidEntryPoint import dev.arkbuilders.drop.app.data.repository.TransferManager import dev.arkbuilders.drop.app.domain.repository.ProfileRepo import dev.arkbuilders.drop.app.domain.repository.TransferHistoryItemRepository -import dev.arkbuilders.drop.app.presentation.navigation.DropDestination +import dev.arkbuilders.drop.app.presentation.home.Home import dev.arkbuilders.drop.app.presentation.history.History -import dev.arkbuilders.drop.app.presentation.Home.Home +import dev.arkbuilders.drop.app.presentation.navigation.DropDestination import dev.arkbuilders.drop.app.presentation.profile.EditProfileEnhanced import dev.arkbuilders.drop.app.presentation.receive.Receive import dev.arkbuilders.drop.app.presentation.send.Send import dev.arkbuilders.drop.app.presentation.theme.DropTheme -import javax.inject.Inject +import org.koin.android.ext.android.get -@AndroidEntryPoint class MainActivity : ComponentActivity() { - @Inject - lateinit var transferManager: TransferManager + private val transferManager: TransferManager = get() - @Inject - lateinit var profileRepo: ProfileRepo + private val profileRepo: ProfileRepo = get() - @Inject - lateinit var transferHistoryItemRepository: TransferHistoryItemRepository + private val transferHistoryItemRepository: TransferHistoryItemRepository = get() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/dev/arkbuilders/drop/app/presentation/history/History.kt b/app/src/main/java/dev/arkbuilders/drop/app/presentation/history/History.kt index 6f578e5..4d444a3 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/presentation/history/History.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/presentation/history/History.kt @@ -36,7 +36,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import compose.icons.TablerIcons import compose.icons.tablericons.ClearAll @@ -48,6 +48,7 @@ import dev.arkbuilders.drop.app.domain.model.TransferStatus import dev.arkbuilders.drop.app.domain.model.TransferType import dev.arkbuilders.drop.app.domain.repository.TransferHistoryItemRepository import dev.arkbuilders.drop.app.presentation.components.AvatarImageWithFallback +import org.koin.compose.koinInject import org.orbitmvi.orbit.compose.collectAsState import java.time.Duration import java.time.OffsetDateTime @@ -60,7 +61,8 @@ fun History( navController: NavController, transferHistoryItemRepository: TransferHistoryItemRepository ) { - val viewModel: HistoryViewModel = hiltViewModel() + val viewModel: HistoryViewModel = koinInject() + val scope = rememberCoroutineScope() val state by viewModel.collectAsState() diff --git a/app/src/main/java/dev/arkbuilders/drop/app/presentation/history/HistoryViewModel.kt b/app/src/main/java/dev/arkbuilders/drop/app/presentation/history/HistoryViewModel.kt index 31e4665..d441959 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/presentation/history/HistoryViewModel.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/presentation/history/HistoryViewModel.kt @@ -2,7 +2,6 @@ package dev.arkbuilders.drop.app.presentation.history import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import dagger.hilt.android.lifecycle.HiltViewModel import dev.arkbuilders.drop.app.domain.model.TransferHistoryItem import dev.arkbuilders.drop.app.domain.repository.TransferHistoryItemRepository import kotlinx.coroutines.flow.launchIn @@ -10,7 +9,6 @@ import kotlinx.coroutines.flow.onEach import org.orbitmvi.orbit.Container import org.orbitmvi.orbit.ContainerHost import org.orbitmvi.orbit.viewmodel.container -import javax.inject.Inject data class HistoryScreenState( val historyItems: List, @@ -20,8 +18,7 @@ data class HistoryScreenState( sealed class HistoryScreenEffect -@HiltViewModel -class HistoryViewModel @Inject constructor( +class HistoryViewModel( private val historyItemRepository: TransferHistoryItemRepository, ) : ViewModel(), ContainerHost { override val container: Container = container( diff --git a/app/src/main/java/dev/arkbuilders/drop/app/presentation/Home/Home.kt b/app/src/main/java/dev/arkbuilders/drop/app/presentation/home/Home.kt similarity index 98% rename from app/src/main/java/dev/arkbuilders/drop/app/presentation/Home/Home.kt rename to app/src/main/java/dev/arkbuilders/drop/app/presentation/home/Home.kt index 664bae6..0046bc6 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/presentation/Home/Home.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/presentation/home/Home.kt @@ -1,4 +1,4 @@ -package dev.arkbuilders.drop.app.presentation.Home +package dev.arkbuilders.drop.app.presentation.home import androidx.compose.animation.core.Spring import androidx.compose.animation.core.animateFloatAsState @@ -35,7 +35,7 @@ import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import compose.icons.TablerIcons import compose.icons.tablericons.ArrowDownCircle @@ -49,7 +49,6 @@ import dev.arkbuilders.drop.app.domain.model.TransferType import dev.arkbuilders.drop.app.domain.model.UserProfile import dev.arkbuilders.drop.app.domain.repository.ProfileRepo import dev.arkbuilders.drop.app.domain.repository.TransferHistoryItemRepository -import dev.arkbuilders.drop.app.presentation.navigation.DropDestination import dev.arkbuilders.drop.app.presentation.components.AvatarImage import dev.arkbuilders.drop.app.presentation.components.AvatarImageWithFallback import dev.arkbuilders.drop.app.presentation.components.DropButton @@ -61,8 +60,10 @@ import dev.arkbuilders.drop.app.presentation.components.DropCardSize import dev.arkbuilders.drop.app.presentation.components.DropCardVariant import dev.arkbuilders.drop.app.presentation.components.DropOutlinedButton import dev.arkbuilders.drop.app.presentation.components.EmptyState +import dev.arkbuilders.drop.app.presentation.navigation.DropDestination import dev.arkbuilders.drop.app.presentation.theme.DesignTokens import kotlinx.coroutines.delay +import org.koin.compose.koinInject import org.orbitmvi.orbit.compose.collectAsState import java.time.Duration import java.time.OffsetDateTime @@ -75,7 +76,7 @@ fun Home( profileRepo: ProfileRepo, transferHistoryItemRepository: TransferHistoryItemRepository, ) { - val viewModel: HomeViewModel = hiltViewModel() + val viewModel: HomeViewModel = koinInject() val state by viewModel.collectAsState() var logoScale by remember { mutableStateOf(0f) } diff --git a/app/src/main/java/dev/arkbuilders/drop/app/presentation/Home/HomeViewModel.kt b/app/src/main/java/dev/arkbuilders/drop/app/presentation/home/HomeViewModel.kt similarity index 89% rename from app/src/main/java/dev/arkbuilders/drop/app/presentation/Home/HomeViewModel.kt rename to app/src/main/java/dev/arkbuilders/drop/app/presentation/home/HomeViewModel.kt index 0180b6a..362ee20 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/presentation/Home/HomeViewModel.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/presentation/home/HomeViewModel.kt @@ -1,8 +1,7 @@ -package dev.arkbuilders.drop.app.presentation.Home +package dev.arkbuilders.drop.app.presentation.home import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import dagger.hilt.android.lifecycle.HiltViewModel import dev.arkbuilders.drop.app.domain.model.TransferHistoryItem import dev.arkbuilders.drop.app.domain.model.UserProfile import dev.arkbuilders.drop.app.domain.repository.ProfileRepo @@ -13,7 +12,6 @@ import kotlinx.coroutines.flow.onEach import org.orbitmvi.orbit.Container import org.orbitmvi.orbit.ContainerHost import org.orbitmvi.orbit.viewmodel.container -import javax.inject.Inject data class HomeScreenState( val historyItems: List, @@ -22,8 +20,7 @@ data class HomeScreenState( sealed class HomeScreenEffect -@HiltViewModel -class HomeViewModel @Inject constructor( +class HomeViewModel( private val historyItemRepository: TransferHistoryItemRepository, private val profileRepo: ProfileRepo, ): ViewModel(), ContainerHost{ diff --git a/app/src/main/java/dev/arkbuilders/drop/app/presentation/profile/EditProfileScreen.kt b/app/src/main/java/dev/arkbuilders/drop/app/presentation/profile/EditProfileScreen.kt index 4d1a68c..4a728fd 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/presentation/profile/EditProfileScreen.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/presentation/profile/EditProfileScreen.kt @@ -75,12 +75,11 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardCapitalization import androidx.compose.ui.unit.dp -import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import compose.icons.TablerIcons import compose.icons.tablericons.Camera -import dagger.hilt.android.EntryPointAccessors -import dev.arkbuilders.drop.app.di.TmpEntryPoint +import dev.arkbuilders.drop.app.domain.AvatarHelper import dev.arkbuilders.drop.app.domain.model.UserAvatar import dev.arkbuilders.drop.app.presentation.components.AvatarImage import dev.arkbuilders.drop.app.presentation.components.DropButton @@ -95,6 +94,7 @@ import dev.arkbuilders.drop.app.presentation.components.ErrorStateDisplay import dev.arkbuilders.drop.app.presentation.components.ErrorType import dev.arkbuilders.drop.app.presentation.theme.DesignTokens import kotlinx.coroutines.delay +import org.koin.compose.koinInject import org.orbitmvi.orbit.compose.collectAsState import org.orbitmvi.orbit.compose.collectSideEffect @@ -103,7 +103,7 @@ import org.orbitmvi.orbit.compose.collectSideEffect fun EditProfileEnhanced( navController: NavController, ) { - val viewModel: EditProfileViewModel = hiltViewModel() + val viewModel: EditProfileViewModel = koinInject() val focusManager = LocalFocusManager.current val keyboardController = LocalSoftwareKeyboardController.current val nameFocusRequester = remember { FocusRequester() } @@ -524,14 +524,8 @@ private fun EnhancedAvatarOption( isSelected: Boolean, onClick: () -> Unit ) { - val context = LocalContext.current val haptic = LocalHapticFeedback.current - val avatarHelper = remember { - EntryPointAccessors.fromApplication( - context.applicationContext, - TmpEntryPoint::class.java - ).avatarHelper() - } + val avatarHelper: AvatarHelper = koinInject() var scale by remember { mutableStateOf(1f) } val animatedScale by animateFloatAsState( diff --git a/app/src/main/java/dev/arkbuilders/drop/app/presentation/profile/EditProfileViewModel.kt b/app/src/main/java/dev/arkbuilders/drop/app/presentation/profile/EditProfileViewModel.kt index 601f6af..a79622f 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/presentation/profile/EditProfileViewModel.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/presentation/profile/EditProfileViewModel.kt @@ -1,7 +1,6 @@ package dev.arkbuilders.drop.app.presentation.profile import androidx.lifecycle.ViewModel -import dagger.hilt.android.lifecycle.HiltViewModel import dev.arkbuilders.drop.app.domain.AvatarHelper import dev.arkbuilders.drop.app.domain.model.UserAvatar import dev.arkbuilders.drop.app.domain.model.UserProfile @@ -9,7 +8,6 @@ import dev.arkbuilders.drop.app.domain.repository.ProfileRepo import org.orbitmvi.orbit.Container import org.orbitmvi.orbit.ContainerHost import org.orbitmvi.orbit.viewmodel.container -import javax.inject.Inject data class EditProfileScreenState( val currentProfile: UserProfile, @@ -29,8 +27,7 @@ sealed class EditProfileScreenEffect { data object NavigateBack : EditProfileScreenEffect() } -@HiltViewModel -class EditProfileViewModel @Inject constructor( +class EditProfileViewModel( private val profileRepo: ProfileRepo, private val avatarHelper: AvatarHelper, ) : ViewModel(), ContainerHost { diff --git a/app/src/main/java/dev/arkbuilders/drop/app/presentation/receive/Receive.kt b/app/src/main/java/dev/arkbuilders/drop/app/presentation/receive/Receive.kt index a009837..e266fcc 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/presentation/receive/Receive.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/presentation/receive/Receive.kt @@ -54,7 +54,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import com.google.accompanist.permissions.ExperimentalPermissionsApi import dev.arkbuilders.drop.app.R @@ -69,6 +69,7 @@ import dev.arkbuilders.drop.app.presentation.receive.components.ReceiveReadyToSc import dev.arkbuilders.drop.app.presentation.receive.components.ReceiveScanningCard import dev.arkbuilders.drop.app.presentation.theme.DesignTokens import kotlinx.coroutines.delay +import org.koin.compose.koinInject import org.orbitmvi.orbit.compose.collectAsState import org.orbitmvi.orbit.compose.collectSideEffect @@ -106,7 +107,7 @@ sealed class ReceiveError(val message: String, val isRecoverable: Boolean = true fun Receive( navController: NavController, ) { - val viewModel: ReceiveViewModel = hiltViewModel() + val viewModel: ReceiveViewModel = koinInject() val clipboardManager = LocalClipboardManager.current val keyboardController = LocalSoftwareKeyboardController.current diff --git a/app/src/main/java/dev/arkbuilders/drop/app/presentation/receive/ReceiveViewModel.kt b/app/src/main/java/dev/arkbuilders/drop/app/presentation/receive/ReceiveViewModel.kt index beea36e..7f71f33 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/presentation/receive/ReceiveViewModel.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/presentation/receive/ReceiveViewModel.kt @@ -2,9 +2,8 @@ package dev.arkbuilders.drop.app.presentation.receive import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import dagger.hilt.android.lifecycle.HiltViewModel -import dev.arkbuilders.drop.app.data.repository.TransferManager import dev.arkbuilders.drop.app.data.ReceivingProgress +import dev.arkbuilders.drop.app.data.repository.TransferManager import dev.arkbuilders.drop.app.domain.PermissionsHelper import kotlinx.coroutines.delay import kotlinx.coroutines.flow.launchIn @@ -12,7 +11,6 @@ import kotlinx.coroutines.flow.onEach import org.orbitmvi.orbit.Container import org.orbitmvi.orbit.ContainerHost import org.orbitmvi.orbit.viewmodel.container -import javax.inject.Inject sealed class ReceiveScreenState { data class Initial(val cameraPermissionGranted: Boolean) : ReceiveScreenState() @@ -33,8 +31,7 @@ sealed class ReceiveScreenEffect { data object RequestCameraPermission : ReceiveScreenEffect() } -@HiltViewModel -class ReceiveViewModel @Inject constructor( +class ReceiveViewModel( private val transferManager: TransferManager, private val permissionsHelper: PermissionsHelper, ) : ViewModel(), ContainerHost { diff --git a/app/src/main/java/dev/arkbuilders/drop/app/presentation/send/Send.kt b/app/src/main/java/dev/arkbuilders/drop/app/presentation/send/Send.kt index 564e512..a06b04a 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/presentation/send/Send.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/presentation/send/Send.kt @@ -6,16 +6,8 @@ import android.content.Context import android.graphics.Bitmap import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts -import androidx.compose.animation.AnimatedContent -import androidx.compose.animation.core.Spring import androidx.compose.animation.core.animateFloatAsState -import androidx.compose.animation.core.spring import androidx.compose.animation.core.tween -import androidx.compose.animation.fadeIn -import androidx.compose.animation.fadeOut -import androidx.compose.animation.slideInVertically -import androidx.compose.animation.slideOutVertically -import androidx.compose.animation.togetherWith import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -72,7 +64,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import compose.icons.TablerIcons import compose.icons.tablericons.AlertCircle @@ -92,6 +84,7 @@ import dev.arkbuilders.drop.app.presentation.send.components.phase.TransferringP import dev.arkbuilders.drop.app.presentation.send.components.phase.WaitingForReceiverPhase import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import org.koin.compose.koinInject import org.orbitmvi.orbit.compose.collectAsState import org.orbitmvi.orbit.compose.collectSideEffect @@ -179,11 +172,9 @@ fun Send( navController: NavController, transferManager: TransferManager ) { - val context = LocalContext.current - val scope = rememberCoroutineScope() val haptic = LocalHapticFeedback.current val listState = rememberLazyListState() - val viewModel: SendViewModel = hiltViewModel() + val viewModel: SendViewModel = koinInject() val state by viewModel.collectAsState() diff --git a/app/src/main/java/dev/arkbuilders/drop/app/presentation/send/SendViewModel.kt b/app/src/main/java/dev/arkbuilders/drop/app/presentation/send/SendViewModel.kt index 7780c87..df34188 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/presentation/send/SendViewModel.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/presentation/send/SendViewModel.kt @@ -11,7 +11,6 @@ import com.google.zxing.BarcodeFormat import com.google.zxing.WriterException import com.google.zxing.common.BitMatrix import com.google.zxing.qrcode.QRCodeWriter -import dagger.hilt.android.lifecycle.HiltViewModel import dev.arkbuilders.drop.app.data.repository.TransferManager import dev.arkbuilders.drop.app.domain.ResourcesHelper import dev.arkbuilders.drop.app.domain.repository.NetworkStatus @@ -23,7 +22,6 @@ import kotlinx.coroutines.launch import org.orbitmvi.orbit.Container import org.orbitmvi.orbit.ContainerHost import org.orbitmvi.orbit.viewmodel.container -import javax.inject.Inject sealed class SendScreenState { data class FileSelection( @@ -66,8 +64,7 @@ sealed class SendScreenEffect { data object NavigateBack : SendScreenEffect() } -@HiltViewModel -class SendViewModel @Inject constructor( +class SendViewModel( private val resourcesHelper: ResourcesHelper, private val networkStatus: NetworkStatus, private val transferManager: TransferManager, diff --git a/app/src/main/java/dev/arkbuilders/drop/app/presentation/send/components/SendFileItem.kt b/app/src/main/java/dev/arkbuilders/drop/app/presentation/send/components/SendFileItem.kt index 1939f66..1f8318f 100644 --- a/app/src/main/java/dev/arkbuilders/drop/app/presentation/send/components/SendFileItem.kt +++ b/app/src/main/java/dev/arkbuilders/drop/app/presentation/send/components/SendFileItem.kt @@ -34,9 +34,9 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import compose.icons.TablerIcons import compose.icons.tablericons.FileText -import dagger.hilt.android.EntryPointAccessors -import dev.arkbuilders.drop.app.di.TmpEntryPoint +import dev.arkbuilders.drop.app.domain.ResourcesHelper import dev.arkbuilders.drop.app.presentation.DisplayUtils.formatBytes +import org.koin.java.KoinJavaComponent.inject @Composable fun SendFileItem( @@ -49,10 +49,9 @@ fun SendFileItem( LaunchedEffect(uri) { try { - val resourcesHelper = EntryPointAccessors.fromApplication( - context.applicationContext, - TmpEntryPoint::class.java - ).resourcesHelper() + val resourcesHelper: ResourcesHelper = inject( + ResourcesHelper::class.java + ).value fileName = resourcesHelper.getFileName(uri) ?: "Unknown file" fileSize = resourcesHelper.getFileSize(uri) diff --git a/build.gradle.kts b/build.gradle.kts index 1bf2a29..a9531fd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,6 +4,6 @@ plugins { alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.kotlin.compose) apply false alias(libs.plugins.ksp) - alias(libs.plugins.dagger.hilt) apply false + // alias(libs.plugins.dagger.hilt) apply false alias(libs.plugins.triplet.play) apply false } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 41d40e8..023f93a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,6 +29,7 @@ tripletPlay = "3.10.1" drop = "17348879247" devsrsouzaIcons = "1.1.0" coil = "2.5.0" +koin = "4.1.1" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -83,7 +84,10 @@ tabler-icons = { module = "br.com.devsrsouza.compose.icons:tabler-icons", versio io-coil = { module = "io.coil-kt:coil-compose", version.ref = "coil" } kotlinx-serialization = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinSerialization" } - +io-koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" } +io-koin-android = { module = "io.insert-koin:koin-android", version.ref = "koin" } +io-koin-compose = { module = "io.insert-koin:koin-compose", version.ref = "koin" } +io-koin-test = { module = "io.insert-koin:koin-test", version.ref = "koin" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" }