From 04b26f8eaf86f397a12978b6610a2f72c6f534db Mon Sep 17 00:00:00 2001 From: SunZar <121431240+SunZar@users.noreply.github.com> Date: Thu, 20 Feb 2025 10:53:37 +0300 Subject: [PATCH] feat: Added history (RecyclerView) and fixed bugs --- .../work/data/UserRepositoryImpl.java | 8 +- .../myitschool/work/data/dto/HistoryDto.java | 12 +- .../work/domain/entities/HistoryEntity.java | 44 +++--- .../work/ui/information/HistoryAdapter.java | 9 +- .../ui/information/InformationFragment.java | 127 ++++++++++++++++-- .../ui/information/InformationViewModel.java | 66 ++++----- .../work/ui/qr/scan/QrScanFragment.kt | 16 ++- .../java/ru/myitschool/work/utils/Utils.java | 9 ++ .../main/res/layout/fragment_information.xml | 10 ++ 9 files changed, 206 insertions(+), 95 deletions(-) create mode 100644 app/src/main/java/ru/myitschool/work/utils/Utils.java diff --git a/app/src/main/java/ru/myitschool/work/data/UserRepositoryImpl.java b/app/src/main/java/ru/myitschool/work/data/UserRepositoryImpl.java index 9d5fe61..9ce5573 100644 --- a/app/src/main/java/ru/myitschool/work/data/UserRepositoryImpl.java +++ b/app/src/main/java/ru/myitschool/work/data/UserRepositoryImpl.java @@ -63,12 +63,12 @@ public class UserRepositoryImpl implements UserRepository, SignUserRepository { ArrayList result1 = new ArrayList<>(historiesDto.size()); for (HistoryDto history : historiesDto) { final Integer id1 = history.id; - final Integer idUser = history.idUser; + final String username1 = history.username; final Long time = history.time; - final String nameReader = history.nameReader; final String type = history.type; - if (idUser != null && id1 != null){ - result1.add(new HistoryEntity(id1, idUser, time, nameReader, type)); + final Integer code = history.code; + if (username1 != null && id1 != null){ + result1.add(new HistoryEntity(id1, username1, time, type, code)); } } return result1; diff --git a/app/src/main/java/ru/myitschool/work/data/dto/HistoryDto.java b/app/src/main/java/ru/myitschool/work/data/dto/HistoryDto.java index 88c7179..77463db 100644 --- a/app/src/main/java/ru/myitschool/work/data/dto/HistoryDto.java +++ b/app/src/main/java/ru/myitschool/work/data/dto/HistoryDto.java @@ -10,21 +10,19 @@ public class HistoryDto { public Integer id; @Nullable - @SerializedName("idUser") - public Integer idUser; + @SerializedName("username") + public String username; @Nullable @SerializedName("time") public Long time; - @Nullable - @SerializedName("nameReader") - public String nameReader; - @Nullable @SerializedName("type") public String type; - + @Nullable + @SerializedName("code") + public Integer code; } diff --git a/app/src/main/java/ru/myitschool/work/domain/entities/HistoryEntity.java b/app/src/main/java/ru/myitschool/work/domain/entities/HistoryEntity.java index 638f72b..74bf911 100644 --- a/app/src/main/java/ru/myitschool/work/domain/entities/HistoryEntity.java +++ b/app/src/main/java/ru/myitschool/work/domain/entities/HistoryEntity.java @@ -19,12 +19,12 @@ public class HistoryEntity { } @Nullable - public Integer getIdUser() { - return idUser; + public String getUsername() { + return username; } - public void setIdUser(@Nullable Integer idUser) { - this.idUser = idUser; + public void setUsername(@Nullable String username) { + this.username = username; } @Nullable @@ -36,15 +36,6 @@ public class HistoryEntity { this.time = time; } - @Nullable - public String getNameReader() { - return nameReader; - } - - public void setNameReader(@Nullable String nameReader) { - this.nameReader = nameReader; - } - @Nullable public String getType() { return type; @@ -54,28 +45,37 @@ public class HistoryEntity { this.type = type; } - public HistoryEntity(@Nullable Integer id, @Nullable Integer idUser, @Nullable Long time, @Nullable String nameReader, @Nullable String type) { + @Nullable + public Integer getCode() { + return code; + } + + public void setCode(@Nullable Integer code) { + this.code = code; + } + + public HistoryEntity(@Nullable Integer id, @Nullable String username, @Nullable Long time, @Nullable String type, @Nullable Integer code) { this.id = id; - this.idUser = idUser; + this.username = username; this.time = time; - this.nameReader = nameReader; this.type = type; + this.code = code; } @Nullable - @SerializedName("idUser") - public Integer idUser; + @SerializedName("username") + public String username; @Nullable @SerializedName("time") public Long time; - @Nullable - @SerializedName("nameReader") - public String nameReader; - @Nullable @SerializedName("type") public String type; + @Nullable + @SerializedName("code") + public Integer code; + } diff --git a/app/src/main/java/ru/myitschool/work/ui/information/HistoryAdapter.java b/app/src/main/java/ru/myitschool/work/ui/information/HistoryAdapter.java index 328b5d2..c9acd3b 100644 --- a/app/src/main/java/ru/myitschool/work/ui/information/HistoryAdapter.java +++ b/app/src/main/java/ru/myitschool/work/ui/information/HistoryAdapter.java @@ -11,11 +11,12 @@ import java.util.ArrayList; import java.util.List; import ru.myitschool.work.databinding.ItemHistoryBinding; +import ru.myitschool.work.domain.entities.HistoryEntity; import ru.myitschool.work.ui.History; public class HistoryAdapter extends RecyclerView.Adapter { - private final List data = new ArrayList<>(); + private final List data = new ArrayList<>(); @NonNull @Override @@ -40,7 +41,7 @@ public class HistoryAdapter extends RecyclerView.Adapter newData) { + public void updateData(List newData) { data.clear(); data.addAll(newData); notifyDataSetChanged(); @@ -54,11 +55,11 @@ public class HistoryAdapter extends RecyclerView.Adapter history = new ArrayList<>(); + PreferenceManager preferenceManager; + InformationViewModel viewModel; + List history = new ArrayList<>(); + private boolean loadingHistory; + private String username; @Nullable @Override @@ -45,9 +56,11 @@ public class InformationFragment extends Fragment { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - sharedPreferences = getContext().getSharedPreferences(getString(R.string.app_name), Context.MODE_PRIVATE); - - getInformation(); + //sharedPreferences = getContext().getSharedPreferences(getString(R.string.app_name), Context.MODE_PRIVATE); + preferenceManager = new PreferenceManager(this.getContext()); + username = preferenceManager.getString(Constants.KEY_USER_USERNAME); + viewModel = new ViewModelProvider(this).get(InformationViewModel.class); + //getInformation(); binding.scan.setOnClickListener(view1 -> { onClickScan(view); @@ -58,12 +71,13 @@ public class InformationFragment extends Fragment { }); binding.refreshLayout.setOnRefreshListener(() -> { - onClickRefresh(); + viewModel.load(); }); //TODO: SERVER ZAGRUZKA LISTAAAAAAAAAAAAAAA HistoryAdapter adapter = new HistoryAdapter(); binding.historylist.setAdapter(adapter); - adapter.updateData(history); + + subscribe(viewModel, adapter, view); //getParentFragmentManager() requireActivity().getSupportFragmentManager().setFragmentResultListener(QrScanDestination.REQUEST_KEY, getViewLifecycleOwner(), (requestKey, result) -> { @@ -79,11 +93,14 @@ public class InformationFragment extends Fragment { Navigation.findNavController(view).navigate(R.id.action_informationFragment_to_resultFragment); //getFragmentManager().beginTransaction().replace(R.id.nav_host_fragment, resFragment).commit(); }); + + viewModel.changeSelectedUsername(username); + viewModel.load(); } - private void onClickRefresh() { + /*private void onClickRefresh() { getInformation(); - } + }*/ private void onClickScan(View view) { Navigation.findNavController(view).navigate(R.id.action_informationFragment_to_qrScanFragment); @@ -91,11 +108,101 @@ public class InformationFragment extends Fragment { } private void onClickLogout(View view) { - sharedPreferences.edit().clear().apply(); + preferenceManager.clear(); Navigation.findNavController(view).navigate(R.id.action_informationFragment_to_loginFragment); //getFragmentManager().beginTransaction().replace(R.id.nav_host_fragment, new LoginFragment()).commit(); } + private void subscribe(final InformationViewModel viewModel, final HistoryAdapter historyAdapter, View view) { + viewModel.stateAllUserHistoryLiveData.observe(getViewLifecycleOwner(), state -> { + loadingHistory = state.isLoading(); + //Toast.makeText(this.getContext(), "Zashol", Toast.LENGTH_SHORT).show(); + + + + binding.loading.setVisibility(Utils.visibleOrGone(loadingHistory)); + if (state.isLoading() == false) { + if (state.getItemsHistory() != null) { + history = state.getItemsHistory(); + + //TODO: BINDING + + + //binding.address.setText(history.getAddress()); + //binding.countVolunteers.setText("Количество волонтёров: " + history.getUsers().size()); + //List itemUserEntities = new ArrayList<>(); + //for (FullUserEntity el : volunteerCenter.getUsers()) { + // UserEntity user = new ItemUserEntity(el.getId(), el.getLastName(), el.getFirstName()); + // itemUserEntities.add(user); + //} + historyAdapter.updateData(history); + historyAdapter.notifyDataSetChanged(); + binding.refreshLayout.setRefreshing(false); + } + } else { + Toast.makeText(this.getContext(), "Error", Toast.LENGTH_SHORT).show(); + takeError(); + } + binding.refreshLayout.setRefreshing(false); + }); + /* + viewModel.stateHistoryLiveData.observe(getViewLifecycleOwner(), state -> { + loadingHistory = state.isLoading(); + //Toast.makeText(this.getContext(), "vse", Toast.LENGTH_SHORT).show(); + binding.loading.setVisibility(Utils.visibleOrGone(loadingHistory)); + if (state.isLoading() == false) { + if (state.getItemsHistory() != null) { + volunteerCenters = state.getItemsVolunteerCenters(); + + List volunteerCentersString = new ArrayList(); + for (ItemVolunteerCenterEntity el : volunteerCenters) { + volunteerCentersString.add(el.getAddress()); + } + + ArrayAdapter spinnerAdapter; + spinnerAdapter = new ArrayAdapter(this.getContext(), android.R.layout.simple_spinner_item, volunteerCentersString); + + spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + + binding.spinner.setAdapter(spinnerAdapter); + //binding.spinner.setPromptId(R.string.chooseday); + //binding.spinner.setSelection(1, true); + String volunteerCenterId = preferenceManager.getString(Constants.KEY_VOLUNTEER_CENTER_ID); + + if (volunteerCenterId != null) { + //Toast.makeText(this.getContext(), volunteerCenterId, Toast.LENGTH_SHORT).show(); + + + binding.spinner.setSelection(Integer.parseInt(volunteerCenterId) - 1, true); + } + + + } else { + Toast.makeText(this.getContext(), "Error", Toast.LENGTH_SHORT).show(); + } + } + + + + + + /*boolean isSuccess = !state.isLoading() + && state.getErrorMessage() == null + && state.getItems() != null; + //binding.refresh.setEnabled(!state.isLoading()); + //if (!state.isLoading()) //binding.refresh.setRefreshing(false); + binding.recycler.setVisibility(Utils.visibleOrGone(isSuccess)); + binding.error.setVisibility(Utils.visibleOrGone(state.getErrorMessage() != null)); + binding.loading.setVisibility(Utils.visibleOrGone(state.isLoading())); + + binding.error.setText(state.getErrorMessage()); + if (isSuccess) { + listAdapter.updateData(state.getItems()); + } + }); +*/ + } + /*private void getInformation() { Retrofit retrofit = new Retrofit.Builder() .baseUrl(ru.myitschool.work.core.Constants.SERVER_ADDRESS) diff --git a/app/src/main/java/ru/myitschool/work/ui/information/InformationViewModel.java b/app/src/main/java/ru/myitschool/work/ui/information/InformationViewModel.java index abe7c8e..c8bed19 100644 --- a/app/src/main/java/ru/myitschool/work/ui/information/InformationViewModel.java +++ b/app/src/main/java/ru/myitschool/work/ui/information/InformationViewModel.java @@ -12,23 +12,17 @@ import java.util.List; import ru.myitschool.work.data.UserRepositoryImpl; import ru.myitschool.work.domain.GetAllUserHistoryUseCase; -import ru.myitschool.work.domain.sign.IsUserExistUseCase; -import ru.sicampus.bootcamp2025.data.UserRepositoryImpl; -import ru.sicampus.bootcamp2025.domain.GetUsersListUseCase; -import ru.sicampus.bootcamp2025.domain.GetVolunteerCenterByIdUseCase; -import ru.sicampus.bootcamp2025.domain.GetVolunteerCentersListUseCase; -import ru.sicampus.bootcamp2025.domain.entites.FullVolunteerCenterEntity; -import ru.sicampus.bootcamp2025.domain.entites.ItemVolunteerCenterEntity; -import ru.sicampus.bootcamp2025.domain.entites.Status; +import ru.myitschool.work.domain.entities.HistoryEntity; +import ru.myitschool.work.domain.entities.Status; public class InformationViewModel extends ViewModel { - private final MutableLiveData mutableStateCentersLiveData = new MutableLiveData<>(); + private final MutableLiveData mutableStateHistoryLiveData = new MutableLiveData<>(); - public final LiveData stateCentersLiveData = mutableStateCentersLiveData; + public final LiveData stateHistoryLiveData = mutableStateHistoryLiveData; - private final MutableLiveData mutableStateVolunteerCenterLiveData = new MutableLiveData<>(); + private final MutableLiveData mutableStateAllUserHistoryLiveData = new MutableLiveData<>(); - public final LiveData stateVolunteerCenterLiveData = mutableStateVolunteerCenterLiveData; + public final LiveData stateAllUserHistoryLiveData = mutableStateAllUserHistoryLiveData; public final GetAllUserHistoryUseCase getAllUserHistoryUseCase = new GetAllUserHistoryUseCase( UserRepositoryImpl.getInstance() @@ -38,26 +32,26 @@ public class InformationViewModel extends ViewModel { update(); }*/ - private Integer volunteerCenterId; + private String username; - public void changeSelectedVCId(@NonNull Integer volunteerCenterId) { - this.volunteerCenterId = volunteerCenterId; + public void changeSelectedUsername(@NonNull String username) { + this.username = this.username; } public void load() { - mutableStateCentersLiveData.setValue(new ListViewModel.State(null, null, null, true)); - getAllUserHistoryUseCase.execute(status -> { - mutableStateCentersLiveData.postValue(fromStatus(status)); - }); + mutableStateAllUserHistoryLiveData.setValue(new InformationViewModel.State(null, null, false)); + getHistById(username); + /*getAllUserHistoryUseCase.execute(username, status -> { + mutableStateHistoryLiveData.postValue(fromStatus(status)); + });*/ } - public void getVCById() { - getVolunteerCenterByIdUseCase.execute(volunteerCenterId, status -> { - Log.d("taggis", status.getStatusCode() + " " + status.getErrors()); + public void getHistById() { + getAllUserHistoryUseCase.execute(username, status -> { + //Log.d("taggis", status.getStatusCode() + " " + status.getErrors()); if (status.getStatusCode() == 200 && status.getErrors() == null) { - mutableStateVolunteerCenterLiveData.postValue(new ListViewModel.State( + mutableStateAllUserHistoryLiveData.postValue(new InformationViewModel.State( status.getErrors() != null ? status.getErrors().getLocalizedMessage() : null, - null, status.getValue(), false )); @@ -67,11 +61,10 @@ public class InformationViewModel extends ViewModel { }); } - private ListViewModel.State fromStatus(Status> status) { - return new ListViewModel.State( + private InformationViewModel.State fromStatus(Status> status) { + return new InformationViewModel.State( status.getErrors() != null ? status.getErrors().getLocalizedMessage() : null, status.getValue(), - null, false ); } @@ -81,17 +74,13 @@ public class InformationViewModel extends ViewModel { private final String errorMessage; @Nullable - private final List itemsVolunteerCenters; - - @Nullable - private final FullVolunteerCenterEntity volunteerCenter; + private final List itemsHistory; private final boolean isLoading; - public State(@Nullable String errorMessage, @Nullable List itemsVolunteerCenters, FullVolunteerCenterEntity volunteerCenter, boolean isLoading) { + public State(@Nullable String errorMessage, @Nullable List itemsHistory, boolean isLoading) { this.errorMessage = errorMessage; - this.itemsVolunteerCenters = itemsVolunteerCenters; - this.volunteerCenter = volunteerCenter; + this.itemsHistory = itemsHistory; this.isLoading = isLoading; } @@ -101,13 +90,8 @@ public class InformationViewModel extends ViewModel { } @Nullable - public List getItemsVolunteerCenters() { - return itemsVolunteerCenters; - } - - @Nullable - public FullVolunteerCenterEntity getVolunteerCenter() { - return volunteerCenter; + public List getItemsHistory() { + return itemsHistory; } public boolean isLoading() { diff --git a/app/src/main/java/ru/myitschool/work/ui/qr/scan/QrScanFragment.kt b/app/src/main/java/ru/myitschool/work/ui/qr/scan/QrScanFragment.kt index a9ddaab..72b23ed 100644 --- a/app/src/main/java/ru/myitschool/work/ui/qr/scan/QrScanFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/qr/scan/QrScanFragment.kt @@ -13,6 +13,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.setFragmentResult import androidx.fragment.app.viewModels import androidx.navigation.NavController +import androidx.navigation.Navigation.findNavController import androidx.navigation.fragment.findNavController import com.google.mlkit.vision.barcode.BarcodeScanner import com.google.mlkit.vision.barcode.BarcodeScannerOptions @@ -40,7 +41,7 @@ class QrScanFragment : Fragment(R.layout.fragment_qr_scan) { super.onViewCreated(view, savedInstanceState) _binding = FragmentQrScanBinding.bind(view) sendResult(bundleOf()) - subscribe() + subscribe(view) initCallback() } @@ -48,7 +49,7 @@ class QrScanFragment : Fragment(R.layout.fragment_qr_scan) { binding.close.setOnClickListener { viewModel.close() } } - private fun subscribe() { + private fun subscribe(view: View) { viewModel.state.collectWhenStarted(this) { state -> binding.loading.visibleOrGone(state is QrScanViewModel.State.Loading) binding.viewFinder.visibleOrGone(state is QrScanViewModel.State.Scan) @@ -62,11 +63,11 @@ class QrScanFragment : Fragment(R.layout.fragment_qr_scan) { when (action) { is QrScanViewModel.Action.RequestPermission -> requestPermission(action.permission) is QrScanViewModel.Action.CloseWithCancel -> { - goBack() + goBack(view) } is QrScanViewModel.Action.CloseWithResult -> { sendResult(QrScanDestination.packToBundle(action.result)) - goBack() + goBack(view) } } } @@ -113,9 +114,10 @@ class QrScanFragment : Fragment(R.layout.fragment_qr_scan) { super.onDestroyView() } - private fun goBack() { - findNavControllerOrNull()?.popBackStack() - ?: requireActivity().onBackPressedDispatcher.onBackPressed() + private fun goBack(view: View) { + findNavController(view).navigate(R.id.action_qrScanFragment_to_informationFragment) + /*findNavControllerOrNull()?.popBackStack() + ?: requireActivity().onBackPressedDispatcher.onBackPressed()*/ } private fun sendResult(bundle: Bundle) { diff --git a/app/src/main/java/ru/myitschool/work/utils/Utils.java b/app/src/main/java/ru/myitschool/work/utils/Utils.java new file mode 100644 index 0000000..63a5e47 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/utils/Utils.java @@ -0,0 +1,9 @@ +package ru.myitschool.work.utils; + +import android.view.View; + +public class Utils { + public static int visibleOrGone(boolean isVisible) { + return isVisible ? View.VISIBLE : View.GONE; + } +} diff --git a/app/src/main/res/layout/fragment_information.xml b/app/src/main/res/layout/fragment_information.xml index b4f8704..edb87a0 100644 --- a/app/src/main/res/layout/fragment_information.xml +++ b/app/src/main/res/layout/fragment_information.xml @@ -86,6 +86,16 @@ android:layout_gravity="center" /> + + \ No newline at end of file