From e19afc5524f77c545cfc091301f07c0a32b5bb36 Mon Sep 17 00:00:00 2001 From: M M Arif Date: Wed, 16 Mar 2022 20:14:41 +0500 Subject: [PATCH] Use pagination for repos --- app/build.gradle | 2 +- .../gitnex/adapters/ReposListAdapter.java | 233 ++++++++++++++++-- .../fragments/MyRepositoriesFragment.java | 7 +- .../fragments/RepositoriesFragment.java | 100 +++++++- .../StarredRepositoriesFragment.java | 15 +- .../viewmodels/RepositoriesListViewModel.java | 63 ----- .../viewmodels/RepositoriesViewModel.java | 121 +++++++++ 7 files changed, 433 insertions(+), 108 deletions(-) delete mode 100644 app/src/main/java/org/mian/gitnex/viewmodels/RepositoriesListViewModel.java create mode 100644 app/src/main/java/org/mian/gitnex/viewmodels/RepositoriesViewModel.java diff --git a/app/build.gradle b/app/build.gradle index efa87775..6eb725c5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -109,7 +109,7 @@ dependencies { implementation "androidx.work:work-runtime:$work_version" implementation "io.mikael:urlbuilder:2.0.9" implementation "org.codeberg.gitnex-garage:emoji-java:v5.1.2" - implementation "org.codeberg.gitnex:tea4j:1.1.1" + implementation "org.codeberg.gitnex:tea4j:1.1.3" coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.1.5" implementation 'androidx.biometric:biometric:1.1.0' implementation 'com.github.chrisvest:stormpot:2.4.2' diff --git a/app/src/main/java/org/mian/gitnex/adapters/ReposListAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/ReposListAdapter.java index 8f94e87c..0f3a9949 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/ReposListAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/ReposListAdapter.java @@ -1,5 +1,6 @@ package org.mian.gitnex.adapters; +import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.graphics.Typeface; @@ -16,11 +17,9 @@ import androidx.recyclerview.widget.RecyclerView; import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.util.ColorGenerator; import org.gitnex.tea4j.models.UserRepositories; -import org.gitnex.tea4j.models.WatchInfo; import org.mian.gitnex.R; import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.clients.PicassoService; -import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.database.api.BaseApi; import org.mian.gitnex.database.api.RepositoriesApi; import org.mian.gitnex.database.models.Repository; @@ -29,7 +28,6 @@ import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TinyDB; -import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.contexts.RepositoryContext; import org.ocpsoft.prettytime.PrettyTime; import java.text.DateFormat; @@ -37,20 +35,199 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import java.util.Locale; -import retrofit2.Call; -import retrofit2.Callback; /** * Author M M Arif */ -public class ReposListAdapter extends RecyclerView.Adapter implements Filterable { +public class ReposListAdapter extends RecyclerView.Adapter implements Filterable { - private final List reposList; private final Context context; + private final int TYPE_LOAD = 0; + private List reposList; private final List reposListFull; + private OnLoadMoreListener loadMoreListener; + private boolean isLoading = false, isMoreDataAvailable = true; + private final TinyDB tinyDb; - static class ReposViewHolder extends RecyclerView.ViewHolder { + public ReposListAdapter(List reposListMain, Context ctx) { + this.context = ctx; + this.reposList = reposListMain; + reposListFull = new ArrayList<>(reposList); + this.tinyDb = TinyDB.getInstance(context); + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + LayoutInflater inflater = LayoutInflater.from(context); + if(viewType == TYPE_LOAD) { + return new ReposListAdapter.ReposHolder(inflater.inflate(R.layout.list_repositories, parent, false)); + } + else { + return new ReposListAdapter.LoadHolder(inflater.inflate(R.layout.row_load, parent, false)); + } + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) { + isLoading = true; + loadMoreListener.onLoadMore(); + } + + if(getItemViewType(position) == TYPE_LOAD) { + ((ReposListAdapter.ReposHolder) holder).bindData(reposList.get(position)); + } + } + + @Override + public int getItemViewType(int position) { + if(reposList.get(position).getFullName() != null) { + return TYPE_LOAD; + } + else { + return 1; + } + } + + @Override + public int getItemCount() { + return reposList.size(); + } + + class ReposHolder extends RecyclerView.ViewHolder { + + private UserRepositories userRepositories; + + private final ImageView image; + private final TextView repoName; + private final TextView orgName; + private final TextView repoDescription; + private CheckBox isRepoAdmin; + private final TextView repoStars; + private final TextView repoLastUpdated; + private final View spacerView; + + ReposHolder(View itemView) { + + super(itemView); + repoName = itemView.findViewById(R.id.repoName); + orgName = itemView.findViewById(R.id.orgName); + repoDescription = itemView.findViewById(R.id.repoDescription); + isRepoAdmin = itemView.findViewById(R.id.repoIsAdmin); + image = itemView.findViewById(R.id.imageAvatar); + repoStars = itemView.findViewById(R.id.repoStars); + repoLastUpdated = itemView.findViewById(R.id.repoLastUpdated); + spacerView = itemView.findViewById(R.id.spacerView); + + itemView.setOnClickListener(v -> { + Context context = v.getContext(); + RepositoryContext repo = new RepositoryContext(userRepositories, context); + Intent intent = repo.getIntent(context, RepoDetailActivity.class); + + int currentActiveAccountId = TinyDB.getInstance(context).getInt("currentActiveAccountId"); + RepositoriesApi repositoryData = BaseApi.getInstance(context, RepositoriesApi.class); + + assert repositoryData != null; + Integer count = repositoryData.checkRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); + + if(count == 0) { + long id = repositoryData.insertRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); + repo.setRepositoryId((int) id); + } + else { + Repository data = repositoryData.getRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); + repo.setRepositoryId(data.getRepositoryId()); + } + + context.startActivity(intent); + }); + } + + @SuppressLint("SetTextI18n") + void bindData(UserRepositories repositories) { + + this.userRepositories = repositories; + int imgRadius = AppUtil.getPixelsFromDensity(context, 3); + + Locale locale = context.getResources().getConfiguration().locale; + String timeFormat = tinyDb.getString("dateFormat", "pretty"); + orgName.setText(repositories.getFullName().split("/")[0]); + repoName.setText(repositories.getFullName().split("/")[1]); + repoStars.setText(repositories.getStars_count()); + + ColorGenerator generator = ColorGenerator.MATERIAL; + int color = generator.getColor(repositories.getName()); + String firstCharacter = String.valueOf(repositories.getFullName().charAt(0)); + + TextDrawable drawable = TextDrawable.builder().beginConfig().useFont(Typeface.DEFAULT).fontSize(18).toUpperCase().width(28).height(28).endConfig().buildRoundRect(firstCharacter, color, 3); + + if(repositories.getAvatar_url() != null) { + if(!repositories.getAvatar_url().equals("")) { + PicassoService.getInstance(context).get().load(repositories.getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop().into(image); + } + else { + image.setImageDrawable(drawable); + } + } + else { + image.setImageDrawable(drawable); + } + + if(repositories.getUpdated_at() != null) { + + switch(timeFormat) { + case "pretty": { + PrettyTime prettyTime = new PrettyTime(locale); + String createdTime = prettyTime.format(repositories.getUpdated_at()); + repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); + repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(repositories.getUpdated_at()), context)); + break; + } + case "normal": { + DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale); + String createdTime = formatter.format(repositories.getUpdated_at()); + repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); + break; + } + case "normal1": { + DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale); + String createdTime = formatter.format(repositories.getUpdated_at()); + repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); + break; + } + } + } + else { + repoLastUpdated.setVisibility(View.GONE); + } + + if(!repositories.getDescription().equals("")) { + repoDescription.setVisibility(View.VISIBLE); + repoDescription.setText(repositories.getDescription()); + spacerView.setVisibility(View.GONE); + } + else { + repoDescription.setVisibility(View.GONE); + spacerView.setVisibility(View.VISIBLE); + } + + if(isRepoAdmin == null) { + isRepoAdmin = new CheckBox(context); + } + isRepoAdmin.setChecked(repositories.getPermissions().isAdmin()); + + } + } + + static class LoadHolder extends RecyclerView.ViewHolder { + LoadHolder(View itemView) { + super(itemView); + } + } + + /*static class ReposViewHolder extends RecyclerView.ViewHolder { private UserRepositories userRepositories; @@ -99,9 +276,9 @@ public class ReposListAdapter extends RecyclerView.Adapter reposListMain) { + /*public ReposListAdapter(Context ctx, List reposListMain) { this.context = ctx; this.reposList = reposListMain; @@ -114,9 +291,9 @@ public class ReposListAdapter extends RecyclerView.Adapter list) { + reposList = list; + notifyDataChanged(); } @Override public Filter getFilter() { - return reposFilter; } @@ -235,8 +439,7 @@ public class ReposListAdapter extends RecyclerView.Adapter { - adapter = new ReposListAdapter(getContext(), myReposListMain); + adapter = new ReposListAdapter(myReposListMain, getContext()); if(adapter.getItemCount() > 0) { mRecyclerView.setAdapter(adapter); noDataMyRepo.setVisibility(View.GONE); @@ -155,11 +155,6 @@ public class MyRepositoriesFragment extends Fragment { MenuItem searchItem = menu.findItem(R.id.action_search); androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) searchItem.getActionView(); searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); - //searchView.setQueryHint(getContext().getString(R.string.strFilter)); - - /*if(!connToInternet) { - return; - }*/ searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() { @Override diff --git a/app/src/main/java/org/mian/gitnex/fragments/RepositoriesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/RepositoriesFragment.java index 90c8251b..9547040b 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/RepositoriesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/RepositoriesFragment.java @@ -11,24 +11,19 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; -import android.widget.ProgressBar; -import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton; import org.mian.gitnex.R; import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.CreateRepoActivity; import org.mian.gitnex.activities.MainActivity; import org.mian.gitnex.adapters.ReposListAdapter; import org.mian.gitnex.databinding.FragmentRepositoriesBinding; -import org.mian.gitnex.viewmodels.RepositoriesListViewModel; +import org.mian.gitnex.helpers.Constants; +import org.mian.gitnex.viewmodels.RepositoriesViewModel; /** * Author M M Arif @@ -36,7 +31,86 @@ import org.mian.gitnex.viewmodels.RepositoriesListViewModel; public class RepositoriesFragment extends Fragment { - private ProgressBar mProgressBar; + private FragmentRepositoriesBinding fragmentRepositoriesBinding; + private ReposListAdapter adapter; + private int page = 1; + private int resultLimit = Constants.resultLimitOldGiteaInstances; + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + + fragmentRepositoriesBinding = FragmentRepositoriesBinding.inflate(inflater, container, false); + + setHasOptionsMenu(true); + ((MainActivity) requireActivity()).setActionBarTitle(getResources().getString(R.string.navRepos)); + + // if gitea is 1.12 or higher use the new limit + if(((BaseActivity) requireActivity()).getAccount().requiresVersion("1.12.0")) { + resultLimit = Constants.resultLimitNewGiteaInstances; + } + + fragmentRepositoriesBinding.addNewRepo.setOnClickListener(view -> { + Intent intent = new Intent(view.getContext(), CreateRepoActivity.class); + startActivity(intent); + }); + + fragmentRepositoriesBinding.recyclerView.setHasFixedSize(true); + fragmentRepositoriesBinding.recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(fragmentRepositoriesBinding.recyclerView.getContext(), + DividerItemDecoration.VERTICAL); + fragmentRepositoriesBinding.recyclerView.addItemDecoration(dividerItemDecoration); + + fragmentRepositoriesBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { + + fragmentRepositoriesBinding.pullToRefresh.setRefreshing(false); + fetchDataAsync(((BaseActivity) requireActivity()).getAccount().getAuthorization()); + fragmentRepositoriesBinding.progressBar.setVisibility(View.VISIBLE); + }, 50)); + + fetchDataAsync(((BaseActivity) requireActivity()).getAccount().getAuthorization()); + + return fragmentRepositoriesBinding.getRoot(); + }; + + private void fetchDataAsync(String instanceToken) { + + RepositoriesViewModel reposModel = new ViewModelProvider(this).get(RepositoriesViewModel.class); + + reposModel.getRepositories(instanceToken, page, resultLimit, getContext()).observe(getViewLifecycleOwner(), reposListMain -> { + + adapter = new ReposListAdapter(reposListMain, getContext()); + adapter.setLoadMoreListener(new ReposListAdapter.OnLoadMoreListener() { + + @Override + public void onLoadMore() { + + page += 1; + RepositoriesViewModel.loadMoreRepos(instanceToken, page, resultLimit, getContext(), adapter); + fragmentRepositoriesBinding.progressBar.setVisibility(View.VISIBLE); + } + + @Override + public void onLoadFinished() { + + fragmentRepositoriesBinding.progressBar.setVisibility(View.GONE); + } + }); + + if(adapter.getItemCount() > 0) { + fragmentRepositoriesBinding.recyclerView.setAdapter(adapter); + fragmentRepositoriesBinding.noData.setVisibility(View.GONE); + } + else { + adapter.notifyDataChanged(); + fragmentRepositoriesBinding.recyclerView.setAdapter(adapter); + fragmentRepositoriesBinding.noData.setVisibility(View.VISIBLE); + } + + fragmentRepositoriesBinding.progressBar.setVisibility(View.GONE); + }); + } + + /*private ProgressBar mProgressBar; private RecyclerView mRecyclerView; private ReposListAdapter adapter; private ExtendedFloatingActionButton createNewRepo; @@ -99,19 +173,19 @@ public class RepositoriesFragment extends Fragment { fetchDataAsync(((BaseActivity) requireActivity()).getAccount().getAuthorization(), pageSize, resultLimit); return fragmentRepositoriesBinding.getRoot(); - } + }*/ @Override public void onResume() { super.onResume(); if(MainActivity.repoCreated) { - RepositoriesListViewModel.loadReposList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), getContext(), pageSize, resultLimit); + RepositoriesViewModel.loadReposList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), page, resultLimit, getContext()); MainActivity.repoCreated = false; } } - private void fetchDataAsync(String instanceToken, int pageSize, int resultLimit) { + /*private void fetchDataAsync(String instanceToken, int pageSize, int resultLimit) { RepositoriesListViewModel repoModel = new ViewModelProvider(this).get(RepositoriesListViewModel.class); @@ -130,7 +204,7 @@ public class RepositoriesFragment extends Fragment { } mProgressBar.setVisibility(View.GONE); }); - } + }*/ @Override public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { @@ -150,7 +224,7 @@ public class RepositoriesFragment extends Fragment { @Override public boolean onQueryTextChange(String newText) { - if(mRecyclerView.getAdapter() != null) { + if(fragmentRepositoriesBinding.recyclerView.getAdapter() != null) { adapter.getFilter().filter(newText); } return false; diff --git a/app/src/main/java/org/mian/gitnex/fragments/StarredRepositoriesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/StarredRepositoriesFragment.java index e319db72..a9d8aa8a 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/StarredRepositoriesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/StarredRepositoriesFragment.java @@ -97,12 +97,12 @@ public class StarredRepositoriesFragment extends Fragment { }, 50)); - fetchDataAsync(((BaseActivity) requireActivity()).getAccount().getAuthorization(), pageSize, resultLimit); + //fetchDataAsync(((BaseActivity) requireActivity()).getAccount().getAuthorization(), pageSize, resultLimit); return fragmentStarredRepositoriesBinding.getRoot(); } - private void fetchDataAsync(String instanceToken, int pageSize, int resultLimit) { + /*private void fetchDataAsync(String instanceToken, int pageSize, int resultLimit) { StarredRepositoriesViewModel starredRepoModel = new ViewModelProvider(this).get(StarredRepositoriesViewModel.class); @@ -122,9 +122,9 @@ public class StarredRepositoriesFragment extends Fragment { mProgressBar.setVisibility(View.GONE); }); - } + }*/ - @Override + /*@Override public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { inflater.inflate(R.menu.search_menu, menu); @@ -133,11 +133,6 @@ public class StarredRepositoriesFragment extends Fragment { MenuItem searchItem = menu.findItem(R.id.action_search); androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) searchItem.getActionView(); searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); - //searchView.setQueryHint(getContext().getString(R.string.strFilter)); - - /*if(!connToInternet) { - return; - }*/ searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() { @Override @@ -154,7 +149,7 @@ public class StarredRepositoriesFragment extends Fragment { } }); - } + }*/ @Override public void onResume() { diff --git a/app/src/main/java/org/mian/gitnex/viewmodels/RepositoriesListViewModel.java b/app/src/main/java/org/mian/gitnex/viewmodels/RepositoriesListViewModel.java deleted file mode 100644 index 357e5eec..00000000 --- a/app/src/main/java/org/mian/gitnex/viewmodels/RepositoriesListViewModel.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.mian.gitnex.viewmodels; - -import android.content.Context; -import android.util.Log; -import androidx.annotation.NonNull; -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; -import org.gitnex.tea4j.models.UserRepositories; -import org.mian.gitnex.clients.RetrofitClient; -import java.util.List; -import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Response; - -/** - * Author M M Arif - */ - -public class RepositoriesListViewModel extends ViewModel { - - private static MutableLiveData> reposList; - - public LiveData> getUserRepositories(String token, Context ctx, int page, int limit) { - - //if (reposList == null) { - reposList = new MutableLiveData<>(); - loadReposList(token, ctx, page, limit); - //} - - return reposList; - } - - public static void loadReposList(String token, Context ctx, int page, int limit) { - - Call> call = RetrofitClient - .getApiInterface(ctx) - .getUserRepositories(token, page, limit); - - call.enqueue(new Callback>() { - - @Override - public void onResponse(@NonNull Call> call, @NonNull Response> response) { - - if(response.isSuccessful()) { - if(response.code() == 200) { - reposList.postValue(response.body()); - - } - } - - } - - @Override - public void onFailure(@NonNull Call> call, Throwable t) { - Log.i("onFailure", t.toString()); - } - - }); - - } - -} diff --git a/app/src/main/java/org/mian/gitnex/viewmodels/RepositoriesViewModel.java b/app/src/main/java/org/mian/gitnex/viewmodels/RepositoriesViewModel.java new file mode 100644 index 00000000..eb27475f --- /dev/null +++ b/app/src/main/java/org/mian/gitnex/viewmodels/RepositoriesViewModel.java @@ -0,0 +1,121 @@ +package org.mian.gitnex.viewmodels; + +import android.content.Context; +import android.util.Log; +import androidx.annotation.NonNull; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; +import org.gitnex.tea4j.models.Releases; +import org.gitnex.tea4j.models.UserRepositories; +import org.mian.gitnex.adapters.ReleasesAdapter; +import org.mian.gitnex.adapters.ReposListAdapter; +import org.mian.gitnex.clients.RetrofitClient; +import java.util.List; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +/** + * Author M M Arif + */ + +public class RepositoriesViewModel extends ViewModel { + + private static MutableLiveData> reposList; + + public LiveData> getRepositories(String token, int page, int resultLimit, Context ctx) { + + reposList = new MutableLiveData<>(); + loadReposList(token, page, resultLimit, ctx); + + return reposList; + } + + public static void loadReposList(String token, int page, int resultLimit, Context ctx) { + + Call> call = RetrofitClient + .getApiInterface(ctx) + .getUserRepositories(token, page, resultLimit); + + call.enqueue(new Callback>() { + + @Override + public void onResponse(@NonNull Call> call, @NonNull Response> response) { + + if(response.isSuccessful()) { + if(response.code() == 200) { + reposList.postValue(response.body()); + } + } + } + + @Override + public void onFailure(@NonNull Call> call, Throwable t) { + Log.i("onFailure", t.toString()); + } + + }); + } + + public static void loadMoreRepos(String token, int page, int resultLimit, Context ctx, ReposListAdapter adapter) { + + Call> call = RetrofitClient.getApiInterface(ctx).getUserRepositories(token, page, resultLimit); + + call.enqueue(new Callback>() { + + @Override + public void onResponse(@NonNull Call> call, @NonNull Response> response) { + + if(response.isSuccessful()) { + List list = reposList.getValue(); + assert list != null; + assert response.body() != null; + + if(response.body().size() != 0) { + list.addAll(response.body()); + adapter.updateList(list); + } + else { + adapter.setMoreDataAvailable(false); + } + } + else { + Log.i("onResponse", String.valueOf(response.code())); + } + } + + @Override + public void onFailure(@NonNull Call> call, @NonNull Throwable t) { + + Log.i("onFailure", t.toString()); + } + }); + } + + /*public static void loadReposList(String token, Context ctx, int page, int limit) { + + Call> call = RetrofitClient + .getApiInterface(ctx) + .getUserRepositories(token, page, limit); + + call.enqueue(new Callback>() { + + @Override + public void onResponse(@NonNull Call> call, @NonNull Response> response) { + + if(response.isSuccessful()) { + if(response.code() == 200) { + reposList.postValue(response.body()); + } + } + } + + @Override + public void onFailure(@NonNull Call> call, Throwable t) { + Log.i("onFailure", t.toString()); + } + + }); + }*/ +}