diff --git a/app/src/main/java/ru/myitschool/work/api/BasicAuthInterceptor.kt b/app/src/main/java/ru/myitschool/work/api/BasicAuthInterceptor.kt new file mode 100644 index 0000000..cc10015 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/api/BasicAuthInterceptor.kt @@ -0,0 +1,16 @@ +package ru.myitschool.work.api + +import okhttp3.Credentials +import okhttp3.Interceptor +import okhttp3.Response + +class BasicAuthInterceptor(private val username: String, private val password: String) : + Interceptor { + override fun intercept(chain: Interceptor.Chain): Response { + val credential = Credentials.basic(username, password) + val request = chain.request().newBuilder() + .header("Authorization", credential) + .build() + return chain.proceed(request) + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/api/NetworkModule.kt b/app/src/main/java/ru/myitschool/work/api/NetworkModule.kt index 9d6ad25..715f06f 100644 --- a/app/src/main/java/ru/myitschool/work/api/NetworkModule.kt +++ b/app/src/main/java/ru/myitschool/work/api/NetworkModule.kt @@ -1,9 +1,11 @@ package ru.myitschool.work.api +import android.content.Context import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent +import dagger.hilt.android.qualifiers.ApplicationContext import ru.myitschool.work.api.login.ApiServiceLogin import ru.myitschool.work.api.main.ApiServiceMain import ru.myitschool.work.api.scan.ApiServiceScan @@ -15,8 +17,8 @@ object NetworkModule { @Provides @Singleton - fun provideRetrofitClient(): RetrofitClient { - return RetrofitClient() + fun provideRetrofitClient(@ApplicationContext context: Context): RetrofitClient { + return RetrofitClient(context) } @Provides diff --git a/app/src/main/java/ru/myitschool/work/api/RetrofitClient.kt b/app/src/main/java/ru/myitschool/work/api/RetrofitClient.kt index 81b4bbd..afe3f13 100644 --- a/app/src/main/java/ru/myitschool/work/api/RetrofitClient.kt +++ b/app/src/main/java/ru/myitschool/work/api/RetrofitClient.kt @@ -1,7 +1,7 @@ package ru.myitschool.work.api -import com.google.gson.Gson -import com.google.gson.GsonBuilder +import android.content.Context +import androidx.core.content.ContentProviderCompat.requireContext import okhttp3.OkHttpClient import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory @@ -9,15 +9,21 @@ import ru.myitschool.work.api.login.ApiServiceLogin import ru.myitschool.work.api.main.ApiServiceMain import ru.myitschool.work.api.scan.ApiServiceScan import ru.myitschool.work.core.Constants.SERVER_ADDRESS +import ru.myitschool.work.utils.AuthPreferences import java.util.concurrent.TimeUnit -class RetrofitClient { +class RetrofitClient(private val context: Context) { private val serverAddress = SERVER_ADDRESS + private var authPreferences: AuthPreferences = AuthPreferences(context) private val httpClient = OkHttpClient.Builder() .connectTimeout(30, TimeUnit.SECONDS) + .addInterceptor(BasicAuthInterceptor( + authPreferences.getLogin() ?: "", + authPreferences.getPassword() ?: "" + )) .readTimeout(30, TimeUnit.SECONDS) .build() diff --git a/app/src/main/java/ru/myitschool/work/core/Constants.kt b/app/src/main/java/ru/myitschool/work/core/Constants.kt index 8f8138d..9cabb89 100644 --- a/app/src/main/java/ru/myitschool/work/core/Constants.kt +++ b/app/src/main/java/ru/myitschool/work/core/Constants.kt @@ -1,5 +1,5 @@ package ru.myitschool.work.core object Constants { - const val SERVER_ADDRESS = "http://localhost:8090" + const val SERVER_ADDRESS = "http://192.168.1.113:8080" } \ 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 index b4abbd9..8e3ab00 100644 --- a/app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt @@ -51,6 +51,10 @@ 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) {} @@ -79,8 +83,7 @@ class LoginFragment : Fragment(R.layout.fragment_login) { binding.error.visibleOrGone(false) authPreferences.saveLoginState(true) - authPreferences.saveLogin(binding.username.text.toString()) // Сохраняем логин - Toast.makeText(context, "Авторизация прошла успешно", Toast.LENGTH_SHORT).show() + navigateToMainScreen() } is LoginViewModel.LoginState.InvalidCredentials -> { @@ -96,6 +99,9 @@ class LoginFragment : Fragment(R.layout.fragment_login) { visibleOrGone(true) text = "Ошибка авторизации" } + + authPreferences.clearLoginState() + Log.d("Authentication", "Ошибка авторизации") } 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 index f28cf79..9333dd0 100644 --- a/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt @@ -52,7 +52,6 @@ class MainViewModel @Inject constructor( } } - // Sealed класс для состояний sealed class MainState { data object Initial : MainState() data object Loading : MainState() diff --git a/app/src/main/java/ru/myitschool/work/utils/AuthPreferences.kt b/app/src/main/java/ru/myitschool/work/utils/AuthPreferences.kt index 7bee323..200ad7e 100644 --- a/app/src/main/java/ru/myitschool/work/utils/AuthPreferences.kt +++ b/app/src/main/java/ru/myitschool/work/utils/AuthPreferences.kt @@ -16,6 +16,7 @@ class AuthPreferences(context: Context) { } } + fun isLoggedIn(): Boolean { return sharedPreferences.getBoolean(KEY_IS_LOGGED_IN, false) } @@ -38,6 +39,17 @@ class AuthPreferences(context: Context) { return sharedPreferences.getString("user_login", null) } + fun savePassword(login: String) { + sharedPreferences.edit().apply { + putString("user_password", login) + apply() + } + } + + fun getPassword(): String? { + return sharedPreferences.getString("user_password", null) + } + companion object { private const val PREFS_NAME = "AuthPreferences" private const val KEY_IS_LOGGED_IN = "is_logged_in"