Skip to content

Commit 009fdb0

Browse files
Merge pull request #4 from Onix-Systems/TASK-3
feat: TASK-3 creating projects list screen UI
2 parents 246e841 + 25eaf57 commit 009fdb0

24 files changed

+489
-17
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.android.gitapi.domain.model;
2+
3+
import java.util.Objects;
4+
5+
public class ProjectItemModel {
6+
private long id;
7+
private String userName;
8+
private String description;
9+
private float stars;
10+
private String avatarUrl;
11+
12+
public ProjectItemModel(long id, String userName, String description, float stars, String avatarUrl) {
13+
this.id = id;
14+
this.userName = userName;
15+
this.description = description;
16+
this.stars = stars;
17+
this.avatarUrl = avatarUrl;
18+
}
19+
20+
public String getUserName() {
21+
return userName;
22+
}
23+
24+
public void setUserName(String userName) {
25+
this.userName = userName;
26+
}
27+
28+
public String getDescription() {
29+
return description;
30+
}
31+
32+
public void setDescription(String description) {
33+
this.description = description;
34+
}
35+
36+
public float getStars() {
37+
return stars;
38+
}
39+
40+
public void setStars(float stars) {
41+
this.stars = stars;
42+
}
43+
44+
public String getAvatarUrl() {
45+
return avatarUrl;
46+
}
47+
48+
public void setAvatarUrl(String avatarUrl) {
49+
this.avatarUrl = avatarUrl;
50+
}
51+
52+
public long getId() {
53+
return id;
54+
}
55+
56+
public void setId(long id) {
57+
this.id = id;
58+
}
59+
60+
@Override
61+
public boolean equals(Object o) {
62+
if (this == o) return true;
63+
if (!(o instanceof ProjectItemModel that)) return false;
64+
return Float.compare(that.stars, stars) == 0 && Objects.equals(userName, that.userName) && Objects.equals(description, that.description) && Objects.equals(avatarUrl, that.avatarUrl);
65+
}
66+
67+
@Override
68+
public int hashCode() {
69+
return Objects.hash(userName, description, stars, avatarUrl);
70+
}
71+
}
72+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.android.gitapi.domain.usecase;
2+
3+
public class GetRepositoryListUseCase {
4+
5+
}

app/src/main/java/com/android/gitapi/domain/UseCase.java renamed to app/src/main/java/com/android/gitapi/domain/usecase/UseCase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.android.gitapi.domain;
1+
package com.android.gitapi.domain.usecase;
22

33

44
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;

app/src/main/java/com/android/gitapi/presentation/MainActivity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.android.gitapi.presentation;
22

3-
import androidx.appcompat.app.AppCompatActivity;
4-
53
import android.os.Bundle;
64

5+
import androidx.appcompat.app.AppCompatActivity;
6+
77
import com.android.gitapi.R;
88

