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 a9fe392..d674c64 100644
Binary files a/app/src/main/jniLibs/armeabi-v7a/libapp.so and b/app/src/main/jniLibs/armeabi-v7a/libapp.so differ
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 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 1c87d57..55c051b 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,16 +1,16 @@
[versions]
agp = "8.1.2"
junit-junit = "4.13.2"
-kotlin = "1.9.0"
+kotlin = "1.9.21"
core-ktx = "1.12.0"
junit = "4.14"
androidx-test-ext-junit = "1.1.5"
espresso-core = "3.5.1"
lifecycle-runtime-ktx = "2.6.2"
-activity-compose = "1.7.2"
-compose-bom = "2023.08.00"
+activity-compose = "1.8.2"
+compose-bom = "2023.10.01"
appcompat = "1.6.1"
-material = "1.10.0"
+material = "1.11.0"
org-jetbrains-kotlin-jvm = "1.9.0"
ksp = "1.9.21-1.0.15"
dagger = "2.46.1"