From 34ce33f4a33868513ee614b3c352f84bdffb26fb Mon Sep 17 00:00:00 2001 From: ikits Date: Sun, 24 Dec 2023 21:54:27 +0300 Subject: [PATCH] add components --- app/build.gradle.kts | 4 +- app/src/devmenu/AndroidManifest.xml | 7 +- .../java/com/ea/ironmonkey/GameActivity.kt | 2 +- app/src/main/jniLibs/armeabi-v7a/libapp.so | Bin 14477132 -> 14477132 bytes devmenu/build.gradle.kts | 11 +- .../usecases/files/RemoveFileUseCase.kt | 3 +- .../usecases/files/RenameFileUseCase.kt | 3 +- devmenu/src/main/AndroidManifest.xml | 6 +- .../src/main/java/com/megboyzz/devmenu/App.kt | 35 ++++ .../java/com/megboyzz/devmenu/MainActivity.kt | 32 +++- .../devmenu/di/components/AppComponent.kt | 50 ----- .../FilesUseCaseComponent.kt | 20 +- .../HideFilesUseCaseComponent.kt | 23 ++- .../ReplacementUseCaseComponent.kt | 22 ++- .../SettingsUseCaseComponent.kt | 22 ++- .../TrackingHandlerUseCaseComponent.kt | 22 ++- .../devmenu/di/modules/SubcomponentsModule.kt | 19 -- .../java/com/megboyzz/devmenu/ui/Utlil.kt | 24 ++- .../devmenu/ui/components/ContextMenu.kt | 171 ++++++++++++++++++ .../megboyzz/devmenu/ui/components/Files.kt | 82 +++++++++ .../devmenu/ui/components/Scaffold.kt | 88 ++++++--- .../megboyzz/devmenu/ui/components/Shared.kt | 25 +++ devmenu/src/main/res/drawable/clip.xml | 9 + devmenu/src/main/res/drawable/icon_file.xml | 12 ++ devmenu/src/main/res/drawable/icon_folder.xml | 12 ++ .../main/res/drawable/icon_hidden_file.xml | 19 ++ .../main/res/drawable/icon_replaced_file.xml | 15 ++ devmenu/src/main/res/values/strings.xml | 3 - devmenu/src/main/res/values/themes.xml | 5 - gradle/libs.versions.toml | 8 +- 30 files changed, 604 insertions(+), 150 deletions(-) create mode 100644 devmenu/src/main/java/com/megboyzz/devmenu/App.kt delete mode 100644 devmenu/src/main/java/com/megboyzz/devmenu/di/components/AppComponent.kt rename devmenu/src/main/java/com/megboyzz/devmenu/di/components/{subcomponents => }/FilesUseCaseComponent.kt (65%) rename devmenu/src/main/java/com/megboyzz/devmenu/di/components/{subcomponents => }/HideFilesUseCaseComponent.kt (56%) rename devmenu/src/main/java/com/megboyzz/devmenu/di/components/{subcomponents => }/ReplacementUseCaseComponent.kt (59%) rename devmenu/src/main/java/com/megboyzz/devmenu/di/components/{subcomponents => }/SettingsUseCaseComponent.kt (57%) rename devmenu/src/main/java/com/megboyzz/devmenu/di/components/{subcomponents => }/TrackingHandlerUseCaseComponent.kt (50%) delete mode 100644 devmenu/src/main/java/com/megboyzz/devmenu/di/modules/SubcomponentsModule.kt create mode 100644 devmenu/src/main/java/com/megboyzz/devmenu/ui/components/ContextMenu.kt create mode 100644 devmenu/src/main/java/com/megboyzz/devmenu/ui/components/Files.kt create mode 100644 devmenu/src/main/java/com/megboyzz/devmenu/ui/components/Shared.kt create mode 100644 devmenu/src/main/res/drawable/clip.xml create mode 100644 devmenu/src/main/res/drawable/icon_file.xml create mode 100644 devmenu/src/main/res/drawable/icon_folder.xml create mode 100644 devmenu/src/main/res/drawable/icon_hidden_file.xml create mode 100644 devmenu/src/main/res/drawable/icon_replaced_file.xml delete mode 100644 devmenu/src/main/res/values/strings.xml delete mode 100644 devmenu/src/main/res/values/themes.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 701cffb..5ab6347 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -77,7 +77,7 @@ android { compose = true } composeOptions { - kotlinCompilerExtensionVersion = "1.5.1" + kotlinCompilerExtensionVersion = "1.5.7" } packaging { resources { @@ -104,7 +104,7 @@ dependencies { androidTestImplementation(libs.ui.test.junit4) debugImplementation(libs.ui.tooling) debugImplementation(libs.ui.test.manifest) - + implementation(project(mapOf("path" to ":devmenu"))) implementation ("commons-codec:commons-codec:1.15") diff --git a/app/src/devmenu/AndroidManifest.xml b/app/src/devmenu/AndroidManifest.xml index 7e0c762..7c3ed72 100644 --- a/app/src/devmenu/AndroidManifest.xml +++ b/app/src/devmenu/AndroidManifest.xml @@ -1,7 +1,9 @@ - - + @@ -9,5 +11,4 @@ - \ No newline at end of file diff --git a/app/src/main/java/com/ea/ironmonkey/GameActivity.kt b/app/src/main/java/com/ea/ironmonkey/GameActivity.kt index 4278e53..1948529 100644 --- a/app/src/main/java/com/ea/ironmonkey/GameActivity.kt +++ b/app/src/main/java/com/ea/ironmonkey/GameActivity.kt @@ -179,7 +179,7 @@ class GameActivity : ComponentActivity(), DrawFrameListener { // Calculate screen-related score val screenScore = - sqrt((screenWidth * screenHeight).toDouble()) * 0.0010000000474974513 * 0.5 + sqrt((screenWidth * screenHeight).toDouble()) * 0.001 * 0.5 // Log CPU information try { diff --git a/app/src/main/jniLibs/armeabi-v7a/libapp.so b/app/src/main/jniLibs/armeabi-v7a/libapp.so index a9fe392bf21d0ca2b39877a2c939b183bbeaf6f7..d674c641e64f4e0a941450cf40fa09533cba7706 100644 GIT binary patch delta 658 zcmWN=b$bi|0KnnrhRJD8=V{ZO)7{76<6rwOiC`vJk6Ql$sDMe|@P?mC(rveqJL}fx$ zp(@p=P7P{Oi`pbohq~0GJ`HF{BO23$rZl5DEoezATGNKMB+-ucbf6=h=u8*7(v9x) zpeMcPO&|KwkNyl`AcGjp5QZ|0;f!D;qZrK?#xjoaOkg6Dn9LNWGL7lXU?#Je%^c=3 zkNGTMA&Xed5|*-z<*Z<3dU8rI5Qs#B$zJ8v4ttH)dY$olZ*asLy~&%s#aq42+r7g( zz0143$9uic`+dL%eaMG>#3_#YsE;|-$9=*leJUdwOiN6NOZ^*(h0=W5XMEP@eBKv) z(U*MLSA5mieBC#k?wh{l4Bz%0-}OD;_X9ulBR}>NXZoq1`MF>CrC<5A-}tR#e&;N| d_XmIUCx7-AfAu$i_YeQ{FaOSnh5m#y{{vrHF9QGo delta 658 zcmWN=1$ztt0Dxf|CMPCN8%~?}a>$Rs8+g{e$qIy0EbEM_x@xy)le z3s}e^7PEw>H+ze>dYiXf^KqZ>NuToRXe5xHk{F+y6pjVcea2^f&gXr>7k$Z> zeZ^OO&DVXyH=W^IzU`>*_^$8yz90CZANjGL_^C7f%+LM8Fa64|{l;(o&N07tmOuET aKl!u2_^ZG9yMOqnfBConL}S6fq0Ij>Yb~(= diff --git a/devmenu/build.gradle.kts b/devmenu/build.gradle.kts index 409620d..572b182 100644 --- a/devmenu/build.gradle.kts +++ b/devmenu/build.gradle.kts @@ -1,7 +1,9 @@ plugins { alias(libs.plugins.androidLibrary) alias(libs.plugins.kotlinAndroid) - alias(libs.plugins.ksp) + kotlin("kapt") + //alias(libs.plugins.ksp) + } android { @@ -38,13 +40,14 @@ android { compose = true } composeOptions { - kotlinCompilerExtensionVersion = "1.5.1" + kotlinCompilerExtensionVersion = "1.5.7" } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" } } + } dependencies { @@ -69,7 +72,7 @@ dependencies { debugImplementation(libs.ui.test.manifest) implementation(libs.dagger) - ksp(libs.dagger.compiler) + kapt(libs.dagger.compiler) implementation(libs.room) - ksp(libs.room.compiler) + kapt(libs.room.compiler) } \ No newline at end of file diff --git a/devmenu/domain/src/main/java/com/megboyzz/devmenu/domain/usecases/files/RemoveFileUseCase.kt b/devmenu/domain/src/main/java/com/megboyzz/devmenu/domain/usecases/files/RemoveFileUseCase.kt index 2dd61b7..30d2f2f 100644 --- a/devmenu/domain/src/main/java/com/megboyzz/devmenu/domain/usecases/files/RemoveFileUseCase.kt +++ b/devmenu/domain/src/main/java/com/megboyzz/devmenu/domain/usecases/files/RemoveFileUseCase.kt @@ -1,7 +1,8 @@ package com.megboyzz.devmenu.domain.usecases.files import java.io.File +import javax.inject.Inject -class RemoveFileUseCase { +class RemoveFileUseCase @Inject constructor() { operator fun invoke(file: File): Boolean = file.delete() } \ No newline at end of file diff --git a/devmenu/domain/src/main/java/com/megboyzz/devmenu/domain/usecases/files/RenameFileUseCase.kt b/devmenu/domain/src/main/java/com/megboyzz/devmenu/domain/usecases/files/RenameFileUseCase.kt index 4dfa2c7..a9a877d 100644 --- a/devmenu/domain/src/main/java/com/megboyzz/devmenu/domain/usecases/files/RenameFileUseCase.kt +++ b/devmenu/domain/src/main/java/com/megboyzz/devmenu/domain/usecases/files/RenameFileUseCase.kt @@ -1,8 +1,9 @@ package com.megboyzz.devmenu.domain.usecases.files import java.io.File +import javax.inject.Inject -class RenameFileUseCase { +class RenameFileUseCase @Inject constructor() { operator fun invoke(file: File, newName: String) = if(file.exists()) file.renameTo(File(file.parent, newName)) diff --git a/devmenu/src/main/AndroidManifest.xml b/devmenu/src/main/AndroidManifest.xml index 3481e08..fba782d 100644 --- a/devmenu/src/main/AndroidManifest.xml +++ b/devmenu/src/main/AndroidManifest.xml @@ -1,12 +1,10 @@ - + + android:exported="true"/> \ No newline at end of file diff --git a/devmenu/src/main/java/com/megboyzz/devmenu/App.kt b/devmenu/src/main/java/com/megboyzz/devmenu/App.kt new file mode 100644 index 0000000..fe0d66a --- /dev/null +++ b/devmenu/src/main/java/com/megboyzz/devmenu/App.kt @@ -0,0 +1,35 @@ +package com.megboyzz.devmenu + +import android.app.Application +import com.megboyzz.devmenu.di.components.DaggerFilesUseCaseComponent +import com.megboyzz.devmenu.di.components.DaggerHideFilesUseCaseComponent +import com.megboyzz.devmenu.di.components.DaggerReplacementUseCaseComponent +import com.megboyzz.devmenu.di.components.DaggerSettingsUseCaseComponent +import com.megboyzz.devmenu.di.components.DaggerTrackingHandlerUseCaseComponent +import com.megboyzz.devmenu.di.components.FilesUseCaseComponent +import com.megboyzz.devmenu.di.components.HideFilesUseCaseComponent +import com.megboyzz.devmenu.di.components.ReplacementUseCaseComponent +import com.megboyzz.devmenu.di.components.SettingsUseCaseComponent +import com.megboyzz.devmenu.di.components.TrackingHandlerUseCaseComponent +import kotlinx.coroutines.coroutineScope +import kotlin.concurrent.thread + +class App: Application() { + + lateinit var filesUseCaseComponent: FilesUseCaseComponent + lateinit var hideFilesUseCaseComponent: HideFilesUseCaseComponent + lateinit var replacementUseCaseComponent: ReplacementUseCaseComponent + lateinit var settingsUseCaseComponent: SettingsUseCaseComponent + lateinit var trackingHandlerUseCaseComponent: TrackingHandlerUseCaseComponent + override fun onCreate() { + super.onCreate() + + filesUseCaseComponent = DaggerFilesUseCaseComponent.builder().context(this).build() + hideFilesUseCaseComponent = DaggerHideFilesUseCaseComponent.builder().context(this).build() + replacementUseCaseComponent = DaggerReplacementUseCaseComponent.builder().context(this).build() + settingsUseCaseComponent = DaggerSettingsUseCaseComponent.builder().context(this).build() + trackingHandlerUseCaseComponent = DaggerTrackingHandlerUseCaseComponent.builder().context(this).build() + + } + +} \ No newline at end of file diff --git a/devmenu/src/main/java/com/megboyzz/devmenu/MainActivity.kt b/devmenu/src/main/java/com/megboyzz/devmenu/MainActivity.kt index 9b8a398..5873f9b 100644 --- a/devmenu/src/main/java/com/megboyzz/devmenu/MainActivity.kt +++ b/devmenu/src/main/java/com/megboyzz/devmenu/MainActivity.kt @@ -1,16 +1,42 @@ package com.megboyzz.devmenu +import android.content.Intent import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent -import com.megboyzz.devmenu.di.components.AppComponent -import dagger.internal.DaggerGenerated +import com.megboyzz.devmenu.ui.components.MainScaffold class MainActivity : ComponentActivity() { + + private fun runGame(){ + + val gameActivityClass = classLoader.loadClass("com.ea.ironmonkey.GameActivity") + val intent = Intent(this, gameActivityClass) + + startActivity(intent) + + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + val isDevMenuEnabled = (application as App) + .trackingHandlerUseCaseComponent + .isDevMenuEnabledUseCase() - setContent {} + if(!isDevMenuEnabled){ + runGame() + return + } + + setContent { + MainScaffold( + onSettingsClick = { /*TODO*/ }, + onSearchValueChanged = {}, + onFloatingButtonClick = ::runGame + ) { + + } + } } } diff --git a/devmenu/src/main/java/com/megboyzz/devmenu/di/components/AppComponent.kt b/devmenu/src/main/java/com/megboyzz/devmenu/di/components/AppComponent.kt deleted file mode 100644 index 60f50e1..0000000 --- a/devmenu/src/main/java/com/megboyzz/devmenu/di/components/AppComponent.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.megboyzz.devmenu.di.components - -import android.content.Context -import com.megboyzz.devmenu.db.entites.Replacement -import com.megboyzz.devmenu.di.components.subcomponents.FilesUseCaseComponent -import com.megboyzz.devmenu.di.components.subcomponents.HideFilesUseCaseComponent -import com.megboyzz.devmenu.di.components.subcomponents.ReplacementUseCaseComponent -import com.megboyzz.devmenu.di.components.subcomponents.SettingsUseCaseComponent -import com.megboyzz.devmenu.di.components.subcomponents.TrackingHandlerUseCaseComponent -import com.megboyzz.devmenu.di.modules.DatabaseModule -import com.megboyzz.devmenu.di.modules.RepositoryModule -import com.megboyzz.devmenu.di.modules.SubcomponentsModule -import com.megboyzz.devmenu.domain.usecases.files.GetFilePropsUseCase -import dagger.BindsInstance -import dagger.Component -import dagger.Subcomponent -import javax.inject.Singleton - - -@Component( - modules = [ - SubcomponentsModule::class, - DatabaseModule::class, - RepositoryModule::class - ] -) -@Singleton -interface AppComponent { - - val filesUseCaseComponent: FilesUseCaseComponent.Builder - - val hideFilesUseCaseComponent: HideFilesUseCaseComponent.Builder - - val replacementUseCaseComponent: ReplacementUseCaseComponent.Builder - - val settingsUseCaseComponent: SettingsUseCaseComponent.Builder - - val trackingHandlerUseCaseComponent: TrackingHandlerUseCaseComponent.Builder - - @Component.Builder - interface Builder{ - - @BindsInstance - fun context(context: Context): Builder - - fun build(): AppComponent - - } - -} \ No newline at end of file diff --git a/devmenu/src/main/java/com/megboyzz/devmenu/di/components/subcomponents/FilesUseCaseComponent.kt b/devmenu/src/main/java/com/megboyzz/devmenu/di/components/FilesUseCaseComponent.kt similarity index 65% rename from devmenu/src/main/java/com/megboyzz/devmenu/di/components/subcomponents/FilesUseCaseComponent.kt rename to devmenu/src/main/java/com/megboyzz/devmenu/di/components/FilesUseCaseComponent.kt index e9b2435..ad3f53d 100644 --- a/devmenu/src/main/java/com/megboyzz/devmenu/di/components/subcomponents/FilesUseCaseComponent.kt +++ b/devmenu/src/main/java/com/megboyzz/devmenu/di/components/FilesUseCaseComponent.kt @@ -1,7 +1,8 @@ -package com.megboyzz.devmenu.di.components.subcomponents +package com.megboyzz.devmenu.di.components import android.content.Context -import com.megboyzz.devmenu.di.components.AppComponent +import com.megboyzz.devmenu.di.modules.DatabaseModule +import com.megboyzz.devmenu.di.modules.RepositoryModule import com.megboyzz.devmenu.domain.usecases.files.GetExternalFilesUseCase import com.megboyzz.devmenu.domain.usecases.files.GetFilePropsUseCase import com.megboyzz.devmenu.domain.usecases.files.GetInternalFilesUseCase @@ -9,9 +10,15 @@ import com.megboyzz.devmenu.domain.usecases.files.RemoveFileUseCase import com.megboyzz.devmenu.domain.usecases.files.RenameFileUseCase import dagger.BindsInstance import dagger.Component -import dagger.Subcomponent +import javax.inject.Singleton -@Subcomponent +@Component( + modules = [ + DatabaseModule::class, + RepositoryModule::class + ] +) +@Singleton interface FilesUseCaseComponent { val getExternalFilesUseCase: GetExternalFilesUseCase @@ -26,7 +33,10 @@ interface FilesUseCaseComponent { @Component.Builder interface Builder{ - fun build(): AppComponent + + @BindsInstance + fun context(context: Context): Builder + fun build(): FilesUseCaseComponent } } \ No newline at end of file diff --git a/devmenu/src/main/java/com/megboyzz/devmenu/di/components/subcomponents/HideFilesUseCaseComponent.kt b/devmenu/src/main/java/com/megboyzz/devmenu/di/components/HideFilesUseCaseComponent.kt similarity index 56% rename from devmenu/src/main/java/com/megboyzz/devmenu/di/components/subcomponents/HideFilesUseCaseComponent.kt rename to devmenu/src/main/java/com/megboyzz/devmenu/di/components/HideFilesUseCaseComponent.kt index e9f8cda..b5d0e94 100644 --- a/devmenu/src/main/java/com/megboyzz/devmenu/di/components/subcomponents/HideFilesUseCaseComponent.kt +++ b/devmenu/src/main/java/com/megboyzz/devmenu/di/components/HideFilesUseCaseComponent.kt @@ -1,14 +1,23 @@ -package com.megboyzz.devmenu.di.components.subcomponents +package com.megboyzz.devmenu.di.components -import com.megboyzz.devmenu.di.components.AppComponent +import android.content.Context +import com.megboyzz.devmenu.di.modules.DatabaseModule +import com.megboyzz.devmenu.di.modules.RepositoryModule import com.megboyzz.devmenu.domain.usecases.hidefiles.GetAllHidedFilesUseCase import com.megboyzz.devmenu.domain.usecases.hidefiles.HideFileUseCase import com.megboyzz.devmenu.domain.usecases.hidefiles.UnHideAllUseCase import com.megboyzz.devmenu.domain.usecases.hidefiles.UnHideFileUseCase +import dagger.BindsInstance import dagger.Component -import dagger.Subcomponent +import javax.inject.Singleton -@Subcomponent +@Component( + modules = [ + DatabaseModule::class, + RepositoryModule::class + ] +) +@Singleton interface HideFilesUseCaseComponent { val getAllHidedFilesUseCase: GetAllHidedFilesUseCase @@ -21,7 +30,11 @@ interface HideFilesUseCaseComponent { @Component.Builder interface Builder{ - fun build(): AppComponent + + @BindsInstance + fun context(context: Context): Builder + + fun build(): HideFilesUseCaseComponent } } \ No newline at end of file diff --git a/devmenu/src/main/java/com/megboyzz/devmenu/di/components/subcomponents/ReplacementUseCaseComponent.kt b/devmenu/src/main/java/com/megboyzz/devmenu/di/components/ReplacementUseCaseComponent.kt similarity index 59% rename from devmenu/src/main/java/com/megboyzz/devmenu/di/components/subcomponents/ReplacementUseCaseComponent.kt rename to devmenu/src/main/java/com/megboyzz/devmenu/di/components/ReplacementUseCaseComponent.kt index 48aabff..9fd662d 100644 --- a/devmenu/src/main/java/com/megboyzz/devmenu/di/components/subcomponents/ReplacementUseCaseComponent.kt +++ b/devmenu/src/main/java/com/megboyzz/devmenu/di/components/ReplacementUseCaseComponent.kt @@ -1,14 +1,23 @@ -package com.megboyzz.devmenu.di.components.subcomponents +package com.megboyzz.devmenu.di.components -import com.megboyzz.devmenu.di.components.AppComponent +import android.content.Context +import com.megboyzz.devmenu.di.modules.DatabaseModule +import com.megboyzz.devmenu.di.modules.RepositoryModule import com.megboyzz.devmenu.domain.usecases.replacement.GetAllReplacedFilesUseCase import com.megboyzz.devmenu.domain.usecases.replacement.RecoverAllReplacementsUseCase import com.megboyzz.devmenu.domain.usecases.replacement.RecoverReplacementUseCase import com.megboyzz.devmenu.domain.usecases.replacement.ReplaceFileUseCase +import dagger.BindsInstance import dagger.Component -import dagger.Subcomponent +import javax.inject.Singleton -@Subcomponent +@Component( + modules = [ + DatabaseModule::class, + RepositoryModule::class + ] +) +@Singleton interface ReplacementUseCaseComponent { val getAllReplacedFilesUseCase: GetAllReplacedFilesUseCase @@ -21,7 +30,10 @@ interface ReplacementUseCaseComponent { @Component.Builder interface Builder{ - fun build(): AppComponent + + @BindsInstance + fun context(context: Context): Builder + fun build(): ReplacementUseCaseComponent } } \ No newline at end of file diff --git a/devmenu/src/main/java/com/megboyzz/devmenu/di/components/subcomponents/SettingsUseCaseComponent.kt b/devmenu/src/main/java/com/megboyzz/devmenu/di/components/SettingsUseCaseComponent.kt similarity index 57% rename from devmenu/src/main/java/com/megboyzz/devmenu/di/components/subcomponents/SettingsUseCaseComponent.kt rename to devmenu/src/main/java/com/megboyzz/devmenu/di/components/SettingsUseCaseComponent.kt index 42f1094..fb090ed 100644 --- a/devmenu/src/main/java/com/megboyzz/devmenu/di/components/subcomponents/SettingsUseCaseComponent.kt +++ b/devmenu/src/main/java/com/megboyzz/devmenu/di/components/SettingsUseCaseComponent.kt @@ -1,14 +1,23 @@ -package com.megboyzz.devmenu.di.components.subcomponents +package com.megboyzz.devmenu.di.components -import com.megboyzz.devmenu.di.components.AppComponent +import android.content.Context +import com.megboyzz.devmenu.di.modules.DatabaseModule +import com.megboyzz.devmenu.di.modules.RepositoryModule import com.megboyzz.devmenu.domain.usecases.settings.RemoveGameDataUseCase import com.megboyzz.devmenu.domain.usecases.settings.SetGameLangUseCase import com.megboyzz.devmenu.domain.usecases.settings.SetTrackingSaveFileUseCase import com.megboyzz.devmenu.domain.usecases.settings.TurnOffDevMenuUseCase +import dagger.BindsInstance import dagger.Component -import dagger.Subcomponent +import javax.inject.Singleton -@Subcomponent +@Component( + modules = [ + DatabaseModule::class, + RepositoryModule::class + ] +) +@Singleton interface SettingsUseCaseComponent { val removeGameDataUseCase: RemoveGameDataUseCase @@ -21,7 +30,10 @@ interface SettingsUseCaseComponent { @Component.Builder interface Builder{ - fun build(): AppComponent + + @BindsInstance + fun context(context: Context): Builder + fun build(): SettingsUseCaseComponent } } \ No newline at end of file diff --git a/devmenu/src/main/java/com/megboyzz/devmenu/di/components/subcomponents/TrackingHandlerUseCaseComponent.kt b/devmenu/src/main/java/com/megboyzz/devmenu/di/components/TrackingHandlerUseCaseComponent.kt similarity index 50% rename from devmenu/src/main/java/com/megboyzz/devmenu/di/components/subcomponents/TrackingHandlerUseCaseComponent.kt rename to devmenu/src/main/java/com/megboyzz/devmenu/di/components/TrackingHandlerUseCaseComponent.kt index 986be68..e3fad99 100644 --- a/devmenu/src/main/java/com/megboyzz/devmenu/di/components/subcomponents/TrackingHandlerUseCaseComponent.kt +++ b/devmenu/src/main/java/com/megboyzz/devmenu/di/components/TrackingHandlerUseCaseComponent.kt @@ -1,13 +1,22 @@ -package com.megboyzz.devmenu.di.components.subcomponents +package com.megboyzz.devmenu.di.components -import com.megboyzz.devmenu.di.components.AppComponent +import android.content.Context +import com.megboyzz.devmenu.di.modules.DatabaseModule +import com.megboyzz.devmenu.di.modules.RepositoryModule import com.megboyzz.devmenu.domain.usecases.IsDevMenuEnabledUseCase import com.megboyzz.devmenu.domain.usecases.StartTrackingUseCase import com.megboyzz.devmenu.domain.usecases.StopTrackingUseCase +import dagger.BindsInstance import dagger.Component -import dagger.Subcomponent +import javax.inject.Singleton -@Subcomponent +@Component( + modules = [ + DatabaseModule::class, + RepositoryModule::class + ] +) +@Singleton interface TrackingHandlerUseCaseComponent { val isDevMenuEnabledUseCase: IsDevMenuEnabledUseCase @@ -18,7 +27,10 @@ interface TrackingHandlerUseCaseComponent { @Component.Builder interface Builder{ - fun build(): AppComponent + + @BindsInstance + fun context(context: Context): Builder + fun build(): TrackingHandlerUseCaseComponent } } \ No newline at end of file diff --git a/devmenu/src/main/java/com/megboyzz/devmenu/di/modules/SubcomponentsModule.kt b/devmenu/src/main/java/com/megboyzz/devmenu/di/modules/SubcomponentsModule.kt deleted file mode 100644 index 15ae17f..0000000 --- a/devmenu/src/main/java/com/megboyzz/devmenu/di/modules/SubcomponentsModule.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.megboyzz.devmenu.di.modules - -import com.megboyzz.devmenu.di.components.subcomponents.FilesUseCaseComponent -import com.megboyzz.devmenu.di.components.subcomponents.HideFilesUseCaseComponent -import com.megboyzz.devmenu.di.components.subcomponents.ReplacementUseCaseComponent -import com.megboyzz.devmenu.di.components.subcomponents.SettingsUseCaseComponent -import com.megboyzz.devmenu.di.components.subcomponents.TrackingHandlerUseCaseComponent -import dagger.Module - -@Module( - subcomponents = [ - FilesUseCaseComponent::class, - HideFilesUseCaseComponent::class, - ReplacementUseCaseComponent::class, - SettingsUseCaseComponent::class, - TrackingHandlerUseCaseComponent::class - ] -) -object SubcomponentsModule \ No newline at end of file diff --git a/devmenu/src/main/java/com/megboyzz/devmenu/ui/Utlil.kt b/devmenu/src/main/java/com/megboyzz/devmenu/ui/Utlil.kt index c7eebee..f5a6eaf 100644 --- a/devmenu/src/main/java/com/megboyzz/devmenu/ui/Utlil.kt +++ b/devmenu/src/main/java/com/megboyzz/devmenu/ui/Utlil.kt @@ -12,6 +12,8 @@ import androidx.compose.ui.unit.Dp @Composable fun Int.asPainter() = painterResource(this) + + @Composable fun Int.asString() = stringResource(this) @@ -19,4 +21,24 @@ fun Int.asString() = stringResource(this) fun SpacerWidth(width: Dp) = Spacer(Modifier.width(width)) @Composable -fun SpacerHeight(height: Dp) = Spacer(Modifier.height(height)) \ No newline at end of file +fun SpacerHeight(height: Dp) = Spacer(Modifier.height(height)) + + +/** + * Возвращает лямбду того типа которая требуется в Composable контексте
+ * например есть функция + * + * fun example( + * a: @Composable () -> SomeType + * ) + * + * Чтобы предать туда параметр нужно обернуть это в скобки
+ * + * example(a = { SomeType() }) + * + * а можно не создавать еще один уровень вложения и использовать asComposableLambda + * + * example(a = SomeType().asComposableLambda) + */ +val T.asComposableLambda: @Composable () -> T + get() = { this } \ No newline at end of file diff --git a/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/ContextMenu.kt b/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/ContextMenu.kt new file mode 100644 index 0000000..ec41862 --- /dev/null +++ b/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/ContextMenu.kt @@ -0,0 +1,171 @@ +package com.megboyzz.devmenu.ui.components + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxScope +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.KeyboardArrowRight +import androidx.compose.material.icons.outlined.Star +import androidx.compose.material3.Divider +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.graphics.vector.rememberVectorPainter +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.megboyzz.devmenu.R +import com.megboyzz.devmenu.ui.asPainter + +@Composable +fun ClickableMenuPosition( + name: String, + icon: Painter, + onClick: () -> Unit +) { + + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier + .clickableWithRipple(onClick = onClick) + .fillMaxWidth() + ) { + CoreMenuPosition(name = name, icon = icon) + Icon(Icons.Default.KeyboardArrowRight, null) + } + +} + +@Composable +fun CoreMenuPosition( + name: String, + icon: Painter +) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(16.dp), + ) { + Image( + painter = icon, + contentDescription = null, + Modifier.size(24.dp) + ) + Text(text = name) + } +} + +@Composable +fun FsElementInContextMenu( + name: String, + type: ElementType, +) { + + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + + val modifier = Modifier.size(32.dp).shadow(elevation = 6.dp) + + when(type){ + ElementType.isHidden -> { Image(painter = R.drawable.icon_hidden_file.asPainter(), contentDescription = null, modifier) } + ElementType.isFile -> { Image(painter = R.drawable.icon_file.asPainter(), contentDescription = null, modifier) } + ElementType.isDir -> { Image(painter = R.drawable.icon_folder.asPainter(), contentDescription = null, modifier) } + ElementType.isReplaced -> { Image(painter = R.drawable.icon_replaced_file.asPainter(), contentDescription = null, modifier) } + } + Text( + text = name + ) + } +} + + +@Composable +fun FileContextMenu( + name: String, + type: ElementType, +) { + CoreFileContextMenu { + Column( + verticalArrangement = Arrangement.spacedBy(20.dp) + ) { + FsElementInContextMenu(name = name, type = type) + Divider() + ClickableMenuPosition( + name = "Заменить", + icon = rememberVectorPainter(image = Icons.Outlined.Star) + ) { + + } + ClickableMenuPosition( + name = "Заменить", + icon = rememberVectorPainter(image = Icons.Outlined.Star) + ) { + + } + ClickableMenuPosition( + name = "Заменить", + icon = rememberVectorPainter(image = Icons.Outlined.Star) + ) { + + } + ClickableMenuPosition( + name = "Заменить", + icon = rememberVectorPainter(image = Icons.Outlined.Star) + ) { + + } + } + } +} + +@Composable +fun CoreFileContextMenu( + content: @Composable BoxScope.() -> Unit +) { + Box( + modifier = Modifier + .wrapContentHeight() + .fillMaxWidth() + //TODO отвязать от цвета + .background(Color.White) + .clip(RoundedCornerShape(10.dp)), + contentAlignment = Alignment.TopCenter + ){ + + Box( + modifier = Modifier.padding( + horizontal = 32.dp, + vertical = 24.dp + ), + content = content + ) + } +} + + +@Preview +@Composable +fun ClicablePreview() { + + FileContextMenu( + name = "my_file.txt", + type = ElementType.isFile + ) + +} \ No newline at end of file diff --git a/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/Files.kt b/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/Files.kt new file mode 100644 index 0000000..0bba91b --- /dev/null +++ b/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/Files.kt @@ -0,0 +1,82 @@ +package com.megboyzz.devmenu.ui.components + +import android.widget.Toast +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material.ripple.rememberRipple +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.megboyzz.devmenu.R +import com.megboyzz.devmenu.ui.asPainter +import com.megboyzz.devmenu.ui.theme.DevMenuTheme + +enum class ElementType { + isHidden, + isReplaced, + isFile, + isDir +} + +@Composable +fun FsElement( + name: String, + type: ElementType, + onClick: () -> Unit, + onLongPressClick: () -> Unit +) { + + Column( + verticalArrangement = Arrangement.spacedBy(10.dp), + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.clickableWithRipple( + onClick = onClick, + onLongClick = onLongPressClick + ) + ) { + when(type){ + ElementType.isHidden -> { Image(painter = R.drawable.icon_hidden_file.asPainter(), contentDescription = null) } + ElementType.isFile -> { Image(painter = R.drawable.icon_file.asPainter(), contentDescription = null) } + ElementType.isDir -> { Image(painter = R.drawable.icon_folder.asPainter(), contentDescription = null) } + ElementType.isReplaced -> { Image(painter = R.drawable.icon_replaced_file.asPainter(), contentDescription = null) } + } + Text( + text = name + ) + } +} + +@Preview +@Composable +fun FileIcon() { + + val context = LocalContext.current + + Box( + modifier = Modifier + .fillMaxSize() + .background(Color.White) + ) { + FsElement( + name = "my_file.txt", + type = ElementType.isReplaced, + onLongPressClick = {Toast.makeText(context, "long!", Toast.LENGTH_SHORT).show()}, + onClick = {Toast.makeText(context, "one!", Toast.LENGTH_SHORT).show()} + ) + } + +} \ No newline at end of file diff --git a/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/Scaffold.kt b/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/Scaffold.kt index 5cd75b2..f78ad73 100644 --- a/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/Scaffold.kt +++ b/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/Scaffold.kt @@ -1,22 +1,27 @@ package com.megboyzz.devmenu.ui.components -import android.util.Log import android.widget.Toast import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.tween +import androidx.compose.animation.slideInVertically +import androidx.compose.animation.slideOutVertically import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.BasicTextField import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.PlayArrow import androidx.compose.material.icons.outlined.Search import androidx.compose.material.icons.outlined.Settings -import androidx.compose.material3.Divider import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.Scaffold @@ -33,21 +38,44 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.megboyzz.devmenu.ui.asComposableLambda import com.megboyzz.devmenu.ui.theme.DevMenuTheme @OptIn(ExperimentalMaterial3Api::class) @Composable -fun MainScaffold() { - Scaffold( - topBar = { - TopAppBar( - title = { Text("") }, +fun MainScaffold( + onSettingsClick: () -> Unit, + onSearchValueChanged: (String) -> Unit, + onFloatingButtonClick: () -> Unit, + content: @Composable (PaddingValues) -> Unit +) { - ) - } - ) { - it.calculateBottomPadding() - } + var searchValue by remember { mutableStateOf("") } + + Scaffold( + + topBar = { + TopBar( + searchValue = searchValue, + onSearchValueChanged = { + searchValue = it + onSearchValueChanged(it) + }, + onSettingsClick = onSettingsClick + ) + }, + + floatingActionButton = { + FloatingActionButton( + onClick = onFloatingButtonClick, + shape = CircleShape, + content = {Icon(imageVector = Icons.Default.PlayArrow, contentDescription = null)} + ) + }, + + content = content + + ) } @@ -59,19 +87,26 @@ fun TopBar( onSettingsClick: () -> Unit ) { - var text by remember { mutableStateOf("") } - var isSearching by remember { mutableStateOf(false) } val context = LocalContext.current TopAppBar( title = { Box { - if(isSearching) { + AnimatedVisibility( + visible = isSearching, + enter = slideInVertically(animationSpec = tween(durationMillis = 200)) { + -it / 3 + }, + exit = slideOutVertically(animationSpec = tween(durationMillis = 200)) { + -it / 3 + } + ) { SearchFileTextField( - value = text, - onValueChange = { text = it } + value = searchValue, + onValueChange = onSearchValueChanged ) - } else Text("NFSMW DevMenu") + } + if(!isSearching) Text("NFSMW DevMenu") } }, @@ -111,13 +146,15 @@ fun SearchButton( @Preview @Composable -fun TopBarPrev() { +fun ScaffoldPreview() { DevMenuTheme { - TopBar( - searchValue = "А как какать", + MainScaffold( + onSettingsClick = { /*TODO*/ }, onSearchValueChanged = {}, - onSettingsClick = {} - ) + onFloatingButtonClick = { /*TODO*/ } + ) { + + } } } @@ -137,11 +174,14 @@ fun SearchFileTextField( Modifier .fillMaxWidth() .background(Color.White, RoundedCornerShape(percent = 30)) + .border(1.dp, Color.Black, RoundedCornerShape(percent = 30)) .padding(start = 12.dp), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { - innerTextField() + Box(Modifier.padding(vertical = 4.dp)) { + innerTextField() + } } } }, diff --git a/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/Shared.kt b/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/Shared.kt new file mode 100644 index 0000000..7b456c1 --- /dev/null +++ b/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/Shared.kt @@ -0,0 +1,25 @@ +package com.megboyzz.devmenu.ui.components + +import android.annotation.SuppressLint +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.material.ripple.rememberRipple +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier + +@SuppressLint("ModifierFactoryUnreferencedReceiver") +@OptIn(ExperimentalFoundationApi::class) +@Composable +fun Modifier.clickableWithRipple( + onClick: () -> Unit, + onLongClick: () -> Unit = {} +): Modifier { + return Modifier.combinedClickable( + interactionSource = remember { MutableInteractionSource() }, + indication = rememberRipple(), + onClick = onClick, + onLongClick = onLongClick + ) +} \ No newline at end of file diff --git a/devmenu/src/main/res/drawable/clip.xml b/devmenu/src/main/res/drawable/clip.xml new file mode 100644 index 0000000..114cc8e --- /dev/null +++ b/devmenu/src/main/res/drawable/clip.xml @@ -0,0 +1,9 @@ + + + diff --git a/devmenu/src/main/res/drawable/icon_file.xml b/devmenu/src/main/res/drawable/icon_file.xml new file mode 100644 index 0000000..dc9ca64 --- /dev/null +++ b/devmenu/src/main/res/drawable/icon_file.xml @@ -0,0 +1,12 @@ + + + + diff --git a/devmenu/src/main/res/drawable/icon_folder.xml b/devmenu/src/main/res/drawable/icon_folder.xml new file mode 100644 index 0000000..987d740 --- /dev/null +++ b/devmenu/src/main/res/drawable/icon_folder.xml @@ -0,0 +1,12 @@ + + + + diff --git a/devmenu/src/main/res/drawable/icon_hidden_file.xml b/devmenu/src/main/res/drawable/icon_hidden_file.xml new file mode 100644 index 0000000..b1a000e --- /dev/null +++ b/devmenu/src/main/res/drawable/icon_hidden_file.xml @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/devmenu/src/main/res/drawable/icon_replaced_file.xml b/devmenu/src/main/res/drawable/icon_replaced_file.xml new file mode 100644 index 0000000..a63783a --- /dev/null +++ b/devmenu/src/main/res/drawable/icon_replaced_file.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/devmenu/src/main/res/values/strings.xml b/devmenu/src/main/res/values/strings.xml deleted file mode 100644 index 2ca7375..0000000 --- a/devmenu/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - MainActivity - \ No newline at end of file diff --git a/devmenu/src/main/res/values/themes.xml b/devmenu/src/main/res/values/themes.xml deleted file mode 100644 index 54827a2..0000000 --- a/devmenu/src/main/res/values/themes.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - -