diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a28d464..3ce1264 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -37,6 +37,14 @@ android { dependencies { defaultLibrary() + val ktorClientCore = "3.0.3" + + implementation("io.ktor:ktor-client-cio:${ktorClientCore}") + implementation("io.ktor:ktor-client-content-negotiation:${ktorClientCore}") + implementation("io.ktor:ktor-client-core:${ktorClientCore}") + implementation("io.ktor:ktor-client-logging:${ktorClientCore}") + implementation("io.ktor:ktor-serialization-kotlinx-json:${ktorClientCore}") + implementation(Dependencies.AndroidX.activity) implementation(Dependencies.AndroidX.fragment) implementation(Dependencies.AndroidX.constraintLayout) @@ -49,7 +57,7 @@ dependencies { implementation("com.squareup.picasso:picasso:2.8") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.1") - implementation("androidx.datastore:datastore-preferences:1.1.1") + implementation("androidx.datastore:datastore-preferences:1.1.2") implementation("com.google.mlkit:barcode-scanning:17.3.0") val cameraX = "1.3.4" 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 2248234..b8152be 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://192.168.1.6:8080" + const val SERVER_ADDRESS = "http://192.168.1.103:8080" } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/data/QrRepositoryImpl.kt b/app/src/main/java/ru/myitschool/work/data/QrRepositoryImpl.kt new file mode 100644 index 0000000..ca8c332 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/QrRepositoryImpl.kt @@ -0,0 +1,15 @@ +package ru.myitschool.work.data + +import ru.myitschool.work.data.local.CredentialsLocalDataSource +import ru.myitschool.work.domain.entities.QrEntity +import ru.myitschool.work.domain.qr.QrRepository + +class QrRepositoryImpl( + private val networkDataSource: QrNetworkDataSource, + private val credentialsLocalDataSource: CredentialsLocalDataSource +) : QrRepository { + + override suspend fun pushQr(qrEntity: QrEntity): Result { + return networkDataSource.pushQr(qrEntity, credentialsLocalDataSource.authData!!) + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/data/UserRepositoryImpl.kt b/app/src/main/java/ru/myitschool/work/data/UserRepositoryImpl.kt new file mode 100644 index 0000000..d74ef43 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/UserRepositoryImpl.kt @@ -0,0 +1,46 @@ +package ru.myitschool.work.data + +import ru.myitschool.work.data.local.CredentialsLocalDataSource +import ru.myitschool.work.data.local.UserLocalDataSource +import ru.myitschool.work.domain.entities.UserEntity +import ru.myitschool.work.domain.login.LoginRepository +import ru.myitschool.work.data.network.UserNetworkDataSource +import ru.myitschool.work.domain.user.UserRepository + +class UserRepositoryImpl( + private val credentialsLocalDataSource: CredentialsLocalDataSource, + private val userLocalDatSource: UserLocalDataSource, + private val networkDataSource: UserNetworkDataSource +) : LoginRepository, UserRepository { + + override suspend fun login(login: String, password: String): Result { + + return runCatching { + networkDataSource.login(credentialsLocalDataSource.setAuthData(login, password)) + .onSuccess { dto -> + userLocalDatSource.cacheData( + UserEntity( + id = dto.id ?: error("Null user id"), + name = dto.name ?: error("Null user name"), + lastVisit = dto.lastVisit ?: error("Null user lastVisit"), + photoUrl = dto.photoUrl ?: error("Null user photoUrl"), + position = dto.position ?: error("Null user position") + ) + ) + } + } + } + + override suspend fun logout() { + credentialsLocalDataSource.clear() + userLocalDatSource.clear() + } + + override suspend fun isUserExist(login: String): Result { + return networkDataSource.isUserExist(login) + } + + override suspend fun getCurrentUser(): UserEntity { + return userLocalDatSource.getUser()!! + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/data/UserRepositoryImplementation.java b/app/src/main/java/ru/myitschool/work/data/UserRepositoryImplementation.java deleted file mode 100644 index ab22eaf..0000000 --- a/app/src/main/java/ru/myitschool/work/data/UserRepositoryImplementation.java +++ /dev/null @@ -1,80 +0,0 @@ -package ru.myitschool.work.data; - -import androidx.annotation.NonNull; - -import java.util.function.Consumer; - -import ru.myitschool.work.data.dto.QrDto; -import ru.myitschool.work.data.network.RetrofitFactory; -import ru.myitschool.work.data.source.Credentials; -import ru.myitschool.work.data.source.UserApi; -import ru.myitschool.work.domain.entities.QrEntity; -import ru.myitschool.work.domain.entities.Status; -import ru.myitschool.work.domain.entities.UserEntity; -import ru.myitschool.work.domain.login.LoginRepository; -import ru.myitschool.work.domain.qr.QrRepository; -import ru.myitschool.work.domain.user.UserRepository; -import ru.myitschool.work.utils.CallToConsumer; - -public class UserRepositoryImplementation implements UserRepository, LoginRepository, QrRepository { - - private static UserRepositoryImplementation INSTANCE; - private final UserApi userApi = RetrofitFactory.getInstance().getUserApi(); - private final Credentials credentials = Credentials.getInstance(); - - private UserRepositoryImplementation() {} - - public static synchronized UserRepositoryImplementation getInstance() { - if (INSTANCE == null) { - INSTANCE = new UserRepositoryImplementation(); - } - return INSTANCE; - } - @Override - public void getUserByLogin(@NonNull String login, @NonNull Consumer> callback) { - - userApi.getByLogin(login).enqueue(new CallToConsumer<>( - callback, - userDto -> { - if (userDto != null) { - final String resultLogin = userDto.login; - final String id = userDto.id; - final String name = userDto.name; - if (resultLogin != null && id != null && name != null) { - return new UserEntity( - id, - resultLogin, - name, - userDto.lastVisit, - userDto.photoUrl, - userDto.position - ); - } - } - return null; - } - )); - } - - @Override - public void isUserExist(@NonNull String login, Consumer> callback) { - userApi.isExist(login).enqueue(new CallToConsumer<>( - callback, - dto -> null - )); - } - - @Override - public void logoutUser() { - credentials.setAuthData(null); - } - - @Override - public void pushQr(@NonNull QrEntity qrEntity, @NonNull Consumer> callback) { - userApi.openDoor(qrEntity.getLogin(), - new QrDto(qrEntity.getQr())).enqueue(new CallToConsumer<>( - callback, - dto -> null - )); - } -} diff --git a/app/src/main/java/ru/myitschool/work/data/dto/QrDto.kt b/app/src/main/java/ru/myitschool/work/data/dto/QrDto.kt index 549d70f..2c89972 100644 --- a/app/src/main/java/ru/myitschool/work/data/dto/QrDto.kt +++ b/app/src/main/java/ru/myitschool/work/data/dto/QrDto.kt @@ -1,15 +1,11 @@ -package ru.myitschool.work.data.dto; +package ru.myitschool.work.data.dto -import androidx.annotation.Nullable; +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -import com.google.gson.annotations.SerializedName; -public class QrDto { - @Nullable - @SerializedName("value") - public String code; - - public QrDto(@Nullable String code) { - this.code = code; - } -} +@Serializable +data class QrDto( + @SerialName("value") + val code: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/data/dto/UserDto.java b/app/src/main/java/ru/myitschool/work/data/dto/UserDto.java index 7bda6e6..0e5f2cf 100644 --- a/app/src/main/java/ru/myitschool/work/data/dto/UserDto.java +++ b/app/src/main/java/ru/myitschool/work/data/dto/UserDto.java @@ -5,6 +5,9 @@ import androidx.annotation.Nullable; import com.google.gson.annotations.SerializedName; +import kotlinx.serialization.Serializable; + +@Serializable public class UserDto { @Nullable diff --git a/app/src/main/java/ru/myitschool/work/data/local/CredentialsLocalDataSource.java b/app/src/main/java/ru/myitschool/work/data/local/CredentialsLocalDataSource.java new file mode 100644 index 0000000..1c9ee7d --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/local/CredentialsLocalDataSource.java @@ -0,0 +1,35 @@ +package ru.myitschool.work.data.local; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public class CredentialsLocalDataSource { + + private static CredentialsLocalDataSource INSTANCE; + + private CredentialsLocalDataSource() {} + + public static synchronized CredentialsLocalDataSource getInstance() { + if (INSTANCE == null) { + INSTANCE = new CredentialsLocalDataSource(); + } + return INSTANCE; + } + + @Nullable + private String authData = null; + + public String setAuthData(@NonNull String login, @NonNull String password) { + this.authData = okhttp3.Credentials.basic(login, password); + return this.authData; + } + + public void clear() { + this.authData = null; + } + + @Nullable + public String getAuthData() { + return authData; + } +} diff --git a/app/src/main/java/ru/myitschool/work/data/local/UserLocalDataSource.kt b/app/src/main/java/ru/myitschool/work/data/local/UserLocalDataSource.kt new file mode 100644 index 0000000..d4a0f15 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/local/UserLocalDataSource.kt @@ -0,0 +1,20 @@ +package ru.myitschool.work.data.local + +import ru.myitschool.work.domain.entities.UserEntity + +object UserLocalDataSource { + + private var currentUser: UserEntity? = null + + fun cacheData(user: UserEntity) { + currentUser = user + } + + fun getUser(): UserEntity? { + return currentUser + } + + fun clear() { + currentUser = null + } +} diff --git a/app/src/main/java/ru/myitschool/work/data/network/KtorClient.kt b/app/src/main/java/ru/myitschool/work/data/network/KtorClient.kt new file mode 100644 index 0000000..f5bcb88 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/network/KtorClient.kt @@ -0,0 +1,37 @@ +package ru.myitschool.work.data.network + +import android.util.Log +import io.ktor.client.HttpClient +import io.ktor.client.engine.cio.CIO +import io.ktor.client.plugins.contentnegotiation.ContentNegotiation +import io.ktor.client.plugins.defaultRequest +import io.ktor.client.plugins.logging.LogLevel +import io.ktor.client.plugins.logging.Logger +import io.ktor.client.plugins.logging.Logging +import io.ktor.http.ContentType +import io.ktor.http.contentType +import io.ktor.serialization.kotlinx.json.json +import kotlinx.serialization.json.Json + +object KtorClient { + val client + get() = HttpClient(CIO) { + install(ContentNegotiation) { + json(Json { + isLenient = true + ignoreUnknownKeys = true + }) + } + install(Logging) { + logger = object : Logger { + override fun log(message: String) { + Log.d("KTOR_CLIENT", message) + } + } + level = LogLevel.ALL + } + defaultRequest { + contentType(ContentType.Application.Json) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/data/network/QrNetworkDataSource.kt b/app/src/main/java/ru/myitschool/work/data/network/QrNetworkDataSource.kt new file mode 100644 index 0000000..2ad9c06 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/network/QrNetworkDataSource.kt @@ -0,0 +1,38 @@ +package ru.myitschool.work.data + +import io.ktor.client.request.headers +import io.ktor.client.request.patch +import io.ktor.client.request.setBody +import io.ktor.http.ContentType +import io.ktor.http.HttpHeaders +import io.ktor.http.HttpStatusCode +import io.ktor.http.contentType +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import ru.myitschool.work.core.Constants +import ru.myitschool.work.data.dto.QrDto +import ru.myitschool.work.data.network.KtorClient +import ru.myitschool.work.domain.entities.QrEntity + +object QrNetworkDataSource { + + suspend fun pushQr(qrEntity: QrEntity, token: String): Result = withContext(Dispatchers.IO) { + + runCatching { + + val response = KtorClient.client.patch("${Constants.SERVER_ADDRESS}/api/push_qr") { + headers { + append(HttpHeaders.Authorization, token) + } + contentType(ContentType.Application.Json) + setBody( + QrDto(code = qrEntity.code) + ) + + } + if (response.status != HttpStatusCode.OK) + error("Status ${response.status}") + Unit + } + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/data/network/RetrofitFactory.java b/app/src/main/java/ru/myitschool/work/data/network/RetrofitFactory.java deleted file mode 100644 index 3410b2c..0000000 --- a/app/src/main/java/ru/myitschool/work/data/network/RetrofitFactory.java +++ /dev/null @@ -1,28 +0,0 @@ -package ru.myitschool.work.data.network; - -import static ru.myitschool.work.core.Constants.SERVER_ADDRESS; - -import retrofit2.Retrofit; -import retrofit2.converter.gson.GsonConverterFactory; -import ru.myitschool.work.data.source.UserApi; - -public class RetrofitFactory { - - private static RetrofitFactory INSTANCE; - - public static synchronized RetrofitFactory getInstance() { - if (INSTANCE == null) { - INSTANCE = new RetrofitFactory(); - } - return INSTANCE; - } - - private final Retrofit retrofit = new Retrofit.Builder() - .baseUrl(SERVER_ADDRESS) - .addConverterFactory(GsonConverterFactory.create()) - .build(); - - public UserApi getUserApi() { - return retrofit.create(UserApi.class); - } -} diff --git a/app/src/main/java/ru/myitschool/work/data/network/UserNetworkDataSource.kt b/app/src/main/java/ru/myitschool/work/data/network/UserNetworkDataSource.kt new file mode 100644 index 0000000..6fb986b --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/network/UserNetworkDataSource.kt @@ -0,0 +1,37 @@ +package ru.myitschool.work.data.network + +import io.ktor.client.call.body +import io.ktor.client.request.get +import io.ktor.client.request.headers +import io.ktor.http.HttpHeaders +import io.ktor.http.HttpStatusCode +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import ru.myitschool.work.core.Constants +import ru.myitschool.work.data.dto.UserDto + +object UserNetworkDataSource { + + suspend fun isUserExist(login: String): Result = withContext(Dispatchers.IO) { + runCatching { + val result = KtorClient.client.get("${Constants.SERVER_ADDRESS}/api/users/username/$login") + result.status == HttpStatusCode.OK + } + } + + suspend fun login(token: String): Result = + withContext(Dispatchers.IO) { + runCatching { + val result = KtorClient.client.get("${Constants.SERVER_ADDRESS}/api/users/login") { + headers { + append(HttpHeaders.Authorization, token) + } + } + if (result.status != HttpStatusCode.OK) + error("Status ${result.status}") + result.body() + } + } + + suspend fun getUserByLogin() {} +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/data/source/Credentials.java b/app/src/main/java/ru/myitschool/work/data/source/Credentials.java deleted file mode 100644 index 4521324..0000000 --- a/app/src/main/java/ru/myitschool/work/data/source/Credentials.java +++ /dev/null @@ -1,29 +0,0 @@ -package ru.myitschool.work.data.source; - -import androidx.annotation.Nullable; - -public class Credentials { - - private static Credentials INSTANCE; - - private Credentials() {} - - public static synchronized Credentials getInstance() { - if (INSTANCE == null) { - INSTANCE = new Credentials(); - } - return INSTANCE; - } - - @Nullable - private String authData = null; - - public void setAuthData(@Nullable String authData) { - this.authData = authData; - } - - @Nullable - public String getAuthData() { - return authData; - } -} diff --git a/app/src/main/java/ru/myitschool/work/data/source/UserApi.java b/app/src/main/java/ru/myitschool/work/data/source/UserApi.java deleted file mode 100644 index 38d1a29..0000000 --- a/app/src/main/java/ru/myitschool/work/data/source/UserApi.java +++ /dev/null @@ -1,19 +0,0 @@ -package ru.myitschool.work.data.source; - -import retrofit2.Call; -import retrofit2.http.Body; -import retrofit2.http.GET; -import retrofit2.http.PATCH; -import retrofit2.http.Path; -import ru.myitschool.work.data.dto.QrDto; -import ru.myitschool.work.data.dto.UserDto; - -public interface UserApi { - - @GET("api/{login}/info") - Call getByLogin(@Path("login") String login); - @GET("api/{login}/auth") - Call isExist(@Path("login") String login); - @PATCH("api/{login}/open/") - Call openDoor(@Path("login") String login, @Body QrDto qrDto); -} diff --git a/app/src/main/java/ru/myitschool/work/domain/entities/QrEntity.kt b/app/src/main/java/ru/myitschool/work/domain/entities/QrEntity.kt index 680a404..e0a8b68 100644 --- a/app/src/main/java/ru/myitschool/work/domain/entities/QrEntity.kt +++ b/app/src/main/java/ru/myitschool/work/domain/entities/QrEntity.kt @@ -1,27 +1,5 @@ -package ru.myitschool.work.domain.entities; +package ru.myitschool.work.domain.entities -import androidx.annotation.NonNull; - -public class QrEntity { - - @NonNull - private final String login; - - @NonNull - public String getQr() { - return qr; - } - - @NonNull - private final String qr; - - @NonNull - public String getLogin() { - return login; - } - - public QrEntity(@NonNull String login, @NonNull String qr) { - this.login = login; - this.qr = qr; - } -} +data class QrEntity( + val code: String +) diff --git a/app/src/main/java/ru/myitschool/work/domain/entities/UserEntity.kt b/app/src/main/java/ru/myitschool/work/domain/entities/UserEntity.kt index 2df0850..2e9d7b7 100644 --- a/app/src/main/java/ru/myitschool/work/domain/entities/UserEntity.kt +++ b/app/src/main/java/ru/myitschool/work/domain/entities/UserEntity.kt @@ -1,65 +1,9 @@ -package ru.myitschool.work.domain.entities; +package ru.myitschool.work.domain.entities -import androidx.annotation.NonNull; - -import javax.annotation.Nullable; - -public class UserEntity { - - @NonNull - private final String id; - @NonNull - private final String name; - @NonNull - private final String login; - @Nullable - private final String last_visit; - @Nullable - private final String photoUrl; - @Nullable - private final String position; - - @NonNull - public String getId() { - return id; - } - - @Nullable - public String getLast_visit() { - return last_visit; - } - - @NonNull - public String getName() { - return name; - } - - @Nullable - public String getPhotoUrl() { - return photoUrl; - } - - @Nullable - public String getPosition() { - return position; - } - - @NonNull - public String getLogin() { - return login; - } - - public UserEntity( - @NonNull String id, @NonNull String login, - @NonNull String name, - @Nullable String last_visit, - @Nullable String photoUrl, - @Nullable String position) { - this.id = id; - this.login = login; - this.name = name; - this.last_visit = last_visit; - this.photoUrl = photoUrl; - this.position = position; - } -} +data class UserEntity( + val id: String, + val name: String, + val lastVisit: String, + val photoUrl: String, + val position: String, +) diff --git a/app/src/main/java/ru/myitschool/work/domain/login/IsUserExistUseCase.kt b/app/src/main/java/ru/myitschool/work/domain/login/IsUserExistUseCase.kt index d8d6544..2a1fecf 100644 --- a/app/src/main/java/ru/myitschool/work/domain/login/IsUserExistUseCase.kt +++ b/app/src/main/java/ru/myitschool/work/domain/login/IsUserExistUseCase.kt @@ -1,29 +1,11 @@ -package ru.myitschool.work.domain.login; +package ru.myitschool.work.domain.login -import androidx.annotation.NonNull; +import android.util.Log +import kotlin.math.log -import java.util.function.Consumer; +class IsUserExistUseCase( + private val repository: LoginRepository +) { -import ru.myitschool.work.domain.entities.Status; - -public class IsUserExistUseCase { - - private final LoginRepository repository; - - public IsUserExistUseCase(LoginRepository repository) { - this.repository = repository; - } - - public void execute(@NonNull String login, Consumer> callback) { - repository.isUserExist(login, status -> { - boolean isAvailable = status.getStatusCode() == 200 || status.getStatusCode() == 401; - callback.accept( - new Status<>( - status.getStatusCode(), - isAvailable ? status.getStatusCode() == 200 : null, - status.getErrors() - ) - ); - }); - } -} + suspend operator fun invoke(login: String) = repository.isUserExist(login) +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/login/LoginRepository.kt b/app/src/main/java/ru/myitschool/work/domain/login/LoginRepository.kt index 2cb86a7..c8c5e73 100644 --- a/app/src/main/java/ru/myitschool/work/domain/login/LoginRepository.kt +++ b/app/src/main/java/ru/myitschool/work/domain/login/LoginRepository.kt @@ -1,13 +1,8 @@ -package ru.myitschool.work.domain.login; +package ru.myitschool.work.domain.login -import androidx.annotation.NonNull; +interface LoginRepository { -import java.util.function.Consumer; - -import ru.myitschool.work.domain.entities.Status; - -public interface LoginRepository { - - void isUserExist(@NonNull String login, Consumer> callback); - void logoutUser(); -} + suspend fun login(login: String, password: String) : Result + suspend fun logout() + suspend fun isUserExist(login: String): Result +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/login/LoginUseCase.kt b/app/src/main/java/ru/myitschool/work/domain/login/LoginUseCase.kt new file mode 100644 index 0000000..dc39396 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/domain/login/LoginUseCase.kt @@ -0,0 +1,9 @@ +package ru.myitschool.work.domain.login + +class LoginUseCase( + private val repository: LoginRepository +) { + + operator fun invoke(login: String, password: String) = + repository.loginUser(login, password) +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/qr/PushQrUseCase.kt b/app/src/main/java/ru/myitschool/work/domain/qr/PushQrUseCase.kt index 9b00790..3fcc909 100644 --- a/app/src/main/java/ru/myitschool/work/domain/qr/PushQrUseCase.kt +++ b/app/src/main/java/ru/myitschool/work/domain/qr/PushQrUseCase.kt @@ -1,28 +1,10 @@ -package ru.myitschool.work.domain.qr; +package ru.myitschool.work.domain.qr -import androidx.annotation.NonNull; +import ru.myitschool.work.domain.entities.QrEntity -import java.util.function.Consumer; +class PushQrUseCase( + private val repository: QrRepository +) { -import ru.myitschool.work.domain.entities.QrEntity; -import ru.myitschool.work.domain.entities.Status; - -public class PushQrUseCase { - private final QrRepository repository; - - public PushQrUseCase(QrRepository repository) { - this.repository = repository; - } - public void execute(@NonNull QrEntity qrEntity, Consumer> callback) { - repository.pushQr(qrEntity, status -> { - boolean isOpened = status.getStatusCode() == 200 || status.getStatusCode() == 400 || status.getStatusCode() == 401; - callback.accept( - new Status<>( - status.getStatusCode(), - isOpened ? status.getStatusCode() == 200 : null, - status.getErrors() - ) - ); - }); - } -} + suspend operator fun invoke(qrEntity: QrEntity) = repository.pushQr(qrEntity) +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/qr/QrRepository.kt b/app/src/main/java/ru/myitschool/work/domain/qr/QrRepository.kt index 41136c3..0531266 100644 --- a/app/src/main/java/ru/myitschool/work/domain/qr/QrRepository.kt +++ b/app/src/main/java/ru/myitschool/work/domain/qr/QrRepository.kt @@ -1,13 +1,8 @@ -package ru.myitschool.work.domain.qr; +package ru.myitschool.work.domain.qr -import androidx.annotation.NonNull; +import ru.myitschool.work.domain.entities.QrEntity -import java.util.function.Consumer; +interface QrRepository { -import ru.myitschool.work.domain.entities.QrEntity; -import ru.myitschool.work.domain.entities.Status; - -public interface QrRepository { - - void pushQr(@NonNull QrEntity qrEntity, @NonNull Consumer> callback); -} + suspend fun pushQr(qrEntity: QrEntity): Result +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/user/GetUserByLoginUseCase.java b/app/src/main/java/ru/myitschool/work/domain/user/GetUserByLoginUseCase.java index 4636485..a9f79a8 100644 --- a/app/src/main/java/ru/myitschool/work/domain/user/GetUserByLoginUseCase.java +++ b/app/src/main/java/ru/myitschool/work/domain/user/GetUserByLoginUseCase.java @@ -5,7 +5,6 @@ import androidx.annotation.NonNull; import java.util.function.Consumer; import ru.myitschool.work.domain.entities.Status; -import ru.myitschool.work.domain.entities.UserEntity; public class GetUserByLoginUseCase { private final UserRepository repository; diff --git a/app/src/main/java/ru/myitschool/work/domain/user/UserRepository.kt b/app/src/main/java/ru/myitschool/work/domain/user/UserRepository.kt index c5ab832..3ea221d 100644 --- a/app/src/main/java/ru/myitschool/work/domain/user/UserRepository.kt +++ b/app/src/main/java/ru/myitschool/work/domain/user/UserRepository.kt @@ -1,14 +1,8 @@ -package ru.myitschool.work.domain.user; +package ru.myitschool.work.domain.user -import androidx.annotation.NonNull; +import ru.myitschool.work.domain.entities.UserEntity -import java.util.function.Consumer; +interface UserRepository { - -import ru.myitschool.work.domain.entities.Status; -import ru.myitschool.work.domain.entities.UserEntity; - -public interface UserRepository { - - void getUserByLogin(@NonNull String login, @NonNull Consumer> callback); -} + suspend fun getCurrentUser(): UserEntity +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.java b/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.java index 3c81043..6d8064e 100644 --- a/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.java +++ b/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.java @@ -6,9 +6,6 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; -import ru.myitschool.work.data.UserRepositoryImplementation; -import ru.myitschool.work.domain.login.IsUserExistUseCase; - public class LoginViewModel extends ViewModel { private final State INIT_STATE = new State(false); diff --git a/app/src/main/java/ru/myitschool/work/ui/login/SplashFragment.kt b/app/src/main/java/ru/myitschool/work/ui/login/SplashFragment.kt new file mode 100644 index 0000000..4d1a1d8 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/ui/login/SplashFragment.kt @@ -0,0 +1,22 @@ +package ru.myitschool.work.ui.login + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.Fragment +import ru.myitschool.work.R +import ru.myitschool.work.databinding.FragmentSplashBinding + +class SplashFragment: Fragment(R.layout.fragment_splash) { + + private var _binding: FragmentSplashBinding? = null + private val binding: FragmentSplashBinding get() = _binding!! + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + _binding = FragmentSplashBinding.bind(view) + } + + override fun onDestroy() { + _binding = null + super.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/profile/UserFragment.java b/app/src/main/java/ru/myitschool/work/ui/profile/UserFragment.java index f6e3078..e4e0008 100644 --- a/app/src/main/java/ru/myitschool/work/ui/profile/UserFragment.java +++ b/app/src/main/java/ru/myitschool/work/ui/profile/UserFragment.java @@ -8,7 +8,6 @@ import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentResultListener; import androidx.lifecycle.ViewModelProvider; import androidx.navigation.Navigation; @@ -19,7 +18,6 @@ import java.text.MessageFormat; import ru.myitschool.work.R; import ru.myitschool.work.databinding.FragmentUserBinding; -import ru.myitschool.work.domain.entities.UserEntity; import ru.myitschool.work.ui.qr.scan.QrScanDestination; import ru.myitschool.work.utils.Utils; diff --git a/app/src/main/java/ru/myitschool/work/ui/profile/UserViewModel.java b/app/src/main/java/ru/myitschool/work/ui/profile/UserViewModel.java index 290cd09..07307c3 100644 --- a/app/src/main/java/ru/myitschool/work/ui/profile/UserViewModel.java +++ b/app/src/main/java/ru/myitschool/work/ui/profile/UserViewModel.java @@ -6,8 +6,6 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; -import ru.myitschool.work.data.UserRepositoryImplementation; -import ru.myitschool.work.domain.entities.UserEntity; import ru.myitschool.work.domain.user.GetUserByLoginUseCase; public class UserViewModel extends ViewModel { diff --git a/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResultViewModel.java b/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResultViewModel.java index 97c49da..74b9a04 100644 --- a/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResultViewModel.java +++ b/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResultViewModel.java @@ -6,8 +6,6 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; -import ru.myitschool.work.data.UserRepositoryImplementation; -import ru.myitschool.work.domain.entities.QrEntity; import ru.myitschool.work.domain.entities.Status; import ru.myitschool.work.domain.qr.PushQrUseCase; @@ -16,7 +14,7 @@ public class QrResultViewModel extends ViewModel { public final LiveData stateLiveData = mutableStateLiveData; public final PushQrUseCase pushQrUseCase = new PushQrUseCase( - UserRepositoryImplementation.getInstance() + QrRepositoryImplementation.getInstance() ); public void update(@NonNull String login, @NonNull String qr) { diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml index ad888ef..ab597b7 100644 --- a/app/src/main/res/layout/fragment_login.xml +++ b/app/src/main/res/layout/fragment_login.xml @@ -33,6 +33,18 @@ android:background="@drawable/input_field" android:hint="@string/login_hint" /> + +