From cafb29f8b7c832aa5a14b2250b67c934c70d6d48 Mon Sep 17 00:00:00 2001 From: opyale Date: Mon, 12 Oct 2020 20:11:23 +0200 Subject: [PATCH] Implementing BottomSheetFragment for commenting on issues and pull requests. (#555) change to server error on onFailure Fix keyboard move issue Fix statusbar color, remove social, enhance other things Merge branch 'master' into bottomsheet-issue-comments Merge branch 'master' of https://codeberg.org/gitnex/GitNex into bottomsheet-issue-comments  Conflicts:  app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java Making it work. Merge branch 'master' of https://codeberg.org/gitnex/GitNex into bottomsheet-issue-comments Merge branch 'master' of https://codeberg.org/gitnex/GitNex into bottomsheet-issue-comments Merge branch 'master' of https://codeberg.org/gitnex/GitNex into bottomsheet-issue-comments First major changes. Merge branch 'master' of https://codeberg.org/gitnex/GitNex into bottomsheet-issue-comments Cleanup. Simplifying title. Adding BottomSheetFragment layout for future changes. Co-authored-by: M M Arif Co-authored-by: M M Arif Co-authored-by: opyale Co-authored-by: opyale Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/555 Reviewed-by: M M Arif --- .../org/mian/gitnex/actions/ActionResult.java | 80 +++++++ .../gitnex/actions/CollaboratorActions.java | 49 ++++ .../org/mian/gitnex/actions/IssueActions.java | 73 +++++- .../activities/AdminGetUsersActivity.java | 5 +- .../mian/gitnex/activities/BaseActivity.java | 5 +- .../gitnex/activities/CommitsActivity.java | 3 +- .../gitnex/activities/FileDiffActivity.java | 2 +- .../activities/IssueDetailActivity.java | 6 +- .../activities/ReplyToIssueActivity.java | 1 - .../gitnex/activities/RepoForksActivity.java | 3 +- .../activities/SettingsSecurityActivity.java | 8 +- .../mian/gitnex/adapters/DraftsAdapter.java | 30 +-- .../mian/gitnex/adapters/FilesAdapter.java | 4 +- .../gitnex/adapters/FilesDiffAdapter.java | 18 +- .../gitnex/adapters/IssueCommentsAdapter.java | 28 ++- .../fragments/BottomSheetReplyFragment.java | 214 ++++++++++++++++++ .../mian/gitnex/fragments/DraftsFragment.java | 7 +- .../mian/gitnex/fragments/IssuesFragment.java | 3 +- .../mian/gitnex/fragments/LabelsFragment.java | 19 +- .../gitnex/fragments/MilestonesFragment.java | 3 +- .../fragments/MyRepositoriesFragment.java | 4 +- .../fragments/OrganizationsFragment.java | 19 +- .../fragments/ProfileEmailsFragment.java | 19 +- .../fragments/ProfileFollowersFragment.java | 19 +- .../fragments/ProfileFollowingFragment.java | 19 +- .../fragments/PullRequestsFragment.java | 3 +- .../gitnex/fragments/ReleasesFragment.java | 19 +- .../gitnex/fragments/RepoInfoFragment.java | 10 +- .../fragments/RepositoriesByOrgFragment.java | 19 +- .../fragments/RepositoriesFragment.java | 4 +- .../StarredRepositoriesFragment.java | 19 +- .../gitnex/fragments/TeamsByOrgFragment.java | 19 +- .../fragments/UserAccountsFragment.java | 3 +- .../java/org/mian/gitnex/helpers/AppUtil.java | 59 ----- .../org/mian/gitnex/helpers/FilesData.java | 71 ------ app/src/main/res/drawable/ic_send.xml | 20 ++ .../res/layout/bottom_sheet_reply_layout.xml | 119 ++++++++++ app/src/main/res/values/strings.xml | 2 +- app/src/main/res/values/themes.xml | 7 + 39 files changed, 697 insertions(+), 318 deletions(-) create mode 100644 app/src/main/java/org/mian/gitnex/actions/ActionResult.java create mode 100644 app/src/main/java/org/mian/gitnex/fragments/BottomSheetReplyFragment.java create mode 100644 app/src/main/res/drawable/ic_send.xml create mode 100644 app/src/main/res/layout/bottom_sheet_reply_layout.xml diff --git a/app/src/main/java/org/mian/gitnex/actions/ActionResult.java b/app/src/main/java/org/mian/gitnex/actions/ActionResult.java new file mode 100644 index 00000000..4c88eeff --- /dev/null +++ b/app/src/main/java/org/mian/gitnex/actions/ActionResult.java @@ -0,0 +1,80 @@ +package org.mian.gitnex.actions; + +import androidx.annotation.NonNull; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.TimeUnit; + +/** + * @author opyale + */ + +public class ActionResult { + + public enum Status { SUCCESS, FAILED } + + private final BlockingQueue blockingQueue; + private final List> onFinishedListeners; + + private boolean invalidated = false; + + public ActionResult() { + + blockingQueue = new ArrayBlockingQueue<>(1); + onFinishedListeners = new ArrayList<>(); + + } + + public void finish(@NonNull Status status) { + + finish(status, null); + } + + public void finish(@NonNull Status status, R result) { + + try { + if(blockingQueue.poll(5, TimeUnit.SECONDS)) { + + for(OnFinishedListener onFinishedListener : onFinishedListeners) + onFinishedListener.onFinished(status, result); + } + + } catch (InterruptedException ignored) {} + + } + + public void invalidate() { + + if(invalidated) throw new IllegalStateException("Already invalidated"); + this.invalidated = true; + + } + + @SafeVarargs + public synchronized final void accept(@NonNull OnFinishedListener... onFinishedListeners) { + + invalidate(); + + this.blockingQueue.add(true); + this.onFinishedListeners.addAll(Arrays.asList(onFinishedListeners)); + + } + + public synchronized final void discard() { + + invalidate(); + this.blockingQueue.add(false); + + } + + public static class None {} + + public interface OnFinishedListener { + + void onFinished(Status status, R result); + } + +} diff --git a/app/src/main/java/org/mian/gitnex/actions/CollaboratorActions.java b/app/src/main/java/org/mian/gitnex/actions/CollaboratorActions.java index a61df5db..03bb66fa 100644 --- a/app/src/main/java/org/mian/gitnex/actions/CollaboratorActions.java +++ b/app/src/main/java/org/mian/gitnex/actions/CollaboratorActions.java @@ -12,8 +12,10 @@ import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.models.Collaborators; import org.mian.gitnex.models.Permission; +import java.util.List; import retrofit2.Call; import retrofit2.Callback; +import retrofit2.Response; /** * Author M M Arif @@ -154,8 +156,55 @@ public class CollaboratorActions { public void onFailure(@NonNull Call call, @NonNull Throwable t) { Log.e("onFailure", t.toString()); } + }); } + public static ActionResult> getCollaborators(Context context) { + + ActionResult> actionResult = new ActionResult<>(); + TinyDB tinyDb = new TinyDB(context); + + String instanceUrl = tinyDb.getString("instanceUrl"); + String loginUid = tinyDb.getString("loginUid"); + String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); + + String repoFullName = tinyDb.getString("repoFullName"); + String[] parts = repoFullName.split("/"); + String repoOwner = parts[0]; + String repoName = parts[1]; + + Call> call = RetrofitClient + .getInstance(instanceUrl, context) + .getApiInterface() + .getCollaborators(Authorization.returnAuthentication(context, loginUid, instanceToken), repoOwner, repoName); + + call.enqueue(new Callback>() { + + @Override + public void onResponse(@NonNull Call> call, @NonNull Response> response) { + + if (response.isSuccessful()) { + + assert response.body() != null; + actionResult.finish(ActionResult.Status.SUCCESS, response.body()); + } + else { + + actionResult.finish(ActionResult.Status.FAILED); + } + } + + @Override + public void onFailure(@NonNull Call> call, @NonNull Throwable t) { + + actionResult.finish(ActionResult.Status.FAILED); + } + }); + + return actionResult; + + } + } diff --git a/app/src/main/java/org/mian/gitnex/actions/IssueActions.java b/app/src/main/java/org/mian/gitnex/actions/IssueActions.java index 9f51002a..57b68b11 100644 --- a/app/src/main/java/org/mian/gitnex/actions/IssueActions.java +++ b/app/src/main/java/org/mian/gitnex/actions/IssueActions.java @@ -1,11 +1,9 @@ package org.mian.gitnex.actions; import android.content.Context; -import android.util.Log; import androidx.annotation.NonNull; import com.google.gson.JsonElement; import org.mian.gitnex.R; -import org.mian.gitnex.activities.ReplyToIssueActivity; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.database.api.DraftsApi; import org.mian.gitnex.helpers.AlertDialogs; @@ -13,6 +11,7 @@ import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.models.IssueComments; +import org.mian.gitnex.models.Issues; import org.mian.gitnex.models.UpdateIssueState; import retrofit2.Call; import retrofit2.Callback; @@ -53,8 +52,6 @@ public class IssueActions { DraftsApi draftsApi = new DraftsApi(ctx); draftsApi.deleteSingleDraft((int) draftIdOnCreate); - ((ReplyToIssueActivity) ctx).finish(); - } } else if(response.code() == 401) { @@ -83,7 +80,7 @@ public class IssueActions { @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { - Log.e("onFailure", t.toString()); + Toasty.error(ctx, ctx.getResources().getString(R.string.genericServerResponseError)); } }); @@ -157,7 +154,7 @@ public class IssueActions { @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { - Log.e("onFailure", t.toString()); + Toasty.error(ctx, ctx.getResources().getString(R.string.genericServerResponseError)); } }); @@ -217,7 +214,7 @@ public class IssueActions { @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { - Toasty.success(ctx, ctx.getString(R.string.unsubscribedSuccessfully)); + Toasty.error(ctx, ctx.getResources().getString(R.string.genericServerResponseError)); } }); @@ -277,9 +274,69 @@ public class IssueActions { @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { - Toasty.error(ctx, ctx.getString(R.string.unsubscriptionError)); + Toasty.error(ctx, ctx.getResources().getString(R.string.genericServerResponseError)); } }); } + public static ActionResult reply(Context context, String comment, int issueIndex) { + + ActionResult actionResult = new ActionResult<>(); + TinyDB tinyDb = new TinyDB(context); + + String instanceUrl = tinyDb.getString("instanceUrl"); + String loginUid = tinyDb.getString("loginUid"); + String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); + + String repoFullName = tinyDb.getString("repoFullName"); + String[] parts = repoFullName.split("/"); + String repoOwner = parts[0]; + String repoName = parts[1]; + + Issues issueComment = new Issues(comment); + + Call call = RetrofitClient + .getInstance(instanceUrl, context) + .getApiInterface() + .replyCommentToIssue(Authorization.returnAuthentication(context, loginUid, instanceToken), repoOwner, repoName, issueIndex, issueComment); + + call.enqueue(new Callback() { + + @Override + public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { + + if(response.code() == 201) { + + actionResult.finish(ActionResult.Status.SUCCESS); + + tinyDb.putBoolean("commentPosted", true); + tinyDb.putBoolean("resumeIssues", true); + tinyDb.putBoolean("resumePullRequests", true); + + } + else if(response.code() == 401) { + + AlertDialogs.authorizationTokenRevokedDialog(context, context.getString(R.string.alertDialogTokenRevokedTitle), + context.getString(R.string.alertDialogTokenRevokedMessage), + context.getString(R.string.alertDialogTokenRevokedCopyNegativeButton), + context.getString(R.string.alertDialogTokenRevokedCopyPositiveButton)); + + } + else { + + actionResult.finish(ActionResult.Status.FAILED); + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + + Toasty.error(context, context.getResources().getString(R.string.genericServerResponseError)); + } + }); + + return actionResult; + + } + } diff --git a/app/src/main/java/org/mian/gitnex/activities/AdminGetUsersActivity.java b/app/src/main/java/org/mian/gitnex/activities/AdminGetUsersActivity.java index f1c6d348..c49bbab0 100644 --- a/app/src/main/java/org/mian/gitnex/activities/AdminGetUsersActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/AdminGetUsersActivity.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -75,7 +76,7 @@ public class AdminGetUsersActivity extends BaseActivity implements BottomSheetAd DividerItemDecoration.VERTICAL); mRecyclerView.addItemDecoration(dividerItemDecoration); - swipeRefresh.setOnRefreshListener(() -> new Handler().postDelayed(() -> { + swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); AdminGetUsersViewModel.loadUsersList(ctx, instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken)); @@ -116,7 +117,7 @@ public class AdminGetUsersActivity extends BaseActivity implements BottomSheetAd final MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.generic_nav_dotted_menu, menu); - new Handler().postDelayed(() -> { + new Handler(Looper.getMainLooper()).postDelayed(() -> { if(searchFilter) { diff --git a/app/src/main/java/org/mian/gitnex/activities/BaseActivity.java b/app/src/main/java/org/mian/gitnex/activities/BaseActivity.java index e6f4c608..87007716 100644 --- a/app/src/main/java/org/mian/gitnex/activities/BaseActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/BaseActivity.java @@ -17,7 +17,9 @@ import org.mian.gitnex.helpers.FontsOverride; import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.notifications.NotificationsMaster; -import static org.acra.ReportField.*; +import static org.acra.ReportField.ANDROID_VERSION; +import static org.acra.ReportField.PHONE_MODEL; +import static org.acra.ReportField.STACK_TRACE; /** * Author M M Arif @@ -145,7 +147,6 @@ public abstract class BaseActivity extends AppCompatActivity { ACRA.init(getApplication(), ACRABuilder); } - } protected abstract int getLayoutResourceId(); 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 75b31fae..f360ef3b 100644 --- a/app/src/main/java/org/mian/gitnex/activities/CommitsActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/CommitsActivity.java @@ -3,6 +3,7 @@ package org.mian.gitnex.activities; import android.content.Context; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.text.method.ScrollingMovementMethod; import android.util.Log; import android.view.Menu; @@ -101,7 +102,7 @@ public class CommitsActivity extends BaseActivity { recyclerView = findViewById(R.id.recyclerView); commitsList = new ArrayList<>(); - swipeRefresh.setOnRefreshListener(() -> new Handler().postDelayed(() -> { + swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); loadInitial(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, branchName, resultLimit); diff --git a/app/src/main/java/org/mian/gitnex/activities/FileDiffActivity.java b/app/src/main/java/org/mian/gitnex/activities/FileDiffActivity.java index 95d3bc4b..62827d23 100644 --- a/app/src/main/java/org/mian/gitnex/activities/FileDiffActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/FileDiffActivity.java @@ -122,7 +122,7 @@ public class FileDiffActivity extends BaseActivity { toolbarTitle.setText(getResources().getString(R.string.fileDiffViewHeaderSingle, Integer.toString(filesCount))); } - FilesDiffAdapter adapter = new FilesDiffAdapter(ctx, fileContentsArray); + FilesDiffAdapter adapter = new FilesDiffAdapter(ctx, getSupportFragmentManager(), fileContentsArray); mListView.setAdapter(adapter); mProgressBar.setVisibility(View.GONE); diff --git a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java index 901f5f45..716cfa4d 100644 --- a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java @@ -2,7 +2,6 @@ package org.mian.gitnex.activities; import android.app.Dialog; import android.content.Context; -import android.content.Intent; import android.graphics.Color; import android.graphics.Typeface; import android.graphics.drawable.ColorDrawable; @@ -43,6 +42,7 @@ import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.ActivityIssueDetailBinding; import org.mian.gitnex.databinding.CustomAssigneesSelectionDialogBinding; import org.mian.gitnex.databinding.CustomLabelsSelectionDialogBinding; +import org.mian.gitnex.fragments.BottomSheetReplyFragment; import org.mian.gitnex.fragments.BottomSheetSingleIssueFragment; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AppUtil; @@ -162,7 +162,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(viewBinding.recyclerView.getContext(), DividerItemDecoration.VERTICAL); viewBinding.recyclerView.addItemDecoration(dividerItemDecoration); - viewBinding.addNewComment.setOnClickListener(v -> startActivity(new Intent(ctx, ReplyToIssueActivity.class))); + viewBinding.addNewComment.setOnClickListener(v -> BottomSheetReplyFragment.newInstance(new Bundle()).show(getSupportFragmentManager(), "replyBottomSheet")); labelsAdapter = new LabelsListAdapter(labelsList, IssueDetailActivity.this, currentLabelsIds); assigneesAdapter = new AssigneesListAdapter(ctx, assigneesList, IssueDetailActivity.this, currentAssignees); @@ -542,7 +542,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt viewBinding.divider.setVisibility(View.VISIBLE); } - adapter = new IssueCommentsAdapter(ctx, issueCommentsMain); + adapter = new IssueCommentsAdapter(ctx, getSupportFragmentManager(), issueCommentsMain); viewBinding.recyclerView.setAdapter(adapter); }); diff --git a/app/src/main/java/org/mian/gitnex/activities/ReplyToIssueActivity.java b/app/src/main/java/org/mian/gitnex/activities/ReplyToIssueActivity.java index 2625523a..a7b6fd79 100644 --- a/app/src/main/java/org/mian/gitnex/activities/ReplyToIssueActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/ReplyToIssueActivity.java @@ -218,7 +218,6 @@ public class ReplyToIssueActivity extends BaseActivity { DraftsApi.updateDraft(draftText, (int) draftIdOnCreate, commentId); //updateDraftByIssueIdAsyncTask(draftText, issueNumber, repositoryId, commentId); } - } private long returnDraftId(String draftText) { diff --git a/app/src/main/java/org/mian/gitnex/activities/RepoForksActivity.java b/app/src/main/java/org/mian/gitnex/activities/RepoForksActivity.java index 4f05111d..8771fc40 100644 --- a/app/src/main/java/org/mian/gitnex/activities/RepoForksActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/RepoForksActivity.java @@ -4,6 +4,7 @@ import android.annotation.SuppressLint; import android.content.Context; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.text.method.ScrollingMovementMethod; import android.util.Log; import android.view.Menu; @@ -106,7 +107,7 @@ public class RepoForksActivity extends BaseActivity { DividerItemDecoration.VERTICAL); recyclerView.addItemDecoration(dividerItemDecoration); - swipeRefresh.setOnRefreshListener(() -> new Handler().postDelayed(() -> { + swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); loadInitial(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, pageSize, resultLimit); diff --git a/app/src/main/java/org/mian/gitnex/activities/SettingsSecurityActivity.java b/app/src/main/java/org/mian/gitnex/activities/SettingsSecurityActivity.java index 0bed9010..115cd117 100644 --- a/app/src/main/java/org/mian/gitnex/activities/SettingsSecurityActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/SettingsSecurityActivity.java @@ -12,8 +12,6 @@ import android.widget.TextView; import androidx.appcompat.app.AlertDialog; import org.apache.commons.io.FileUtils; import org.mian.gitnex.R; -import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.FilesData; import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Version; @@ -21,7 +19,6 @@ import org.mian.gitnex.helpers.ssl.MemorizingTrustManager; import org.mian.gitnex.notifications.NotificationsMaster; import java.io.File; import java.io.IOException; -import java.util.HashSet; /** * Author M M Arif @@ -99,10 +96,7 @@ public class SettingsSecurityActivity extends BaseActivity { // clear cache setter File cacheDir = appCtx.getCacheDir(); - long size__ = FilesData.getFileSizeRecursively(new HashSet<>(), cacheDir); - if(size__ > 0) { - clearCacheSelected.setText(String.valueOf(AppUtil.formatFileSizeInDetail(size__))); - } + clearCacheSelected.setText(FileUtils.byteCountToDisplaySize((int) FileUtils.sizeOfDirectory(cacheDir))); // clear cache clearCacheFrame.setOnClickListener(v1 -> { diff --git a/app/src/main/java/org/mian/gitnex/adapters/DraftsAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/DraftsAdapter.java index 4557dc2b..401493d3 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/DraftsAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/DraftsAdapter.java @@ -2,7 +2,7 @@ package org.mian.gitnex.adapters; import android.annotation.SuppressLint; import android.content.Context; -import android.content.Intent; +import android.os.Bundle; import android.text.Html; import android.text.Spanned; import android.view.LayoutInflater; @@ -11,11 +11,12 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentManager; import androidx.recyclerview.widget.RecyclerView; import org.mian.gitnex.R; -import org.mian.gitnex.activities.ReplyToIssueActivity; import org.mian.gitnex.database.api.DraftsApi; import org.mian.gitnex.database.models.DraftWithRepository; +import org.mian.gitnex.fragments.BottomSheetReplyFragment; import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; import java.util.List; @@ -27,6 +28,7 @@ import java.util.List; public class DraftsAdapter extends RecyclerView.Adapter { private List draftsList; + private FragmentManager fragmentManager; private Context mCtx; class DraftsViewHolder extends RecyclerView.ViewHolder { @@ -69,16 +71,17 @@ public class DraftsAdapter extends RecyclerView.Adapter { - Intent intent = new Intent(mCtx, ReplyToIssueActivity.class); - intent.putExtra("commentBody", draftText.getText().toString()); - intent.putExtra("issueNumber", issueNumber.getText().toString()); - intent.putExtra("repositoryId", repoId.getText().toString()); - intent.putExtra("draftTitle", repoInfo.getText().toString()); - intent.putExtra("commentId", commentId.getText().toString()); - intent.putExtra("draftId", draftId.getText().toString()); + Bundle bundle = new Bundle(); - if(!commentId.getText().toString().equalsIgnoreCase("")) { - intent.putExtra("commentAction", "edit"); + bundle.putString("commentBody", draftText.getText().toString()); + bundle.putString("issueNumber", issueNumber.getText().toString()); + bundle.putString("repositoryId", repoId.getText().toString()); + bundle.putString("draftTitle", repoInfo.getText().toString()); + bundle.putString("commentId", commentId.getText().toString()); + bundle.putString("draftId", draftId.getText().toString()); + + if(!commentId.getText().toString().isEmpty()) { + bundle.putString("commentAction", "edit"); } TinyDB tinyDb = new TinyDB(mCtx); @@ -86,7 +89,7 @@ public class DraftsAdapter extends RecyclerView.Adapter draftsListMain) { + public DraftsAdapter(Context mCtx, FragmentManager fragmentManager, List draftsListMain) { this.mCtx = mCtx; + this.fragmentManager = fragmentManager; this.draftsList = draftsListMain; } diff --git a/app/src/main/java/org/mian/gitnex/adapters/FilesAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/FilesAdapter.java index c9b273a3..93b12a42 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/FilesAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/FilesAdapter.java @@ -10,8 +10,8 @@ import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; +import org.apache.commons.io.FileUtils; import org.mian.gitnex.R; -import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.models.Files; import java.util.ArrayList; @@ -165,7 +165,7 @@ public class FilesAdapter extends RecyclerView.Adapter fileDiffViews; - public FilesDiffAdapter(Context context, List fileDiffViews) { + public FilesDiffAdapter(Context context, FragmentManager fragmentManager, List fileDiffViews) { this.context = context; + this.fragmentManager = fragmentManager; this.fileDiffViews = fileDiffViews; selectedViews = new ConcurrentSkipListMap<>(); @@ -201,12 +204,11 @@ public class FilesDiffAdapter extends BaseAdapter { selectedViews.clear(); - Intent intent = new Intent(context, ReplyToIssueActivity.class); - intent.putExtra("commentBody", stringBuilder.toString()); - intent.putExtra("cursorToEnd", true); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + Bundle bundle = new Bundle(); + bundle.putString("commentBody", stringBuilder.toString()); + bundle.putBoolean("cursorToEnd", true); - context.startActivity(intent); + BottomSheetReplyFragment.newInstance(bundle).show(fragmentManager, "replyBottomSheet"); } diff --git a/app/src/main/java/org/mian/gitnex/adapters/IssueCommentsAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/IssueCommentsAdapter.java index b1f20cc1..c2443b26 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/IssueCommentsAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/IssueCommentsAdapter.java @@ -7,6 +7,7 @@ import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; import android.net.Uri; +import android.os.Bundle; import android.text.Spanned; import android.view.LayoutInflater; import android.view.View; @@ -14,14 +15,15 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentManager; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.gson.JsonElement; import com.vdurmont.emoji.EmojiParser; import org.mian.gitnex.R; -import org.mian.gitnex.activities.ReplyToIssueActivity; import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.RetrofitClient; +import org.mian.gitnex.fragments.BottomSheetReplyFragment; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.RoundedTransformation; @@ -60,11 +62,13 @@ import retrofit2.Callback; public class IssueCommentsAdapter extends RecyclerView.Adapter { private List issuesComments; + private FragmentManager fragmentManager; private Context mCtx; - public IssueCommentsAdapter(Context mCtx, List issuesCommentsMain) { + public IssueCommentsAdapter(Context mCtx, FragmentManager fragmentManager, List issuesCommentsMain) { this.mCtx = mCtx; + this.fragmentManager = fragmentManager; this.issuesComments = issuesCommentsMain; } @@ -126,11 +130,12 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter { - Intent intent = new Intent(ctx, ReplyToIssueActivity.class); - intent.putExtra("commentId", commendId.getText()); - intent.putExtra("commentAction", "edit"); - intent.putExtra("commentBody", commendBodyRaw.getText()); - ctx.startActivity(intent); + Bundle bundle = new Bundle(); + bundle.putString("commentId", commendId.getText().toString()); + bundle.putString("commentAction", "edit"); + bundle.putString("commentBody", commendBodyRaw.getText().toString()); + + BottomSheetReplyFragment.newInstance(bundle).show(fragmentManager, "replyBottomSheet"); dialog.dismiss(); }); @@ -187,13 +192,12 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter dismiss()); + + drafts.setOnClickListener(v -> { + + Intent intent = new Intent(getContext(), MainActivity.class); + intent.putExtra("launchFragment", "drafts"); + startActivity(intent); + + dismiss(); + }); + + send.setOnClickListener(v -> IssueActions + .reply(getContext(), commentContent.getText().toString(), issueNumber) + .accept((status, result) -> { + + if(status == ActionResult.Status.SUCCESS) { + + Toasty.success(getContext(), getString(R.string.commentSuccess)); + + tinyDB.putBoolean("commentPosted", true); + tinyDB.putBoolean("resumeIssues", true); + tinyDB.putBoolean("resumePullRequests", true); + + if(draftId != 0 && tinyDB.getBoolean("draftsCommentsDeletionEnabled")) { + + draftsApi.deleteSingleDraft((int) draftId); + } + + dismiss(); + } + else { + + Toasty.error(getContext(), getString(R.string.commentError)); + dismiss(); + } + })); + + return view; + } + + private void saveDraft(String text, boolean remove) { + + ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 1f); + valueAnimator.setDuration(500); + valueAnimator.addUpdateListener(animation -> { + + float value = (Float) animation.getAnimatedValue(); + + if(value == 0f) { + draftsHint.setVisibility((remove) ? View.GONE : View.VISIBLE); + } + + draftsHint.setAlpha(value); + }); + + if(remove) { + + draftsApi.deleteSingleDraft((int) draftId); + draftId = 0; + + valueAnimator.reverse(); + } + else { + + if(draftId == 0) { + draftId = draftsApi.insertDraft(repositoryId, currentActiveAccountId, issueNumber, text, StaticGlobalVariables.draftTypeComment, "TODO"); + } else { + DraftsApi.updateDraft(text, (int) draftId, "TODO"); + } + + draftsHint.setVisibility(View.VISIBLE); + valueAnimator.start(); + } + } + + public static BottomSheetReplyFragment newInstance(Bundle bundle) { + + BottomSheetReplyFragment fragment = new BottomSheetReplyFragment(); + fragment.setArguments(bundle); + + return fragment; + } +} diff --git a/app/src/main/java/org/mian/gitnex/fragments/DraftsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/DraftsFragment.java index 7275400d..bda08766 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/DraftsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/DraftsFragment.java @@ -3,6 +3,7 @@ package org.mian.gitnex.fragments; import android.content.Context; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -66,11 +67,9 @@ public class DraftsFragment extends Fragment { DividerItemDecoration.VERTICAL); mRecyclerView.addItemDecoration(dividerItemDecoration); - adapter = new DraftsAdapter(getContext(), draftsList_); - + adapter = new DraftsAdapter(getContext(), getChildFragmentManager(), draftsList_); currentActiveAccountId = tinyDb.getInt("currentActiveAccountId"); - - swipeRefresh.setOnRefreshListener(() -> new Handler().postDelayed(() -> { + swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { draftsList_.clear(); fetchDataAsync(currentActiveAccountId); 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 4ab393d3..0fbcf14d 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/IssuesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/IssuesFragment.java @@ -3,6 +3,7 @@ package org.mian.gitnex.fragments; import android.content.Context; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; @@ -87,7 +88,7 @@ public class IssuesFragment extends Fragment { mProgressBar = v.findViewById(R.id.progress_bar); noDataIssues = v.findViewById(R.id.noDataIssues); - swipeRefresh.setOnRefreshListener(() -> new Handler().postDelayed(() -> { + swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); loadInitial(instanceToken, repoOwner, repoName, resultLimit, requestType, tinyDb.getString("repoIssuesState")); diff --git a/app/src/main/java/org/mian/gitnex/fragments/LabelsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/LabelsFragment.java index 58ca5879..13d1da1f 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/LabelsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/LabelsFragment.java @@ -3,6 +3,7 @@ package org.mian.gitnex.fragments; import android.net.Uri; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -87,18 +88,12 @@ public class LabelsFragment extends Fragment { mProgressBar = v.findViewById(R.id.progress_bar); - swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - swipeRefresh.setRefreshing(false); - LabelsViewModel.loadLabelsList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), repoOwner, repoName, getContext()); - } - }, 200); - } - }); + swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { + + swipeRefresh.setRefreshing(false); + LabelsViewModel.loadLabelsList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), repoOwner, repoName, getContext()); + + }, 200)); fetchDataAsync(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), repoOwner, repoName); diff --git a/app/src/main/java/org/mian/gitnex/fragments/MilestonesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/MilestonesFragment.java index ea15a89f..0ee28723 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/MilestonesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/MilestonesFragment.java @@ -3,6 +3,7 @@ package org.mian.gitnex.fragments; import android.content.Context; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; @@ -94,7 +95,7 @@ public class MilestonesFragment extends Fragment { viewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(ctx)); viewBinding.recyclerView.setAdapter(adapter); - viewBinding.pullToRefresh.setOnRefreshListener(() -> new Handler().postDelayed(() -> { + viewBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { dataList.clear(); viewBinding.pullToRefresh.setRefreshing(false); diff --git a/app/src/main/java/org/mian/gitnex/fragments/MyRepositoriesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/MyRepositoriesFragment.java index fd5702c4..eb26dba3 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/MyRepositoriesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/MyRepositoriesFragment.java @@ -4,6 +4,7 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -130,10 +131,11 @@ public class MyRepositoriesFragment extends Fragment { } }); - swipeRefresh.setOnRefreshListener(() -> new Handler().postDelayed(() -> { + swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); MyRepositoriesViewModel.loadMyReposList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), userLogin, getContext(), pageSize, resultLimit); + }, 50)); fetchDataAsync(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), userLogin, pageSize, resultLimit); diff --git a/app/src/main/java/org/mian/gitnex/fragments/OrganizationsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/OrganizationsFragment.java index a90cefc0..5149ab3e 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/OrganizationsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/OrganizationsFragment.java @@ -3,6 +3,7 @@ package org.mian.gitnex.fragments; import android.content.Intent; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -99,18 +100,12 @@ public class OrganizationsFragment extends Fragment { } }); - swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - swipeRefresh.setRefreshing(false); - OrganizationListViewModel.loadOrgsList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), getContext()); - } - }, 50); - } - }); + swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { + + swipeRefresh.setRefreshing(false); + OrganizationListViewModel.loadOrgsList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), getContext()); + + }, 50)); fetchDataAsync(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken)); diff --git a/app/src/main/java/org/mian/gitnex/fragments/ProfileEmailsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ProfileEmailsFragment.java index 8c944bb5..3b1ca710 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ProfileEmailsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ProfileEmailsFragment.java @@ -3,6 +3,7 @@ package org.mian.gitnex.fragments; import android.net.Uri; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -88,18 +89,12 @@ public class ProfileEmailsFragment extends Fragment { mProgressBar = v.findViewById(R.id.progress_bar); - swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - swipeRefresh.setRefreshing(false); - ProfileEmailsViewModel.loadEmailsList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), getContext()); - } - }, 200); - } - }); + swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { + + swipeRefresh.setRefreshing(false); + ProfileEmailsViewModel.loadEmailsList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), getContext()); + + }, 200)); fetchDataAsync(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken)); diff --git a/app/src/main/java/org/mian/gitnex/fragments/ProfileFollowersFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ProfileFollowersFragment.java index 9ff623f1..7a277213 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ProfileFollowersFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ProfileFollowersFragment.java @@ -3,6 +3,7 @@ package org.mian.gitnex.fragments; import android.net.Uri; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -88,18 +89,12 @@ public class ProfileFollowersFragment extends Fragment { mProgressBar = v.findViewById(R.id.progress_bar); - swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - swipeRefresh.setRefreshing(false); - ProfileFollowersViewModel.loadFollowersList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), getContext()); - } - }, 200); - } - }); + swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { + + swipeRefresh.setRefreshing(false); + ProfileFollowersViewModel.loadFollowersList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), getContext()); + + }, 200)); fetchDataAsync(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken)); diff --git a/app/src/main/java/org/mian/gitnex/fragments/ProfileFollowingFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ProfileFollowingFragment.java index d776917d..13daf478 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ProfileFollowingFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ProfileFollowingFragment.java @@ -3,6 +3,7 @@ package org.mian.gitnex.fragments; import android.net.Uri; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -88,18 +89,12 @@ public class ProfileFollowingFragment extends Fragment { mProgressBar = v.findViewById(R.id.progress_bar); - swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - swipeRefresh.setRefreshing(false); - ProfileFollowingViewModel.loadFollowingList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), getContext()); - } - }, 200); - } - }); + swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { + + swipeRefresh.setRefreshing(false); + ProfileFollowingViewModel.loadFollowingList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), getContext()); + + }, 200)); fetchDataAsync(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken)); 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 72bb998f..28b1f6ed 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/PullRequestsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/PullRequestsFragment.java @@ -3,6 +3,7 @@ package org.mian.gitnex.fragments; import android.content.Context; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; @@ -88,7 +89,7 @@ public class PullRequestsFragment extends Fragment { mProgressBar = v.findViewById(R.id.progress_bar); noData = v.findViewById(R.id.noData); - swipeRefresh.setOnRefreshListener(() -> new Handler().postDelayed(() -> { + swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); loadInitial(instanceToken, repoOwner, repoName, pageSize, tinyDb.getString("repoPrState"), resultLimit); diff --git a/app/src/main/java/org/mian/gitnex/fragments/ReleasesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ReleasesFragment.java index f04a5f25..621ac085 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ReleasesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ReleasesFragment.java @@ -3,6 +3,7 @@ package org.mian.gitnex.fragments; import android.net.Uri; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -88,18 +89,12 @@ public class ReleasesFragment extends Fragment { mProgressBar = v.findViewById(R.id.progress_bar); - swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - swipeRefresh.setRefreshing(false); - ReleasesViewModel.loadReleasesList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), repoOwner, repoName, getContext()); - } - }, 50); - } - }); + swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { + + swipeRefresh.setRefreshing(false); + ReleasesViewModel.loadReleasesList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), repoOwner, repoName, getContext()); + + }, 50)); fetchDataAsync(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), repoOwner, repoName); diff --git a/app/src/main/java/org/mian/gitnex/fragments/RepoInfoFragment.java b/app/src/main/java/org/mian/gitnex/fragments/RepoInfoFragment.java index 58e96a16..238d603a 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/RepoInfoFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/RepoInfoFragment.java @@ -18,13 +18,13 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; +import org.apache.commons.io.FileUtils; import org.mian.gitnex.R; import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.activities.RepoStargazersActivity; import org.mian.gitnex.activities.RepoWatchersActivity; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.helpers.AlertDialogs; -import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.TimeHelper; @@ -283,13 +283,7 @@ public class RepoInfoFragment extends Fragment { repoMetaForks.setText(repoInfo.getForks_count()); repoMetaWatchers.setText(repoInfo.getWatchers_count()); - - if(repoInfo.getSize() != 0) { - repoMetaSize.setText(AppUtil.formatFileSize(repoInfo.getSize())); - } - else { - repoMetaSize.setText("0 B"); - } + repoMetaSize.setText(FileUtils.byteCountToDisplaySize((int) repoInfo.getSize())); repoMetaCreatedAt.setText(TimeHelper.formatTime(repoInfo.getCreated_at(), new Locale(locale), timeFormat, ctx)); if(timeFormat.equals("pretty")) { diff --git a/app/src/main/java/org/mian/gitnex/fragments/RepositoriesByOrgFragment.java b/app/src/main/java/org/mian/gitnex/fragments/RepositoriesByOrgFragment.java index 9660af3b..b6831bb4 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/RepositoriesByOrgFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/RepositoriesByOrgFragment.java @@ -3,6 +3,7 @@ package org.mian.gitnex.fragments; import android.net.Uri; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -92,18 +93,12 @@ public class RepositoriesByOrgFragment extends Fragment { mProgressBar = v.findViewById(R.id.progress_bar); - swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - swipeRefresh.setRefreshing(false); - RepositoriesByOrgViewModel.loadOrgRepos(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), orgName, getContext(), pageSize, resultLimit); - } - }, 200); - } - }); + swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { + + swipeRefresh.setRefreshing(false); + RepositoriesByOrgViewModel.loadOrgRepos(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), orgName, getContext(), pageSize, resultLimit); + + }, 200)); fetchDataAsync(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), orgName, pageSize, resultLimit); 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 e5bdfc91..79968b01 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/RepositoriesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/RepositoriesFragment.java @@ -3,6 +3,7 @@ package org.mian.gitnex.fragments; import android.content.Intent; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -98,10 +99,11 @@ public class RepositoriesFragment extends Fragment { } }); - swipeRefresh.setOnRefreshListener(() -> new Handler().postDelayed(() -> { + swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); RepositoriesListViewModel.loadReposList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), getContext(), pageSize, resultLimit); + }, 50)); fetchDataAsync(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), pageSize, resultLimit); 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 4f400a3e..1b537b0e 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/StarredRepositoriesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/StarredRepositoriesFragment.java @@ -4,6 +4,7 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -127,18 +128,12 @@ public class StarredRepositoriesFragment extends Fragment { } }); - swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - swipeRefresh.setRefreshing(false); - StarredRepositoriesViewModel.loadStarredReposList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), getContext(), pageSize, resultLimit); - } - }, 50); - } - }); + swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { + + swipeRefresh.setRefreshing(false); + StarredRepositoriesViewModel.loadStarredReposList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), getContext(), pageSize, resultLimit); + + }, 50)); fetchDataAsync(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), pageSize, resultLimit); diff --git a/app/src/main/java/org/mian/gitnex/fragments/TeamsByOrgFragment.java b/app/src/main/java/org/mian/gitnex/fragments/TeamsByOrgFragment.java index 69b38d95..11f18570 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/TeamsByOrgFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/TeamsByOrgFragment.java @@ -3,6 +3,7 @@ package org.mian.gitnex.fragments; import android.net.Uri; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -90,18 +91,12 @@ public class TeamsByOrgFragment extends Fragment { mProgressBar = v.findViewById(R.id.progress_bar); - swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - swipeRefresh.setRefreshing(false); - TeamsByOrgViewModel.loadTeamsByOrgList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), orgName, getContext()); - } - }, 200); - } - }); + swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { + + swipeRefresh.setRefreshing(false); + TeamsByOrgViewModel.loadTeamsByOrgList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), orgName, getContext()); + + }, 200)); fetchDataAsync(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), orgName); diff --git a/app/src/main/java/org/mian/gitnex/fragments/UserAccountsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/UserAccountsFragment.java index f527cf29..64ddc5e2 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/UserAccountsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/UserAccountsFragment.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -57,7 +58,7 @@ public class UserAccountsFragment extends Fragment { adapter = new UserAccountsAdapter(getContext(), userAccountsList); - swipeRefresh.setOnRefreshListener(() -> new Handler().postDelayed(() -> { + swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { userAccountsList.clear(); swipeRefresh.setRefreshing(false); diff --git a/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java b/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java index 6eedfa4b..bd175b31 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java +++ b/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java @@ -13,7 +13,6 @@ import android.view.View; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; -import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Calendar; @@ -123,33 +122,6 @@ public class AppUtil { } - public static String formatFileSize(long size) { - - String repoSize = size + " B"; - - double m = size / 1024.0; - double g = ((size / 1024.0) / 1024.0); - double t = (((size / 1024.0) / 1024.0) / 1024.0); - - DecimalFormat dec = new DecimalFormat("0.00"); - - if(t > 1) { - repoSize = dec.format(t).concat(" TB"); - } - else if(g > 1) { - repoSize = dec.format(g).concat(" GB"); - } - else if(m > 1) { - repoSize = dec.format(m).concat(" MB"); - } - else if((double) size > 1) { - repoSize = dec.format((double) size).concat(" KB"); - } - - return repoSize; - - } - public static String getTimestampFromDate(Context context, Date date) { TinyDB tinyDB = new TinyDB(context); @@ -159,37 +131,6 @@ public class AppUtil { } - public static String formatFileSizeInDetail(long size) { - - String fileSize = null; - - double k = size / 1024.0; - double m = ((size / 1024.0) / 1024.0); - double g = (((size / 1024.0) / 1024.0) / 1024.0); - double t = ((((size / 1024.0) / 1024.0) / 1024.0) / 1024.0); - - DecimalFormat dec = new DecimalFormat("0.00"); - - if(t > 1) { - fileSize = dec.format(t).concat(" TB"); - } - else if(g > 1) { - fileSize = dec.format(g).concat(" GB"); - } - else if(m > 1) { - fileSize = dec.format(m).concat(" MB"); - } - else if(k > 1) { - fileSize = dec.format(k).concat(" KB"); - } - else if((double) size > 1) { - fileSize = dec.format((double) size).concat(" B"); - } - - return fileSize; - - } - public static String customDateFormat(String customDate) { String[] parts = customDate.split("-"); diff --git a/app/src/main/java/org/mian/gitnex/helpers/FilesData.java b/app/src/main/java/org/mian/gitnex/helpers/FilesData.java index 1278bb94..23d39a2f 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/FilesData.java +++ b/app/src/main/java/org/mian/gitnex/helpers/FilesData.java @@ -1,12 +1,5 @@ package org.mian.gitnex.helpers; -import java.io.File; -import java.util.ArrayDeque; -import java.util.Deque; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; - /** * Author M M Arif */ @@ -16,69 +9,5 @@ public class FilesData { public static int returnOnlyNumber(String fileSize) { return Integer.parseInt(fileSize.substring(0, fileSize.indexOf(" "))); - } - - public static long getFileSizeRecursively(Set alreadySeen, File dirDirectory) { - - long fileSize = 0; - - for (File filItem : Objects.requireNonNull(dirDirectory.listFiles())) { - - if (filItem.isDirectory()) { - - fileSize += getFileSize(filItem); - - } - else { - - alreadySeen.add(new File(filItem.getName())); - fileSize += filItem.length(); - - } - - } - - return fileSize; - - } - - private static long getFileSize(File subDirectory) { - - long fileSize = 0; - - Deque unprocessedDirs = new ArrayDeque<>(); - unprocessedDirs.add(subDirectory); - Set alreadySeen = new HashSet<>(); - - while (!unprocessedDirs.isEmpty()) { - - File dir = unprocessedDirs.removeFirst(); - - for (File filItem : Objects.requireNonNull(dir.listFiles())) { - - if (filItem.isDirectory()) { - - unprocessedDirs.addFirst(filItem); - - } - else { - - if (! alreadySeen.contains(filItem.getName())) { - - alreadySeen.add(new File(filItem.getName())); - fileSize += filItem.length(); - - } - - } - - } - - } - - return fileSize; - - } - } diff --git a/app/src/main/res/drawable/ic_send.xml b/app/src/main/res/drawable/ic_send.xml new file mode 100644 index 00000000..ea45d40a --- /dev/null +++ b/app/src/main/res/drawable/ic_send.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/layout/bottom_sheet_reply_layout.xml b/app/src/main/res/layout/bottom_sheet_reply_layout.xml new file mode 100644 index 00000000..283e85a0 --- /dev/null +++ b/app/src/main/res/layout/bottom_sheet_reply_layout.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8ec71966..a956a86b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -628,7 +628,7 @@ Drafts deleted successfully Draft deleted successfully This will delete all the drafts for this account. \n\nProceed with deletion? - Draft saved + Draft was saved automatically. Themes, fonts, badges, code block theme PDF mode, source code theme diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 49bdb68e..c55ffea3 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -133,15 +133,22 @@