99
public class MainActivity extends AppCompatActivity {
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.android.gitapi.presentation.adapter;
2+
3+
import android.view.LayoutInflater;
4+
import android.view.ViewGroup;
5+
6+
import androidx.annotation.NonNull;
7+
import androidx.recyclerview.widget.ListAdapter;
8+
9+
import com.android.gitapi.databinding.RepositoryItemBinding;
10+
import com.android.gitapi.domain.model.ProjectItemModel;
11+
12+
public class RepositoryAdapter extends ListAdapter<ProjectItemModel, RepositoryViewHolder> {
13+
public RepositoryAdapter() {
14+
super(new RepositoryDiffCallback());
15+
}
16+
17+
@NonNull
18+
@Override
19+
public RepositoryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
20+
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
21+
RepositoryItemBinding binding = RepositoryItemBinding.inflate(inflater, parent, false);
22+
return new RepositoryViewHolder(binding);
23+
}
24+
25+
@Override
26+
public void onBindViewHolder(@NonNull RepositoryViewHolder holder, int position) {
27+
ProjectItemModel repository = getItem(position);
28+
holder.bind(repository);
29+
}
30+
31+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.android.gitapi.presentation.adapter;
2+
3+
import androidx.annotation.NonNull;
4+
import androidx.recyclerview.widget.DiffUtil;
5+
6+
import com.android.gitapi.domain.model.ProjectItemModel;
7+
8+
public class RepositoryDiffCallback extends DiffUtil.ItemCallback<ProjectItemModel> {
9+
10+
@Override
11+
public boolean areItemsTheSame(@NonNull ProjectItemModel oldItem, @NonNull ProjectItemModel newItem) {
12+
return oldItem.hashCode() == newItem.hashCode();
13+
}
14+
15+
@Override
16+
public boolean areContentsTheSame(@NonNull ProjectItemModel oldItem, @NonNull ProjectItemModel newItem) {
17+
return oldItem.equals(newItem);
18+
}
19+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.android.gitapi.presentation.adapter;
2+
3+
import androidx.recyclerview.widget.RecyclerView;
4+
5+
import com.android.gitapi.databinding.RepositoryItemBinding;
6+
import com.android.gitapi.domain.model.ProjectItemModel;
7+
import com.bumptech.glide.Glide;
8+
9+
10+
public class RepositoryViewHolder extends RecyclerView.ViewHolder {
11+
private final RepositoryItemBinding binding;
12+
13+
public RepositoryViewHolder(RepositoryItemBinding binding) {
14+
super(binding.getRoot());
15+
this.binding = binding;
16+
}
17+
18+
public void bind(ProjectItemModel repository) {
19+
binding.setModel(repository);
20+
binding.executePendingBindings();
21+
Glide.with(binding.getRoot()).load(repository.getAvatarUrl()).into(binding.avatarImageView);
22+
}
23+
}
24+

app/src/main/java/com/android/gitapi/presentation/arch/BaseFragment.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,19 @@
1414
import androidx.navigation.NavController;
1515
import androidx.navigation.fragment.NavHostFragment;
1616

17-
import com.android.gitapi.R;
18-
1917
public abstract class BaseFragment<T extends ViewDataBinding> extends Fragment {
2018

2119
protected T binding;
2220
private NavController navController;
2321

22+
private void findNavController(Fragment fragment) {
23+
navController = NavHostFragment.findNavController(fragment);
24+
}
25+
2426
@Override
2527
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
2628
binding = DataBindingUtil.inflate(inflater, getLayoutId(), container, false);
27-
NavHostFragment navHostFragment =
28-
(NavHostFragment) requireActivity().getSupportFragmentManager().findFragmentById(R.id.fragmentContainerView);
29-
navController = navHostFragment.getNavController();
29+
findNavController(this);
3030
return binding.getRoot();
3131
}
3232

app/src/main/java/com/android/gitapi/presentation/repositorylist/RepositoryListFragment.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,23 @@
44
import android.view.LayoutInflater;
55
import android.view.View;
66
import android.view.ViewGroup;
7+
import android.widget.ArrayAdapter;
78

89
import androidx.annotation.NonNull;
910
import androidx.annotation.Nullable;
1011
import androidx.lifecycle.ViewModelProvider;
12+
import androidx.recyclerview.widget.LinearLayoutManager;
1113

1214
import com.android.gitapi.App;
1315
import com.android.gitapi.R;
1416
import com.android.gitapi.databinding.FragmentRepositoryListBinding;
17+
import com.android.gitapi.domain.model.ProjectItemModel;
1518
import com.android.gitapi.domain.repository.ProjectsListRepository;
19+
import com.android.gitapi.presentation.adapter.RepositoryAdapter;
1620
import com.android.gitapi.presentation.arch.BaseFragment;
1721

22+
import java.util.ArrayList;
23+
1824
import javax.inject.Inject;
1925

2026
public class RepositoryListFragment extends BaseFragment<FragmentRepositoryListBinding> {
@@ -25,6 +31,8 @@ public class RepositoryListFragment extends BaseFragment<FragmentRepositoryListB
2531
@Inject
2632
ProjectsListRepository projectsListRepository;
2733

34+
private final RepositoryAdapter adapter = new RepositoryAdapter();
35+
2836
private RepositoryListViewModel viewModel;
2937

3038
@Override
@@ -41,14 +49,36 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
4149
return super.onCreateView(inflater, container, savedInstanceState);
4250
}
4351

52+
private void initRecycle() {
53+
binding.repoRecyclerView.setAdapter(adapter);
54+
binding.repoRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
55+
var list = new ArrayList<ProjectItemModel>();
56+
list.add(new ProjectItemModel(1, "Username", "Some description text", 3.4f, "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQIC4VUtRM1OdB1qC2Ybg_cyjVaCWMZ_WLgYaZoTiZZIQ&s"));
57+
list.add(new ProjectItemModel(1, "Username", "Some description text Some description text Some description text Some description text Some description text Some description text", 3.4f, "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQIC4VUtRM1OdB1qC2Ybg_cyjVaCWMZ_WLgYaZoTiZZIQ&s"));
58+
list.add(new ProjectItemModel(1, "Username", "Some description text", 3.4f, "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQIC4VUtRM1OdB1qC2Ybg_cyjVaCWMZ_WLgYaZoTiZZIQ&s"));
59+
list.add(new ProjectItemModel(1, "Username", "Some description text Some description text Some description text Some description text", 3.4f, "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQIC4VUtRM1OdB1qC2Ybg_cyjVaCWMZ_WLgYaZoTiZZIQ&s"));
60+
adapter.submitList(list);
61+
}
62+
63+
private void setupSpinner() {
64+
String[] timeFrameItems = getResources().getStringArray(R.array.timeframe);
65+
66+
ArrayAdapter<String> adapter = new ArrayAdapter<>(requireActivity(), android.R.layout.simple_spinner_item, timeFrameItems);
67+
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
68+
69+
binding.timeframeSpinner.setAdapter(adapter);
70+
71+
}
72+
4473
@Override
4574
protected int getLayoutId() {
4675
return R.layout.fragment_repository_list;
4776
}
4877

4978
@Override
5079
protected void setupViews() {
51-
80+
initRecycle();
81+
setupSpinner();
5282
}
5383

5484
@Override
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.android.gitapi.presentation.tablayout;
2+
3+
import androidx.fragment.app.Fragment;
4+
import androidx.fragment.app.FragmentManager;
5+
import androidx.lifecycle.Lifecycle;
6+
import androidx.viewpager2.adapter.FragmentStateAdapter;
7+
8+
import com.android.gitapi.presentation.repositorylist.RepositoryListFragment;
9+
10+
public class PagerAdapter extends FragmentStateAdapter {
11+
private static final int NUM_TABS = 2;
12+
13+
public PagerAdapter(FragmentManager fragmentManager, Lifecycle lifecycle) {
14+
super(fragmentManager, lifecycle);
15+
}
16+
17+
@Override
18+
public int getItemCount() {
19+
return NUM_TABS;
20+
}
21+
22+
@Override
23+
public Fragment createFragment(int position) {
24+
switch (position) {
25+
case 0:
26+
return new RepositoryListFragment();
27+
case 1:
28+
return new RepositoryListFragment();
29+
}
30+
throw new IllegalStateException();
31+
}
32+
}

0 commit comments

Comments
 (0)