diff --git a/README.md b/README.md index 729a9793..63c46084 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,6 @@ Open source libraries - Caverock/androidsvg - Droidsonroids.gif/android-gif-drawable - Barteksc/AndroidPdfViewer -- Mikepenz/fastadapter - Ge0rg/MemorizingTrustManager [Follow me on Fediverse - mastodon.social/@mmarif](https://mastodon.social/@mmarif) diff --git a/app/build.gradle b/app/build.gradle index 15e848ee..c144d7b8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -35,7 +35,6 @@ configurations { dependencies { def lifecycle_version = "2.2.0" def markwon_version = '4.3.1' - def fastadapter = "3.3.1" def acra = "5.5.0" implementation fileTree(include: ['*.jar'], dir: 'libs') @@ -82,10 +81,6 @@ 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" - //noinspection GradleDependency - implementation "com.mikepenz:fastadapter:$fastadapter" - implementation "com.mikepenz:fastadapter-commons:$fastadapter" - implementation "com.mikepenz:fastadapter-extensions:$fastadapter" implementation "ch.acra:acra-mail:$acra" implementation "ch.acra:acra-limiter:$acra" implementation "ch.acra:acra-notification:$acra" diff --git a/app/src/main/java/org/mian/gitnex/activities/CommitsActivity.java b/app/src/main/java/org/mian/gitnex/activities/CommitsActivity.java index e3d20068..b8617db6 100644 --- a/app/src/main/java/org/mian/gitnex/activities/CommitsActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/CommitsActivity.java @@ -1,5 +1,6 @@ package org.mian.gitnex.activities; +import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.text.method.ScrollingMovementMethod; @@ -13,312 +14,273 @@ import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.appcompat.widget.Toolbar; -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.clients.RetrofitClient; import org.mian.gitnex.adapters.CommitsAdapter; +import org.mian.gitnex.clients.AppApiService; +import org.mian.gitnex.helpers.Authorization; +import org.mian.gitnex.helpers.StaticGlobalVariables; +import org.mian.gitnex.helpers.Toasty; +import org.mian.gitnex.helpers.VersionCheck; +import org.mian.gitnex.interfaces.ApiInterface; import org.mian.gitnex.models.Commits; import org.mian.gitnex.util.TinyDB; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; -import static com.mikepenz.fastadapter.adapters.ItemAdapter.items; /** * Author M M Arif */ -public class CommitsActivity extends BaseActivity implements ItemFilterListener { +public class CommitsActivity extends BaseActivity { - private View.OnClickListener onClickListener; - private TextView noData; - private ProgressBar progressBar; - private SwipeRefreshLayout swipeRefreshLayout; - private String TAG = "CommitsActivity - "; - private int resultLimit = 50; - private boolean loadNextFlag = false; + private Context ctx; + private View.OnClickListener onClickListener; + private TextView noData; + private ProgressBar progressBar; + private String TAG = "CommitsActivity"; + private int resultLimit = StaticGlobalVariables.resultLimitOldGiteaInstances; + private int pageSize = 1; - private List items = new ArrayList<>(); - private FastItemAdapter fastItemAdapter; - private ItemAdapter footerAdapter; - private EndlessRecyclerOnScrollListener endlessRecyclerOnScrollListener; + private RecyclerView recyclerView; + private List commitsList; + private CommitsAdapter adapter; + private ApiInterface api; - @Override - protected int getLayoutResourceId(){ - return R.layout.activity_commits; - } + @Override + protected int getLayoutResourceId() { - @Override - public void onCreate(Bundle savedInstanceState) { + return R.layout.activity_commits; + } - super.onCreate(savedInstanceState); - Toolbar toolbar = findViewById(R.id.toolbar); - setSupportActionBar(toolbar); + @Override + public void onCreate(Bundle savedInstanceState) { - TinyDB tinyDb = new TinyDB(getApplicationContext()); - final String instanceUrl = tinyDb.getString("instanceUrl"); - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; + super.onCreate(savedInstanceState); + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + ctx = this; - String branchName = getIntent().getStringExtra("branchName"); + TinyDB tinyDb = new TinyDB(ctx); + final String instanceUrl = tinyDb.getString("instanceUrl"); + final String loginUid = tinyDb.getString("loginUid"); + final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); + String repoFullName = tinyDb.getString("repoFullName"); + String[] parts = repoFullName.split("/"); + final String repoOwner = parts[0]; + final String repoName = parts[1]; - TextView toolbar_title = findViewById(R.id.toolbar_title); - toolbar_title.setMovementMethod(new ScrollingMovementMethod()); - toolbar_title.setText(branchName); + String branchName = getIntent().getStringExtra("branchName"); - ImageView closeActivity = findViewById(R.id.close); - noData = findViewById(R.id.noDataCommits); - progressBar = findViewById(R.id.progress_bar); - swipeRefreshLayout = findViewById(R.id.pullToRefresh); + TextView toolbar_title = findViewById(R.id.toolbar_title); + toolbar_title.setMovementMethod(new ScrollingMovementMethod()); + toolbar_title.setText(branchName); - RecyclerView recyclerView = findViewById(R.id.recyclerView); - recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext())); - recyclerView.setHasFixedSize(true); + ImageView closeActivity = findViewById(R.id.close); + noData = findViewById(R.id.noDataCommits); + progressBar = findViewById(R.id.progress_bar); + SwipeRefreshLayout swipeRefresh = findViewById(R.id.pullToRefresh); - initCloseListener(); - closeActivity.setOnClickListener(onClickListener); + initCloseListener(); + closeActivity.setOnClickListener(onClickListener); - fastItemAdapter = new FastItemAdapter<>(); - fastItemAdapter.withSelectable(true); + // if gitea is 1.12 or higher use the new limit (resultLimitNewGiteaInstances) + if(VersionCheck.compareVersion("1.12.0", tinyDb.getString("giteaVersion")) >= 1) { + resultLimit = StaticGlobalVariables.resultLimitNewGiteaInstances; + } - footerAdapter = items(); - //noinspection unchecked - fastItemAdapter.addAdapter(1, footerAdapter); + recyclerView = findViewById(R.id.recyclerView); + commitsList = new ArrayList<>(); - fastItemAdapter.getItemFilter().withFilterPredicate((IItemAdapter.Predicate) (item, constraint) -> item.getCommitTitle().toLowerCase().contains(Objects.requireNonNull(constraint).toString().toLowerCase())); + swipeRefresh.setOnRefreshListener(() -> new Handler().postDelayed(() -> { - fastItemAdapter.getItemFilter().withItemFilterListener(this); + swipeRefresh.setRefreshing(false); + loadInitial(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, branchName); + adapter.notifyDataChanged(); - recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext())); - recyclerView.setItemAnimator(new DefaultItemAnimator()); - recyclerView.setAdapter(fastItemAdapter); + }, 200)); - endlessRecyclerOnScrollListener = new EndlessRecyclerOnScrollListener(footerAdapter) { + adapter = new CommitsAdapter(ctx, commitsList); + adapter.setLoadMoreListener(() -> recyclerView.post(() -> { - @Override - public void onLoadMore(final int currentPage) { + if(commitsList.size() == resultLimit || pageSize == resultLimit) { - loadNext(instanceUrl, instanceToken, repoOwner, repoName, currentPage, branchName); + int page = (commitsList.size() + resultLimit) / resultLimit; + loadMore(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, page, branchName); - } + } - }; + })); - swipeRefreshLayout.setOnRefreshListener(() -> { + recyclerView.setHasFixedSize(true); + recyclerView.setLayoutManager(new LinearLayoutManager(ctx)); + recyclerView.setAdapter(adapter); - progressBar.setVisibility(View.VISIBLE); - fastItemAdapter.clear(); - endlessRecyclerOnScrollListener.resetPageCount(); - swipeRefreshLayout.setRefreshing(false); + api = AppApiService.createService(ApiInterface.class, instanceUrl, ctx); + loadInitial(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, branchName); - }); + } - recyclerView.addOnScrollListener(endlessRecyclerOnScrollListener); + private void loadInitial(String token, String repoOwner, String repoName, String branchName) { - loadInitial(instanceUrl, instanceToken, repoOwner, repoName, branchName); + Call> call = api.getRepositoryCommits(token, repoOwner, repoName, 1, branchName); - assert savedInstanceState != null; - fastItemAdapter.withSavedInstanceState(savedInstanceState); + call.enqueue(new Callback>() { - } + @Override + public void onResponse(@NonNull Call> call, @NonNull Response> response) { - private void loadInitial(String instanceUrl, String token, String repoOwner, String repoName, String branchName) { + if(response.isSuccessful()) { - Call> call = RetrofitClient - .getInstance(instanceUrl, getApplicationContext()) - .getApiInterface() - .getRepositoryCommits(token, repoOwner, repoName, 1, branchName); + assert response.body() != null; + if(response.body().size() > 0) { - call.enqueue(new Callback>() { + commitsList.clear(); + commitsList.addAll(response.body()); + adapter.notifyDataChanged(); + noData.setVisibility(View.GONE); - @Override - public void onResponse(@NonNull Call> call, @NonNull Response> response) { + } + else { + commitsList.clear(); + adapter.notifyDataChanged(); + noData.setVisibility(View.VISIBLE); + } - if (response.isSuccessful()) { + progressBar.setVisibility(View.GONE); - assert response.body() != null; + } + else { - if(response.body().size() > 0) { + Log.e(TAG, String.valueOf(response.code())); - if(response.body().size() == resultLimit) { - loadNextFlag = true; - } + } - for (int i = 0; i < response.body().size(); i++) { + } - items.add(new CommitsAdapter(getApplicationContext()).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())); + @Override + public void onFailure(@NonNull Call> call, @NonNull Throwable t) { - } + Log.e(TAG, t.toString()); + } - fastItemAdapter.add(items); + }); - } - else { + } - noData.setVisibility(View.VISIBLE); + private void loadMore(String token, String repoOwner, String repoName, final int page, String branchName) { - } + //add loading progress view + commitsList.add(new Commits("load")); + adapter.notifyItemInserted((commitsList.size() - 1)); - progressBar.setVisibility(View.GONE); + Call> call = api.getRepositoryCommits(token, repoOwner, repoName, page, branchName); - } - else { + call.enqueue(new Callback>() { - Log.e(TAG, String.valueOf(response.code())); + @Override + public void onResponse(@NonNull Call> call, @NonNull Response> response) { - } + if(response.isSuccessful()) { - } + //remove loading view + commitsList.remove(commitsList.size() - 1); - @Override - public void onFailure(@NonNull Call> call, @NonNull Throwable t) { + List result = response.body(); - Log.e(TAG, t.toString()); + assert result != null; + if(result.size() > 0) { - } + pageSize = result.size(); + commitsList.addAll(result); - }); + } + else { - } + Toasty.info(ctx, getString(R.string.noMoreData)); + adapter.setMoreDataAvailable(false); - private void loadNext(String instanceUrl, String token, String repoOwner, String repoName, final int currentPage, String branchName) { + } - footerAdapter.clear(); - //noinspection unchecked - footerAdapter.add(new ProgressItem().withEnabled(false)); - Handler handler = new Handler(); + adapter.notifyDataChanged(); - handler.postDelayed(() -> { + } + else { - Call> call = RetrofitClient - .getInstance(instanceUrl, getApplicationContext()) - .getApiInterface() - .getRepositoryCommits(token, repoOwner, repoName, currentPage + 1, branchName); + Log.e(TAG, String.valueOf(response.code())); - call.enqueue(new Callback>() { + } - @Override - public void onResponse(@NonNull Call> call, @NonNull Response> response) { + } - if (response.isSuccessful()) { + @Override + public void onFailure(@NonNull Call> call, @NonNull Throwable t) { - assert response.body() != null; + Log.e(TAG, t.toString()); - if (response.body().size() > 0) { + } - loadNextFlag = response.body().size() == resultLimit; + }); - for (int i = 0; i < response.body().size(); i++) { + } - fastItemAdapter.add(fastItemAdapter.getAdapterItemCount(), new CommitsAdapter(getApplicationContext()).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())); + @Override + public boolean onCreateOptionsMenu(Menu menu) { - } + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.search_menu, menu); - footerAdapter.clear(); + 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); - } - else { + searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() { - footerAdapter.clear(); - } + @Override + public boolean onQueryTextSubmit(String query) { - progressBar.setVisibility(View.GONE); + return false; + } - } - else { + @Override + public boolean onQueryTextChange(String newText) { - Log.e(TAG, String.valueOf(response.code())); + filter(newText); + return true; + } - } + }); - } + return super.onCreateOptionsMenu(menu); - @Override - public void onFailure(@NonNull Call> call, @NonNull Throwable t) { + } - Log.e(TAG, t.toString()); + private void filter(String text) { - } + List arr = new ArrayList<>(); - }); + for(Commits d : commitsList) { + if(d.getCommit().getMessage().toLowerCase().contains(text) || d.getSha().toLowerCase().contains(text)) { + arr.add(d); + } + } - }, 1000); + adapter.updateList(arr); + } - if(!loadNextFlag) { + private void initCloseListener() { - footerAdapter.clear(); - - } - - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.search_menu, menu); - - 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(); - return super.onCreateOptionsMenu(menu); - - } - - @Override - public void itemsFiltered(@Nullable CharSequence constraint, @Nullable List results) { - endlessRecyclerOnScrollListener.disable(); - } - - @Override - public void onReset() { - endlessRecyclerOnScrollListener.enable(); - } - - private void initCloseListener() { - onClickListener = view -> { - getIntent().removeExtra("branchName"); - finish(); - }; - } + onClickListener = view -> { + getIntent().removeExtra("branchName"); + finish(); + }; + } } diff --git a/app/src/main/java/org/mian/gitnex/adapters/CommitsAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/CommitsAdapter.java index b49d4ea9..2dfb60c7 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/CommitsAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/CommitsAdapter.java @@ -1,18 +1,21 @@ package org.mian.gitnex.adapters; +import android.annotation.SuppressLint; import android.content.Context; -import android.text.Html; -import android.text.method.LinkMovementMethod; +import android.content.Intent; +import android.net.Uri; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; import android.widget.TextView; import androidx.annotation.NonNull; -import com.mikepenz.fastadapter.FastAdapter; -import com.mikepenz.fastadapter.items.AbstractItem; +import androidx.recyclerview.widget.RecyclerView; import org.mian.gitnex.R; import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.TimeHelper; +import org.mian.gitnex.models.Commits; import org.mian.gitnex.util.TinyDB; -import java.util.Date; import java.util.List; import java.util.Locale; @@ -20,142 +23,152 @@ import java.util.Locale; * Author M M Arif */ -public class CommitsAdapter extends AbstractItem { +public class CommitsAdapter extends RecyclerView.Adapter { - final private Context ctx; - private String commitTitle; - private String commitHtmlUrl; - private String commitCommitter; - private Date commitDate; + private Context ctx; + private final int TYPE_LOAD = 0; + private List commitsList; + private CommitsAdapter.OnLoadMoreListener loadMoreListener; + private boolean isLoading = false; + private boolean isMoreDataAvailable = true; - private boolean isSelectable = true; + public CommitsAdapter(Context ctx, List commitsListMain) { - public CommitsAdapter(Context ctx) { this.ctx = ctx; - } + this.commitsList = commitsListMain; - public CommitsAdapter 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 CommitsAdapter withEnabled(boolean enabled) { - return null; - } - - @Override - public boolean isSelectable() { - return isSelectable; - } - - @Override - public CommitsAdapter 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 CommitsAdapter.ViewHolder getViewHolder(@NonNull View v) { + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new CommitsAdapter.ViewHolder(v); + LayoutInflater inflater = LayoutInflater.from(ctx); + + if(viewType == TYPE_LOAD) { + return new CommitsHolder(inflater.inflate(R.layout.list_commits, parent, false)); + } + else { + return new LoadHolder(inflater.inflate(R.layout.row_load, parent, false)); + } } - public class ViewHolder extends FastAdapter.ViewHolder { + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { - final TinyDB tinyDb = new TinyDB(ctx); - final String locale = tinyDb.getString("locale"); - final String timeFormat = tinyDb.getString("dateFormat"); + if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) { - TextView commitTitleVw; - TextView commitCommitterVw; - TextView commitDateVw; - TextView commitHtmlUrlVw; + isLoading = true; + loadMoreListener.onLoadMore(); - public ViewHolder(View itemView) { + } + + if(getItemViewType(position) == TYPE_LOAD) { + + ((CommitsHolder) holder).bindData(commitsList.get(position)); + + } + + } + + @Override + public int getItemViewType(int position) { + + if(commitsList.get(position).getSha() != null) { + return TYPE_LOAD; + } + else { + return 1; + } + + } + + @Override + public int getItemCount() { + + return commitsList.size(); + + } + + class CommitsHolder extends RecyclerView.ViewHolder { + + TextView commitTitle; + TextView commitCommitter; + TextView commitDate; + Button commitHtmlUrl; + + CommitsHolder(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); + commitTitle = itemView.findViewById(R.id.commitTitleVw); + commitCommitter = itemView.findViewById(R.id.commitCommitterVw); + commitDate = itemView.findViewById(R.id.commitDateVw); + commitHtmlUrl = itemView.findViewById(R.id.commitHtmlUrlVw); } - @Override - public void bindView(CommitsAdapter item, @NonNull List payloads) { + @SuppressLint("SetTextI18n") + void bindData(Commits commitsModel) { - commitTitleVw.setText(item.getCommitTitle()); - commitCommitterVw.setText(ctx.getString(R.string.commitCommittedBy, item.getcommitCommitter())); + final TinyDB tinyDb = new TinyDB(ctx); + final String locale = tinyDb.getString("locale"); + final String timeFormat = tinyDb.getString("dateFormat"); - commitDateVw.setText(TimeHelper.formatTime(item.getcommitDate(), new Locale(locale), timeFormat, ctx)); + commitTitle.setText(commitsModel.getCommit().getMessage()); + commitCommitter.setText(ctx.getString(R.string.commitCommittedBy, commitsModel.getCommit().getCommitter().getName())); + + commitDate.setText(TimeHelper.formatTime(commitsModel.getCommit().getCommitter().getDate(), new Locale(locale), timeFormat, ctx)); if(timeFormat.equals("pretty")) { - commitDateVw.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(item.getcommitDate()), ctx)); + commitDate.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(commitsModel.getCommit().getCommitter().getDate()), ctx)); } - commitHtmlUrlVw.setText(Html.fromHtml("" + ctx.getResources().getString(R.string.viewInBrowser) + " ")); - commitHtmlUrlVw.setMovementMethod(LinkMovementMethod.getInstance()); - - } - - @Override - public void unbindView(@NonNull CommitsAdapter item) { - - commitTitleVw.setText(null); - commitCommitterVw.setText(null); - commitDateVw.setText(null); - commitHtmlUrlVw.setText(null); + commitHtmlUrl.setOnClickListener(v -> ctx.startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse(commitsModel.getHtml_url())))); } } + static class LoadHolder extends RecyclerView.ViewHolder { + + LoadHolder(View itemView) { + + super(itemView); + } + + } + + public void setMoreDataAvailable(boolean moreDataAvailable) { + + isMoreDataAvailable = moreDataAvailable; + + } + + public void notifyDataChanged() { + + notifyDataSetChanged(); + isLoading = false; + + } + + public interface OnLoadMoreListener { + + void onLoadMore(); + + } + + public void setLoadMoreListener(CommitsAdapter.OnLoadMoreListener loadMoreListener) { + + this.loadMoreListener = loadMoreListener; + + } + + public void updateList(List list) { + + commitsList = list; + notifyDataSetChanged(); + } + } diff --git a/app/src/main/java/org/mian/gitnex/clients/AppApiService.java b/app/src/main/java/org/mian/gitnex/clients/AppApiService.java new file mode 100644 index 00000000..b36b181d --- /dev/null +++ b/app/src/main/java/org/mian/gitnex/clients/AppApiService.java @@ -0,0 +1,76 @@ +package org.mian.gitnex.clients; + +import android.content.Context; +import android.util.Log; +import org.mian.gitnex.helpers.ssl.MemorizingTrustManager; +import org.mian.gitnex.util.AppUtil; +import java.io.File; +import java.security.SecureRandom; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.X509TrustManager; +import okhttp3.Cache; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.logging.HttpLoggingInterceptor; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +/** + * Author M M Arif + */ + +public class AppApiService { + + public static S createService(Class serviceClass, String instanceURL, Context ctx) { + + final boolean connToInternet = AppUtil.haveNetworkConnection(ctx); + File httpCacheDirectory = new File(ctx.getCacheDir(), "responses"); + int cacheSize = 50 * 1024 * 1024; // 50MB + Cache cache = new Cache(httpCacheDirectory, cacheSize); + + HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); + logging.setLevel(HttpLoggingInterceptor.Level.BODY); + + try { + + SSLContext sslContext = SSLContext.getInstance("TLS"); + + MemorizingTrustManager memorizingTrustManager = new MemorizingTrustManager(ctx); + sslContext.init(null, new X509TrustManager[]{memorizingTrustManager}, new SecureRandom()); + + OkHttpClient okHttpClient = new OkHttpClient.Builder() + .cache(cache) + //.addInterceptor(logging) + .sslSocketFactory(sslContext.getSocketFactory(), memorizingTrustManager) + .hostnameVerifier(memorizingTrustManager.wrapHostnameVerifier(HttpsURLConnection.getDefaultHostnameVerifier())) + .addInterceptor(chain -> { + + Request request = chain.request(); + if(connToInternet) { + request = request.newBuilder().header("Cache-Control", "public, max-age=" + 60).build(); + } + else { + request = request.newBuilder().header("Cache-Control", "public, only-if-cached, max-stale=" + 60 * 60 * 24 * 30).build(); + } + return chain.proceed(request); + + }).build(); + + Retrofit.Builder builder = new Retrofit.Builder() + .baseUrl(instanceURL) + .client(okHttpClient) + .addConverterFactory(GsonConverterFactory.create()); + + Retrofit retrofit = builder.build(); + return retrofit.create(serviceClass); + + } + catch(Exception e) { + Log.e("onFailure", e.toString()); + } + + return null; + } + +} diff --git a/app/src/main/java/org/mian/gitnex/fragments/IssuesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/IssuesFragment.java index f2615a16..0103cbbc 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/IssuesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/IssuesFragment.java @@ -76,7 +76,7 @@ public class IssuesFragment extends Fragment { final SwipeRefreshLayout swipeRefresh = v.findViewById(R.id.pullToRefresh); // if gitea is 1.12 or higher use the new limit - if(VersionCheck.compareVersion("1.12.0", tinyDb.getString("giteaVersion")) < 1) { + if(VersionCheck.compareVersion("1.12.0", tinyDb.getString("giteaVersion")) >= 1) { resultLimit = StaticGlobalVariables.resultLimitNewGiteaInstances; } diff --git a/app/src/main/java/org/mian/gitnex/fragments/PullRequestsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/PullRequestsFragment.java index e94560ad..936a8245 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/PullRequestsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/PullRequestsFragment.java @@ -76,7 +76,7 @@ public class PullRequestsFragment extends Fragment { final SwipeRefreshLayout swipeRefresh = v.findViewById(R.id.pullToRefresh); // if gitea is 1.12 or higher use the new limit - if(VersionCheck.compareVersion("1.12.0", tinyDb.getString("giteaVersion")) < 1) { + if(VersionCheck.compareVersion("1.12.0", tinyDb.getString("giteaVersion")) >= 1) { resultLimit = StaticGlobalVariables.resultLimitNewGiteaInstances; } 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 dd64133e..9972ac65 100644 --- a/app/src/main/java/org/mian/gitnex/models/Commits.java +++ b/app/src/main/java/org/mian/gitnex/models/Commits.java @@ -29,6 +29,10 @@ public class Commits { return html_url; } + public Commits(String url) { + this.url = url; + } + public static class commitObject { private String url; diff --git a/app/src/main/res/layout/list_commits.xml b/app/src/main/res/layout/list_commits.xml index 21856768..e1310bf5 100644 --- a/app/src/main/res/layout/list_commits.xml +++ b/app/src/main/res/layout/list_commits.xml @@ -1,10 +1,10 @@ - - + android:layout_marginTop="15dp" + android:textColor="@color/btnTextColor" + android:textSize="14sp" + android:minHeight="0dp" + android:minWidth="0dp" + android:padding="8dp" + android:background="@drawable/shape_buttons" /> @@ -64,7 +68,8 @@ android:layout_height="wrap_content" android:gravity="end" android:textColor="?attr/primaryTextColor" - android:textSize="14sp" /> + android:textSize="14sp" + android:layout_marginTop="20dp"/>