diff --git a/app/src/main/java/ru/yandex/practicum/contacts/SplashActivity.java b/app/src/main/java/ru/yandex/practicum/contacts/SplashActivity.java index dcab69b..774f489 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/SplashActivity.java +++ b/app/src/main/java/ru/yandex/practicum/contacts/SplashActivity.java @@ -33,7 +33,12 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = SplashActivityBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); - binding.settingsButton.setOnClickListener(view -> navigateToSettings()); + binding.settingsButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + navigateToSettings(); + } + }); if (ContextUtils.hasContactPermissions(this)) { navigateToMain(); diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/base/BaseListDiffCallback.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/base/BaseListDiffCallback.java new file mode 100644 index 0000000..4871dc3 --- /dev/null +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/base/BaseListDiffCallback.java @@ -0,0 +1,27 @@ +package ru.yandex.practicum.contacts.presentation.base; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.DiffUtil; + +import ru.yandex.practicum.contacts.presentation.main.ContactUi; + +public class BaseListDiffCallback> extends DiffUtil.ItemCallback { + + @Override + public boolean areItemsTheSame(@NonNull T oldItem, @NonNull T newItem) { + return oldItem.theSameAs(newItem); + } + + @Override + public boolean areContentsTheSame(@NonNull T oldItem, @NonNull T newItem) { + return oldItem.equals(newItem); + } + + @Nullable + @Override + public Object getChangePayload(@NonNull T oldItem, @NonNull T newItem) { + return newItem; + } + +} diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/base/ListDiffInterface.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/base/ListDiffInterface.java new file mode 100644 index 0000000..ba958b8 --- /dev/null +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/base/ListDiffInterface.java @@ -0,0 +1,8 @@ +package ru.yandex.practicum.contacts.presentation.base; + +public interface ListDiffInterface { + boolean theSameAs(T obj); + + boolean equals(Object object); + +} diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/filter/FilterContactTypeAdapter.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/filter/FilterContactTypeAdapter.java index 4203bc2..a17f732 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/filter/FilterContactTypeAdapter.java +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/filter/FilterContactTypeAdapter.java @@ -17,6 +17,8 @@ import ru.yandex.practicum.contacts.databinding.ItemFilterBinding; import ru.yandex.practicum.contacts.model.ContactType; +import ru.yandex.practicum.contacts.presentation.base.BaseListDiffCallback; +import ru.yandex.practicum.contacts.presentation.base.ListDiffInterface; import ru.yandex.practicum.contacts.presentation.filter.model.FilterContactType; import ru.yandex.practicum.contacts.presentation.filter.model.FilterContactTypeUi; import ru.yandex.practicum.contacts.utils.model.ContactTypeUtils; @@ -26,7 +28,7 @@ public class FilterContactTypeAdapter extends RecyclerView.Adapter differ = new AsyncListDiffer<>( new AdapterListUpdateCallback(this), - new AsyncDifferConfig.Builder<>(new ListDiffCallback()).build() + new AsyncDifferConfig.Builder<>(new BaseListDiffCallback()).build() ); private final Consumer clickListener; @@ -86,22 +88,28 @@ public void bind(FilterContactTypeUi data) { } } - static class ListDiffCallback extends DiffUtil.ItemCallback { - - @Override - public boolean areItemsTheSame(@NonNull FilterContactTypeUi oldItem, @NonNull FilterContactTypeUi newItem) { - return oldItem.getContactType() == newItem.getContactType(); - } - - @Override - public boolean areContentsTheSame(@NonNull FilterContactTypeUi oldItem, @NonNull FilterContactTypeUi newItem) { - return oldItem.equals(newItem); - } - - @Nullable - @Override - public Object getChangePayload(@NonNull FilterContactTypeUi oldItem, @NonNull FilterContactTypeUi newItem) { - return newItem; - } - } +// static class ListDiffCallback extends DiffUtil.ItemCallback implements ListDiffInterface { +// +// @Override +// public boolean areItemsTheSame(@NonNull FilterContactTypeUi oldItem, @NonNull FilterContactTypeUi newItem) { +// return oldItem.getContactType() == newItem.getContactType(); +// } +// +// @Override +// public boolean areContentsTheSame(@NonNull FilterContactTypeUi oldItem, @NonNull FilterContactTypeUi newItem) { +// return oldItem.equals(newItem); +// } +// +// @Nullable +// @Override +// public Object getChangePayload(@NonNull FilterContactTypeUi oldItem, @NonNull FilterContactTypeUi newItem) { +// return newItem; +// } +// +// @Override +// public boolean theSameAs(FilterContactTypeUI obj){ +// return this.getContactType() == obj.getContactType(); +// } +// +// } } diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/filter/model/FilterContactTypeUi.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/filter/model/FilterContactTypeUi.java index fbb187f..9f9e951 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/filter/model/FilterContactTypeUi.java +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/filter/model/FilterContactTypeUi.java @@ -2,7 +2,9 @@ import androidx.annotation.NonNull; -public class FilterContactTypeUi { +import ru.yandex.practicum.contacts.presentation.base.ListDiffInterface; + +public class FilterContactTypeUi implements ListDiffInterface { private final FilterContactType contactType; private final boolean selected; @@ -20,6 +22,11 @@ public boolean isSelected() { return selected; } + @Override + public boolean theSameAs(FilterContactTypeUi obj) { + return this.getContactType() == obj.getContactType(); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactAdapter.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactAdapter.java index 9c23172..d11b449 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactAdapter.java +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactAdapter.java @@ -23,12 +23,14 @@ import ru.yandex.practicum.contacts.R; import ru.yandex.practicum.contacts.databinding.ItemContactBinding; +import ru.yandex.practicum.contacts.presentation.base.BaseListDiffCallback; +import ru.yandex.practicum.contacts.presentation.base.ListDiffInterface; public class ContactAdapter extends RecyclerView.Adapter { private final AsyncListDiffer differ = new AsyncListDiffer<>( new AdapterListUpdateCallback(this), - new AsyncDifferConfig.Builder<>(new ListDiffCallback()).build() + new AsyncDifferConfig.Builder<>(new BaseListDiffCallback()).build() ); @NonNull @@ -93,22 +95,28 @@ private void loadAvatar(ContactUi contact) { } } - static class ListDiffCallback extends DiffUtil.ItemCallback { - - @Override - public boolean areItemsTheSame(@NonNull ContactUi oldItem, @NonNull ContactUi newItem) { - return oldItem.hashCode() == newItem.hashCode(); - } - - @Override - public boolean areContentsTheSame(@NonNull ContactUi oldItem, @NonNull ContactUi newItem) { - return oldItem.equals(newItem); - } - - @Nullable - @Override - public Object getChangePayload(@NonNull ContactUi oldItem, @NonNull ContactUi newItem) { - return newItem; - } - } +// static class ListDiffCallback extends DiffUtil.ItemCallback implements ListDiffInterface { +// +// @Override +// public boolean areItemsTheSame(@NonNull ContactUi oldItem, @NonNull ContactUi newItem) { +// return oldItem.hashCode() == newItem.hashCode(); +// } +// +// @Override +// public boolean areContentsTheSame(@NonNull ContactUi oldItem, @NonNull ContactUi newItem) { +// return oldItem.equals(newItem); +// } +// +// @Nullable +// @Override +// public Object getChangePayload(@NonNull ContactUi oldItem, @NonNull ContactUi newItem) { +// return newItem; +// } +// +// @Override +// public boolean theSameAs(ContactUI obj){ +// return this.hashCode() == obj.hashCode(); +// } +// +// } } diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactUi.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactUi.java index 4b2f216..ab674b5 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactUi.java +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactUi.java @@ -5,8 +5,9 @@ import java.util.List; import ru.yandex.practicum.contacts.model.ContactType; +import ru.yandex.practicum.contacts.presentation.base.ListDiffInterface; -public class ContactUi { +public class ContactUi implements ListDiffInterface { private final String name; private final String phone; @@ -41,6 +42,11 @@ public List getTypes() { return types; } + @Override + public boolean theSameAs(ContactUi obj) { + return this.hashCode() == obj.hashCode(); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/MainActivity.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/MainActivity.java index 048f24d..9e5fa37 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/MainActivity.java +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/MainActivity.java @@ -27,6 +27,7 @@ import ru.yandex.practicum.contacts.presentation.sort.model.SortType; import ru.yandex.practicum.contacts.ui.widget.DividerItemDecoration; import ru.yandex.practicum.contacts.utils.android.Debouncer; +import ru.yandex.practicum.contacts.utils.android.OnDebounceListener; import ru.yandex.practicum.contacts.utils.widget.EditTextUtils; import androidx.annotation.IdRes; @@ -36,7 +37,7 @@ import androidx.lifecycle.ViewModelProvider; @SuppressLint("UnsafeExperimentalUsageError") -public class MainActivity extends AppCompatActivity { +public class MainActivity extends AppCompatActivity implements OnDebounceListener { public static final String SORT_TAG = "SORT_TAG"; public static final String FILTER_TAG = "FILTER_TAG"; @@ -47,6 +48,10 @@ public class MainActivity extends AppCompatActivity { private final Map badges = new HashMap<>(); + @Override + public void onDebounce() { + viewModel.search(); + } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -71,7 +76,12 @@ protected void onCreate(Bundle savedInstanceState) { bindSearch(); EditTextUtils.addTextListener(binding.searchLayout.searchText, query -> viewModel.updateSearchText(query.toString())); - binding.searchLayout.resetButton.setOnClickListener(view -> clearSearch()); + binding.searchLayout.resetButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clearSearch(); + } + }); getSupportFragmentManager().setFragmentResultListener(SortDialogFragment.REQUEST_KEY, this, (requestKey, result) -> { final SortType newSortType = SortDialogFragment.from(result); @@ -85,7 +95,7 @@ protected void onCreate(Bundle savedInstanceState) { } public void bindSearch() { - final Debouncer debouncer = new Debouncer(viewModel); + final Debouncer debouncer = new Debouncer(this); binding.searchLayout.searchText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortTypeAdapter.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortTypeAdapter.java index fde5f59..15c6d4d 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortTypeAdapter.java +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortTypeAdapter.java @@ -17,13 +17,15 @@ import ru.yandex.practicum.contacts.R; import ru.yandex.practicum.contacts.databinding.ItemSortBinding; +import ru.yandex.practicum.contacts.presentation.base.BaseListDiffCallback; +import ru.yandex.practicum.contacts.presentation.base.ListDiffInterface; import ru.yandex.practicum.contacts.presentation.sort.model.SortType; public class SortTypeAdapter extends RecyclerView.Adapter { private final AsyncListDiffer differ = new AsyncListDiffer<>( new AdapterListUpdateCallback(this), - new AsyncDifferConfig.Builder<>(new ListDiffCallback()).build() + new AsyncDifferConfig.Builder<>(new BaseListDiffCallback()).build() ); private final Consumer clickListener; @@ -89,22 +91,28 @@ private int resource(SortType sortType) { } } - static class ListDiffCallback extends DiffUtil.ItemCallback { - - @Override - public boolean areItemsTheSame(@NonNull SortTypeUI oldItem, @NonNull SortTypeUI newItem) { - return oldItem.getSortType() == newItem.getSortType(); - } - - @Override - public boolean areContentsTheSame(@NonNull SortTypeUI oldItem, @NonNull SortTypeUI newItem) { - return oldItem.equals(newItem); - } - - @Nullable - @Override - public Object getChangePayload(@NonNull SortTypeUI oldItem, @NonNull SortTypeUI newItem) { - return newItem; - } - } +// static class ListDiffCallback extends DiffUtil.ItemCallback implements ListDiffInterface { +// +// @Override +// public boolean areItemsTheSame(@NonNull SortTypeUI oldItem, @NonNull SortTypeUI newItem) { +// return oldItem.getSortType() == newItem.getSortType(); +// } +// +// @Override +// public boolean areContentsTheSame(@NonNull SortTypeUI oldItem, @NonNull SortTypeUI newItem) { +// return oldItem.equals(newItem); +// } +// +// @Nullable +// @Override +// public Object getChangePayload(@NonNull SortTypeUI oldItem, @NonNull SortTypeUI newItem) { +// return newItem; +// } +// +// @Override +// public boolean theSameAs(SortTypeUI obj){ +// return this.getSortType() == obj.getSortType(); +// } +// +// } } diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortTypeUI.java b/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortTypeUI.java index eb71f27..59dc7fe 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortTypeUI.java +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/sort/SortTypeUI.java @@ -2,9 +2,10 @@ import androidx.annotation.NonNull; +import ru.yandex.practicum.contacts.presentation.base.ListDiffInterface; import ru.yandex.practicum.contacts.presentation.sort.model.SortType; -public class SortTypeUI { +public class SortTypeUI implements ListDiffInterface { private final SortType sortType; private final boolean selected; @@ -22,6 +23,11 @@ public boolean isSelected() { return selected; } + @Override + public boolean theSameAs(SortTypeUI obj) { + return this.getSortType() == obj.getSortType(); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/app/src/main/java/ru/yandex/practicum/contacts/utils/android/Debouncer.java b/app/src/main/java/ru/yandex/practicum/contacts/utils/android/Debouncer.java index 431baca..2ee0cff 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/utils/android/Debouncer.java +++ b/app/src/main/java/ru/yandex/practicum/contacts/utils/android/Debouncer.java @@ -13,10 +13,10 @@ public class Debouncer { private static final int MESSAGE_ID = 1; private static final int DELAY = 500; - private final MainViewModel viewModel; + private final OnDebounceListener listener; - public Debouncer(MainViewModel viewModel) { - this.viewModel = viewModel; + public Debouncer(OnDebounceListener listener) { + this.listener = listener; } private final Handler handler = new Handler(Looper.getMainLooper()) { @@ -39,6 +39,6 @@ public void updateValue(String value) { // выполнить действие по прошествии 500мс, если нового события в течении 500мс не было отправлено private void doOnDebounce() { - viewModel.search(); + listener.onDebounce(); } } diff --git a/app/src/main/java/ru/yandex/practicum/contacts/utils/android/OnDebounceListener.java b/app/src/main/java/ru/yandex/practicum/contacts/utils/android/OnDebounceListener.java new file mode 100644 index 0000000..713537c --- /dev/null +++ b/app/src/main/java/ru/yandex/practicum/contacts/utils/android/OnDebounceListener.java @@ -0,0 +1,5 @@ +package ru.yandex.practicum.contacts.utils.android; + +public interface OnDebounceListener { + void onDebounce(); +}