From ea9025296ab84a01e43f8c2e077e2dd94de5e583 Mon Sep 17 00:00:00 2001 From: M M Arif Date: Fri, 27 Mar 2020 23:59:24 +0500 Subject: [PATCH] final implementation and ui completion of commits list --- app/build.gradle | 11 +- .../mian/gitnex/adapters/CommitsAdapter.java | 78 ----- .../gitnex/datasource/CommitsDataSource.java | 138 --------- .../datasource/CommitsDataSourceFactory.java | 52 ---- .../gitnex/fragments/CommitsFragment.java | 286 +++++++++++++++--- .../gitnex/fragments/IssuesOpenFragment.java | 2 +- .../org/mian/gitnex/items/CommitsItems.java | 180 +++++++++++ .../java/org/mian/gitnex/models/Commits.java | 9 +- .../gitnex/viewmodels/CommitsViewModel.java | 43 --- app/src/main/res/layout/list_commits.xml | 50 ++- app/src/main/res/values/strings.xml | 2 + 11 files changed, 489 insertions(+), 362 deletions(-) delete mode 100644 app/src/main/java/org/mian/gitnex/adapters/CommitsAdapter.java delete mode 100644 app/src/main/java/org/mian/gitnex/datasource/CommitsDataSource.java delete mode 100644 app/src/main/java/org/mian/gitnex/datasource/CommitsDataSourceFactory.java create mode 100644 app/src/main/java/org/mian/gitnex/items/CommitsItems.java delete mode 100644 app/src/main/java/org/mian/gitnex/viewmodels/CommitsViewModel.java diff --git a/app/build.gradle b/app/build.gradle index ae5aaab8..e2460f4a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -33,15 +33,15 @@ configurations { dependencies { def lifecycle_version = "2.2.0" - final def markwon_version = '4.2.1' - def paging_version = "2.1.2" + def markwon_version = "4.2.1" + def fastadapter = "3.3.1" implementation fileTree(include: ['*.jar'], dir: 'libs') implementation "androidx.appcompat:appcompat:1.1.0" implementation "com.google.android.material:material:1.2.0-alpha05" implementation "androidx.constraintlayout:constraintlayout:1.1.3" implementation "androidx.legacy:legacy-support-v4:1.0.0" - testImplementation 'junit:junit:4.13' + testImplementation "junit:junit:4.13" androidTestImplementation "androidx.test:runner:1.2.0" androidTestImplementation "androidx.test.espresso:espresso-core:3.2.0" implementation "com.github.vihtarb:tooltip:0.2.0" @@ -80,5 +80,8 @@ dependencies { implementation "com.github.chrisbanes:PhotoView:2.3.0" implementation "com.pddstudio:highlightjs-android:1.5.0" implementation "com.github.barteksc:android-pdf-viewer:3.2.0-beta.1" - implementation "androidx.paging:paging-runtime:$paging_version" + //noinspection GradleDependency + implementation "com.mikepenz:fastadapter:$fastadapter" + implementation "com.mikepenz:fastadapter-commons:$fastadapter" + implementation "com.mikepenz:fastadapter-extensions:$fastadapter" } diff --git a/app/src/main/java/org/mian/gitnex/adapters/CommitsAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/CommitsAdapter.java deleted file mode 100644 index a79e342c..00000000 --- a/app/src/main/java/org/mian/gitnex/adapters/CommitsAdapter.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.mian.gitnex.adapters; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; -import androidx.annotation.NonNull; -import androidx.paging.PagedListAdapter; -import androidx.recyclerview.widget.DiffUtil; -import androidx.recyclerview.widget.RecyclerView; -import org.mian.gitnex.R; -import org.mian.gitnex.models.Commits; - -/** - * Author M M Arif - */ - -public class CommitsAdapter extends PagedListAdapter { - - private Context mCtx; - - public CommitsAdapter(Context mCtx) { - - super(DIFF_CALLBACK); - this.mCtx = mCtx; - - } - - @NonNull - @Override - public CommitsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - - View view = LayoutInflater.from(mCtx).inflate(R.layout.list_commits, parent, false); - return new CommitsViewHolder(view); - - } - - @Override - public void onBindViewHolder(@NonNull CommitsViewHolder holder, int position) { - - Commits commit_ = getItem(position); - - if (commit_ != null) { - holder.commitTitle.setText(commit_.getCommit().getMessage()); - } - - } - - private static DiffUtil.ItemCallback DIFF_CALLBACK = - new DiffUtil.ItemCallback() { - @Override - public boolean areItemsTheSame(Commits oldCommit, Commits newCommit) { - return oldCommit.getSha().equals(newCommit.getSha()); - } - - @SuppressLint("DiffUtilEquals") - @Override - public boolean areContentsTheSame(Commits oldCommit, @NonNull Commits newCommit) { - return oldCommit.equals(newCommit); - } - }; - - static class CommitsViewHolder extends RecyclerView.ViewHolder { - - TextView commitTitle; - - CommitsViewHolder(View itemView) { - - super(itemView); - commitTitle = itemView.findViewById(R.id.commitTitle); - - } - - } - -} diff --git a/app/src/main/java/org/mian/gitnex/datasource/CommitsDataSource.java b/app/src/main/java/org/mian/gitnex/datasource/CommitsDataSource.java deleted file mode 100644 index 05725175..00000000 --- a/app/src/main/java/org/mian/gitnex/datasource/CommitsDataSource.java +++ /dev/null @@ -1,138 +0,0 @@ -package org.mian.gitnex.datasource; - -import android.content.Context; -import android.util.Log; -import androidx.annotation.NonNull; -import androidx.paging.PageKeyedDataSource; -import org.mian.gitnex.clients.RetrofitClient; -import org.mian.gitnex.models.Commits; -import java.util.List; -import java.util.Objects; -import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Response; - -/** - * Author M M Arif - */ - -public class CommitsDataSource extends PageKeyedDataSource { - - private String TAG = "CommitsDataSource"; - private Context ctx; - - private static final int FIRST_PAGE = 1; - - private String instanceUrl; - private String instanceToken; - private String owner; - private String repo; - - CommitsDataSource(Context ctx, String instanceUrl, String instanceToken, String owner, String repo) { - - this.ctx = ctx; - this.instanceUrl = instanceUrl; - this.instanceToken = instanceToken; - this.owner = owner; - this.repo = repo; - - } - - @Override - public void loadInitial(@NonNull LoadInitialParams params, @NonNull final LoadInitialCallback callback) { - - RetrofitClient.getInstance(instanceUrl, ctx) - .getApiInterface() - .getRepositoryCommits(instanceToken, owner, repo, FIRST_PAGE) - .enqueue(new Callback>() { - @Override - public void onResponse(@NonNull Call> call, @NonNull Response> response) { - - if (response.body() != null) { - - callback.onResult(response.body(), null, FIRST_PAGE + 1); - - } - - } - - @Override - public void onFailure(@NonNull Call> call, @NonNull Throwable t) { - - Log.e(TAG, Objects.requireNonNull(t.getMessage())); - - } - }); - - } - - @Override - public void loadBefore(@NonNull final LoadParams params, @NonNull final LoadCallback callback) { - - RetrofitClient.getInstance(instanceUrl, ctx) - .getApiInterface() - .getRepositoryCommits(instanceToken, owner, repo, params.key) - .enqueue(new Callback>() { - - @Override - public void onResponse(@NonNull Call> call, @NonNull Response> response) { - - Integer adjacentKey = (params.key > 1) ? params.key - 1 : null; - - if (response.body() != null) { - - callback.onResult(response.body(), adjacentKey); - - } - - } - - @Override - public void onFailure(@NonNull Call> call, @NonNull Throwable t) { - - Log.e(TAG, Objects.requireNonNull(t.getMessage())); - - } - - }); - - } - - @Override - public void loadAfter(@NonNull final LoadParams params, @NonNull final LoadCallback callback) { - - RetrofitClient.getInstance(instanceUrl, ctx) - .getApiInterface() - .getRepositoryCommits(instanceToken, owner, repo, params.key) - .enqueue(new Callback>() { - - @Override - public void onResponse(@NonNull Call> call, @NonNull Response> response) { - - if (response.body() != null) { - - boolean next = false; - if(response.body().size() > 0) { - next = true; - } - - Integer key = next ? params.key + 1 : null; - - callback.onResult(response.body(), key); - - } - - } - - @Override - public void onFailure(@NonNull Call> call, @NonNull Throwable t) { - - Log.e(TAG, Objects.requireNonNull(t.getMessage())); - - } - - }); - - } - -} diff --git a/app/src/main/java/org/mian/gitnex/datasource/CommitsDataSourceFactory.java b/app/src/main/java/org/mian/gitnex/datasource/CommitsDataSourceFactory.java deleted file mode 100644 index 5e0e8093..00000000 --- a/app/src/main/java/org/mian/gitnex/datasource/CommitsDataSourceFactory.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.mian.gitnex.datasource; - -import android.content.Context; -import androidx.annotation.NonNull; -import androidx.lifecycle.MutableLiveData; -import androidx.paging.DataSource; -import androidx.paging.PageKeyedDataSource; -import org.mian.gitnex.models.Commits; - -/** - * Author M M Arif - */ - -public class CommitsDataSourceFactory extends DataSource.Factory { - - private Context ctx; - private String instanceUrl; - private String instanceToken; - private String repoOwner; - private String repoName; - private int listLimit; - - public CommitsDataSourceFactory(Context ctx, String instanceUrl, String instanceToken, String repoOwner, String repoName, int listLimit) { - - this.ctx = ctx; - this.instanceUrl = instanceUrl; - this.instanceToken = instanceToken; - this.repoOwner = repoOwner; - this.repoName = repoName; - this.listLimit = listLimit; - - } - - private MutableLiveData> itemLiveDataSource = new MutableLiveData<>(); - - @NonNull - @Override - public DataSource create() { - - CommitsDataSource itemDataSource = new CommitsDataSource(ctx, instanceUrl, instanceToken, repoOwner, repoName); - itemLiveDataSource.postValue(itemDataSource); - return itemDataSource; - - } - - public MutableLiveData> getItemLiveDataSource() { - - return itemLiveDataSource; - - } - -} diff --git a/app/src/main/java/org/mian/gitnex/fragments/CommitsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/CommitsFragment.java index 3c52b23f..2b48e2ee 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/CommitsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/CommitsFragment.java @@ -1,39 +1,59 @@ package org.mian.gitnex.fragments; import android.os.Bundle; +import android.os.Handler; +import android.util.Log; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +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.Observer; -import androidx.lifecycle.ViewModel; -import androidx.lifecycle.ViewModelProvider; -import androidx.lifecycle.ViewModelProviders; -import androidx.paging.PagedList; +import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import com.mikepenz.fastadapter.IItemAdapter; +import com.mikepenz.fastadapter.adapters.ItemAdapter; +import com.mikepenz.fastadapter.commons.adapters.FastItemAdapter; +import com.mikepenz.fastadapter.listeners.ItemFilterListener; +import com.mikepenz.fastadapter_extensions.items.ProgressItem; +import com.mikepenz.fastadapter_extensions.scroll.EndlessRecyclerOnScrollListener; import org.mian.gitnex.R; -import org.mian.gitnex.adapters.CommitsAdapter; +import org.mian.gitnex.clients.RetrofitClient; +import org.mian.gitnex.items.CommitsItems; import org.mian.gitnex.models.Commits; import org.mian.gitnex.util.TinyDB; -import org.mian.gitnex.viewmodels.CommitsViewModel; +import java.util.ArrayList; +import java.util.List; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; +import static com.mikepenz.fastadapter.adapters.ItemAdapter.items; /** * Author M M Arif */ -public class CommitsFragment extends Fragment { +public class CommitsFragment extends Fragment implements ItemFilterListener { - private CommitsViewModel commitsViewModel; - private CommitsAdapter commitsAdapter; + private TextView noData; + private ProgressBar progressBar; private SwipeRefreshLayout swipeRefreshLayout; + private String TAG = "CommitsFragment - "; + private int resultLimit = 50; + private boolean loadNextFlag = false; - private int listLimit = 50; + private List items = new ArrayList<>(); + private FastItemAdapter fastItemAdapter; + private ItemAdapter footerAdapter; + private EndlessRecyclerOnScrollListener endlessRecyclerOnScrollListener; @Nullable @Override @@ -51,48 +71,244 @@ public class CommitsFragment extends Fragment { final String repoOwner = parts[0]; final String repoName = parts[1]; - TextView noDataCommits = v.findViewById(R.id.noDataCommits); - ProgressBar progressBar = v.findViewById(R.id.progress_bar); + noData = v.findViewById(R.id.noDataCommits); + progressBar = v.findViewById(R.id.progress_bar); swipeRefreshLayout = v.findViewById(R.id.pullToRefresh); - progressBar.setVisibility(View.GONE); RecyclerView recyclerView = v.findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.setHasFixedSize(true); - //CommitsViewModel commitsViewModel = new ViewModelProvider(this).get(CommitsViewModel.class); - - commitsAdapter = new CommitsAdapter(getContext()); - - commitsViewModel = ViewModelProviders.of(this, new ViewModelProvider.Factory() { - - @NonNull - @Override - public VM create(@NonNull Class modelClass) { - //noinspection unchecked - return (VM) new CommitsViewModel (getContext(), instanceUrl, instanceToken, repoOwner, repoName, listLimit); - } - - }).get(CommitsViewModel.class); - - swipeRefreshLayout.setOnRefreshListener(() -> commitsViewModel.refresh()); + fastItemAdapter = new FastItemAdapter<>(); + fastItemAdapter.withSelectable(true); + footerAdapter = items(); //noinspection unchecked - commitsViewModel.itemPagedList.observe(getViewLifecycleOwner(), new Observer>() { + fastItemAdapter.addAdapter(1, footerAdapter); + + fastItemAdapter.getItemFilter().withFilterPredicate(new IItemAdapter.Predicate() { @Override - public void onChanged(@Nullable PagedList items) { + public boolean filter(@NonNull CommitsItems item, CharSequence constraint) { - commitsAdapter.submitList(items); - swipeRefreshLayout.setRefreshing(false); + return item.getCommitTitle().toString().toLowerCase().contains(constraint.toString().toLowerCase()); } }); - recyclerView.setAdapter(commitsAdapter); + fastItemAdapter.getItemFilter().withItemFilterListener(this); + + recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + recyclerView.setItemAnimator(new DefaultItemAnimator()); + recyclerView.setAdapter(fastItemAdapter); + + endlessRecyclerOnScrollListener = new EndlessRecyclerOnScrollListener(footerAdapter) { + + @Override + public void onLoadMore(final int currentPage) { + + loadNext(instanceUrl, instanceToken, repoOwner, repoName, currentPage); + + } + + }; + + swipeRefreshLayout.setOnRefreshListener(() -> { + + progressBar.setVisibility(View.VISIBLE); + fastItemAdapter.clear(); + endlessRecyclerOnScrollListener.resetPageCount(); + swipeRefreshLayout.setRefreshing(false); + + }); + + recyclerView.addOnScrollListener(endlessRecyclerOnScrollListener); + + loadInitial(instanceUrl, instanceToken, repoOwner, repoName); + + assert savedInstanceState != null; + fastItemAdapter.withSavedInstanceState(savedInstanceState); + return v; } + private void loadInitial(String instanceUrl, String token, String repoOwner, String repoName) { + + Call> call = RetrofitClient + .getInstance(instanceUrl, getContext()) + .getApiInterface() + .getRepositoryCommits(token, repoOwner, repoName, 1); + + call.enqueue(new Callback>() { + + @Override + public void onResponse(@NonNull Call> call, @NonNull Response> response) { + + if (response.isSuccessful()) { + + assert response.body() != null; + + if(response.body().size() > 0) { + + if(response.body().size() == resultLimit) { + loadNextFlag = true; + } + + for (int i = 0; i < response.body().size(); i++) { + + items.add(new CommitsItems(getContext()).withNewItems(response.body().get(i).getCommit().getMessage(), response.body().get(i).getHtml_url(), + response.body().get(i).getCommit().getCommitter().getName(), response.body().get(i).getCommit().getCommitter().getDate())); + + } + + fastItemAdapter.add(items); + + } + else { + + noData.setVisibility(View.VISIBLE); + + } + + progressBar.setVisibility(View.GONE); + + } + else { + + Log.e(TAG, String.valueOf(response.code())); + + } + + } + + @Override + public void onFailure(@NonNull Call> call, @NonNull Throwable t) { + + Log.e(TAG, t.toString()); + + } + + }); + + } + + private void loadNext(String instanceUrl, String token, String repoOwner, String repoName, final int currentPage) { + + footerAdapter.clear(); + //noinspection unchecked + footerAdapter.add(new ProgressItem().withEnabled(false)); + Handler handler = new Handler(); + + handler.postDelayed(new Runnable() { + + @Override + public void run() { + + Call> call = RetrofitClient + .getInstance(instanceUrl, getContext()) + .getApiInterface() + .getRepositoryCommits(token, repoOwner, repoName, currentPage + 1); + + call.enqueue(new Callback>() { + + @Override + public void onResponse(@NonNull Call> call, @NonNull Response> response) { + + if (response.isSuccessful()) { + + assert response.body() != null; + + if (response.body().size() > 0) { + + loadNextFlag = response.body().size() == resultLimit; + + for (int i = 0; i < response.body().size(); i++) { + + fastItemAdapter.add(fastItemAdapter.getAdapterItemCount(), new CommitsItems(getContext()).withNewItems(response.body().get(i).getCommit().getMessage(), + response.body().get(i).getHtml_url(), response.body().get(i).getCommit().getCommitter().getName(), + response.body().get(i).getCommit().getCommitter().getDate())); + + } + + footerAdapter.clear(); + + } + else { + + footerAdapter.clear(); + } + + progressBar.setVisibility(View.GONE); + + } + else { + + Log.e(TAG, String.valueOf(response.code())); + + } + + } + + @Override + public void onFailure(@NonNull Call> call, @NonNull Throwable t) { + + Log.e(TAG, t.toString()); + + } + + }); + + } + + }, 1000); + + if(!loadNextFlag) { + + footerAdapter.clear(); + + } + + } + + @Override + public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { + + inflater.inflate(R.menu.search_menu, menu); + super.onCreateOptionsMenu(menu, inflater); + + 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.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() { + + @Override + public boolean onQueryTextSubmit(String query) { + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + fastItemAdapter.filter(newText); + return true; + } + + }); + + endlessRecyclerOnScrollListener.enable(); + + } + + @Override + public void itemsFiltered(@Nullable CharSequence constraint, @Nullable List results) { + endlessRecyclerOnScrollListener.disable(); + } + + @Override + public void onReset() { + endlessRecyclerOnScrollListener.enable(); + } + } diff --git a/app/src/main/java/org/mian/gitnex/fragments/IssuesOpenFragment.java b/app/src/main/java/org/mian/gitnex/fragments/IssuesOpenFragment.java index cf5100b2..46b70dbc 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/IssuesOpenFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/IssuesOpenFragment.java @@ -51,7 +51,7 @@ public class IssuesOpenFragment extends Fragment { private int pageSize = 1; private TextView noDataIssues; private int resultLimit = 50; - private String requestType = "issues" ; + private String requestType = "issues"; @Nullable @Override diff --git a/app/src/main/java/org/mian/gitnex/items/CommitsItems.java b/app/src/main/java/org/mian/gitnex/items/CommitsItems.java new file mode 100644 index 00000000..bfa2a69f --- /dev/null +++ b/app/src/main/java/org/mian/gitnex/items/CommitsItems.java @@ -0,0 +1,180 @@ +package org.mian.gitnex.items; + +import android.content.Context; +import android.text.Html; +import android.text.method.LinkMovementMethod; +import android.view.View; +import android.widget.TextView; +import androidx.annotation.NonNull; +import com.mikepenz.fastadapter.FastAdapter; +import com.mikepenz.fastadapter.items.AbstractItem; +import org.mian.gitnex.R; +import org.mian.gitnex.helpers.ClickListener; +import org.mian.gitnex.helpers.TimeHelper; +import org.mian.gitnex.util.TinyDB; +import org.ocpsoft.prettytime.PrettyTime; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Locale; + +/** + * Author M M Arif + */ + +public class CommitsItems extends AbstractItem { + + final private Context ctx; + private String commitTitle; + private String commitHtmlUrl; + private String commitCommitter; + private Date commitDate; + + private boolean isSelectable = true; + + public CommitsItems(Context ctx) { + this.ctx = ctx; + } + + public CommitsItems withNewItems(String commitTitle, String commitHtmlUrl, String commitCommitter, Date commitDate) { + + this.setNewItems(commitTitle, commitHtmlUrl, commitCommitter, commitDate); + return this; + + } + + private void setNewItems(String commitTitle, String commitHtmlUrl, String commitCommitter, Date commitDate) { + + this.commitTitle = commitTitle; + this.commitHtmlUrl = commitHtmlUrl; + this.commitCommitter = commitCommitter; + this.commitDate = commitDate; + + } + + public String getCommitTitle() { + return commitTitle; + } + + private String getCommitHtmlUrl() { + return commitHtmlUrl; + } + + private String getcommitCommitter() { + return commitCommitter; + } + + private Date getcommitDate() { + return commitDate; + } + + @Override + public boolean isEnabled() { + return true; + } + + @Override + public CommitsItems withEnabled(boolean enabled) { + return null; + } + + @Override + public boolean isSelectable() { + return isSelectable; + } + + @Override + public CommitsItems withSelectable(boolean selectable) { + + this.isSelectable = selectable; + return this; + + } + + @Override + public int getType() { + return R.id.commitList; + } + + @Override + public int getLayoutRes() { + return R.layout.list_commits; + } + + @NonNull + @Override + public CommitsItems.ViewHolder getViewHolder(@NonNull View v) { + + return new CommitsItems.ViewHolder(v); + + } + + public class ViewHolder extends FastAdapter.ViewHolder { + + final TinyDB tinyDb = new TinyDB(ctx); + final String locale = tinyDb.getString("locale"); + final String timeFormat = tinyDb.getString("dateFormat"); + + TextView commitTitleVw; + TextView commitCommitterVw; + TextView commitDateVw; + TextView commitHtmlUrlVw; + + public ViewHolder(View itemView) { + + super(itemView); + + commitTitleVw = itemView.findViewById(R.id.commitTitleVw); + commitCommitterVw = itemView.findViewById(R.id.commitCommitterVw); + commitDateVw = itemView.findViewById(R.id.commitDateVw); + commitHtmlUrlVw = itemView.findViewById(R.id.commitHtmlUrlVw); + + } + + @Override + public void bindView(CommitsItems item, @NonNull List payloads) { + + commitTitleVw.setText(item.getCommitTitle()); + commitCommitterVw.setText(ctx.getString(R.string.commitCommittedBy, item.getcommitCommitter())); + + switch (timeFormat) { + case "pretty": { + PrettyTime prettyTime = new PrettyTime(new Locale(locale)); + String createdTime = prettyTime.format(item.getcommitDate()); + commitDateVw.setText(createdTime); + commitDateVw.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(item.getcommitDate()), ctx)); + break; + } + case "normal": { + DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + ctx.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); + String createdTime = formatter.format(item.getcommitDate()); + commitDateVw.setText(createdTime); + break; + } + case "normal1": { + DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + ctx.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); + String createdTime = formatter.format(item.getcommitDate()); + commitDateVw.setText(createdTime); + break; + } + } + + commitHtmlUrlVw.setText(Html.fromHtml("" + ctx.getResources().getString(R.string.viewInBrowser) + " ")); + commitHtmlUrlVw.setMovementMethod(LinkMovementMethod.getInstance()); + + } + + @Override + public void unbindView(@NonNull CommitsItems item) { + + commitTitleVw.setText(null); + commitCommitterVw.setText(null); + commitDateVw.setText(null); + commitHtmlUrlVw.setText(null); + + } + + } + +} diff --git a/app/src/main/java/org/mian/gitnex/models/Commits.java b/app/src/main/java/org/mian/gitnex/models/Commits.java index b166a861..dd64133e 100644 --- a/app/src/main/java/org/mian/gitnex/models/Commits.java +++ b/app/src/main/java/org/mian/gitnex/models/Commits.java @@ -1,5 +1,6 @@ package org.mian.gitnex.models; +import java.util.Date; import java.util.List; /** @@ -40,7 +41,7 @@ public class Commits { String name; String email; - String date; + Date date; public String getName() { return name; @@ -50,7 +51,7 @@ public class Commits { return email; } - public String getDate() { + public Date getDate() { return date; } @@ -60,7 +61,7 @@ public class Commits { String name; String email; - String date; + Date date; public String getName() { return name; @@ -70,7 +71,7 @@ public class Commits { return email; } - public String getDate() { + public Date getDate() { return date; } diff --git a/app/src/main/java/org/mian/gitnex/viewmodels/CommitsViewModel.java b/app/src/main/java/org/mian/gitnex/viewmodels/CommitsViewModel.java deleted file mode 100644 index 7545c607..00000000 --- a/app/src/main/java/org/mian/gitnex/viewmodels/CommitsViewModel.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.mian.gitnex.viewmodels; - -import android.content.Context; -import androidx.lifecycle.LiveData; -import androidx.lifecycle.ViewModel; -import androidx.paging.LivePagedListBuilder; -import androidx.paging.PageKeyedDataSource; -import androidx.paging.PagedList; -import org.mian.gitnex.datasource.CommitsDataSource; -import org.mian.gitnex.datasource.CommitsDataSourceFactory; -import org.mian.gitnex.models.Commits; -import java.util.Objects; - -/** - * Author M M Arif - */ - -public class CommitsViewModel extends ViewModel { - - private CommitsDataSourceFactory itemDataSourceFactory; - public LiveData itemPagedList; - - public CommitsViewModel(Context ctx, String instannceUrl, String instanceToken, String owner, String repo, int listLimit) { - - itemDataSourceFactory = new CommitsDataSourceFactory(ctx, instannceUrl, instanceToken, owner, repo, listLimit); - LiveData> liveDataSource = itemDataSourceFactory.getItemLiveDataSource(); - PagedList.Config pagedListConfig = - (new PagedList.Config.Builder()) - .setEnablePlaceholders(true) - .setPageSize(listLimit).build(); - //noinspection unchecked - itemPagedList = new LivePagedListBuilder(itemDataSourceFactory, pagedListConfig) - .build(); - - } - - public void refresh() { - - Objects.requireNonNull(itemDataSourceFactory.getItemLiveDataSource().getValue()).invalidate(); - - } - -} diff --git a/app/src/main/res/layout/list_commits.xml b/app/src/main/res/layout/list_commits.xml index 65665766..776865f7 100644 --- a/app/src/main/res/layout/list_commits.xml +++ b/app/src/main/res/layout/list_commits.xml @@ -2,9 +2,10 @@ + android:background="?attr/primaryBackgroundColor"> + + + + + android:layout_height="wrap_content" + android:layout_marginTop="10dp" + android:orientation="horizontal"> + + + + + + + android:textSize="14sp" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f2e5a20b..b8d6c0a1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -506,6 +506,7 @@ private public Default + View in Browser Translate GitNex with Crowdin @@ -562,4 +563,5 @@ Create Repository Commits Commit Title + Committed by %1$s