From aa918de503f37ed6e797cb0c8bb2221d5427fcb6 Mon Sep 17 00:00:00 2001 From: pedro Date: Wed, 19 Feb 2025 15:32:17 +0300 Subject: [PATCH] second commit --- .gitignore | 7 +- .gitmodules | 6 - .idea/.gitignore | 3 + .idea/.name | 1 + .idea/codeStyles/Project.xml | 123 +++++++++ .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/compiler.xml | 6 + .idea/deploymentTargetSelector.xml | 10 + .idea/gradle.xml | 20 ++ .idea/kotlinc.xml | 6 + .idea/migrations.xml | 10 + .idea/misc.xml | 9 + .idea/runConfigurations.xml | 17 ++ .kotlin/errors/errors-1733770864492.log | 45 --- .kotlin/errors/errors-1733770932568.log | 45 --- .kotlin/errors/errors-1739952108304.log | 82 ++++++ README.md | 121 --------- app/build.gradle.kts | 120 ++++---- app/proguard-rules.pro | 6 +- .../nto_minipigs/ExampleInstrumentedTest.kt | 24 ++ app/src/main/AndroidManifest.xml | 17 +- .../example/nto_minipigs/LoginViewModel.kt | 23 ++ .../com/example/nto_minipigs/MainActivity.kt | 69 +++++ .../nto_minipigs/Retrofit}/ApiService.kt | 6 +- .../nto_minipigs/Retrofit/Models/Data.kt | 5 + .../nto_minipigs/Retrofit/Models}/User.kt | 2 +- .../nto_minipigs/Retrofit}/RetrofitClient.kt | 6 +- .../example/nto_minipigs/core/Constants.kt | 7 + .../nto_minipigs/ui/screens/LoginScreen.kt | 67 +++++ .../nto_minipigs/ui/screens/MainScreen.kt | 66 +++++ .../example/nto_minipigs/ui/theme/Color.kt | 11 + .../example/nto_minipigs/ui/theme/Theme.kt | 58 ++++ .../com/example/nto_minipigs/ui/theme/Type.kt | 34 +++ app/src/main/java/ru/myitschool/work/App.kt | 7 - app/src/main/java/ru/myitschool/work/Data.kt | 5 - .../java/ru/myitschool/work/core/Constants.kt | 5 - .../main/java/ru/myitschool/work/core/env.kt | 6 - .../ru/myitschool/work/ui/RootActivity.kt | 90 ------ .../work/ui/login/LoginDestination.kt | 6 - .../myitschool/work/ui/login/LoginFragment.kt | 91 ------- .../work/ui/login/LoginViewModel.kt | 17 -- .../work/ui/main/MainDestination.kt | 6 - .../myitschool/work/ui/main/MainFragment.kt | 112 -------- .../myitschool/work/ui/main/MainViewModel.kt | 17 -- .../work/ui/qr/results/QrResultDestination.kt | 6 - .../work/ui/qr/results/QrResultFragment.kt | 63 ----- .../work/ui/qr/results/QrResultViewModel.kt | 17 -- .../work/ui/qr/scan/QrScanDestination.kt | 30 -- .../work/ui/qr/scan/QrScanFragment.kt | 140 ---------- .../work/ui/qr/scan/QrScanViewModel.kt | 93 ------- .../myitschool/work/utils/FlowExtensions.kt | 10 - .../work/utils/FragmentExtesions.kt | 18 -- .../work/utils/TextChangedListener.kt | 12 - .../myitschool/work/utils/ViewExtensions.kt | 7 - app/src/main/res/drawable/ic_close.xml | 5 - app/src/main/res/drawable/ic_logout.xml | 5 - app/src/main/res/drawable/ic_no_img.xml | 5 - app/src/main/res/drawable/ic_qr_code.xml | 25 -- app/src/main/res/drawable/ic_refresh.xml | 5 - app/src/main/res/drawable/ic_rounded.xml | 5 - app/src/main/res/layout/activity_root.xml | 14 - app/src/main/res/layout/fragment_login.xml | 57 ---- app/src/main/res/layout/fragment_main.xml | 89 ------ .../main/res/layout/fragment_qr_result.xml | 25 -- app/src/main/res/layout/fragment_qr_scan.xml | 35 --- app/src/main/res/values-b+ru/strings.xml | 11 - app/src/main/res/values/dimens.xml | 5 - app/src/main/res/values/ids.xml | 4 - app/src/main/res/values/strings.xml | 10 +- app/src/main/res/values/strings_qr.xml | 4 - app/src/main/res/values/themes.xml | 19 +- .../main/res/xml/network_security_config.xml | 4 - .../example/nto_minipigs/ExampleUnitTest.kt | 17 ++ build.gradle.kts | 7 +- buildSrc/.gitignore | 2 - buildSrc/build.gradle.kts | 8 - buildSrc/src/main/java/Dependencies.kt | 220 --------------- .../main/java/DependencyHandlerExtensions.kt | 40 --- buildSrc/src/main/java/Plugin.kt | 67 ----- buildSrc/src/main/java/Version.kt | 42 --- gradle.properties | 6 +- gradle/README.md | 11 - gradle/libs.versions.toml | 32 +++ gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 257 +++++++----------- settings.gradle.kts | 11 +- 86 files changed, 903 insertions(+), 1943 deletions(-) delete mode 100644 .gitmodules create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/compiler.xml create mode 100644 .idea/deploymentTargetSelector.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/kotlinc.xml create mode 100644 .idea/migrations.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/runConfigurations.xml delete mode 100644 .kotlin/errors/errors-1733770864492.log delete mode 100644 .kotlin/errors/errors-1733770932568.log create mode 100644 .kotlin/errors/errors-1739952108304.log delete mode 100644 README.md create mode 100644 app/src/androidTest/java/com/example/nto_minipigs/ExampleInstrumentedTest.kt create mode 100644 app/src/main/java/com/example/nto_minipigs/LoginViewModel.kt create mode 100644 app/src/main/java/com/example/nto_minipigs/MainActivity.kt rename app/src/main/java/{ru/myitschool/work => com/example/nto_minipigs/Retrofit}/ApiService.kt (77%) create mode 100644 app/src/main/java/com/example/nto_minipigs/Retrofit/Models/Data.kt rename app/src/main/java/{ru/myitschool/work => com/example/nto_minipigs/Retrofit/Models}/User.kt (76%) rename app/src/main/java/{ru/myitschool/work => com/example/nto_minipigs/Retrofit}/RetrofitClient.kt (59%) create mode 100644 app/src/main/java/com/example/nto_minipigs/core/Constants.kt create mode 100644 app/src/main/java/com/example/nto_minipigs/ui/screens/LoginScreen.kt create mode 100644 app/src/main/java/com/example/nto_minipigs/ui/screens/MainScreen.kt create mode 100644 app/src/main/java/com/example/nto_minipigs/ui/theme/Color.kt create mode 100644 app/src/main/java/com/example/nto_minipigs/ui/theme/Theme.kt create mode 100644 app/src/main/java/com/example/nto_minipigs/ui/theme/Type.kt delete mode 100644 app/src/main/java/ru/myitschool/work/App.kt delete mode 100644 app/src/main/java/ru/myitschool/work/Data.kt delete mode 100644 app/src/main/java/ru/myitschool/work/core/Constants.kt delete mode 100644 app/src/main/java/ru/myitschool/work/core/env.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/RootActivity.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/login/LoginDestination.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/main/MainDestination.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/qr/results/QrResultDestination.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/qr/results/QrResultFragment.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/qr/results/QrResultViewModel.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/qr/scan/QrScanDestination.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/qr/scan/QrScanFragment.kt delete mode 100644 app/src/main/java/ru/myitschool/work/ui/qr/scan/QrScanViewModel.kt delete mode 100644 app/src/main/java/ru/myitschool/work/utils/FlowExtensions.kt delete mode 100644 app/src/main/java/ru/myitschool/work/utils/FragmentExtesions.kt delete mode 100644 app/src/main/java/ru/myitschool/work/utils/TextChangedListener.kt delete mode 100644 app/src/main/java/ru/myitschool/work/utils/ViewExtensions.kt delete mode 100644 app/src/main/res/drawable/ic_close.xml delete mode 100644 app/src/main/res/drawable/ic_logout.xml delete mode 100644 app/src/main/res/drawable/ic_no_img.xml delete mode 100644 app/src/main/res/drawable/ic_qr_code.xml delete mode 100644 app/src/main/res/drawable/ic_refresh.xml delete mode 100644 app/src/main/res/drawable/ic_rounded.xml delete mode 100644 app/src/main/res/layout/activity_root.xml delete mode 100644 app/src/main/res/layout/fragment_login.xml delete mode 100644 app/src/main/res/layout/fragment_main.xml delete mode 100644 app/src/main/res/layout/fragment_qr_result.xml delete mode 100644 app/src/main/res/layout/fragment_qr_scan.xml delete mode 100644 app/src/main/res/values-b+ru/strings.xml delete mode 100644 app/src/main/res/values/dimens.xml delete mode 100644 app/src/main/res/values/ids.xml delete mode 100644 app/src/main/res/values/strings_qr.xml delete mode 100644 app/src/main/res/xml/network_security_config.xml create mode 100644 app/src/test/java/com/example/nto_minipigs/ExampleUnitTest.kt delete mode 100644 buildSrc/.gitignore delete mode 100644 buildSrc/build.gradle.kts delete mode 100644 buildSrc/src/main/java/Dependencies.kt delete mode 100644 buildSrc/src/main/java/DependencyHandlerExtensions.kt delete mode 100644 buildSrc/src/main/java/Plugin.kt delete mode 100644 buildSrc/src/main/java/Version.kt delete mode 100644 gradle/README.md create mode 100644 gradle/libs.versions.toml diff --git a/.gitignore b/.gitignore index 10cfdbf..aa724b7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,12 @@ *.iml .gradle /local.properties -/.idea +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml .DS_Store /build /captures diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index b3f5536..0000000 --- a/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "gradle"] - path = gradle - url = https://git.sicampus.ru/core/gradle.git -[submodule "buildSrc"] - path = buildSrc - url = https://git.sicampus.ru/core/dependecies.git diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..b3fdcd2 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +nto_minipigs \ No newline at end of file diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..7643783 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,123 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..79ee123 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b86273d --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..b268ef3 --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..7b3006b --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..6d0ee1c --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..b2c751a --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..16660f1 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/.kotlin/errors/errors-1733770864492.log b/.kotlin/errors/errors-1733770864492.log deleted file mode 100644 index 4f711c4..0000000 --- a/.kotlin/errors/errors-1733770864492.log +++ /dev/null @@ -1,45 +0,0 @@ -kotlin version: 2.0.21 -error message: androidx.compose.compiler.plugins.kotlin.IncompatibleComposeRuntimeVersionException: The Compose Compiler requires the Compose Runtime to be on the class path, but none could be found. The compose compiler plugin you are using (version 1.5.14) expects a minimum runtime version of 1.0.0. - at androidx.compose.compiler.plugins.kotlin.VersionChecker.noRuntimeOnClasspathError(VersionChecker.kt:221) - at androidx.compose.compiler.plugins.kotlin.VersionChecker.check(VersionChecker.kt:193) - at androidx.compose.compiler.plugins.kotlin.ComposeIrGenerationExtension.generate(ComposeIrGenerationExtension.kt:73) - at org.jetbrains.kotlin.fir.pipeline.ConvertToIrKt.applyIrGenerationExtensions(convertToIr.kt:442) - at org.jetbrains.kotlin.fir.pipeline.Fir2IrPipeline.runActualizationPipeline(convertToIr.kt:246) - at org.jetbrains.kotlin.fir.pipeline.Fir2IrPipeline.convertToIrAndActualize(convertToIr.kt:130) - at org.jetbrains.kotlin.fir.pipeline.ConvertToIrKt.convertToIrAndActualize(convertToIr.kt:99) - at org.jetbrains.kotlin.fir.pipeline.ConvertToIrKt.convertToIrAndActualize$default(convertToIr.kt:72) - at org.jetbrains.kotlin.cli.jvm.compiler.pipeline.JvmCompilerPipelineKt.convertToIrAndActualizeForJvm(jvmCompilerPipeline.kt:196) - at org.jetbrains.kotlin.cli.jvm.compiler.pipeline.JvmCompilerPipelineKt.convertAnalyzedFirToIr(jvmCompilerPipeline.kt:169) - at org.jetbrains.kotlin.cli.jvm.compiler.pipeline.JvmCompilerPipelineKt.compileModulesUsingFrontendIrAndLightTree(jvmCompilerPipeline.kt:140) - at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:148) - at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:43) - at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:103) - at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:49) - at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:101) - at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:464) - at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:73) - at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.doCompile(IncrementalCompilerRunner.kt:506) - at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileImpl(IncrementalCompilerRunner.kt:423) - at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.tryCompileIncrementally$lambda$9$compile(IncrementalCompilerRunner.kt:249) - at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.tryCompileIncrementally(IncrementalCompilerRunner.kt:267) - at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:120) - at org.jetbrains.kotlin.daemon.CompileServiceImplBase.execIncrementalCompiler(CompileServiceImpl.kt:675) - at org.jetbrains.kotlin.daemon.CompileServiceImplBase.access$execIncrementalCompiler(CompileServiceImpl.kt:92) - at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1660) - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) - at java.base/java.lang.reflect.Method.invoke(Unknown Source) - at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) - at java.rmi/sun.rmi.transport.Transport$1.run(Unknown Source) - at java.rmi/sun.rmi.transport.Transport$1.run(Unknown Source) - at java.base/java.security.AccessController.doPrivileged(Unknown Source) - at java.rmi/sun.rmi.transport.Transport.serviceCall(Unknown Source) - at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) - at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source) - at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(Unknown Source) - at java.base/java.security.AccessController.doPrivileged(Unknown Source) - at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source) - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) - at java.base/java.lang.Thread.run(Unknown Source) - - diff --git a/.kotlin/errors/errors-1733770932568.log b/.kotlin/errors/errors-1733770932568.log deleted file mode 100644 index 4f711c4..0000000 --- a/.kotlin/errors/errors-1733770932568.log +++ /dev/null @@ -1,45 +0,0 @@ -kotlin version: 2.0.21 -error message: androidx.compose.compiler.plugins.kotlin.IncompatibleComposeRuntimeVersionException: The Compose Compiler requires the Compose Runtime to be on the class path, but none could be found. The compose compiler plugin you are using (version 1.5.14) expects a minimum runtime version of 1.0.0. - at androidx.compose.compiler.plugins.kotlin.VersionChecker.noRuntimeOnClasspathError(VersionChecker.kt:221) - at androidx.compose.compiler.plugins.kotlin.VersionChecker.check(VersionChecker.kt:193) - at androidx.compose.compiler.plugins.kotlin.ComposeIrGenerationExtension.generate(ComposeIrGenerationExtension.kt:73) - at org.jetbrains.kotlin.fir.pipeline.ConvertToIrKt.applyIrGenerationExtensions(convertToIr.kt:442) - at org.jetbrains.kotlin.fir.pipeline.Fir2IrPipeline.runActualizationPipeline(convertToIr.kt:246) - at org.jetbrains.kotlin.fir.pipeline.Fir2IrPipeline.convertToIrAndActualize(convertToIr.kt:130) - at org.jetbrains.kotlin.fir.pipeline.ConvertToIrKt.convertToIrAndActualize(convertToIr.kt:99) - at org.jetbrains.kotlin.fir.pipeline.ConvertToIrKt.convertToIrAndActualize$default(convertToIr.kt:72) - at org.jetbrains.kotlin.cli.jvm.compiler.pipeline.JvmCompilerPipelineKt.convertToIrAndActualizeForJvm(jvmCompilerPipeline.kt:196) - at org.jetbrains.kotlin.cli.jvm.compiler.pipeline.JvmCompilerPipelineKt.convertAnalyzedFirToIr(jvmCompilerPipeline.kt:169) - at org.jetbrains.kotlin.cli.jvm.compiler.pipeline.JvmCompilerPipelineKt.compileModulesUsingFrontendIrAndLightTree(jvmCompilerPipeline.kt:140) - at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:148) - at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:43) - at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:103) - at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:49) - at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:101) - at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:464) - at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:73) - at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.doCompile(IncrementalCompilerRunner.kt:506) - at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileImpl(IncrementalCompilerRunner.kt:423) - at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.tryCompileIncrementally$lambda$9$compile(IncrementalCompilerRunner.kt:249) - at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.tryCompileIncrementally(IncrementalCompilerRunner.kt:267) - at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:120) - at org.jetbrains.kotlin.daemon.CompileServiceImplBase.execIncrementalCompiler(CompileServiceImpl.kt:675) - at org.jetbrains.kotlin.daemon.CompileServiceImplBase.access$execIncrementalCompiler(CompileServiceImpl.kt:92) - at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1660) - at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) - at java.base/java.lang.reflect.Method.invoke(Unknown Source) - at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) - at java.rmi/sun.rmi.transport.Transport$1.run(Unknown Source) - at java.rmi/sun.rmi.transport.Transport$1.run(Unknown Source) - at java.base/java.security.AccessController.doPrivileged(Unknown Source) - at java.rmi/sun.rmi.transport.Transport.serviceCall(Unknown Source) - at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) - at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source) - at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(Unknown Source) - at java.base/java.security.AccessController.doPrivileged(Unknown Source) - at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source) - at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) - at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) - at java.base/java.lang.Thread.run(Unknown Source) - - diff --git a/.kotlin/errors/errors-1739952108304.log b/.kotlin/errors/errors-1739952108304.log new file mode 100644 index 0000000..36106c7 --- /dev/null +++ b/.kotlin/errors/errors-1739952108304.log @@ -0,0 +1,82 @@ +kotlin version: 2.0.0 +error message: Daemon compilation failed: null +java.lang.Exception + at org.jetbrains.kotlin.daemon.common.CompileService$CallResult$Error.get(CompileService.kt:69) + at org.jetbrains.kotlin.daemon.common.CompileService$CallResult$Error.get(CompileService.kt:65) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemon(GradleKotlinCompilerWork.kt:240) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemonOrFallbackImpl(GradleKotlinCompilerWork.kt:159) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.run(GradleKotlinCompilerWork.kt:111) + at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction.execute(GradleCompilerRunnerWithWorkers.kt:76) + at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:66) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:62) + at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:62) + at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44) + at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) + at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) + at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:59) + at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:174) + at java.base/java.util.concurrent.FutureTask.run(Unknown Source) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:194) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:127) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:169) + at org.gradle.internal.Factories$1.create(Factories.java:31) + at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:263) + at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127) + at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:132) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:133) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) + at java.base/java.util.concurrent.FutureTask.run(Unknown Source) + at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) + at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) + at java.base/java.lang.Thread.run(Unknown Source) +Caused by: java.nio.file.DirectoryNotEmptyException: C:\Users\User\AppData\Local\Temp\kotlin-backups9600370536754382189 + at java.base/sun.nio.fs.WindowsFileSystemProvider.implDelete(Unknown Source) + at java.base/sun.nio.fs.AbstractFileSystemProvider.delete(Unknown Source) + at java.base/java.nio.file.Files.delete(Unknown Source) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction$cleanupStash$2$1$1.invoke(CompilationTransaction.kt:244) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction$cleanupStash$2$1$1.invoke(CompilationTransaction.kt:244) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction.cleanupStash$lambda$11$lambda$10$lambda$9(CompilationTransaction.kt:244) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source) + at java.base/java.util.ArrayList.forEach(Unknown Source) + at java.base/java.util.stream.SortedOps$RefSortingSink.end(Unknown Source) + at java.base/java.util.stream.Sink$ChainedReference.end(Unknown Source) + at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source) + at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source) + at java.base/java.util.stream.ReferencePipeline.forEach(Unknown Source) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction.cleanupStash(CompilationTransaction.kt:244) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction.close(CompilationTransaction.kt:254) + at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.tryCompileIncrementally(IncrementalCompilerRunner.kt:747) + at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:120) + at org.jetbrains.kotlin.daemon.CompileServiceImplBase.execIncrementalCompiler(CompileServiceImpl.kt:676) + at org.jetbrains.kotlin.daemon.CompileServiceImplBase.access$execIncrementalCompiler(CompileServiceImpl.kt:92) + at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1661) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) + at java.base/java.lang.reflect.Method.invoke(Unknown Source) + at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) + at java.rmi/sun.rmi.transport.Transport$1.run(Unknown Source) + at java.rmi/sun.rmi.transport.Transport$1.run(Unknown Source) + at java.base/java.security.AccessController.doPrivileged(Unknown Source) + at java.rmi/sun.rmi.transport.Transport.serviceCall(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(Unknown Source) + at java.base/java.security.AccessController.doPrivileged(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source) + ... 3 more + + diff --git a/README.md b/README.md deleted file mode 100644 index ef91da2..0000000 --- a/README.md +++ /dev/null @@ -1,121 +0,0 @@ -[![Android Studio version](https://img.shields.io/endpoint?url=https%3A%2F%2Fsicampus.ru%2Fgitea%2Fcore%2Fdocs%2Fraw%2Fbranch%2Fmain%2Fandroid-studio-label.json)](https://sicampus.ru/gitea/core/docs/src/branch/main/how-upload-project.md) - -# НТО 2024. II отборочный этап. Командные задани — клиентская часть - -## 📖 Предыстория -В компании S контроль доступа в офис осуществляется с помощью СКУД (системы контроля управления доступом). На данный момент у каждого сотрудника компании есть карта-пропуск с NFC меткой. А у каждой входной двери есть считыватель с обеих сторон. При поднесении карты к считывателю, дверь открывается, а информация о времени входа или выхода сотрудника фиксируется в базе данных. -Администрации компании S требуется мобильное приложение, как для рядовых сотрудников, так и для администрации с возможностью просмотра посещений и работой электронного пропуска как временной замены обычного (при помощи сканировании QR кода, который находится на считывателе). Поскольку в приложении есть возможность использовать телефон как пропуск - то к данному приложению повышенные требования к безопасности всех данных, находящихся внутри него. - - - -## 📋 Системные требования - -| **Параметр** | **Требование** | -|-----------------------------|---------------------------------------| -| **Минимальная версия Android** | 9.0 (API 28) | -| **Целевая версия Android** | 14 (API 34) | -| **Поддерживаемые устройства** | смартфоны, планшеты | -| **Ориентация экранов** | портретная | -| **Языки** | русский, английский | -| **Разрешения** | доступ к интернету, камера (при необходимости) | - - - -## 📱 Техническое задание -Требуется разработать нативное мобильное приложение, которое будет содержать следующие экраны. - - -### 1. Экран авторизации - -> Данный экран должен быть показан при первом входе в приложение, а также в ситуациях, когда пользователь не зарегистрировался в приложении. - -#### Элементы, которые должны присутствовать на экране: -- Поле ввода (`id/username`), в котором пользователю необходимо ввести свой логин. -- Кнопка входа (`id/login`), по нажатию на которую пользователь авторизуется в системе. -- По умолчанию скрытое (`GONE`) текстовое поле с ошибкой (`id/error`). - -#### Требования к компонентам: -1. В пустом поле ввода должна отображаться подсказка, что требуется ввести пользователю. -2. Если хотя бы одно из условий ниже соблюдено - кнопка должна быть неактивной: - - Поле ввода пустое. - - Количество символов менее 3х. - - Логин начинается с цифры. - - Логин содержит символы, отличные от латинского алфавита и цифр. -3. Поле ввода и кнопку должно быть видно при раскрытии клавиатуры. -4. - При нажатии на кнопку входа необходимо проверить, что данный пользователь существует с помощью запроса `api//auth` (подробное описание представлено в техническом задании серверной части). -5. В случае отсутствия логина или любой другой неполадки - необходимо вывести ошибку, пока пользователь не изменит текстовое поле или повторно не нажмёт на кнопку. -6. После нажатия на кнопку - логин должен быть сохранён и при следующем открытии приложения экран авторизации не должен быть показан. -7. После нажатия на кнопку - при нажатии стрелки назад - экран авторизации не должен быть показан повторно. -8. Экран авторизации показывается только в случае, если пользователь неавторизован. - - - - -### 2. Главный экран - -> Данный экран содержит общую информацию о пользователе: ->- ФИО ->- Фото ->- Должность ->- Время последнего входа - -#### Элементы, которые должны присутствовать на экране: -- Текстовое поле (`id/fullname`), в котором написано имя пользователя. -- Изображение (`id/photo`), на котором отображено фото пользователя. -- Текстовое поле (`id/position`), в котором написана должность пользователя. -- Текстовое поле (`id/lastEntry`), в котором написана дата и время последнего входа пользователя. -- Кнопка (`id/logout`) для выхода пользователя из аккаунта. -- Кнопка (`id/refresh`) для обновления данных. -- Кнопка (`id/scan`) для сканирования QR кода. -- По умолчанию скрытое текстовое поле с ошибкой (`id/error`). - -#### Требования к компонентам: -- В случае любой ошибки необходимо скрыть все элементы, кроме текстового поля с ошибкой и кнопки обновления данных. -- Для получения данных необходимо использовать сетевой запрос `/api//info`. -- Формат даты и времени последнего входа пользователя: `yyyy-MM-dd HH:mm` (например: 2024-02-31 08:31). Время необходимо отображать с сервера, без поправок на часовой пояс или локальное смещение. -- При нажатии на кнопку выход все данные (если есть) пользователя должны быть очищены, а приложение должно открыть экран авторизации. -- При нажатии кнопки сканирования необходимо открыть экран сканирования QR кода. -- При нажатии на кнопку обновления данных - необходимо повторно вызывать сетевой запрос для получения актуальных данных. - - - -### 3. Экран сканирования QR-кода - -> Данный экран позволяет отсканировать код на турникете и войти с помощью смартфона. В данном случае данный экран будет уже написан и представлен dам в готовом виде в заготовке. Вам необходимо только подписаться на его результат с помощью **Result API** и обработать считанные данные из QR кода. **Данный экран нельзя модифицировать. Он поставляется как есть.** - - - -### 4. Экран с результатом сканирования QR кода - -> На данном экране необходимо вывести успешность или неуспешность входа с помощью метода QR кода. - -#### Элементы, которые должны присутствовать на экране: -- Текстовое поле (`id/result`), где содержится текст об успешности или неуспешности входа. -- Кнопка (`id/close`) для закрытия данного экрана. - -#### Требования к компонентам: -- В случае, если результат пришёл пустым или со статусом “Отмена” - необходимо вывести пользователю текст: - *"Вход был отменён/Operation was cancelled"* -- В случае, если данные пришли, то необходимо их отправить на сервер с запросом `api//open`, добавив данные из результата и получить ответ. -- Если сервер ответил успешно - то отображаем текст: - *"Успешно/Success"* -- Если сервер ответил любой ошибкой - то отображаем текст: - *"Что-то пошло не так/Something wrong"* -- Кнопка закрытия всегда открывает главный экран. - - - -## 🛠 Решение - -Необходимо загрузить свое решение в систему [по ссылке](https://innovationcampus.ru/lms/mod/quiz/view.php?id=2149). - -Отметим, что работу необходимо осуществлять в представленных проектах-заготовках (шаблонах). - - - -## ✅ Особенности оценивания - -Оценивание происходит с помощью автоматической системы тестирования, которая в автоматическом режиме находит элементы и взаимодействует с ними (именно для этого у каждого элемента указан уникальный идентификатор, по которому будет производится поиск). Каждый тест происходит с чистой установки приложения. -В случае тестирования сервера на него поочередно отправляются команды, описанные в API и ожидаются определенные корректные ответы. -Сервер и приложение тестируются независимо. - diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 01a15f4..4df0e42 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,94 +1,70 @@ plugins { - kotlinAndroid - androidApplication - jetbrainsKotlinSerialization version Version.Kotlin.language - kotlinAnnotationProcessor - id("com.google.dagger.hilt.android").version("2.51.1") - id("org.jetbrains.kotlin.plugin.compose") version "2.0.0" + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.compose) + id("org.jetbrains.kotlin.plugin.serialization") version "2.1.20-Beta2" } -val packageName = "ru.myitschool.work" - android { - namespace = packageName - compileSdk = Version.Android.Sdk.compile + namespace = "com.example.nto_minipigs" + compileSdk = 35 defaultConfig { - applicationId = packageName - minSdk = Version.Android.Sdk.min - targetSdk = Version.Android.Sdk.target + applicationId = "com.example.nto_minipigs" + minSdk = 24 + targetSdk = 35 versionCode = 1 versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - buildFeatures.viewBinding = true - + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + kotlinOptions { + jvmTarget = "11" + } buildFeatures { compose = true } - - compileOptions { - sourceCompatibility = Version.Kotlin.javaSource - targetCompatibility = Version.Kotlin.javaSource - } - - kotlinOptions { - jvmTarget = Version.Kotlin.jvmTarget - } } dependencies { - defaultLibrary() + val nav_version = "2.8.7" - val lifecycle_version = "2.2.0" - - implementation("androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version") - implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version") - - val composeBom = platform("androidx.compose:compose-bom:2024.10.01") - implementation(composeBom) - androidTestImplementation(composeBom) - - implementation("androidx.compose.material3:material3") - implementation("androidx.compose.ui:ui-tooling-preview") - debugImplementation("androidx.compose.ui:ui-tooling") - - androidTestImplementation("androidx.compose.ui:ui-test-junit4") - debugImplementation("androidx.compose.ui:ui-test-manifest") - - implementation(Dependencies.AndroidX.activity) - implementation(Dependencies.AndroidX.fragment) - implementation(Dependencies.AndroidX.constraintLayout) - - implementation(Dependencies.AndroidX.Navigation.fragment) - implementation(Dependencies.AndroidX.Navigation.navigationUi) - - implementation(Dependencies.Retrofit.library) - implementation(Dependencies.Retrofit.gsonConverter) - - implementation("com.squareup.picasso:picasso:2.8") + implementation("androidx.navigation:navigation-compose:$nav_version") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.1") - implementation("androidx.datastore:datastore-preferences:1.1.1") - implementation("com.google.mlkit:barcode-scanning:17.3.0") + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.activity.compose) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.ui) + implementation(libs.androidx.ui.graphics) + implementation(libs.androidx.ui.tooling.preview) + implementation(libs.androidx.material3) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(platform(libs.androidx.compose.bom)) + androidTestImplementation(libs.androidx.ui.test.junit4) + debugImplementation(libs.androidx.ui.tooling) + debugImplementation(libs.androidx.ui.test.manifest) - val cameraX = "1.3.4" - implementation("androidx.camera:camera-core:$cameraX") - implementation("androidx.camera:camera-camera2:$cameraX") - implementation("androidx.camera:camera-lifecycle:$cameraX") - implementation("androidx.camera:camera-view:$cameraX") - implementation("androidx.camera:camera-mlkit-vision:1.4.0-rc04") + val retrofitVersion = "2.11.0" - val hilt = "2.51.1" - implementation("com.google.dagger:hilt-android:$hilt") - kapt("com.google.dagger:hilt-android-compiler:$hilt") - - implementation("com.squareup.okhttp3:logging-interceptor:4.10.0") - - implementation("com.google.code.gson:gson:2.11.0") -} - -kapt { - correctErrorTypes = true -} + implementation("com.squareup.retrofit2:retrofit:$retrofitVersion") + implementation("com.squareup.retrofit2:converter-gson:$retrofitVersion") + implementation("androidx.datastore:datastore-preferences:1.1.2") + implementation("androidx.datastore:datastore:1.1.2") +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 71dd361..481bb43 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -18,8 +18,4 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile --if class androidx.credentials.CredentialManager --keep class androidx.credentials.playservices.** { - *; -} +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/example/nto_minipigs/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/example/nto_minipigs/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..5dc810b --- /dev/null +++ b/app/src/androidTest/java/com/example/nto_minipigs/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.example.nto_minipigs + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.example.nto_minipigs", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a986978..4bffea7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,27 +1,24 @@ - - - - - + + android:name=".MainActivity" + android:exported="true" + android:label="@string/app_name" + android:theme="@style/Theme.Nto_minipigs"> diff --git a/app/src/main/java/com/example/nto_minipigs/LoginViewModel.kt b/app/src/main/java/com/example/nto_minipigs/LoginViewModel.kt new file mode 100644 index 0000000..1b05006 --- /dev/null +++ b/app/src/main/java/com/example/nto_minipigs/LoginViewModel.kt @@ -0,0 +1,23 @@ +package com.example.nto_minipigs + +import RetrofitClient +import android.util.Log +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.launch + +class LoginViewModel :ViewModel() { + private val serviceApi = RetrofitClient.apiService + + fun getData(status: String, func: () -> Unit) { + viewModelScope.launch { + try { + val response = serviceApi.auth(status) + Log.d("auth:", response.toString()) + func() + } catch (e: Exception) { + Log.d("exception:", e.toString()) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/nto_minipigs/MainActivity.kt b/app/src/main/java/com/example/nto_minipigs/MainActivity.kt new file mode 100644 index 0000000..7221dd6 --- /dev/null +++ b/app/src/main/java/com/example/nto_minipigs/MainActivity.kt @@ -0,0 +1,69 @@ +package com.example.nto_minipigs + +import android.content.Context +import android.content.SharedPreferences +import android.os.Bundle +import android.util.Log +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.intPreferencesKey +import androidx.datastore.preferences.preferencesDataStore +import androidx.lifecycle.ViewModelProvider +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController +import com.example.nto_minipigs.ui.screens.LoginScreen +import com.example.nto_minipigs.ui.theme.Nto_minipigsTheme +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map +import kotlinx.serialization.Serializable + +class MainActivity : ComponentActivity() { + val Context.dataStore: DataStore by preferencesDataStore(name = "settings") + val context = applicationContext + + val EXAMPLE_COUNTER = intPreferencesKey("example_counter") + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + val exampleCounterFlow: Flow = context.dataStore.data + .map { preferences -> + // No type safety. + preferences[EXAMPLE_COUNTER] ?: 0 + } + + enableEdgeToEdge() + setContent { + Nto_minipigsTheme { + val navController = rememberNavController() + val loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] + + NavHost( + navController = navController, + startDestination = Login + ) { + composable { LoginScreen( onNavigateToMain = { navController.navigate(route = Main)}, viewModel = loginViewModel ) } + composable
{ MainScreen() } + } + } + } + } +} + +@Serializable +object Login + +@Serializable +object Main + +@Composable +fun MainScreen() { + Text("Main") +} diff --git a/app/src/main/java/ru/myitschool/work/ApiService.kt b/app/src/main/java/com/example/nto_minipigs/Retrofit/ApiService.kt similarity index 77% rename from app/src/main/java/ru/myitschool/work/ApiService.kt rename to app/src/main/java/com/example/nto_minipigs/Retrofit/ApiService.kt index 46e41c8..f928313 100644 --- a/app/src/main/java/ru/myitschool/work/ApiService.kt +++ b/app/src/main/java/com/example/nto_minipigs/Retrofit/ApiService.kt @@ -1,11 +1,13 @@ -package ru.myitschool.work +package com.example.nto_minipigs.Retrofit + +import com.example.nto_minipigs.Retrofit.Models.Data import okhttp3.ResponseBody import retrofit2.http.Body import retrofit2.http.GET import retrofit2.http.PATCH import retrofit2.http.Path -interface ApiService { +public interface ApiService { @GET("/api/{LOGIN}/auth") suspend fun auth(@Path("LOGIN") login: String): ResponseBody diff --git a/app/src/main/java/com/example/nto_minipigs/Retrofit/Models/Data.kt b/app/src/main/java/com/example/nto_minipigs/Retrofit/Models/Data.kt new file mode 100644 index 0000000..2387c94 --- /dev/null +++ b/app/src/main/java/com/example/nto_minipigs/Retrofit/Models/Data.kt @@ -0,0 +1,5 @@ +package com.example.nto_minipigs.Retrofit.Models + +data class Data( + val value: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/User.kt b/app/src/main/java/com/example/nto_minipigs/Retrofit/Models/User.kt similarity index 76% rename from app/src/main/java/ru/myitschool/work/User.kt rename to app/src/main/java/com/example/nto_minipigs/Retrofit/Models/User.kt index 325c76d..0163f8f 100644 --- a/app/src/main/java/ru/myitschool/work/User.kt +++ b/app/src/main/java/com/example/nto_minipigs/Retrofit/Models/User.kt @@ -1,4 +1,4 @@ -package ru.myitschool.work +package com.example.nto_minipigs.Retrofit.Models data class User( val id: Int, diff --git a/app/src/main/java/ru/myitschool/work/RetrofitClient.kt b/app/src/main/java/com/example/nto_minipigs/Retrofit/RetrofitClient.kt similarity index 59% rename from app/src/main/java/ru/myitschool/work/RetrofitClient.kt rename to app/src/main/java/com/example/nto_minipigs/Retrofit/RetrofitClient.kt index d504d4a..820c2f4 100644 --- a/app/src/main/java/ru/myitschool/work/RetrofitClient.kt +++ b/app/src/main/java/com/example/nto_minipigs/Retrofit/RetrofitClient.kt @@ -1,7 +1,8 @@ -import ru.myitschool.work.core.Constants.SERVER_ADDRESS +import com.example.nto_minipigs.Retrofit.ApiService +import com.example.nto_minipigs.core.Constants.SERVER_ADDRESS import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory -import ru.myitschool.work.ApiService +import retrofit2.create object RetrofitClient { val baseUrl = SERVER_ADDRESS @@ -12,4 +13,5 @@ object RetrofitClient { .build() } + val apiService : ApiService = getInstance().create(ApiService::class.java) } \ No newline at end of file diff --git a/app/src/main/java/com/example/nto_minipigs/core/Constants.kt b/app/src/main/java/com/example/nto_minipigs/core/Constants.kt new file mode 100644 index 0000000..6bda110 --- /dev/null +++ b/app/src/main/java/com/example/nto_minipigs/core/Constants.kt @@ -0,0 +1,7 @@ +package com.example.nto_minipigs.core + +object Constants { + const val SHARED_PREFS = "shared_prefs" + const val EMAIL_KEY = "email_key" + const val SERVER_ADDRESS = "http://192.168.1.127:5000" +} \ No newline at end of file diff --git a/app/src/main/java/com/example/nto_minipigs/ui/screens/LoginScreen.kt b/app/src/main/java/com/example/nto_minipigs/ui/screens/LoginScreen.kt new file mode 100644 index 0000000..968e105 --- /dev/null +++ b/app/src/main/java/com/example/nto_minipigs/ui/screens/LoginScreen.kt @@ -0,0 +1,67 @@ +package com.example.nto_minipigs.ui.screens + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import com.example.nto_minipigs.ui.theme.Nto_minipigsTheme +import androidx.compose.runtime.getValue +import androidx.compose.runtime.setValue +import androidx.compose.ui.unit.dp +import com.example.nto_minipigs.LoginViewModel + +@Composable +fun LoginScreen( onNavigateToMain: () -> Unit, viewModel: LoginViewModel) { + Nto_minipigsTheme { + Surface { + Column( + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Text( + text = "MiniPigs", + style = MaterialTheme.typography.titleLarge, + modifier = Modifier.padding(bottom = 36.dp) + ) + + var login by remember { mutableStateOf("") } + var password by remember { mutableStateOf("") } + + OutlinedTextField( + value = login, + onValueChange = { login = it }, + label = { Text("Login") }, + modifier = Modifier.padding(bottom = 4.dp), + shape = RoundedCornerShape(12.dp) + ) + + OutlinedTextField( + value = password, + onValueChange = { password = it }, + label = { Text("Password") }, + modifier = Modifier.padding(bottom = 12.dp), + shape = RoundedCornerShape(12.dp), + ) + + Button( + onClick = { viewModel.getData(login, onNavigateToMain) }, + shape = RoundedCornerShape(12.dp), + ) { + Text(text = "Sign In", style = MaterialTheme.typography.bodyLarge) + } + } + } + } +} diff --git a/app/src/main/java/com/example/nto_minipigs/ui/screens/MainScreen.kt b/app/src/main/java/com/example/nto_minipigs/ui/screens/MainScreen.kt new file mode 100644 index 0000000..d0605ef --- /dev/null +++ b/app/src/main/java/com/example/nto_minipigs/ui/screens/MainScreen.kt @@ -0,0 +1,66 @@ +package com.example.nto_minipigs.ui.screens + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import com.example.nto_minipigs.ui.theme.Nto_minipigsTheme +import androidx.compose.runtime.getValue +import androidx.compose.runtime.setValue +import androidx.compose.ui.unit.dp + +@Composable +fun MainScreen( onNavigateToMain: () -> Unit ) { + Nto_minipigsTheme { + Surface { + Column( + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Text( + text = "MiniPigs", + style = MaterialTheme.typography.titleLarge, + modifier = Modifier.padding(bottom = 36.dp) + ) + + var login by remember { mutableStateOf("") } + var password by remember { mutableStateOf("") } + + OutlinedTextField( + value = login, + onValueChange = { login = it }, + label = { Text("Login") }, + modifier = Modifier.padding(bottom = 4.dp), + shape = RoundedCornerShape(12.dp) + ) + + OutlinedTextField( + value = password, + onValueChange = { password = it }, + label = { Text("Password") }, + modifier = Modifier.padding(bottom = 12.dp), + shape = RoundedCornerShape(12.dp), + ) + + Button( + onClick = { onNavigateToMain() }, + shape = RoundedCornerShape(12.dp), + ) { + Text(text = "Sign In", style = MaterialTheme.typography.bodyLarge) + } + } + } + } +} diff --git a/app/src/main/java/com/example/nto_minipigs/ui/theme/Color.kt b/app/src/main/java/com/example/nto_minipigs/ui/theme/Color.kt new file mode 100644 index 0000000..e7a0730 --- /dev/null +++ b/app/src/main/java/com/example/nto_minipigs/ui/theme/Color.kt @@ -0,0 +1,11 @@ +package com.example.nto_minipigs.ui.theme + +import androidx.compose.ui.graphics.Color + +val Purple80 = Color(0xFFD0BCFF) +val PurpleGrey80 = Color(0xFFCCC2DC) +val Pink80 = Color(0xFFEFB8C8) + +val Purple40 = Color(0xFF6650a4) +val PurpleGrey40 = Color(0xFF625b71) +val Pink40 = Color(0xFF7D5260) \ No newline at end of file diff --git a/app/src/main/java/com/example/nto_minipigs/ui/theme/Theme.kt b/app/src/main/java/com/example/nto_minipigs/ui/theme/Theme.kt new file mode 100644 index 0000000..54ab34e --- /dev/null +++ b/app/src/main/java/com/example/nto_minipigs/ui/theme/Theme.kt @@ -0,0 +1,58 @@ +package com.example.nto_minipigs.ui.theme + +import android.app.Activity +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext + +private val DarkColorScheme = darkColorScheme( + primary = Purple80, + secondary = PurpleGrey80, + tertiary = Pink80 +) + +private val LightColorScheme = lightColorScheme( + primary = Purple40, + secondary = PurpleGrey40, + tertiary = Pink40 + + /* Other default colors to override + background = Color(0xFFFFFBFE), + surface = Color(0xFFFFFBFE), + onPrimary = Color.White, + onSecondary = Color.White, + onTertiary = Color.White, + onBackground = Color(0xFF1C1B1F), + onSurface = Color(0xFF1C1B1F), + */ +) + +@Composable +fun Nto_minipigsTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + // Dynamic color is available on Android 12+ + dynamicColor: Boolean = true, + content: @Composable () -> Unit +) { + val colorScheme = when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + + darkTheme -> DarkColorScheme + else -> LightColorScheme + } + + MaterialTheme( + colorScheme = colorScheme, + typography = Typography, + content = content + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/nto_minipigs/ui/theme/Type.kt b/app/src/main/java/com/example/nto_minipigs/ui/theme/Type.kt new file mode 100644 index 0000000..2df7cf7 --- /dev/null +++ b/app/src/main/java/com/example/nto_minipigs/ui/theme/Type.kt @@ -0,0 +1,34 @@ +package com.example.nto_minipigs.ui.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +// Set of Material typography styles to start with +val Typography = Typography( + bodyLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ) + /* Other default text styles to override + titleLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 22.sp, + lineHeight = 28.sp, + letterSpacing = 0.sp + ), + labelSmall = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp + ) + */ +) \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/App.kt b/app/src/main/java/ru/myitschool/work/App.kt deleted file mode 100644 index 3085135..0000000 --- a/app/src/main/java/ru/myitschool/work/App.kt +++ /dev/null @@ -1,7 +0,0 @@ -package ru.myitschool.work - -import android.app.Application -import dagger.hilt.android.HiltAndroidApp - -@HiltAndroidApp -class App : Application() \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/Data.kt b/app/src/main/java/ru/myitschool/work/Data.kt deleted file mode 100644 index 33832e8..0000000 --- a/app/src/main/java/ru/myitschool/work/Data.kt +++ /dev/null @@ -1,5 +0,0 @@ -package ru.myitschool.work - -data class Data( - val value: String -) \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/core/Constants.kt b/app/src/main/java/ru/myitschool/work/core/Constants.kt deleted file mode 100644 index 9ebbf50..0000000 --- a/app/src/main/java/ru/myitschool/work/core/Constants.kt +++ /dev/null @@ -1,5 +0,0 @@ -package ru.myitschool.work.core -// БЕРИТЕ И ИЗМЕНЯЙТЕ ХОСТ ТОЛЬКО ЗДЕСЬ И НЕ БЕРИТЕ ИЗ ДРУГИХ МЕСТ. ФАЙЛ ПЕРЕМЕЩАТЬ НЕЛЬЗЯ -object Constants { - const val SERVER_ADDRESS = "http://172.31.254.138:8090" -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/core/env.kt b/app/src/main/java/ru/myitschool/work/core/env.kt deleted file mode 100644 index 33b641a..0000000 --- a/app/src/main/java/ru/myitschool/work/core/env.kt +++ /dev/null @@ -1,6 +0,0 @@ -package ru.myitschool.work.core - -object env { - const val SHARED_PREFS = "shared_prefs" - const val EMAIL_KEY = "email_key" -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt b/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt deleted file mode 100644 index 851baac..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt +++ /dev/null @@ -1,90 +0,0 @@ -package ru.myitschool.work.ui - -import RetrofitClient -import android.os.Bundle -import android.content.Context -import android.content.Intent -import android.content.SharedPreferences -import android.util.Log -import androidx.activity.OnBackPressedCallback -import androidx.appcompat.app.AppCompatActivity -import androidx.fragment.app.FragmentActivity -import androidx.fragment.app.FragmentManager -import androidx.navigation.NavController -import androidx.navigation.createGraph -import androidx.navigation.findNavController -import androidx.navigation.fragment.NavHostFragment -import androidx.navigation.fragment.fragment -import dagger.hilt.android.AndroidEntryPoint -import ru.myitschool.work.R -import ru.myitschool.work.ui.login.LoginDestination -import ru.myitschool.work.ui.login.LoginFragment -import ru.myitschool.work.ui.main.MainDestination -import ru.myitschool.work.ui.main.MainFragment -import ru.myitschool.work.ui.qr.scan.QrScanDestination -import ru.myitschool.work.ui.qr.scan.QrScanFragment -import ru.myitschool.work.core.env.SHARED_PREFS -import ru.myitschool.work.core.env.EMAIL_KEY -import ru.myitschool.work.ui.qr.results.QrResultDestination -import ru.myitschool.work.ui.qr.results.QrResultFragment - -// НЕ ИЗМЕНЯЙТЕ НАЗВАНИЕ КЛАССА! -@AndroidEntryPoint -class RootActivity : AppCompatActivity() { - private lateinit var sharedpreferences: SharedPreferences - public lateinit var navController: NavController - private var username: String? = null - - var qrData = "" - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - sharedpreferences = getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE) - username = sharedpreferences.getString(EMAIL_KEY, null) - - setContentView(R.layout.activity_root) - - val navHostFragment = supportFragmentManager - .findFragmentById(R.id.nav_host_fragment) as NavHostFragment? - - navController = navHostFragment?.navController!! - - if (navHostFragment != null) { - navController?.graph = navController?.createGraph( - startDestination = if (username != null) MainDestination else LoginDestination - ) { - fragment() - fragment() - fragment() - fragment() - }!! - -// navController.navigate(QrResultDestination) - } - - onBackPressedDispatcher.addCallback( - this, - object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - onSupportNavigateUp() - } - } - ) - } - - override fun onSupportNavigateUp(): Boolean { - val popBackResult = if (navController.previousBackStackEntry != null) { - navController.popBackStack() - } else { - false - } - return popBackResult || super.onSupportNavigateUp() - } - - public fun navigate(a: Int, b: androidx.fragment.app.Fragment) { - supportFragmentManager.beginTransaction() - .replace(a, b) - .commit() - } -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/login/LoginDestination.kt b/app/src/main/java/ru/myitschool/work/ui/login/LoginDestination.kt deleted file mode 100644 index 50acfb0..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/login/LoginDestination.kt +++ /dev/null @@ -1,6 +0,0 @@ -package ru.myitschool.work.ui.login - -import kotlinx.serialization.Serializable - -@Serializable -data object LoginDestination \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt b/app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt deleted file mode 100644 index f43a55e..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt +++ /dev/null @@ -1,91 +0,0 @@ -package ru.myitschool.work.ui.login - -import RetrofitClient -import RetrofitClient.getInstance -import android.content.Context -import android.content.SharedPreferences -import android.os.Bundle -import android.util.Log -import android.view.View -import androidx.core.widget.addTextChangedListener -import androidx.fragment.app.Fragment -import androidx.fragment.app.viewModels -import androidx.lifecycle.lifecycleScope -import androidx.navigation.NavController -import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext -import ru.myitschool.work.R -import ru.myitschool.work.databinding.FragmentLoginBinding -import ru.myitschool.work.ui.RootActivity -import ru.myitschool.work.ui.main.MainFragment -import ru.myitschool.work.ApiService -import ru.myitschool.work.core.env.EMAIL_KEY -import ru.myitschool.work.core.env.SHARED_PREFS -import ru.myitschool.work.ui.main.MainDestination -import ru.myitschool.work.ui.qr.scan.QrScanDestination - -@AndroidEntryPoint -class LoginFragment : Fragment(R.layout.fragment_login) { - private lateinit var sharedpreferences: SharedPreferences - - private var _binding: FragmentLoginBinding? = null - private val binding: FragmentLoginBinding get() = _binding!! - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - _binding = FragmentLoginBinding.bind(view) - - binding.login.setOnClickListener(View.OnClickListener { - handleLogin() - }) - - binding.username.addTextChangedListener { - val name = binding.username.text.toString() - if(name != "" && name.length >= 3 && !isNumericToX(name[0].toString()) && name.matches(Regex("^[A-Za-z0-9]+\$"))) { - binding.login.isEnabled = true - binding.login.isClickable = true - } else { - binding.login.isEnabled = false - binding.login.isClickable = false - } - } - } - - fun isNumericToX(toCheck: String): Boolean { - return toCheck.toDoubleOrNull() != null - } - - private fun handleLogin() { - binding.loading.visibility = View.VISIBLE - binding.fields.visibility = View.GONE - - sharedpreferences = activity?.getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE)!! - - MainScope().launch { - try { - val apiInterface = getInstance().create(ApiService::class.java) - val result = apiInterface.auth(binding.username.text.toString()) - with(sharedpreferences.edit()) { - putString(EMAIL_KEY, binding.username.text.toString()) - apply() - } - (activity as RootActivity).navController?.popBackStack() - (activity as RootActivity).navController?.navigate(MainDestination) - } catch (e: Exception) { - binding.loading.visibility = View.GONE - binding.fields.visibility = View.VISIBLE - binding.error.visibility = View.VISIBLE - binding.error.text = e.toString() - } - } - } - - override fun onDestroyView() { - _binding = null - super.onDestroyView() - } -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt deleted file mode 100644 index 3a53d6c..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt +++ /dev/null @@ -1,17 +0,0 @@ -package ru.myitschool.work.ui.login - -import android.content.Context -import androidx.lifecycle.ViewModel -import dagger.hilt.android.lifecycle.HiltViewModel -import dagger.hilt.android.qualifiers.ApplicationContext -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import javax.inject.Inject - -@HiltViewModel -class LoginViewModel @Inject constructor( - @ApplicationContext private val context: Context, -) : ViewModel() { - private val _state = MutableStateFlow(true) - val state = _state.asStateFlow() -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/main/MainDestination.kt b/app/src/main/java/ru/myitschool/work/ui/main/MainDestination.kt deleted file mode 100644 index a044334..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/main/MainDestination.kt +++ /dev/null @@ -1,6 +0,0 @@ -package ru.myitschool.work.ui.main - -import kotlinx.serialization.Serializable - -@Serializable -data object MainDestination \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt b/app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt deleted file mode 100644 index 4d0606e..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt +++ /dev/null @@ -1,112 +0,0 @@ -package ru.myitschool.work.ui.main - -import RetrofitClient.getInstance -import android.content.Context -import android.content.Intent -import android.content.SharedPreferences -import android.os.Bundle -import android.util.Log -import android.view.View -import android.widget.ImageView -import androidx.activity.result.contract.ActivityResultContracts -import androidx.fragment.app.Fragment -import androidx.fragment.app.setFragmentResultListener -import androidx.lifecycle.lifecycleScope -import com.google.gson.Gson -import com.squareup.picasso.Picasso -import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.async -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext -import okhttp3.Response -import ru.myitschool.work.ApiService -import ru.myitschool.work.R -import ru.myitschool.work.User -import ru.myitschool.work.core.env.EMAIL_KEY -import ru.myitschool.work.core.env.SHARED_PREFS -import ru.myitschool.work.databinding.FragmentMainBinding -import ru.myitschool.work.ui.RootActivity -import ru.myitschool.work.ui.login.LoginDestination -import ru.myitschool.work.ui.login.LoginFragment -import ru.myitschool.work.ui.qr.results.QrResultDestination -import ru.myitschool.work.ui.qr.scan.QrScanDestination -import ru.myitschool.work.ui.qr.scan.QrScanFragment -import java.time.LocalDateTime -import java.time.format.DateTimeFormatter - -@AndroidEntryPoint -class MainFragment: Fragment(R.layout.fragment_main) { - private var _binding: FragmentMainBinding? = null - private val binding: FragmentMainBinding get() = _binding!! - - private lateinit var sharedpreferences: SharedPreferences - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - _binding = FragmentMainBinding.bind(view) - sharedpreferences = activity?.getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE)!! - - refresh() - binding.logout.setOnClickListener(View.OnClickListener { - with(sharedpreferences.edit()) { - clear() - apply() - } - (activity as RootActivity).navController?.popBackStack() - (activity as RootActivity).navController?.navigate(LoginDestination) - }) - - binding.scan.setOnClickListener(View.OnClickListener { - (activity as RootActivity).navController?.navigate(QrScanDestination) - }) - - binding.refresh.setOnClickListener(View.OnClickListener { - refresh() - }) - - setFragmentResultListener(QrScanDestination.REQUEST_KEY) { requestKey, bundle -> - val result = bundle.getString("key_qr") - if(result != null) { - (activity as RootActivity).qrData = result.toString() - (activity as RootActivity).navController?.navigate(QrResultDestination) - } - } - } - - fun refresh() { - val username = sharedpreferences.getString(EMAIL_KEY, null) - val gson = Gson() - - MainScope().launch { - val task = async { - try { - val apiInterface = getInstance().create(ApiService::class.java) - val response = apiInterface.info(""+username) - return@async response - } catch (e: Exception) { - binding.innerFields.visibility = View.GONE - binding.error.visibility = View.VISIBLE - binding.error.text = e.toString() - return@async null - } - } - val info = gson.fromJson(task.await()?.string(), User::class.java) - if(info != null) { - withContext(Dispatchers.Main) { - binding.error.visibility = View.GONE - binding.innerFields.visibility = View.VISIBLE - - binding.fullname.text = info.name - binding.position.text = info.position - val time = LocalDateTime.parse(info.lastVisit).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")) - binding.lastEntry.text = time.toString() - val imageView: ImageView = binding.photo - Picasso.get().load(info.photo).into(imageView) - } - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt deleted file mode 100644 index 0a8f655..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt +++ /dev/null @@ -1,17 +0,0 @@ -package ru.myitschool.work.ui.main - -import android.content.Context -import androidx.lifecycle.ViewModel -import dagger.hilt.android.lifecycle.HiltViewModel -import dagger.hilt.android.qualifiers.ApplicationContext -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import javax.inject.Inject - -@HiltViewModel -class MainViewModel @Inject constructor( - @ApplicationContext private val context: Context, -) : ViewModel() { - private val _state = MutableStateFlow(true) - val state = _state.asStateFlow() -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/qr/results/QrResultDestination.kt b/app/src/main/java/ru/myitschool/work/ui/qr/results/QrResultDestination.kt deleted file mode 100644 index 70e282b..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/qr/results/QrResultDestination.kt +++ /dev/null @@ -1,6 +0,0 @@ -package ru.myitschool.work.ui.qr.results -import kotlinx.serialization.Serializable - -@Serializable -object QrResultDestination { -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/qr/results/QrResultFragment.kt b/app/src/main/java/ru/myitschool/work/ui/qr/results/QrResultFragment.kt deleted file mode 100644 index d0c1d45..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/qr/results/QrResultFragment.kt +++ /dev/null @@ -1,63 +0,0 @@ -package ru.myitschool.work.ui.qr.results - -import RetrofitClient.getInstance -import android.content.Context -import android.content.SharedPreferences -import android.os.Bundle -import android.view.View -import androidx.fragment.app.Fragment -import kotlinx.coroutines.MainScope -import kotlinx.coroutines.launch -import ru.myitschool.work.ApiService -import ru.myitschool.work.Data -import ru.myitschool.work.R -import ru.myitschool.work.core.env.EMAIL_KEY -import ru.myitschool.work.core.env.SHARED_PREFS -import ru.myitschool.work.databinding.FragmentMainBinding -import ru.myitschool.work.databinding.FragmentQrResultBinding -import ru.myitschool.work.databinding.FragmentQrScanBinding -import ru.myitschool.work.ui.RootActivity -import ru.myitschool.work.ui.login.LoginDestination -import ru.myitschool.work.ui.main.MainDestination -import ru.myitschool.work.ui.qr.scan.QrScanDestination - -class QrResultFragment: Fragment(R.layout.fragment_qr_result) { - private var _binding: FragmentQrResultBinding? = null - private lateinit var sharedpreferences: SharedPreferences - private val binding: FragmentQrResultBinding get() = _binding!! - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - _binding = FragmentQrResultBinding.bind(view) - - sharedpreferences = activity?.getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE)!! - - val username = sharedpreferences.getString(EMAIL_KEY, null) - val data = (activity as RootActivity).qrData - - if(data == "" || data == "Отмена") { - binding.result.text = resources.getString(R.string.canceled) - } else { - MainScope().launch { - try { - val apiInterface = getInstance().create(ApiService::class.java) - val req: Data = Data(data) - val result = apiInterface.open(req, ""+username) - binding.result.text = resources.getString(R.string.success) - } catch (e: Exception) { - binding.result.text = resources.getString(R.string.smthwr) - } - } - } - - (activity as RootActivity).qrData = "null" - - binding.close.setOnClickListener(View.OnClickListener { - goBack() - }) - } - - private fun goBack() { - (activity as RootActivity).navController?.popBackStack() - } -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/qr/results/QrResultViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/qr/results/QrResultViewModel.kt deleted file mode 100644 index 31669f4..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/qr/results/QrResultViewModel.kt +++ /dev/null @@ -1,17 +0,0 @@ -package ru.myitschool.work.ui.main - -import android.content.Context -import androidx.lifecycle.ViewModel -import dagger.hilt.android.lifecycle.HiltViewModel -import dagger.hilt.android.qualifiers.ApplicationContext -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import javax.inject.Inject - -@HiltViewModel -class QrResultViewModel @Inject constructor( - @ApplicationContext private val context: Context, -) : ViewModel() { - private val _state = MutableStateFlow(true) - val state = _state.asStateFlow() -} diff --git a/app/src/main/java/ru/myitschool/work/ui/qr/scan/QrScanDestination.kt b/app/src/main/java/ru/myitschool/work/ui/qr/scan/QrScanDestination.kt deleted file mode 100644 index 7e34b28..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/qr/scan/QrScanDestination.kt +++ /dev/null @@ -1,30 +0,0 @@ -package ru.myitschool.work.ui.qr.scan - -import android.os.Bundle -import androidx.core.os.bundleOf -import kotlinx.serialization.Serializable - -// НЕ ИЗМЕНЯЙТЕ ЭТОТ ФАЙЛ. В ТЕСТАХ ОН БУДЕМ ВОЗВРАЩЁН В ИСХОДНОЕ СОСТОЯНИЕ -@Serializable -data object QrScanDestination { - const val REQUEST_KEY = "qr_result" - private const val KEY_QR_DATA = "key_qr" - - fun newInstance(): QrScanFragment { - return QrScanFragment() - } - - fun getDataIfExist(bundle: Bundle): String? { - return if (bundle.containsKey(KEY_QR_DATA)) { - bundle.getString(KEY_QR_DATA) - } else { - null - } - } - - internal fun packToBundle(data: String): Bundle { - return bundleOf( - KEY_QR_DATA to data - ) - } -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/qr/scan/QrScanFragment.kt b/app/src/main/java/ru/myitschool/work/ui/qr/scan/QrScanFragment.kt deleted file mode 100644 index de438a8..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/qr/scan/QrScanFragment.kt +++ /dev/null @@ -1,140 +0,0 @@ -package ru.myitschool.work.ui.qr.scan - -import android.os.Bundle -import android.util.Log -import android.view.View -import androidx.activity.result.contract.ActivityResultContracts -import androidx.camera.core.ImageAnalysis -import androidx.camera.mlkit.vision.MlKitAnalyzer -import androidx.camera.view.LifecycleCameraController -import androidx.camera.view.PreviewView -import androidx.core.content.ContextCompat -import androidx.core.os.bundleOf -import androidx.fragment.app.Fragment -import androidx.fragment.app.setFragmentResult -import androidx.fragment.app.viewModels -import androidx.navigation.NavController -import androidx.navigation.fragment.findNavController -import com.google.mlkit.vision.barcode.BarcodeScanner -import com.google.mlkit.vision.barcode.BarcodeScannerOptions -import com.google.mlkit.vision.barcode.BarcodeScanning -import com.google.mlkit.vision.barcode.common.Barcode -import ru.myitschool.work.R -import ru.myitschool.work.databinding.FragmentQrScanBinding -import ru.myitschool.work.utils.collectWhenStarted -import ru.myitschool.work.utils.visibleOrGone - -// НЕ ИЗМЕНЯЙТЕ ЭТОТ ФАЙЛ. В ТЕСТАХ ОН БУДЕМ ВОЗВРАЩЁН В ИСХОДНОЕ СОСТОЯНИЕ -class QrScanFragment : Fragment(R.layout.fragment_qr_scan) { - private var _binding: FragmentQrScanBinding? = null - private val binding: FragmentQrScanBinding get() = _binding!! - - private var barcodeScanner: BarcodeScanner? = null - private var isCameraInit: Boolean = false - private val permissionLauncher = registerForActivityResult( - ActivityResultContracts.RequestPermission() - ) { isGranted -> viewModel.onPermissionResult(isGranted) } - - private val viewModel: QrScanViewModel by viewModels() - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - _binding = FragmentQrScanBinding.bind(view) - sendResult(bundleOf()) - subscribe() - initCallback() - } - - private fun initCallback() { - binding.close.setOnClickListener { viewModel.close() } - } - - private fun subscribe() { - viewModel.state.collectWhenStarted(this) { state -> - binding.loading.visibleOrGone(state is QrScanViewModel.State.Loading) - binding.viewFinder.visibleOrGone(state is QrScanViewModel.State.Scan) - if (!isCameraInit && state is QrScanViewModel.State.Scan) { - startCamera() - isCameraInit = true - } - } - - viewModel.action.collectWhenStarted(this) { action -> - when (action) { - is QrScanViewModel.Action.RequestPermission -> requestPermission(action.permission) - is QrScanViewModel.Action.CloseWithCancel -> { - goBack() - } - is QrScanViewModel.Action.CloseWithResult -> { - sendResult(QrScanDestination.packToBundle(action.result)) - goBack() - } - } - } - } - - private fun requestPermission(permission: String) { - permissionLauncher.launch(permission) - } - - private fun startCamera() { - val context = requireContext() - val cameraController = LifecycleCameraController(context) - val previewView: PreviewView = binding.viewFinder - val executor = ContextCompat.getMainExecutor(context) - - val options = BarcodeScannerOptions.Builder() - .setBarcodeFormats(Barcode.FORMAT_QR_CODE) - .build() - val barcodeScanner = BarcodeScanning.getClient(options) - this.barcodeScanner = barcodeScanner - - cameraController.setImageAnalysisAnalyzer( - executor, - MlKitAnalyzer( - listOf(barcodeScanner), - ImageAnalysis.COORDINATE_SYSTEM_VIEW_REFERENCED, - executor - ) { result -> - result?.getValue(barcodeScanner)?.firstOrNull()?.let { value -> - viewModel.findBarcode(value) - - } - } - ) - - cameraController.bindToLifecycle(this) - previewView.controller = cameraController - } - - override fun onDestroyView() { - barcodeScanner?.close() - barcodeScanner = null - _binding = null - super.onDestroyView() - } - - private fun goBack() { - findNavControllerOrNull()?.popBackStack() - ?: requireActivity().onBackPressedDispatcher.onBackPressed() - } - - private fun sendResult(bundle: Bundle) { - setFragmentResult( - QrScanDestination.REQUEST_KEY, - bundle - ) - findNavControllerOrNull() - ?.previousBackStackEntry - ?.savedStateHandle - ?.set(QrScanDestination.REQUEST_KEY, bundle) - } - - private fun findNavControllerOrNull(): NavController? { - return try { - findNavController() - } catch (_: Throwable) { - null - } - } -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/qr/scan/QrScanViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/qr/scan/QrScanViewModel.kt deleted file mode 100644 index 14565ab..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/qr/scan/QrScanViewModel.kt +++ /dev/null @@ -1,93 +0,0 @@ -package ru.myitschool.work.ui.qr.scan - -import android.Manifest -import android.app.Application -import android.content.pm.PackageManager -import androidx.core.content.ContextCompat -import androidx.lifecycle.AndroidViewModel -import androidx.lifecycle.viewModelScope -import com.google.mlkit.vision.barcode.common.Barcode -import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asSharedFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.update -import kotlinx.coroutines.launch -import ru.myitschool.work.utils.MutablePublishFlow - -// НЕ ИЗМЕНЯЙТЕ ЭТОТ ФАЙЛ. В ТЕСТАХ ОН БУДЕМ ВОЗВРАЩЁН В ИСХОДНОЕ СОСТОЯНИЕ -class QrScanViewModel( - application: Application -) : AndroidViewModel(application) { - - private val _action = MutablePublishFlow() - val action = _action.asSharedFlow() - - private val _state = MutableStateFlow(initialState) - val state = _state.asStateFlow() - - init { - checkPermission() - } - - fun onPermissionResult(isGranted: Boolean) { - viewModelScope.launch { - if (isGranted) { - _state.update { State.Scan } - } else { - _action.emit(Action.CloseWithCancel) - } - } - } - - private fun checkPermission() { - viewModelScope.launch { - val isPermissionGranted = ContextCompat.checkSelfPermission( - getApplication(), - CAMERA_PERMISSION - ) == PackageManager.PERMISSION_GRANTED - if (isPermissionGranted) { - _state.update { State.Scan } - } else { - delay(1000) - _action.emit(Action.RequestPermission(CAMERA_PERMISSION)) - } - } - } - - fun findBarcode(barcode: Barcode) { - viewModelScope.launch { - barcode.rawValue?.let { value -> - _action.emit(Action.CloseWithResult(value)) - } - } - } - - fun close() { - viewModelScope.launch { - _action.emit(Action.CloseWithCancel) - } - } - - sealed interface State { - data object Loading : State - - data object Scan : State - } - - sealed interface Action { - data class RequestPermission( - val permission: String - ) : Action - data object CloseWithCancel : Action - data class CloseWithResult( - val result: String - ) : Action - } - - private companion object { - val initialState = State.Loading - - const val CAMERA_PERMISSION = Manifest.permission.CAMERA - } -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/utils/FlowExtensions.kt b/app/src/main/java/ru/myitschool/work/utils/FlowExtensions.kt deleted file mode 100644 index 87bccc2..0000000 --- a/app/src/main/java/ru/myitschool/work/utils/FlowExtensions.kt +++ /dev/null @@ -1,10 +0,0 @@ -package ru.myitschool.work.utils - -import kotlinx.coroutines.channels.BufferOverflow -import kotlinx.coroutines.flow.MutableSharedFlow - -fun MutablePublishFlow() = MutableSharedFlow( - replay = 0, - extraBufferCapacity = 1, - BufferOverflow.DROP_OLDEST -) \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/utils/FragmentExtesions.kt b/app/src/main/java/ru/myitschool/work/utils/FragmentExtesions.kt deleted file mode 100644 index 927380c..0000000 --- a/app/src/main/java/ru/myitschool/work/utils/FragmentExtesions.kt +++ /dev/null @@ -1,18 +0,0 @@ -package ru.myitschool.work.utils - -import androidx.fragment.app.Fragment -import androidx.lifecycle.flowWithLifecycle -import androidx.lifecycle.lifecycleScope -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.launch - -inline fun Flow.collectWhenStarted( - fragment: Fragment, - crossinline collector: (T) -> Unit -) { - fragment.viewLifecycleOwner.lifecycleScope.launch { - flowWithLifecycle(fragment.viewLifecycleOwner.lifecycle).collect { value -> - collector.invoke(value) - } - } -} diff --git a/app/src/main/java/ru/myitschool/work/utils/TextChangedListener.kt b/app/src/main/java/ru/myitschool/work/utils/TextChangedListener.kt deleted file mode 100644 index c81147d..0000000 --- a/app/src/main/java/ru/myitschool/work/utils/TextChangedListener.kt +++ /dev/null @@ -1,12 +0,0 @@ -package ru.myitschool.work.utils - -import android.text.Editable -import android.text.TextWatcher - -open class TextChangedListener: TextWatcher { - override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) = Unit - - override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) = Unit - - override fun afterTextChanged(s: Editable?) = Unit -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/utils/ViewExtensions.kt b/app/src/main/java/ru/myitschool/work/utils/ViewExtensions.kt deleted file mode 100644 index 5c38f67..0000000 --- a/app/src/main/java/ru/myitschool/work/utils/ViewExtensions.kt +++ /dev/null @@ -1,7 +0,0 @@ -package ru.myitschool.work.utils - -import android.view.View - -fun View.visibleOrGone(isVisible: Boolean) { - this.visibility = if (isVisible) View.VISIBLE else View.GONE -} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_close.xml b/app/src/main/res/drawable/ic_close.xml deleted file mode 100644 index f8ca0c6..0000000 --- a/app/src/main/res/drawable/ic_close.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_logout.xml b/app/src/main/res/drawable/ic_logout.xml deleted file mode 100644 index c22a96f..0000000 --- a/app/src/main/res/drawable/ic_logout.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_no_img.xml b/app/src/main/res/drawable/ic_no_img.xml deleted file mode 100644 index 44206c9..0000000 --- a/app/src/main/res/drawable/ic_no_img.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_qr_code.xml b/app/src/main/res/drawable/ic_qr_code.xml deleted file mode 100644 index b03f9ae..0000000 --- a/app/src/main/res/drawable/ic_qr_code.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_refresh.xml b/app/src/main/res/drawable/ic_refresh.xml deleted file mode 100644 index 86504d0..0000000 --- a/app/src/main/res/drawable/ic_refresh.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_rounded.xml b/app/src/main/res/drawable/ic_rounded.xml deleted file mode 100644 index 8877b62..0000000 --- a/app/src/main/res/drawable/ic_rounded.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/app/src/main/res/layout/activity_root.xml b/app/src/main/res/layout/activity_root.xml deleted file mode 100644 index 0bf7f5b..0000000 --- a/app/src/main/res/layout/activity_root.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml deleted file mode 100644 index 5c85e8a..0000000 --- a/app/src/main/res/layout/fragment_login.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - -