code: Делаю

This commit is contained in:
DKaverznev 2025-02-19 12:55:52 +03:00
parent a1827a4db3
commit a62ba9da82
12 changed files with 71 additions and 30 deletions

View File

@ -22,7 +22,7 @@
<activity
android:name=".ui.RootActivity"
android:exported="true"
android:theme="@android:style/Theme.NoTitleBar">
android:theme="@style/Theme.MaterialComponents.DayNight.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

View File

@ -36,6 +36,6 @@ object NetworkModule {
@Provides
@Singleton
fun provideApiServiceScan(retrofitClient: RetrofitClient): ApiServiceScan {
return retrofitClient.getApiServiceScan()
return retrofitClient.getApiServiceScanAuth()
}
}

View File

@ -1,7 +1,6 @@
package ru.myitschool.work.api
import android.content.Context
import androidx.core.content.ContentProviderCompat.requireContext
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
@ -12,38 +11,37 @@ import ru.myitschool.work.core.Constants.SERVER_ADDRESS
import ru.myitschool.work.utils.AuthPreferences
import java.util.concurrent.TimeUnit
class RetrofitClient(private val context: Context) {
class RetrofitClient(context: Context) {
private val serverAddress = SERVER_ADDRESS
private var authPreferences: AuthPreferences = AuthPreferences(context)
private val httpClient = OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
private val httpClientWithAuth = OkHttpClient.Builder()
.connectTimeout(5, TimeUnit.SECONDS)
.addInterceptor(BasicAuthInterceptor(
authPreferences.getLogin() ?: "",
authPreferences.getPassword() ?: ""
))
.readTimeout(30, TimeUnit.SECONDS)
.readTimeout(5, TimeUnit.SECONDS)
.build()
private val retrofit: Retrofit by lazy {
private val retrofitWithAuth: Retrofit by lazy {
Retrofit.Builder()
.baseUrl(serverAddress)
.client(httpClient)
.client(httpClientWithAuth)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
fun getApiServiceLogin(): ApiServiceLogin {
return retrofit.create(ApiServiceLogin::class.java)
return retrofitWithAuth.create(ApiServiceLogin::class.java)
}
fun getApiServiceMain(): ApiServiceMain {
return retrofit.create(ApiServiceMain::class.java)
return retrofitWithAuth.create(ApiServiceMain::class.java)
}
fun getApiServiceScan(): ApiServiceScan {
return retrofit.create(ApiServiceScan::class.java)
fun getApiServiceScanAuth(): ApiServiceScan {
return retrofitWithAuth.create(ApiServiceScan::class.java)
}
}

View File

@ -0,0 +1,10 @@
package ru.myitschool.work.api.list
import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Path
interface ApiServiceList {
@GET("api/auth/{login}")
fun authenticate(@Path("login") login: String): Call<Void>
}

View File

@ -1,10 +1,13 @@
package ru.myitschool.work.api.login
import retrofit2.Call
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.Path
import ru.myitschool.work.api.main.UserInfo
interface ApiServiceLogin {
@GET("api/{login}/auth")
fun authenticate(@Path("login") login: String): Call<Void>
@GET("api/auth")
fun authenticate(): Call<Void>
}

View File

@ -5,6 +5,6 @@ import retrofit2.http.GET
import retrofit2.http.Path
interface ApiServiceMain {
@GET("api/{login}/info")
@GET("api/info/{login}")
fun getDataUser(@Path("login") login: String): Call<UserInfo>
}

View File

@ -6,6 +6,6 @@ import retrofit2.http.PATCH
import retrofit2.http.Path
interface ApiServiceScan {
@PATCH("api/{login}/info")
@PATCH("api/info/{login}")
fun open(@Path("login") login: String, @Body data: CodeJson): Call<Void>
}

View File

@ -1,5 +1,12 @@
package ru.myitschool.work.api.scan
class CodeJson(
private var value: String? = null
private var value: String? = null,
private var type: String? = null,
private var time: String? = null
)
object OpenType {
const val QR_TYPE = "qr"
const val NFC_TYPE = "card"
}

View File

@ -51,10 +51,6 @@ class LoginFragment : Fragment(R.layout.fragment_login) {
addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {
val login = s.toString()
authPreferences.saveLogin(binding.username.text.toString())
authPreferences.savePassword(binding.password.text.toString())
binding.login.isEnabled = validateLogin(login)
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
@ -64,7 +60,12 @@ class LoginFragment : Fragment(R.layout.fragment_login) {
binding.login.setOnClickListener {
val login = binding.username.text.toString()
performLogin(login)
val password = binding.password.text.toString()
authPreferences.saveLogin(login)
authPreferences.savePassword(password)
performLogin()
}
binding.loading.visibleOrGone(false)
@ -82,6 +83,9 @@ class LoginFragment : Fragment(R.layout.fragment_login) {
binding.loading.visibleOrGone(false)
binding.error.visibleOrGone(false)
authPreferences.saveLogin(binding.username.text.toString())
authPreferences.savePassword(binding.password.text.toString())
authPreferences.saveLoginState(true)
navigateToMainScreen()
@ -110,9 +114,9 @@ class LoginFragment : Fragment(R.layout.fragment_login) {
}
}
private fun performLogin(login: String) {
private fun performLogin() {
lifecycleScope.launch {
viewModel.authenticate(login)
viewModel.authenticate()
}
}

View File

@ -20,11 +20,11 @@ class LoginViewModel @Inject constructor(
private val _state = MutableStateFlow<LoginState>(LoginState.Initial)
val state = _state.asStateFlow()
fun authenticate(login: String) {
fun authenticate() {
viewModelScope.launch {
_state.value = LoginState.Loading
apiService.authenticate(login).enqueue(object : retrofit2.Callback<Void> {
apiService.authenticate().enqueue(object : retrofit2.Callback<Void> {
override fun onResponse(call: Call<Void>, response: Response<Void>) {
Log.d("Authentication", "Response code: ${response.code()}")

View File

@ -10,11 +10,13 @@ import androidx.navigation.fragment.findNavController
import dagger.hilt.android.AndroidEntryPoint
import ru.myitschool.work.R
import ru.myitschool.work.api.scan.CodeJson
import ru.myitschool.work.api.scan.OpenType
import ru.myitschool.work.databinding.FragmentScanResultBinding
import ru.myitschool.work.ui.main.MainDestination
import ru.myitschool.work.ui.qr.scan.QrScanDestination
import ru.myitschool.work.utils.AuthPreferences
import ru.myitschool.work.utils.collectWhenStarted
import ru.myitschool.work.utils.getCurrentTime
import ru.myitschool.work.utils.visibleOrGone
@AndroidEntryPoint
@ -48,7 +50,14 @@ class ResultFragment : Fragment(R.layout.fragment_scan_result) {
}
val qrData = QrScanDestination.getDataIfExist(arguments ?: Bundle())
authPreferences.getLogin()?.let { viewModel.open(it, CodeJson(qrData)) }
authPreferences.getLogin()?.let { login ->
val currentTime = getCurrentTime()
viewModel.open(login, CodeJson(
value = qrData,
type = OpenType.QR_TYPE,
time = currentTime
))
}
}
private fun observeOpenState() {

View File

@ -0,0 +1,10 @@
package ru.myitschool.work.utils
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
fun getCurrentTime(): String {
val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.getDefault())
return dateFormat.format(Date())
}