Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
plugins {
alias(libs.plugins.androidApplication)
alias(libs.plugins.jetbrainsKotlinAndroid)
id ("kotlin-kapt")
id ("com.google.dagger.hilt.android")

}

android {
Expand Down Expand Up @@ -51,6 +54,32 @@ android {

dependencies {

//Dagger-Hilt
implementation("com.google.dagger:hilt-android:2.46.1")
implementation("androidx.hilt:hilt-navigation-compose:1.1.0")
kapt("com.google.dagger:hilt-compiler:2.46.1")
kapt("androidx.hilt:hilt-compiler:1.1.0")
//Room
implementation ("androidx.room:room-runtime:2.5.0")
implementation ("androidx.room:room-ktx:2.5.0")
kapt("androidx.room:room-compiler:2.5.0")
//MOSHI
implementation ("com.squareup.moshi:moshi:1.12.0")
implementation ("com.squareup.moshi:moshi-kotlin:1.12.0")

//RETROFIT
implementation ("com.squareup.retrofit2:converter-moshi:2.9.0")
implementation ("com.squareup.retrofit2:retrofit:2.9.0")
implementation ("com.squareup.okhttp3:okhttp:4.9.0")

//Compose Dependencies
implementation("androidx.compose.runtime:runtime-livedata:1.5.4") //вот эту добавил
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1")
implementation("androidx.navigation:navigation-compose:2.5.3")
implementation("androidx.constraintlayout:constraintlayout-compose:1.0.1")
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.5.1")


implementation(libs.androidx.core.ktx)
implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.androidx.activity.compose)
Expand Down
3 changes: 2 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:name=".MyApplication"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
Expand Down
23 changes: 7 additions & 16 deletions app/src/main/java/com/serpak/absolut_app/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.serpak.absolut_app


import AppNavigation
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
Expand All @@ -10,8 +12,12 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview

import com.serpak.absolut_app.screens.CreateStoreScreen
import com.serpak.absolut_app.ui.theme.Absolut_appTheme
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand All @@ -22,25 +28,10 @@ class MainActivity : ComponentActivity() {
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
Greeting("Android")
AppNavigation()
}
}
}
}
}

@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
Text(
text = "Hello $name!",
modifier = modifier
)
}

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
Absolut_appTheme {
Greeting("Android")
}
}
8 changes: 8 additions & 0 deletions app/src/main/java/com/serpak/absolut_app/MyApplication.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.serpak.absolut_app

import android.app.Application
import dagger.hilt.android.HiltAndroidApp

@HiltAndroidApp
class MyApplication: Application() {
}
68 changes: 68 additions & 0 deletions app/src/main/java/com/serpak/absolut_app/di/ApiModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.serpak.absolut_app.di

import android.content.SharedPreferences
import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import java.util.concurrent.TimeUnit
import javax.inject.Singleton


@Module
@InstallIn(SingletonComponent::class)
object ApiModule {

private const val BASE_URL = "http://127.0.0.1:8000/api/v1/"

@Provides
@Singleton
fun provideAuthInterceptor(sharedPreferences: SharedPreferences):AuthInterceptor{
return AuthInterceptor(sharedPreferences)
}

@Provides
@Singleton
fun provideOkHttpClient(authInterceptor: AuthInterceptor): OkHttpClient{
return OkHttpClient.Builder()
.addInterceptor(authInterceptor)
.connectTimeout(5, TimeUnit.SECONDS)
.readTimeout(5, TimeUnit.SECONDS)
.writeTimeout(5, TimeUnit.SECONDS)
.build()
}

@Provides
@Singleton
fun provideKotlinJsonAdapterFactory(): KotlinJsonAdapterFactory = KotlinJsonAdapterFactory()

@Provides
@Singleton
fun provideMoshi(kotlinJsonAdapterFactory: KotlinJsonAdapterFactory): Moshi = Moshi.Builder()
.add(kotlinJsonAdapterFactory)
.build()

@Provides
@Singleton
fun provideMoshiConverterFactory(moshi: Moshi):MoshiConverterFactory = MoshiConverterFactory
.create(moshi)

@Provides
@Singleton
fun providerRetrofitClient(
okHttpClient: OkHttpClient,
moshiConverterFactory: MoshiConverterFactory
): Retrofit{
return Retrofit.Builder()
.addConverterFactory(moshiConverterFactory)
.client(okHttpClient)
.baseUrl(BASE_URL)
.build()
}

}
4 changes: 4 additions & 0 deletions app/src/main/java/com/serpak/absolut_app/di/AppModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.serpak.absolut_app.di

object AppModule {
}
18 changes: 18 additions & 0 deletions app/src/main/java/com/serpak/absolut_app/di/AuthInterceptor.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.serpak.absolut_app.di

import android.content.SharedPreferences
import okhttp3.Interceptor
import okhttp3.Response

class AuthInterceptor(private val sharedPreferences: SharedPreferences): Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val token = sharedPreferences.getString("token", "") ?: ""
val originalRequest = chain.request()
val newRequest = originalRequest.newBuilder()
.header("Authorization", "Bearer $token")
.build()
return chain.proceed(newRequest)
}


}
121 changes: 121 additions & 0 deletions app/src/main/java/com/serpak/absolut_app/navigation/AppNavigation.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.material3.Button
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import androidx.navigation.compose.rememberNavController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import com.serpak.absolut_app.R
import com.serpak.absolut_app.navigation.Routes
import com.serpak.absolut_app.screens.AuthScreen
import com.serpak.absolut_app.screens.CompletedScreen
import com.serpak.absolut_app.screens.CreateStoreScreen
import com.serpak.absolut_app.screens.SizeOfEstablishmentScreen
import com.serpak.absolut_app.screens.TypeOfCompanyScreen
import com.serpak.absolut_app.screens.TypeOfServiceScreen
import com.serpak.absolut_app.screens.WelcomeScreen

@Composable
fun AppNavigation() {
val navController = rememberNavController()
val screens = listOf(
Routes.WELCOME_SCREEN,
Routes.CREATE_STORE_SCREEN,
Routes.TYPE_OF_COMPANY_SCREEN,
Routes.SIZE_OF_ESTABLISHMENT_SCREEN,
Routes.TYPE_OF_SERVICE_SCREEN,
Routes.COMPLETED_SCREEN
)

// Состояние для отслеживания текущего экрана
var currentScreenIndex by remember { mutableStateOf(0) }

Box{
// Image(painter = painterResource(id = R.drawable), contentDescription = )
}
Scaffold(
topBar = {
// Прогрессбар
LinearProgressIndicator(
progress = (currentScreenIndex + 1).toFloat() / screens.size,
modifier = Modifier
.fillMaxWidth()
.padding(top = 25.dp)
)
},
bottomBar = {
// Панель с кнопками "Назад" и "Далее"
Row(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
horizontalArrangement = Arrangement.SpaceBetween
) {
// Кнопка "Назад"
if (currentScreenIndex > 0) {
Button(onClick = {
if (currentScreenIndex > 0) {
currentScreenIndex--
navController.popBackStack()
}
}) {
Text(text = "Назад")
}
}

Spacer(modifier = Modifier.weight(1f))

// Кнопка "Далее"
Button(onClick = {
if (currentScreenIndex < screens.size - 1) {
currentScreenIndex++
navController.navigate(screens[currentScreenIndex])
}
}) {
Text(text = "Далее")
}
}
}
) {
NavHost(
navController = navController,
startDestination = screens[0],
modifier = Modifier.padding(it)
) {
composable(Routes.AUTH_SCREEN){
AuthScreen(navController = navController)
}
composable(Routes.WELCOME_SCREEN) {
WelcomeScreen(navController = navController)
}
composable(Routes.CREATE_STORE_SCREEN) {
CreateStoreScreen(navController = navController)
}
composable(Routes.TYPE_OF_COMPANY_SCREEN) {
TypeOfCompanyScreen(navController = navController)
}
composable(Routes.SIZE_OF_ESTABLISHMENT_SCREEN) {
SizeOfEstablishmentScreen(navController = navController)
}
composable(Routes.TYPE_OF_SERVICE_SCREEN) {
TypeOfServiceScreen(navController = navController)
}
composable(Routes.COMPLETED_SCREEN) {
CompletedScreen(navController = navController)
}
}
}
}


12 changes: 12 additions & 0 deletions app/src/main/java/com/serpak/absolut_app/navigation/Routes.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.serpak.absolut_app.navigation

object Routes {
const val AUTH_SCREEN = "auth_screen"
const val WELCOME_SCREEN = "welcome_screen"
const val CREATE_STORE_SCREEN = "create_store_screen"
const val TYPE_OF_COMPANY_SCREEN = "type_of_company_screen"
const val SIZE_OF_ESTABLISHMENT_SCREEN = "size_of_establishment_screen"
const val TYPE_OF_SERVICE_SCREEN = "type_of_service_screen"
const val COMPLETED_SCREEN = "completed_screen"

}
11 changes: 11 additions & 0 deletions app/src/main/java/com/serpak/absolut_app/screens/AuthScreen.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.serpak.absolut_app.screens

import androidx.compose.runtime.Composable
import androidx.navigation.NavHostController

@Composable
fun AuthScreen(
navController: NavHostController
){

}
Loading