From 6d75ee149cf8bce041293fe5d22cb331ec75b108 Mon Sep 17 00:00:00 2001 From: Petr Rudichev Date: Thu, 20 Feb 2025 16:02:27 +0300 Subject: [PATCH] feat: add all --- app/src/main/AndroidManifest.xml | 26 +- .../work/api/data/EmployeeRepositoryImpl.java | 14 +- .../work/api/data/SignRepositoryImpl.java | 48 ++-- .../api/data/dto/employee/EmployeeDTO.java | 2 +- .../api/data/network/RetrofitFactory.java | 2 +- .../work/api/data/source/SignApi.java | 5 +- .../work/api/domain/EmployeeRepository.java | 12 +- .../work/api/domain/SignRepository.java | 6 +- .../work/api/domain/entity/Status.java | 11 +- ...mpolyeeEntity.java => EmployeeEntity.java} | 115 +++++---- .../employee/DeleteEmployeeUseCase.java | 4 +- .../useCases/employee/GetAllEmployees.java | 4 +- .../employee/GetEmloyeeByIdUseCase.java | 4 +- .../employee/GetEmployeeByEmailUseCase.java | 4 +- .../useCases/sign/CreateEmployeeUseCase.java | 4 +- .../useCases/sign/LoginEmployeeUseCase.java | 6 +- .../ru/myitschool/work/core/UrlConstants.kt | 5 +- .../work/ui/login/LoginActivity.java | 115 --------- .../work/ui/profile/ProfileFragment.java | 35 --- .../ui/profile/RedactProfileFragment.java | 38 --- .../ui/profile/RedactProfileViewModel.java | 7 - .../work/ui/screens/LoginActivity.java | 120 ++++++++++ .../ui/{main => screens}/MainActivity.java | 16 +- .../work/ui/userlist/CompanyInfoFragment.java | 38 --- .../ui/userlist/CompanyInfoViewModel.java | 7 - .../{login => viewModel}/LoginViewModel.java | 30 +-- app/src/main/res/drawable/activity_main.xml | 36 +++ .../main/res/drawable/application_icon.png | Bin 0 -> 11765 bytes .../{background.png => background_login.png} | Bin .../res/drawable/small_application_icon.png | Bin 0 -> 6836 bytes app/src/main/res/drawable/splash_screen.xml | 11 + .../main/res/layout-w936dp/fragment_main.xml | 122 ---------- .../res/layout-w936dp/fragment_result.xml | 27 --- app/src/main/res/layout/activity_login.xml | 129 +++++----- app/src/main/res/layout/activity_main.xml | 17 +- .../main/res/layout/company_info_fragment.xml | 225 ------------------ .../main/res/layout/employees_fragment.xml | 51 ---- app/src/main/res/layout/fragment_main.xml | 115 --------- app/src/main/res/layout/fragment_profile.xml | 218 ----------------- app/src/main/res/layout/fragment_qr.xml | 14 ++ app/src/main/res/layout/fragment_qr_scan.xml | 35 --- .../res/layout/fragment_redact_profile.xml | 209 ---------------- app/src/main/res/layout/fragment_result.xml | 26 -- app/src/main/res/layout/item_user_list.xml | 80 ------- app/src/main/res/values/colors.xml | 7 + app/src/main/res/values/strings.xml | 5 +- app/src/main/res/values/styles.xml | 33 +++ app/src/main/res/values/themes.xml | 2 +- 48 files changed, 458 insertions(+), 1582 deletions(-) rename app/src/main/java/ru/myitschool/work/api/domain/entity/employee/{EmpolyeeEntity.java => EmployeeEntity.java} (83%) delete mode 100644 app/src/main/java/ru/myitschool/work/ui/login/LoginActivity.java delete mode 100644 app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.java delete mode 100644 app/src/main/java/ru/myitschool/work/ui/profile/RedactProfileFragment.java delete mode 100644 app/src/main/java/ru/myitschool/work/ui/profile/RedactProfileViewModel.java create mode 100644 app/src/main/java/ru/myitschool/work/ui/screens/LoginActivity.java rename app/src/main/java/ru/myitschool/work/ui/{main => screens}/MainActivity.java (57%) delete mode 100644 app/src/main/java/ru/myitschool/work/ui/userlist/CompanyInfoFragment.java delete mode 100644 app/src/main/java/ru/myitschool/work/ui/userlist/CompanyInfoViewModel.java rename app/src/main/java/ru/myitschool/work/ui/{login => viewModel}/LoginViewModel.java (66%) create mode 100644 app/src/main/res/drawable/activity_main.xml create mode 100644 app/src/main/res/drawable/application_icon.png rename app/src/main/res/drawable/{background.png => background_login.png} (100%) create mode 100644 app/src/main/res/drawable/small_application_icon.png create mode 100644 app/src/main/res/drawable/splash_screen.xml delete mode 100644 app/src/main/res/layout-w936dp/fragment_main.xml delete mode 100644 app/src/main/res/layout-w936dp/fragment_result.xml delete mode 100644 app/src/main/res/layout/company_info_fragment.xml delete mode 100644 app/src/main/res/layout/employees_fragment.xml delete mode 100644 app/src/main/res/layout/fragment_main.xml delete mode 100644 app/src/main/res/layout/fragment_profile.xml create mode 100644 app/src/main/res/layout/fragment_qr.xml delete mode 100644 app/src/main/res/layout/fragment_qr_scan.xml delete mode 100644 app/src/main/res/layout/fragment_redact_profile.xml delete mode 100644 app/src/main/res/layout/fragment_result.xml delete mode 100644 app/src/main/res/layout/item_user_list.xml create mode 100644 app/src/main/res/values/styles.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2ae5448..08c38ea 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ - + @@ -8,22 +7,24 @@ + android:usesCleartextTraffic="true" + android:theme="@style/splashScreenTheme"> + + + + android:name=".ui.screens.MainActivity" + android:exported="true" > @@ -31,5 +32,4 @@ - - \ No newline at end of file + diff --git a/app/src/main/java/ru/myitschool/work/api/data/EmployeeRepositoryImpl.java b/app/src/main/java/ru/myitschool/work/api/data/EmployeeRepositoryImpl.java index c5c7fff..92bb96f 100644 --- a/app/src/main/java/ru/myitschool/work/api/data/EmployeeRepositoryImpl.java +++ b/app/src/main/java/ru/myitschool/work/api/data/EmployeeRepositoryImpl.java @@ -5,13 +5,11 @@ import androidx.annotation.NonNull; import ru.myitschool.work.api.data.dto.employee.EmployeeDTO; import ru.myitschool.work.api.data.network.RetrofitFactory; import ru.myitschool.work.api.data.source.EmployeeApi; -import ru.myitschool.work.api.data.utils.CallToConsumer; import ru.myitschool.work.api.domain.EmployeeRepository; import ru.myitschool.work.api.domain.entity.Status; -import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; +import ru.myitschool.work.api.domain.entity.employee.EmployeeEntity; import ru.myitschool.work.api.domain.entity.employee.ItemEmployeeEntity; -import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; @@ -85,22 +83,22 @@ public class EmployeeRepositoryImpl implements EmployeeRepository { // } @Override - public void getAllEmployees(@NonNull Consumer>> callback) { + public void getAllEmployees(@NonNull Consumer>> callback) { } @Override - public ItemEmployeeEntity getEmployeeById(long id, @NonNull Consumer> callback) { + public ItemEmployeeEntity getEmployeeById(long id, @NonNull Consumer> callback) { return null; } @Override - public void getEmployeeByEmail(@NonNull String email, @NonNull Consumer> callback) { + public void getEmployeeByEmail(@NonNull String email, @NonNull Consumer> callback) { } @Override - public void getEmployeeByTelephone(@NonNull String telephone, @NonNull Consumer> callback) { + public void getEmployeeByTelephone(@NonNull String telephone, @NonNull Consumer> callback) { } @@ -110,7 +108,7 @@ public class EmployeeRepositoryImpl implements EmployeeRepository { } @Override - public void deleteEmployee(long id, @NonNull Consumer> callback) { + public void deleteEmployee(long id, @NonNull Consumer> callback) { } diff --git a/app/src/main/java/ru/myitschool/work/api/data/SignRepositoryImpl.java b/app/src/main/java/ru/myitschool/work/api/data/SignRepositoryImpl.java index ecca9fa..3510752 100644 --- a/app/src/main/java/ru/myitschool/work/api/data/SignRepositoryImpl.java +++ b/app/src/main/java/ru/myitschool/work/api/data/SignRepositoryImpl.java @@ -1,5 +1,7 @@ package ru.myitschool.work.api.data; +import android.util.Log; + import androidx.annotation.NonNull; import java.util.List; @@ -11,7 +13,7 @@ import ru.myitschool.work.api.data.source.SignApi; import ru.myitschool.work.api.data.utils.CallToConsumer; import ru.myitschool.work.api.domain.SignRepository; import ru.myitschool.work.api.domain.entity.Status; -import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; +import ru.myitschool.work.api.domain.entity.employee.EmployeeEntity; public class SignRepositoryImpl implements SignRepository { private static SignRepositoryImpl INSTANCE; @@ -27,7 +29,7 @@ public class SignRepositoryImpl implements SignRepository { } @Override - public void createEmployee(@NonNull EmployeeCreateDTO employeeCreateDTO, @NonNull Consumer> callback) { + public void createEmployee(@NonNull EmployeeCreateDTO employeeCreateDTO, @NonNull Consumer> callback) { signApi.register(employeeCreateDTO).enqueue(new CallToConsumer<>( callback, employeeDTO -> { @@ -42,32 +44,27 @@ public class SignRepositoryImpl implements SignRepository { final long officeId = employeeDTO.officeId; final String officeName = employeeDTO.officeName; final String officeUrl= employeeDTO.officeImageUrl; - final String possition = employeeDTO.position; + final String position = employeeDTO.position; final String role = employeeDTO.role; final String profileImageUrl= employeeDTO.profileImageUrl; final boolean visitStatus= employeeDTO.visitStatus; final String startVisit= employeeDTO.startVisitDateTime; final List visitIdLast30Days = employeeDTO.visitsIdLast30Days; final long totalVisitTimeLast30Days = employeeDTO.totalTimeVisitsLast30Days; - final String curentOfficeName = employeeDTO.currentOfficeName; + final String currentOfficeName = employeeDTO.currentOfficeName; final String createdAt= employeeDTO.createAt; - if (name != null && surname != null && telephone != null && - email_ != null && officeName != null && officeUrl != null && - possition != null && role != null && startVisit != null && - visitIdLast30Days != null && curentOfficeName != null && - createdAt != null) { - - return new EmpolyeeEntity(id_, name, surname, patronymic, - telephone, email_, officeId, officeName, officeUrl, possition, role, profileImageUrl, - visitStatus, startVisit, visitIdLast30Days, totalVisitTimeLast30Days, curentOfficeName, createdAt); + if (name != null && surname != null && telephone != null && email_ != null && officeName != null && officeUrl != null && position != null && + role != null && startVisit != null && profileImageUrl != null && visitIdLast30Days != null && currentOfficeName != null && createdAt != null) { + return new EmployeeEntity(id_, name, surname, patronymic, telephone, email_, officeId, officeName, officeUrl, position, role, profileImageUrl, + visitStatus, startVisit, visitIdLast30Days, totalVisitTimeLast30Days, currentOfficeName, createdAt); } else return null; }) ); } @Override - public void login(@NonNull String email, @NonNull String password, @NonNull Consumer> callback) { + public void login(@NonNull String email, @NonNull String password, @NonNull Consumer> callback) { credentialsDataSource.updateLogin(email, password); signApi.login().enqueue(new CallToConsumer<>(callback, employeeDTO -> { if (employeeDTO == null) return null; @@ -81,25 +78,22 @@ public class SignRepositoryImpl implements SignRepository { final long officeId = employeeDTO.officeId; final String officeName = employeeDTO.officeName; final String officeUrl= employeeDTO.officeImageUrl; - final String possition = employeeDTO.position; + final String position = employeeDTO.position; final String role = employeeDTO.role; - final String profileImageUrl= employeeDTO.profileImageUrl; + final String profileImageUrl = employeeDTO.profileImageUrl; final boolean visitStatus= employeeDTO.visitStatus; - final String startVisit= employeeDTO.startVisitDateTime; + final String startVisit = employeeDTO.startVisitDateTime; final List visitIdLast30Days = employeeDTO.visitsIdLast30Days; final long totalVisitTimeLast30Days = employeeDTO.totalTimeVisitsLast30Days; - final String curentOfficeName = employeeDTO.currentOfficeName; - final String createdAt= employeeDTO.createAt; + final String currentOfficeName = employeeDTO.currentOfficeName; + final String createdAt = employeeDTO.createAt; - if (name != null && surname != null && telephone != null && - email_ != null && officeName != null && officeUrl != null && - possition != null && role != null && startVisit != null && - visitIdLast30Days != null && curentOfficeName != null && - createdAt != null) { + if (name != null && surname != null && telephone != null && email_ != null && officeName != null && officeUrl != null + && position != null && role != null && profileImageUrl != null && startVisit != null && visitIdLast30Days != null + && currentOfficeName != null && createdAt != null) { - return new EmpolyeeEntity(id_, name, surname, patronymic, - telephone, email_, officeId, officeName, officeUrl, possition, role, profileImageUrl, - visitStatus, startVisit, visitIdLast30Days, totalVisitTimeLast30Days, curentOfficeName, createdAt); + return new EmployeeEntity(id_, name, surname, patronymic, telephone, email_, officeId, officeName, officeUrl, position, role, profileImageUrl, + visitStatus, startVisit, visitIdLast30Days, totalVisitTimeLast30Days, currentOfficeName, createdAt); } else return null; })); } diff --git a/app/src/main/java/ru/myitschool/work/api/data/dto/employee/EmployeeDTO.java b/app/src/main/java/ru/myitschool/work/api/data/dto/employee/EmployeeDTO.java index da4da62..3ffaef7 100644 --- a/app/src/main/java/ru/myitschool/work/api/data/dto/employee/EmployeeDTO.java +++ b/app/src/main/java/ru/myitschool/work/api/data/dto/employee/EmployeeDTO.java @@ -36,7 +36,7 @@ public class EmployeeDTO { @SerializedName("officeImageUrl") public String officeImageUrl; @Nullable - @SerializedName("position") + @SerializedName("positionName") public String position; // Название должности @Nullable @SerializedName("role") diff --git a/app/src/main/java/ru/myitschool/work/api/data/network/RetrofitFactory.java b/app/src/main/java/ru/myitschool/work/api/data/network/RetrofitFactory.java index dc55b68..9b3194c 100644 --- a/app/src/main/java/ru/myitschool/work/api/data/network/RetrofitFactory.java +++ b/app/src/main/java/ru/myitschool/work/api/data/network/RetrofitFactory.java @@ -1,6 +1,6 @@ package ru.myitschool.work.api.data.network; -import com.example.myapplication.core.UrlConstants; +import ru.myitschool.work.core.UrlConstants; import okhttp3.OkHttpClient; import okhttp3.Request; diff --git a/app/src/main/java/ru/myitschool/work/api/data/source/SignApi.java b/app/src/main/java/ru/myitschool/work/api/data/source/SignApi.java index b0755a2..0e95206 100644 --- a/app/src/main/java/ru/myitschool/work/api/data/source/SignApi.java +++ b/app/src/main/java/ru/myitschool/work/api/data/source/SignApi.java @@ -9,10 +9,9 @@ import ru.myitschool.work.api.data.dto.employee.EmployeeCreateDTO; import ru.myitschool.work.api.data.dto.employee.EmployeeDTO; public interface SignApi { - @POST("api/v1/employees/authorization/register") + @POST("api/v1/authorization/register") Call register(@Body EmployeeCreateDTO employeeCreateDTO); - @GET("api/v1/employees/authorization//login") + @GET("api/v1/authorization/login") Call login(); - } diff --git a/app/src/main/java/ru/myitschool/work/api/domain/EmployeeRepository.java b/app/src/main/java/ru/myitschool/work/api/domain/EmployeeRepository.java index c0d3858..ca2f455 100644 --- a/app/src/main/java/ru/myitschool/work/api/domain/EmployeeRepository.java +++ b/app/src/main/java/ru/myitschool/work/api/domain/EmployeeRepository.java @@ -7,15 +7,15 @@ import java.util.function.Consumer; import ru.myitschool.work.api.data.dto.employee.EmployeeDTO; import ru.myitschool.work.api.domain.entity.Status; -import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; +import ru.myitschool.work.api.domain.entity.employee.EmployeeEntity; import ru.myitschool.work.api.domain.entity.employee.ItemEmployeeEntity; public interface EmployeeRepository { - void getAllEmployees(@NonNull Consumer>> callback); - ItemEmployeeEntity getEmployeeById(long id, @NonNull Consumer> callback); - void getEmployeeByEmail(@NonNull String email, @NonNull Consumer> callback); - void getEmployeeByTelephone(@NonNull String telephone, @NonNull Consumer> callback); + void getAllEmployees(@NonNull Consumer>> callback); + ItemEmployeeEntity getEmployeeById(long id, @NonNull Consumer> callback); + void getEmployeeByEmail(@NonNull String email, @NonNull Consumer> callback); + void getEmployeeByTelephone(@NonNull String telephone, @NonNull Consumer> callback); void updateEmployee(long id, @NonNull EmployeeDTO employeeDTO, @NonNull Consumer> callback);//переделай после dto - void deleteEmployee(long id, @NonNull Consumer> callback); + void deleteEmployee(long id, @NonNull Consumer> callback); void patchEmployeerOfficeId(long id, long officeId, @NonNull Consumer> callback); } diff --git a/app/src/main/java/ru/myitschool/work/api/domain/SignRepository.java b/app/src/main/java/ru/myitschool/work/api/domain/SignRepository.java index e87253b..d137fc6 100644 --- a/app/src/main/java/ru/myitschool/work/api/domain/SignRepository.java +++ b/app/src/main/java/ru/myitschool/work/api/domain/SignRepository.java @@ -6,10 +6,10 @@ import java.util.function.Consumer; import ru.myitschool.work.api.data.dto.employee.EmployeeCreateDTO; import ru.myitschool.work.api.domain.entity.Status; -import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; +import ru.myitschool.work.api.domain.entity.employee.EmployeeEntity; public interface SignRepository { - void createEmployee(@NonNull EmployeeCreateDTO employeeRegisterDTO, @NonNull Consumer> callback); - void login(@NonNull String email, @NonNull String password, @NonNull Consumer> callback); + void createEmployee(@NonNull EmployeeCreateDTO employeeRegisterDTO, @NonNull Consumer> callback); + void login(@NonNull String email, @NonNull String password, @NonNull Consumer> callback); void logout(); } diff --git a/app/src/main/java/ru/myitschool/work/api/domain/entity/Status.java b/app/src/main/java/ru/myitschool/work/api/domain/entity/Status.java index 4d4720b..172e5a5 100644 --- a/app/src/main/java/ru/myitschool/work/api/domain/entity/Status.java +++ b/app/src/main/java/ru/myitschool/work/api/domain/entity/Status.java @@ -1,21 +1,20 @@ package ru.myitschool.work.api.domain.entity; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; public class Status { - final int statusCod; + final int statusCode; @Nullable private final T value; @Nullable private final Throwable errors; - public Status(int statusCod, @Nullable T value, @Nullable Throwable errors) { - this.statusCod = statusCod; + public Status(int statusCode, @Nullable T value, @Nullable Throwable errors) { + this.statusCode = statusCode; this.value = value; this.errors = errors; } - public int getStatusCod() { - return statusCod; + public int getStatusCode() { + return statusCode; } @Nullable diff --git a/app/src/main/java/ru/myitschool/work/api/domain/entity/employee/EmpolyeeEntity.java b/app/src/main/java/ru/myitschool/work/api/domain/entity/employee/EmployeeEntity.java similarity index 83% rename from app/src/main/java/ru/myitschool/work/api/domain/entity/employee/EmpolyeeEntity.java rename to app/src/main/java/ru/myitschool/work/api/domain/entity/employee/EmployeeEntity.java index b0ab5b4..471b896 100644 --- a/app/src/main/java/ru/myitschool/work/api/domain/entity/employee/EmpolyeeEntity.java +++ b/app/src/main/java/ru/myitschool/work/api/domain/entity/employee/EmployeeEntity.java @@ -3,18 +3,17 @@ package ru.myitschool.work.api.domain.entity.employee; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import java.util.Date; import java.util.List; -public class EmpolyeeEntity { - @NonNull private final long id; +public class EmployeeEntity { + private final long id; @NonNull private final String name; @NonNull private final String surname; - @NonNull private final String patronymic; + @Nullable private final String patronymic; @NonNull private final String telephone; @NonNull private final String email; - @NonNull private final long officeId; + private final long officeId; @NonNull private final String officeName; @NonNull private final String officeImageUrl; @@ -24,7 +23,7 @@ public class EmpolyeeEntity { @NonNull private final String profileImageUrl; // Текущее состояние входа: false - visit (посещение) ещё не началось, true - visit идёт - @NonNull private final boolean visitStatus; + private final boolean visitStatus; // Если visitStatus true, то возвращает дату и время начала посещения в формате LocalDateTime.toString(), // превратить обратно можно с помощью LocalDateTime.parse(). @@ -33,7 +32,7 @@ public class EmpolyeeEntity { @NonNull private final List visitsIdLast30Days; // Список Id посещений за последние 30 дней. // Возвращает количество отработанных часов за последний месяц. - @NonNull private final long totalTimeVisitsLast30Days; + private final long totalTimeVisitsLast30Days; // (Возможно это стоит убрать) Название офиса, в котором сейчас находится работник. // Если visitStatus false, возвращает null. @@ -43,7 +42,7 @@ public class EmpolyeeEntity { // превратить обратно можно с помощью LocalDateTime.parse(). @NonNull private final String createAt; - public EmpolyeeEntity(long id, @NonNull String name, @NonNull String surname, @NonNull String patronymic, @NonNull String telephone, @NonNull String email, long officeId, @NonNull String officeName, @NonNull String officeImageUrl, @NonNull String position, @NonNull String role, @NonNull String profileImageUrl, boolean visitStatus, @NonNull String startVisitDateTime, @NonNull List visitsIdLast30Days, long totalTimeVisitsLast30Days, @NonNull String currentOfficeName, @NonNull String createAt) { + public EmployeeEntity(long id, @NonNull String name, @NonNull String surname, @Nullable String patronymic, @NonNull String telephone, @NonNull String email, long officeId, @NonNull String officeName, @NonNull String officeImageUrl, @NonNull String position, @NonNull String role, @NonNull String profileImageUrl, boolean visitStatus, @NonNull String startVisitDateTime, @NonNull List visitsIdLast30Days, long totalTimeVisitsLast30Days, @NonNull String currentOfficeName, @NonNull String createAt) { this.id = id; this.name = name; this.surname = surname; @@ -64,52 +63,37 @@ public class EmpolyeeEntity { this.createAt = createAt; } - public long getId() { - return id; + @NonNull + public String getCreateAt() { + return createAt; } @NonNull - public String getName() { - return name; + public String getCurrentOfficeName() { + return currentOfficeName; + } + + public long getTotalTimeVisitsLast30Days() { + return totalTimeVisitsLast30Days; } @NonNull - public String getSurname() { - return surname; + public List getVisitsIdLast30Days() { + return visitsIdLast30Days; } @NonNull - public String getPatronymic() { - return patronymic; + public String getStartVisitDateTime() { + return startVisitDateTime; + } + + public boolean isVisitStatus() { + return visitStatus; } @NonNull - public String getTelephone() { - return telephone; - } - - @NonNull - public String getEmail() { - return email; - } - - public long getOfficeId() { - return officeId; - } - - @NonNull - public String getOfficeName() { - return officeName; - } - - @NonNull - public String getOfficeImageUrl() { - return officeImageUrl; - } - - @NonNull - public String getPosition() { - return position; + public String getProfileImageUrl() { + return profileImageUrl; } @NonNull @@ -118,35 +102,50 @@ public class EmpolyeeEntity { } @NonNull - public String getProfileImageUrl() { - return profileImageUrl; - } - - public boolean isVisitStatus() { - return visitStatus; + public String getPosition() { + return position; } @NonNull - public String getStartVisitDateTime() { - return startVisitDateTime; + public String getOfficeImageUrl() { + return officeImageUrl; } @NonNull - public List getVisitsIdLast30Days() { - return visitsIdLast30Days; + public String getOfficeName() { + return officeName; } - public long getTotalTimeVisitsLast30Days() { - return totalTimeVisitsLast30Days; + public long getOfficeId() { + return officeId; } @NonNull - public String getCurrentOfficeName() { - return currentOfficeName; + public String getEmail() { + return email; } @NonNull - public String getCreateAt() { - return createAt; + public String getTelephone() { + return telephone; + } + + @Nullable + public String getPatronymic() { + return patronymic; + } + + @NonNull + public String getSurname() { + return surname; + } + + @NonNull + public String getName() { + return name; + } + + public long getId() { + return id; } } diff --git a/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/DeleteEmployeeUseCase.java b/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/DeleteEmployeeUseCase.java index 0476b04..37d76c0 100644 --- a/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/DeleteEmployeeUseCase.java +++ b/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/DeleteEmployeeUseCase.java @@ -6,7 +6,7 @@ import java.util.function.Consumer; import ru.myitschool.work.api.domain.EmployeeRepository; import ru.myitschool.work.api.domain.entity.Status; -import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; +import ru.myitschool.work.api.domain.entity.employee.EmployeeEntity; public class DeleteEmployeeUseCase { private final EmployeeRepository employeeRepository; @@ -16,7 +16,7 @@ public class DeleteEmployeeUseCase { } - public void execute(long id, @NonNull Consumer> callback) { + public void execute(long id, @NonNull Consumer> callback) { employeeRepository.deleteEmployee(id,callback); } } diff --git a/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetAllEmployees.java b/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetAllEmployees.java index f7e76f5..cf727a0 100644 --- a/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetAllEmployees.java +++ b/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetAllEmployees.java @@ -7,7 +7,7 @@ import java.util.function.Consumer; import ru.myitschool.work.api.domain.EmployeeRepository; import ru.myitschool.work.api.domain.entity.Status; -import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; +import ru.myitschool.work.api.domain.entity.employee.EmployeeEntity; public class GetAllEmployees { private final EmployeeRepository employeeRepository; @@ -16,7 +16,7 @@ public class GetAllEmployees { this.employeeRepository = employeeRepository; } - public void execute(@NonNull Consumer>> callback) { + public void execute(@NonNull Consumer>> callback) { employeeRepository.getAllEmployees(callback); } } diff --git a/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetEmloyeeByIdUseCase.java b/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetEmloyeeByIdUseCase.java index 80bcc4e..c93a8cf 100644 --- a/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetEmloyeeByIdUseCase.java +++ b/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetEmloyeeByIdUseCase.java @@ -8,7 +8,7 @@ import java.util.function.Consumer; import ru.myitschool.work.api.domain.EmployeeRepository; import ru.myitschool.work.api.domain.entity.Status; -import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; +import ru.myitschool.work.api.domain.entity.employee.EmployeeEntity; public class GetEmloyeeByIdUseCase { private final EmployeeRepository employeeRepository; @@ -17,7 +17,7 @@ public class GetEmloyeeByIdUseCase { this.employeeRepository = employeeRepository; } - public void execute(long id, @NonNull Consumer> callback) { + public void execute(long id, @NonNull Consumer> callback) { employeeRepository.getEmployeeById(id, callback); } } diff --git a/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetEmployeeByEmailUseCase.java b/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetEmployeeByEmailUseCase.java index f7c2a88..ef667e4 100644 --- a/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetEmployeeByEmailUseCase.java +++ b/app/src/main/java/ru/myitschool/work/api/domain/useCases/employee/GetEmployeeByEmailUseCase.java @@ -6,7 +6,7 @@ import java.util.function.Consumer; import ru.myitschool.work.api.domain.EmployeeRepository; import ru.myitschool.work.api.domain.entity.Status; -import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; +import ru.myitschool.work.api.domain.entity.employee.EmployeeEntity; public class GetEmployeeByEmailUseCase { private final ru.myitschool.work.api.domain.EmployeeRepository employeeRepository; @@ -15,6 +15,6 @@ public class GetEmployeeByEmailUseCase { this.employeeRepository = employeeRepository; } - public void execute(@NonNull String email, @NonNull Consumer> callback) { + public void execute(@NonNull String email, @NonNull Consumer> callback) { employeeRepository.getEmployeeByEmail(email, callback); }} diff --git a/app/src/main/java/ru/myitschool/work/api/domain/useCases/sign/CreateEmployeeUseCase.java b/app/src/main/java/ru/myitschool/work/api/domain/useCases/sign/CreateEmployeeUseCase.java index 65eabd3..22b3812 100644 --- a/app/src/main/java/ru/myitschool/work/api/domain/useCases/sign/CreateEmployeeUseCase.java +++ b/app/src/main/java/ru/myitschool/work/api/domain/useCases/sign/CreateEmployeeUseCase.java @@ -7,7 +7,7 @@ import java.util.function.Consumer; import ru.myitschool.work.api.data.dto.employee.EmployeeCreateDTO; import ru.myitschool.work.api.domain.SignRepository; import ru.myitschool.work.api.domain.entity.Status; -import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; +import ru.myitschool.work.api.domain.entity.employee.EmployeeEntity; public class CreateEmployeeUseCase { private final SignRepository signRepository; @@ -16,7 +16,7 @@ public class CreateEmployeeUseCase { this.signRepository = signRepository; } - public void execute(@NonNull EmployeeCreateDTO employeeRegisterDTO, Consumer> callback) { + public void execute(@NonNull EmployeeCreateDTO employeeRegisterDTO, Consumer> callback) { signRepository.createEmployee(employeeRegisterDTO, callback); } } diff --git a/app/src/main/java/ru/myitschool/work/api/domain/useCases/sign/LoginEmployeeUseCase.java b/app/src/main/java/ru/myitschool/work/api/domain/useCases/sign/LoginEmployeeUseCase.java index 7844eee..2be29c9 100644 --- a/app/src/main/java/ru/myitschool/work/api/domain/useCases/sign/LoginEmployeeUseCase.java +++ b/app/src/main/java/ru/myitschool/work/api/domain/useCases/sign/LoginEmployeeUseCase.java @@ -6,7 +6,7 @@ import java.util.function.Consumer; import ru.myitschool.work.api.domain.SignRepository; import ru.myitschool.work.api.domain.entity.Status; -import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; +import ru.myitschool.work.api.domain.entity.employee.EmployeeEntity; public class LoginEmployeeUseCase { private final SignRepository signRepository; @@ -15,9 +15,9 @@ public class LoginEmployeeUseCase { this.signRepository = signRepository; } - public void execute(@NonNull String email, @NonNull String password, Consumer> callback) { + public void execute(@NonNull String email, @NonNull String password, Consumer> callback) { signRepository.login(email, password, employeeEntityStatus -> { - //if (employeeEntityStatus.getStatusCode() != 200) signRepository.logout(); + if (employeeEntityStatus.getStatusCode() != 200) signRepository.logout(); callback.accept(employeeEntityStatus); }); } diff --git a/app/src/main/java/ru/myitschool/work/core/UrlConstants.kt b/app/src/main/java/ru/myitschool/work/core/UrlConstants.kt index ec03aab..c1e47ad 100644 --- a/app/src/main/java/ru/myitschool/work/core/UrlConstants.kt +++ b/app/src/main/java/ru/myitschool/work/core/UrlConstants.kt @@ -1,7 +1,6 @@ -package com.example.myapplication.core +package ru.myitschool.work.core object UrlConstants { // url для эмулятора http://10.0.2.2:8080/ - const val BASE_URL: String = "http://192.168.0.105:8080" - const val DOWNLOAD_URL: String = "$BASE_URL/api/v1/images/" + const val BASE_URL: String = "http://10.6.66.151:8080" } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/login/LoginActivity.java b/app/src/main/java/ru/myitschool/work/ui/login/LoginActivity.java deleted file mode 100644 index a2ef4b8..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/login/LoginActivity.java +++ /dev/null @@ -1,115 +0,0 @@ -package ru.myitschool.work.ui.login; - -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.text.Editable; -import android.view.View; - -import androidx.activity.EdgeToEdge; -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; -import androidx.lifecycle.ViewModelProvider; - -import com.example.myapplication.core.SettingConstants; -import com.google.android.material.snackbar.Snackbar; -import com.google.android.material.textfield.TextInputEditText; - -import ru.myitschool.work.R; -import ru.myitschool.work.databinding.ActivityLoginBinding; -import ru.myitschool.work.ui.main.MainActivity; - -public class LoginActivity extends AppCompatActivity { - - private ActivityLoginBinding binding; - private LoginViewModel viewModel; - - - public LoginActivity() { - super(R.layout.activity_login); - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - EdgeToEdge.enable(this); - setContentView(R.layout.activity_login); - ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { - Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); - return insets; - - binding = ActivityLoginBinding.bind(v); - viewModel = new ViewModelProvider(this).get(ActivityLoginBinding.class); - - binding.email.addTextChangedListener(new TextChangedListener<>(binding.email) { - @Override - public void onTextChanged(TextInputEditText target, Editable s) { - listenerEmailEditText(s); - } - }); - - binding.password.addTextChangedListener(new TextChangedListener<>(binding.password) { - @Override - public void onTextChanged(TextInputEditText target, Editable s) { - listenerPasswordEditText(s); - } - }); - - binding.btEnter.setOnClickListener(this.onClickListenerLoginButton); - - subscribe(); - }); - } - - private void subscribe() { - viewModel.errorLiveData.observe(getViewLifecycleOwner(), error -> { - binding.btEnter.setEnabled(true); - Snackbar.make(requireView(), error, Snackbar.LENGTH_LONG).show(); - }); - viewModel.openLiveData.observe(getViewLifecycleOwner(), employee -> { - binding.btEnter.setEnabled(true); - - SharedPreferences settings = requireView().getContext().getSharedPreferences( - SettingConstants.PREFS_FILE, Context.MODE_PRIVATE - ); - settings.edit().putLong(SettingConstants.PREF_ID, employee.getId()).apply(); - settings.edit().putString(SettingConstants.PREF_ROLE, employee.getRole()).apply(); - - startActivity(new Intent(getApplicationContext(), MainActivity.class)); - }); - } - - private void listenerEmailEditText(Editable s) { - if (s.toString().isEmpty()) { - binding.email.setError("Обязательное поле"); - } else if (!isEmailValid(s.toString())) { - binding.emailLay.setError("Неверный формат"); - } else { - binding.emailLay.setErrorEnabled(false); - } - } - - private void listenerPasswordEditText(Editable s) { - if (s.toString().isEmpty()) { - binding.passwordLay.setError("Обязательное поле"); - } else { - binding.passwordLay.setErrorEnabled(false); - } - } - - private void onClickListenerLoginButton(View view) { - binding.btEnter.setEnabled(false); - - viewModel.changeEmail(String.valueOf(binding.email.getText())); - viewModel.changePassword(String.valueOf(binding.password.getText())); - viewModel.confirm(); - } - - private boolean isEmailValid(String email) { - return android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches(); - } -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.java b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.java deleted file mode 100644 index 7355bf6..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.java +++ /dev/null @@ -1,35 +0,0 @@ -package ru.myitschool.work.ui.profile; - -import android.os.Bundle; - -import androidx.fragment.app.Fragment; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import ru.myitschool.work.R; - -/** - * A simple {@link Fragment} subclass. - * Use the {@link ProfileFragment#newInstance} factory method to - * create an instance of this fragment. - */ -public class ProfileFragment extends Fragment { - - - - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_profile, container, false); - } -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/profile/RedactProfileFragment.java b/app/src/main/java/ru/myitschool/work/ui/profile/RedactProfileFragment.java deleted file mode 100644 index d191f01..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/profile/RedactProfileFragment.java +++ /dev/null @@ -1,38 +0,0 @@ -package ru.myitschool.work.ui.profile; - -import androidx.lifecycle.ViewModelProvider; - -import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import ru.myitschool.work.R; - -public class RedactProfileFragment extends Fragment { - - private RedactProfileViewModel mViewModel; - - public static RedactProfileFragment newInstance() { - return new RedactProfileFragment(); - } - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_redact_profile, container, false); - } - - @Override - public void onActivityCreated(@Nullable Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - mViewModel = new ViewModelProvider(this).get(RedactProfileViewModel.class); - // TODO: Use the ViewModel - } - -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/profile/RedactProfileViewModel.java b/app/src/main/java/ru/myitschool/work/ui/profile/RedactProfileViewModel.java deleted file mode 100644 index b06e10e..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/profile/RedactProfileViewModel.java +++ /dev/null @@ -1,7 +0,0 @@ -package ru.myitschool.work.ui.profile; - -import androidx.lifecycle.ViewModel; - -public class RedactProfileViewModel extends ViewModel { - // TODO: Implement the ViewModel -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/screens/LoginActivity.java b/app/src/main/java/ru/myitschool/work/ui/screens/LoginActivity.java new file mode 100644 index 0000000..4c3bf7c --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/ui/screens/LoginActivity.java @@ -0,0 +1,120 @@ +package ru.myitschool.work.ui.screens; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.text.Editable; +import android.view.View; +import android.widget.Button; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; +import androidx.lifecycle.ViewModelProvider; + +import com.example.myapplication.core.SettingConstants; +import com.google.android.material.snackbar.Snackbar; +import com.google.android.material.textfield.TextInputEditText; +import com.google.android.material.textfield.TextInputLayout; + +import ru.myitschool.work.R; +import ru.myitschool.work.ui.viewModel.LoginViewModel; +import ru.myitschool.work.utils.TextChangedListener; + +public class LoginActivity extends AppCompatActivity { + private Button loginButton; + private TextInputEditText email; + private TextInputLayout emailLayout; + private TextInputEditText password; + private TextInputLayout passwordLayout; + private LoginViewModel viewModel; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_login); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + + loginButton = findViewById(R.id.loginButton); + email = findViewById(R.id.email); + emailLayout = findViewById(R.id.email_layout); + password = findViewById(R.id.password); + passwordLayout = findViewById(R.id.password_layout); + + viewModel = new ViewModelProvider(this).get(LoginViewModel.class); + + email.addTextChangedListener(new TextChangedListener<>(email) { + @Override + public void onTextChanged(TextInputEditText target, Editable s) { + listenerEmailEditText(s); + } + }); + password.addTextChangedListener(new TextChangedListener<>(password) { + @Override + public void onTextChanged(TextInputEditText target, Editable s) { + listenerPasswordEditText(s); + } + }); + + loginButton.setOnClickListener(this::onClickListenerLoginButton); + subscribe(); + } + + private void subscribe() { + viewModel.errorLiveData.observe(this, error -> { + loginButton.setEnabled(true); + Snackbar.make(findViewById(android.R.id.content), error, Snackbar.LENGTH_LONG).show(); + }); + viewModel.openLiveData.observe(this, employee -> { + loginButton.setEnabled(true); + + SharedPreferences settings = getSharedPreferences( + SettingConstants.PREFS_FILE, Context.MODE_PRIVATE + ); + settings.edit().putLong(SettingConstants.PREF_ID, employee.getId()).apply(); + settings.edit().putString(SettingConstants.PREF_ROLE, employee.getRole()).apply(); + + startActivity(new Intent(this, MainActivity.class)); + finish(); + }); + } + + private void listenerEmailEditText(Editable s) { + if (s.toString().isEmpty()) { + emailLayout.setError("Обязательное поле"); + } else if (!isEmailValid(s.toString())) { + emailLayout.setError("Неверный формат"); + } else { + emailLayout.setErrorEnabled(false); + } + } + + private void listenerPasswordEditText(Editable s) { + if (s.toString().isEmpty()) { + passwordLayout.setError("Обязательное поле"); + } else { + passwordLayout.setErrorEnabled(false); + } + } + + private void onClickListenerLoginButton(View view) { + loginButton.setEnabled(false); + + viewModel.changeEmail(String.valueOf(email.getText())); + viewModel.changePassword(String.valueOf(password.getText())); + viewModel.confirm(); + } + + private boolean isEmailValid(String email) { + return android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches(); + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/main/MainActivity.java b/app/src/main/java/ru/myitschool/work/ui/screens/MainActivity.java similarity index 57% rename from app/src/main/java/ru/myitschool/work/ui/main/MainActivity.java rename to app/src/main/java/ru/myitschool/work/ui/screens/MainActivity.java index 339e6a7..d89691b 100644 --- a/app/src/main/java/ru/myitschool/work/ui/main/MainActivity.java +++ b/app/src/main/java/ru/myitschool/work/ui/screens/MainActivity.java @@ -1,6 +1,9 @@ -package ru.myitschool.work.ui.main; +package ru.myitschool.work.ui.screens; +import android.content.Intent; +import android.content.SharedPreferences; import android.os.Bundle; +import android.util.Log; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; @@ -8,9 +11,12 @@ import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; +import com.example.myapplication.core.SettingConstants; + import ru.myitschool.work.R; public class MainActivity extends AppCompatActivity { + private SharedPreferences settings; @Override protected void onCreate(Bundle savedInstanceState) { @@ -22,5 +28,13 @@ public class MainActivity extends AppCompatActivity { v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); + + settings = getSharedPreferences(SettingConstants.PREFS_FILE, MODE_PRIVATE); + + if (settings.getLong(SettingConstants.PREF_ID, SettingConstants.ERROR_ID) == SettingConstants.ERROR_ID) { + Log.d("Test", "(MainActivity) Пользователь не авторизован!"); + startActivity(new Intent(this, LoginActivity.class)); + finish(); + } } } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/userlist/CompanyInfoFragment.java b/app/src/main/java/ru/myitschool/work/ui/userlist/CompanyInfoFragment.java deleted file mode 100644 index 8c78ba5..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/userlist/CompanyInfoFragment.java +++ /dev/null @@ -1,38 +0,0 @@ -package ru.myitschool.work.ui.userlist; - -import androidx.lifecycle.ViewModelProvider; - -import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import ru.myitschool.work.R; - -public class CompanyInfoFragment extends Fragment { - - private CompanyInfoViewModel mViewModel; - - public static CompanyInfoFragment newInstance() { - return new CompanyInfoFragment(); - } - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.company_info_fragment, container, false); - } - - @Override - public void onActivityCreated(@Nullable Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - mViewModel = new ViewModelProvider(this).get(CompanyInfoViewModel.class); - // TODO: Use the ViewModel - } - -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/userlist/CompanyInfoViewModel.java b/app/src/main/java/ru/myitschool/work/ui/userlist/CompanyInfoViewModel.java deleted file mode 100644 index 708da7d..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/userlist/CompanyInfoViewModel.java +++ /dev/null @@ -1,7 +0,0 @@ -package ru.myitschool.work.ui.userlist; - -import androidx.lifecycle.ViewModel; - -public class CompanyInfoViewModel extends ViewModel { - // TODO: Implement the ViewModel -} \ 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/viewModel/LoginViewModel.java similarity index 66% rename from app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.java rename to app/src/main/java/ru/myitschool/work/ui/viewModel/LoginViewModel.java index 2b7a25d..237a10e 100644 --- a/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.java +++ b/app/src/main/java/ru/myitschool/work/ui/viewModel/LoginViewModel.java @@ -1,4 +1,6 @@ -package ru.myitschool.work.ui.login; +package ru.myitschool.work.ui.viewModel; + +import androidx.lifecycle.ViewModel; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -6,17 +8,17 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import ru.myitschool.work.api.data.SignRepositoryImpl; -import ru.myitschool.work.api.domain.entity.employee.EmpolyeeEntity; +import ru.myitschool.work.api.domain.entity.employee.EmployeeEntity; import ru.myitschool.work.api.domain.useCases.sign.LoginEmployeeUseCase; -public class LoginViewModel { +public class LoginViewModel extends ViewModel { private final MutableLiveData mutableErrorLiveData = new MutableLiveData<>(); public final LiveData errorLiveData = mutableErrorLiveData; - private final MutableLiveData mutableOpenLiveData = new MutableLiveData<>(); - public final LiveData openLiveData = mutableOpenLiveData; + private final MutableLiveData mutableOpenLiveData = new MutableLiveData<>(); + public final LiveData openLiveData = mutableOpenLiveData; - private final LoginEmployeeUseCase loginEmployeeUseCase = new LoginEmployeeUseCase( + private final LoginEmployeeUseCase loginVolunteerUseCase = new LoginEmployeeUseCase( SignRepositoryImpl.getInstance() ); @@ -38,19 +40,19 @@ public class LoginViewModel { final String currentPassword = password; if (currentEmail == null || currentEmail.isEmpty()) { - mutableErrorLiveData.postValue("Пароль пустой!"); - return; - } - if (currentPassword == null || currentPassword.isEmpty()) { mutableErrorLiveData.postValue("email пустой!"); return; } - loginEmployeeUseCase.execute(currentEmail, currentPassword, status -> { + if (currentPassword == null || currentPassword.isEmpty()) { + mutableErrorLiveData.postValue("Пароль пустой!"); + return; + } + loginVolunteerUseCase.execute("example1@gmail.com", "password", status -> { if (status.getStatusCode() == 200 && status.getErrors() == null && status.getValue() != null) { mutableOpenLiveData.postValue(status.getValue()); - } else if (status.getStatusCode() == 401) mutableErrorLiveData.postValue("Данные не верны. Попробуйте ещё разок :("); - else mutableErrorLiveData.postValue("Вы не подключены к интернету :("); + } else if (status.getStatusCode() == 401) + mutableErrorLiveData.postValue("Данные не верны. Попробуйте ещё разок :("); + else mutableErrorLiveData.postValue("Вы не подключены к интернету :( " + status.getStatusCode() + " " + status.getValue()); }); } - } diff --git a/app/src/main/res/drawable/activity_main.xml b/app/src/main/res/drawable/activity_main.xml new file mode 100644 index 0000000..c025673 --- /dev/null +++ b/app/src/main/res/drawable/activity_main.xml @@ -0,0 +1,36 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/application_icon.png b/app/src/main/res/drawable/application_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..da9cb60c3057334570c2d5395dcc6b0f372c14ff GIT binary patch literal 11765 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 + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-w936dp/fragment_main.xml b/app/src/main/res/layout-w936dp/fragment_main.xml deleted file mode 100644 index 7b5668a..0000000 --- a/app/src/main/res/layout-w936dp/fragment_main.xml +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - - -