diff --git a/app/src/main/java/org/mian/gitnex/actions/AssigneesActions.java b/app/src/main/java/org/mian/gitnex/actions/AssigneesActions.java index 5da47e25..706d063b 100644 --- a/app/src/main/java/org/mian/gitnex/actions/AssigneesActions.java +++ b/app/src/main/java/org/mian/gitnex/actions/AssigneesActions.java @@ -8,12 +8,12 @@ import androidx.annotation.NonNull; import org.gitnex.tea4j.models.Collaborators; import org.gitnex.tea4j.models.Issues; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.adapters.AssigneesListAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.CustomAssigneesSelectionDialogBinding; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; +import org.mian.gitnex.helpers.contexts.AccountContext; import java.util.List; import retrofit2.Call; import retrofit2.Callback; @@ -28,7 +28,7 @@ public class AssigneesActions { Call callSingleIssueLabels = RetrofitClient .getApiInterface(ctx) - .getIssueByIndex(Authorization.get(ctx), repoOwner, repoName, issueIndex); + .getIssueByIndex(((BaseActivity) ctx).getAccount().getAuthorization(), repoOwner, repoName, issueIndex); callSingleIssueLabels.enqueue(new Callback() { @@ -64,11 +64,9 @@ public class AssigneesActions { public static void getRepositoryAssignees(Context ctx, String repoOwner, String repoName, List assigneesList, Dialog dialogAssignees, AssigneesListAdapter assigneesAdapter, CustomAssigneesSelectionDialogBinding assigneesBinding) { - TinyDB tinyDB = TinyDB.getInstance(ctx); - Call> call = RetrofitClient .getApiInterface(ctx) - .getCollaborators(Authorization.get(ctx), repoOwner, repoName); + .getCollaborators(((BaseActivity) ctx).getAccount().getAuthorization(), repoOwner, repoName); call.enqueue(new Callback>() { @@ -87,7 +85,8 @@ public class AssigneesActions { if(assigneesList_.size() > 0) { - assigneesList.add(new Collaborators(tinyDB.getString("userFullname"), tinyDB.getString("loginUid"), tinyDB.getString("userAvatar"))); + AccountContext userInfo = ((BaseActivity) ctx).getAccount(); + assigneesList.add(new Collaborators(userInfo.getFullName(), userInfo.getAccount().getUserName(), userInfo.getUserInfo().getAvatar())); assigneesList.addAll(assigneesList_); } else { 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 e6bdcc74..65518e16 100644 --- a/app/src/main/java/org/mian/gitnex/actions/CollaboratorActions.java +++ b/app/src/main/java/org/mian/gitnex/actions/CollaboratorActions.java @@ -7,11 +7,12 @@ import org.gitnex.tea4j.models.Collaborators; import org.gitnex.tea4j.models.Permission; import org.mian.gitnex.R; import org.mian.gitnex.activities.AddCollaboratorToRepositoryActivity; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.clients.RetrofitClient; +import org.mian.gitnex.fragments.CollaboratorsFragment; import org.mian.gitnex.helpers.AlertDialogs; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.List; import retrofit2.Call; import retrofit2.Callback; @@ -23,18 +24,11 @@ import retrofit2.Response; public class CollaboratorActions { - public static void deleteCollaborator(final Context context, final String searchKeyword, String userName) { - - final TinyDB tinyDb = TinyDB.getInstance(context); - - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; + public static void deleteCollaborator(final Context context, String userName, RepositoryContext repository) { Call call = RetrofitClient .getApiInterface(context) - .deleteCollaborator(Authorization.get(context), repoOwner, repoName, userName); + .deleteCollaborator(((BaseActivity) context).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), userName); call.enqueue(new Callback() { @@ -44,10 +38,10 @@ public class CollaboratorActions { if(response.isSuccessful()) { if(response.code() == 204) { + CollaboratorsFragment.refreshCollaborators = true; Toasty.success(context, context.getString(R.string.removeCollaboratorToastText)); ((AddCollaboratorToRepositoryActivity)context).finish(); //Log.i("addCollaboratorSearch", addCollaboratorSearch.getText().toString()); - //tinyDb.putBoolean("updateDataSet", true); //AddCollaboratorToRepositoryActivity usersSearchData = new AddCollaboratorToRepositoryActivity(); //usersSearchData.loadUserSearchList(instanceToken, searchKeyword, context); @@ -87,20 +81,13 @@ public class CollaboratorActions { } - public static void addCollaborator(final Context context, String permission, String userName) { - - final TinyDB tinyDb = TinyDB.getInstance(context); - - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; + public static void addCollaborator(final Context context, String permission, String userName, RepositoryContext repository) { Permission permissionString = new Permission(permission); Call call = RetrofitClient .getApiInterface(context) - .addCollaborator(Authorization.get(context), repoOwner, repoName, userName, permissionString); + .addCollaborator(((BaseActivity) context).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), userName, permissionString); call.enqueue(new Callback() { @@ -110,6 +97,7 @@ public class CollaboratorActions { if(response.isSuccessful()) { if(response.code() == 204) { + CollaboratorsFragment.refreshCollaborators = true; Toasty.success(context, context.getString(R.string.addCollaboratorToastText)); ((AddCollaboratorToRepositoryActivity)context).finish(); //AddCollaboratorToRepositoryActivity usersSearchData = new AddCollaboratorToRepositoryActivity(); @@ -152,19 +140,13 @@ public class CollaboratorActions { } - public static ActionResult> getCollaborators(Context context) { + public static ActionResult> getCollaborators(Context context, RepositoryContext repository) { ActionResult> actionResult = new ActionResult<>(); - TinyDB tinyDb = TinyDB.getInstance(context); - - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - String repoOwner = parts[0]; - String repoName = parts[1]; Call> call = RetrofitClient .getApiInterface(context) - .getCollaborators(Authorization.get(context), repoOwner, repoName); + .getCollaborators(((BaseActivity) context).getAccount().getAuthorization(), repository.getOwner(), repository.getName()); call.enqueue(new Callback>() { 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 254f24f2..1b4c249d 100644 --- a/app/src/main/java/org/mian/gitnex/actions/IssueActions.java +++ b/app/src/main/java/org/mian/gitnex/actions/IssueActions.java @@ -1,17 +1,22 @@ package org.mian.gitnex.actions; +import android.app.Activity; import android.content.Context; import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; import com.google.gson.JsonElement; import org.gitnex.tea4j.models.IssueComments; import org.gitnex.tea4j.models.Issues; import org.gitnex.tea4j.models.UpdateIssueState; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; +import org.mian.gitnex.activities.IssueDetailActivity; import org.mian.gitnex.clients.RetrofitClient; +import org.mian.gitnex.fragments.IssuesFragment; +import org.mian.gitnex.fragments.PullRequestsFragment; import org.mian.gitnex.helpers.AlertDialogs; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; +import org.mian.gitnex.helpers.contexts.IssueContext; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; @@ -22,21 +27,14 @@ import retrofit2.Response; public class IssueActions { - public static ActionResult> edit(Context context, String comment, int commentId) { + public static ActionResult> edit(Context context, String comment, int commentId, IssueContext issue) { ActionResult> actionResult = new ActionResult<>(); - TinyDB tinyDb = TinyDB.getInstance(context); - - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - - String repoOwner = parts[0]; - String repoName = parts[1]; - Call call = RetrofitClient .getApiInterface(context) - .patchIssueComment(Authorization.get(context), repoOwner, repoName, commentId, new IssueComments(comment)); + .patchIssueComment(((BaseActivity) context).getAccount().getAuthorization(), issue.getRepository().getOwner(), + issue.getRepository().getName(), commentId, new IssueComments(comment)); call.enqueue(new Callback() { @@ -51,7 +49,8 @@ public class IssueActions { case 401: actionResult.finish(ActionResult.Status.FAILED, response); - AlertDialogs.authorizationTokenRevokedDialog(context, context.getResources().getString(R.string.alertDialogTokenRevokedTitle), context.getResources().getString(R.string.alertDialogTokenRevokedMessage), context.getResources().getString(R.string.cancelButton), context.getResources().getString(R.string.navLogout)); + AlertDialogs.authorizationTokenRevokedDialog(context, context.getResources().getString(R.string.alertDialogTokenRevokedTitle), context.getResources().getString(R.string.alertDialogTokenRevokedMessage), + context.getResources().getString(R.string.cancelButton), context.getResources().getString(R.string.navLogout)); break; default: @@ -72,22 +71,15 @@ public class IssueActions { } - public static void closeReopenIssue(final Context ctx, final int issueIndex, final String issueState) { - - final TinyDB tinyDb = TinyDB.getInstance(ctx); - - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - - final String repoOwner = parts[0]; - final String repoName = parts[1]; + public static void closeReopenIssue(final Context ctx, final String issueState, IssueContext issue) { UpdateIssueState issueStatJson = new UpdateIssueState(issueState); Call call; call = RetrofitClient .getApiInterface(ctx) - .closeReopenIssue(Authorization.get(ctx), repoOwner, repoName, issueIndex, issueStatJson); + .closeReopenIssue(((BaseActivity) ctx).getAccount().getAuthorization(), issue.getRepository().getOwner(), + issue.getRepository().getName(), issue.getIssueIndex(), issueStatJson); call.enqueue(new Callback() { @@ -97,22 +89,19 @@ public class IssueActions { if(response.isSuccessful()) { if(response.code() == 201) { - tinyDb.putBoolean("resumeIssues", true); - tinyDb.putBoolean("resumeClosedIssues", true); - + if (issue.hasIssue()) { + IssuesFragment.resumeIssues = issue.getIssue().getPull_request() == null; + PullRequestsFragment.resumePullRequests = issue.getIssue().getPull_request() != null; + } if(issueState.equals("closed")) { - Toasty.success(ctx, ctx.getString(R.string.issueStateClosed)); - tinyDb.putString("issueState", "closed"); - } else if(issueState.equals("open")) { - Toasty.success(ctx, ctx.getString(R.string.issueStateReopened)); - tinyDb.putString("issueState", "open"); - } + ((IssueDetailActivity) ctx).singleIssueUpdate = true; + ((IssueDetailActivity) ctx).onResume(); } } else if(response.code() == 401) { @@ -147,25 +136,14 @@ public class IssueActions { } - public static void subscribe(final Context ctx) { - - final TinyDB tinyDB = TinyDB.getInstance(ctx); - - String[] repoFullName = tinyDB.getString("repoFullName").split("/"); - - if(repoFullName.length != 2) { - return; - } - - final String userLogin = tinyDB.getString("userLogin"); - final String token = "token " + tinyDB.getString(tinyDB.getString("loginUid") + "-token"); - final int issueNr = Integer.parseInt(tinyDB.getString("issueNumber")); + public static void subscribe(final Context ctx, IssueContext issue) { Call call; call = RetrofitClient .getApiInterface(ctx) - .addIssueSubscriber(token, repoFullName[0], repoFullName[1], issueNr, userLogin); + .addIssueSubscriber(((BaseActivity) ctx).getAccount().getAuthorization(), issue.getRepository().getOwner(), + issue.getRepository().getName(), issue.getIssueIndex(), ((BaseActivity) ctx).getAccount().getAccount().getUserName()); call.enqueue(new Callback() { @@ -177,12 +155,10 @@ public class IssueActions { if(response.code() == 201) { Toasty.success(ctx, ctx.getString(R.string.subscribedSuccessfully)); - tinyDB.putBoolean("issueSubscribed", true); } else if(response.code() == 200) { - tinyDB.putBoolean("issueSubscribed", true); Toasty.success(ctx, ctx.getString(R.string.alreadySubscribed)); } @@ -210,21 +186,12 @@ public class IssueActions { } - public static void unsubscribe(final Context ctx) { - - final TinyDB tinyDB = TinyDB.getInstance(ctx); - - String[] repoFullName = tinyDB.getString("repoFullName").split("/"); - if(repoFullName.length != 2) { - return; - } - final String userLogin = tinyDB.getString("userLogin"); - final String token = "token " + tinyDB.getString(tinyDB.getString("loginUid") + "-token"); - final int issueNr = Integer.parseInt(tinyDB.getString("issueNumber")); + public static void unsubscribe(final Context ctx, IssueContext issue) { Call call; - call = RetrofitClient.getApiInterface(ctx).delIssueSubscriber(token, repoFullName[0], repoFullName[1], issueNr, userLogin); + call = RetrofitClient.getApiInterface(ctx).delIssueSubscriber(((BaseActivity) ctx).getAccount().getAuthorization(), issue.getRepository().getOwner(), + issue.getRepository().getName(), issue.getIssueIndex(), ((BaseActivity) ctx).getAccount().getAccount().getUserName()); call.enqueue(new Callback() { @@ -236,12 +203,10 @@ public class IssueActions { if(response.code() == 201) { Toasty.success(ctx, ctx.getString(R.string.unsubscribedSuccessfully)); - tinyDB.putBoolean("issueSubscribed", false); } else if(response.code() == 200) { - tinyDB.putBoolean("issueSubscribed", false); Toasty.success(ctx, ctx.getString(R.string.alreadyUnsubscribed)); } @@ -268,22 +233,16 @@ public class IssueActions { }); } - public static ActionResult reply(Context context, String comment, int issueIndex) { + public static ActionResult reply(Context context, String comment, IssueContext issue) { ActionResult actionResult = new ActionResult<>(); - TinyDB tinyDb = TinyDB.getInstance(context); - - 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 .getApiInterface(context) - .replyCommentToIssue(Authorization.get(context), repoOwner, repoName, issueIndex, issueComment); + .replyCommentToIssue(((BaseActivity) context).getAccount().getAuthorization(), issue.getRepository().getOwner(), + issue.getRepository().getName(), issue.getIssueIndex(), issueComment); call.enqueue(new Callback() { @@ -291,13 +250,12 @@ public class IssueActions { 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); - + if (issue.hasIssue()) { + IssuesFragment.resumeIssues = issue.getIssue().getPull_request() == null; + PullRequestsFragment.resumePullRequests = issue.getIssue().getPull_request() != null; + } } else if(response.code() == 401) { diff --git a/app/src/main/java/org/mian/gitnex/actions/LabelsActions.java b/app/src/main/java/org/mian/gitnex/actions/LabelsActions.java index f9f53c25..ca52c3b2 100644 --- a/app/src/main/java/org/mian/gitnex/actions/LabelsActions.java +++ b/app/src/main/java/org/mian/gitnex/actions/LabelsActions.java @@ -7,10 +7,10 @@ import android.view.View; import androidx.annotation.NonNull; import org.gitnex.tea4j.models.Labels; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.adapters.LabelsListAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.CustomLabelsSelectionDialogBinding; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Toasty; import java.util.List; import retrofit2.Call; @@ -26,7 +26,7 @@ public class LabelsActions { Call> callSingleIssueLabels = RetrofitClient .getApiInterface(ctx) - .getIssueLabels(Authorization.get(ctx), repoOwner, repoName, issueIndex); + .getIssueLabels(((BaseActivity) ctx).getAccount().getAuthorization(), repoOwner, repoName, issueIndex); callSingleIssueLabels.enqueue(new Callback>() { @@ -63,7 +63,7 @@ public class LabelsActions { Call> call = RetrofitClient .getApiInterface(ctx) - .getLabels(Authorization.get(ctx), repoOwner, repoName); + .getLabels(((BaseActivity) ctx).getAccount().getAuthorization(), repoOwner, repoName); call.enqueue(new Callback>() { @@ -82,7 +82,7 @@ public class LabelsActions { // Load organization labels Call> callOrgLabels = RetrofitClient .getApiInterface(ctx) - .getOrganizationLabels(Authorization.get(ctx), repoOwner); + .getOrganizationLabels(((BaseActivity) ctx).getAccount().getAuthorization(), repoOwner); callOrgLabels.enqueue(new Callback>() { diff --git a/app/src/main/java/org/mian/gitnex/actions/MilestoneActions.java b/app/src/main/java/org/mian/gitnex/actions/MilestoneActions.java index af66e1ab..90b195cc 100644 --- a/app/src/main/java/org/mian/gitnex/actions/MilestoneActions.java +++ b/app/src/main/java/org/mian/gitnex/actions/MilestoneActions.java @@ -6,10 +6,11 @@ import androidx.annotation.NonNull; import com.google.gson.JsonElement; import org.gitnex.tea4j.models.Milestones; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.helpers.AlertDialogs; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import retrofit2.Call; import retrofit2.Callback; @@ -21,23 +22,14 @@ public class MilestoneActions { static final private String TAG = "MilestoneActions : "; - public static void closeMilestone(final Context ctx, int milestoneId_) { - - final TinyDB tinyDB = TinyDB.getInstance(ctx); - - String repoFullName = tinyDB.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - final String loginUid = tinyDB.getString("loginUid"); - final String token = "token " + tinyDB.getString(loginUid + "-token"); + public static void closeMilestone(final Context ctx, int milestoneId_, RepositoryContext repository) { Milestones milestoneStateJson = new Milestones("closed"); Call call; call = RetrofitClient .getApiInterface(ctx) - .closeReopenMilestone(token, repoOwner, repoName, milestoneId_, milestoneStateJson); + .closeReopenMilestone(((BaseActivity) ctx).getAccount().getAuthorization(), repository.getOwner(), repository.getOwner(), milestoneId_, milestoneStateJson); call.enqueue(new Callback() { @@ -77,23 +69,14 @@ public class MilestoneActions { } - public static void openMilestone(final Context ctx, int milestoneId_) { - - final TinyDB tinyDB = TinyDB.getInstance(ctx); - - String repoFullName = tinyDB.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - final String loginUid = tinyDB.getString("loginUid"); - final String token = "token " + tinyDB.getString(loginUid + "-token"); + public static void openMilestone(final Context ctx, int milestoneId_, RepositoryContext repository) { Milestones milestoneStateJson = new Milestones("open"); Call call; call = RetrofitClient .getApiInterface(ctx) - .closeReopenMilestone(token, repoOwner, repoName, milestoneId_, milestoneStateJson); + .closeReopenMilestone(((BaseActivity) ctx).getAccount().getAuthorization(), repository.getOwner(), repository.getOwner(), milestoneId_, milestoneStateJson); call.enqueue(new Callback() { diff --git a/app/src/main/java/org/mian/gitnex/actions/PullRequestActions.java b/app/src/main/java/org/mian/gitnex/actions/PullRequestActions.java index 3d59130c..53e913eb 100644 --- a/app/src/main/java/org/mian/gitnex/actions/PullRequestActions.java +++ b/app/src/main/java/org/mian/gitnex/actions/PullRequestActions.java @@ -4,16 +4,16 @@ import android.content.Context; import androidx.annotation.NonNull; import com.google.gson.JsonElement; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.helpers.AlertDialogs; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Toasty; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; /** - * Author qwerty287 + * @author qwerty287 */ public class PullRequestActions { @@ -21,7 +21,7 @@ public class PullRequestActions { public static void deleteHeadBranch(Context context, String repoOwner, String repoName, String headBranch, boolean showToasts) { Call call = RetrofitClient .getApiInterface(context) - .deleteBranch(Authorization.get(context), repoOwner, repoName, headBranch); + .deleteBranch(((BaseActivity) context).getAccount().getAuthorization(), repoOwner, repoName, headBranch); call.enqueue(new Callback() { @@ -71,7 +71,7 @@ public class PullRequestActions { else { strategy = "rebase"; } - RetrofitClient.getApiInterface(context).updatePullRequest(Authorization.get(context), repoOwner, repoName, Integer.parseInt(index), strategy) + RetrofitClient.getApiInterface(context).updatePullRequest(((BaseActivity) context).getAccount().getAuthorization(), repoOwner, repoName, Integer.parseInt(index), strategy) .enqueue(new Callback() { @Override diff --git a/app/src/main/java/org/mian/gitnex/actions/RepositoryActions.java b/app/src/main/java/org/mian/gitnex/actions/RepositoryActions.java index aac81f4a..7f55dee7 100644 --- a/app/src/main/java/org/mian/gitnex/actions/RepositoryActions.java +++ b/app/src/main/java/org/mian/gitnex/actions/RepositoryActions.java @@ -5,11 +5,12 @@ import android.util.Log; import androidx.annotation.NonNull; import com.google.gson.JsonElement; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; +import org.mian.gitnex.activities.MainActivity; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.helpers.AlertDialogs; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import retrofit2.Call; import retrofit2.Callback; @@ -19,20 +20,13 @@ import retrofit2.Callback; public class RepositoryActions { - public static void starRepository(final Context context) { - - final TinyDB tinyDb = TinyDB.getInstance(context); - - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; + public static void starRepository(final Context context, RepositoryContext repository) { Call call; call = RetrofitClient .getApiInterface(context) - .starRepository(Authorization.get(context), repoOwner, repoName); + .starRepository(((BaseActivity) context).getAccount().getAuthorization(), repository.getOwner(), repository.getName()); call.enqueue(new Callback() { @@ -42,7 +36,7 @@ public class RepositoryActions { if(response.isSuccessful()) { if(response.code() == 204) { - tinyDb.putBoolean("repoCreated", true); + MainActivity.repoCreated = true; Toasty.success(context, context.getString(R.string.starRepositorySuccess)); } @@ -81,20 +75,13 @@ public class RepositoryActions { } - public static void unStarRepository(final Context context) { - - final TinyDB tinyDb = TinyDB.getInstance(context); - - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; + public static void unStarRepository(final Context context, RepositoryContext repository) { Call call; call = RetrofitClient .getApiInterface(context) - .unStarRepository(Authorization.get(context), repoOwner, repoName); + .unStarRepository(((BaseActivity) context).getAccount().getAuthorization(), repository.getOwner(), repository.getName()); call.enqueue(new Callback() { @@ -104,7 +91,7 @@ public class RepositoryActions { if(response.isSuccessful()) { if(response.code() == 204) { - tinyDb.putBoolean("repoCreated", true); + MainActivity.repoCreated = true; Toasty.success(context, context.getString(R.string.unStarRepositorySuccess)); } @@ -143,20 +130,13 @@ public class RepositoryActions { } - public static void watchRepository(final Context context) { - - final TinyDB tinyDb = TinyDB.getInstance(context); - - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; + public static void watchRepository(final Context context, RepositoryContext repository) { Call call; call = RetrofitClient .getApiInterface(context) - .watchRepository(Authorization.get(context), repoOwner, repoName); + .watchRepository(((BaseActivity) context).getAccount().getAuthorization(), repository.getOwner(), repository.getName()); call.enqueue(new Callback() { @@ -166,7 +146,6 @@ public class RepositoryActions { if(response.isSuccessful()) { if(response.code() == 200) { - tinyDb.putBoolean("repoCreated", true); Toasty.success(context, context.getString(R.string.watchRepositorySuccess)); } @@ -205,20 +184,13 @@ public class RepositoryActions { } - public static void unWatchRepository(final Context context) { - - final TinyDB tinyDb = TinyDB.getInstance(context); - - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; + public static void unWatchRepository(final Context context, RepositoryContext repository) { Call call; call = RetrofitClient .getApiInterface(context) - .unWatchRepository(Authorization.get(context), repoOwner, repoName); + .unWatchRepository(((BaseActivity) context).getAccount().getAuthorization(), repository.getOwner(), repository.getName()); call.enqueue(new Callback() { @@ -227,7 +199,6 @@ public class RepositoryActions { if(response.code() == 204) { - tinyDb.putBoolean("repoCreated", true); Toasty.success(context, context.getString(R.string.unWatchRepositorySuccess)); } diff --git a/app/src/main/java/org/mian/gitnex/actions/TeamActions.java b/app/src/main/java/org/mian/gitnex/actions/TeamActions.java index 934fcce3..5fde0f9c 100644 --- a/app/src/main/java/org/mian/gitnex/actions/TeamActions.java +++ b/app/src/main/java/org/mian/gitnex/actions/TeamActions.java @@ -5,10 +5,9 @@ import androidx.annotation.NonNull; import com.google.gson.JsonElement; import org.mian.gitnex.R; import org.mian.gitnex.activities.AddNewTeamMemberActivity; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.helpers.AlertDialogs; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; import retrofit2.Call; import retrofit2.Callback; @@ -21,13 +20,9 @@ public class TeamActions { public static void removeTeamMember(final Context context, String userName, int teamId) { - final TinyDB tinyDb = TinyDB.getInstance(context); - - Call call; - - call = RetrofitClient + Call call = RetrofitClient .getApiInterface(context) - .removeTeamMember(Authorization.get(context), teamId, userName); + .removeTeamMember(((BaseActivity) context).getAccount().getAuthorization(), teamId, userName); call.enqueue(new Callback() { @@ -38,7 +33,6 @@ public class TeamActions { if(response.code() == 204) { - tinyDb.putBoolean("teamActionFlag", true); Toasty.success(context, context.getString(R.string.memberRemovedMessage)); ((AddNewTeamMemberActivity)context).finish(); @@ -83,11 +77,9 @@ public class TeamActions { public static void addTeamMember(final Context context, String userName, int teamId) { - final TinyDB tinyDb = TinyDB.getInstance(context); - Call call = RetrofitClient .getApiInterface(context) - .addTeamMember(Authorization.get(context), teamId, userName); + .addTeamMember(((BaseActivity) context).getAccount().getAuthorization(), teamId, userName); call.enqueue(new Callback() { @@ -98,7 +90,6 @@ public class TeamActions { if(response.code() == 204) { - tinyDb.putBoolean("teamActionFlag", true); Toasty.success(context, context.getString(R.string.memberAddedMessage)); ((AddNewTeamMemberActivity)context).finish(); diff --git a/app/src/main/java/org/mian/gitnex/activities/AddCollaboratorToRepositoryActivity.java b/app/src/main/java/org/mian/gitnex/activities/AddCollaboratorToRepositoryActivity.java index 1769f6a8..d336b929 100644 --- a/app/src/main/java/org/mian/gitnex/activities/AddCollaboratorToRepositoryActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/AddCollaboratorToRepositoryActivity.java @@ -15,10 +15,10 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import org.gitnex.tea4j.models.UserInfo; import org.gitnex.tea4j.models.UserSearch; -import org.mian.gitnex.adapters.UserSearchAdapter; +import org.mian.gitnex.adapters.CollaboratorSearchAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.ActivityAddCollaboratorToRepositoryBinding; -import org.mian.gitnex.helpers.Authorization; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.List; import retrofit2.Call; import retrofit2.Callback; @@ -36,6 +36,7 @@ public class AddCollaboratorToRepositoryActivity extends BaseActivity { private ProgressBar mProgressBar; private RecyclerView mRecyclerView; + private RepositoryContext repository; @Override public void onCreate(Bundle savedInstanceState) { @@ -53,6 +54,8 @@ public class AddCollaboratorToRepositoryActivity extends BaseActivity { mProgressBar = activityAddCollaboratorToRepositoryBinding.progressBar; noData = activityAddCollaboratorToRepositoryBinding.noData; + repository = RepositoryContext.fromIntent(getIntent()); + addCollaboratorSearch.requestFocus(); assert imm != null; imm.showSoftInput(addCollaboratorSearch, InputMethodManager.SHOW_IMPLICIT); @@ -80,8 +83,8 @@ public class AddCollaboratorToRepositoryActivity extends BaseActivity { public void loadUserSearchList(String searchKeyword) { Call call = RetrofitClient - .getApiInterface(appCtx) - .getUserBySearch(Authorization.get(ctx), searchKeyword, 10, 1); + .getApiInterface(ctx) + .getUserBySearch(getAccount().getAuthorization(), searchKeyword, 10, 1); call.enqueue(new Callback() { @@ -112,7 +115,7 @@ public class AddCollaboratorToRepositoryActivity extends BaseActivity { private void getUsersList(List dataList, Context context) { - UserSearchAdapter adapter = new UserSearchAdapter(dataList, context); + CollaboratorSearchAdapter adapter = new CollaboratorSearchAdapter(dataList, context, repository); mRecyclerView.setHasFixedSize(true); mRecyclerView.setLayoutManager(new LinearLayoutManager(ctx)); @@ -139,4 +142,10 @@ public class AddCollaboratorToRepositoryActivity extends BaseActivity { onClickListener = view -> finish(); } + @Override + public void onResume() { + super.onResume(); + repository.checkAccountSwitch(this); + } + } diff --git a/app/src/main/java/org/mian/gitnex/activities/AddNewAccountActivity.java b/app/src/main/java/org/mian/gitnex/activities/AddNewAccountActivity.java index 40e233de..8aea3cfb 100644 --- a/app/src/main/java/org/mian/gitnex/activities/AddNewAccountActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/AddNewAccountActivity.java @@ -14,6 +14,7 @@ import org.mian.gitnex.R; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.database.api.BaseApi; import org.mian.gitnex.database.api.UserAccountsApi; +import org.mian.gitnex.database.models.UserAccount; import org.mian.gitnex.databinding.ActivityAddNewAccountBinding; import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.PathsHelper; @@ -50,6 +51,15 @@ public class AddNewAccountActivity extends BaseActivity { initCloseListener(); viewBinding.close.setOnClickListener(onClickListener); viewBinding.instanceUrl.setText(getIntent().getStringExtra("instanceUrl")); + viewBinding.loginToken.setText(getIntent().getStringExtra("token")); + String scheme = getIntent().getStringExtra("scheme"); + if(scheme != null && scheme.equals("http")) { + viewBinding.protocolSpinner.setText(Protocol.HTTP.toString()); + spinnerSelectedValue = Protocol.HTTP.toString(); + } else { // default is https + viewBinding.protocolSpinner.setText(Protocol.HTTPS.toString()); + spinnerSelectedValue = Protocol.HTTPS.toString(); + } ArrayAdapter adapterProtocols = new ArrayAdapter<>(ctx, R.layout.list_spinner_items, Protocol.values()); @@ -134,7 +144,6 @@ public class AddNewAccountActivity extends BaseActivity { return; } - tinyDB.putString("giteaVersion", version.getVersion()); Version giteaVersion = new Version(version.getVersion()); if(giteaVersion.less(getString(R.string.versionLow))) { @@ -210,14 +219,24 @@ public class AddNewAccountActivity extends BaseActivity { if(!userAccountExists) { - userAccountsApi.createNewAccount(accountName, instanceUrl, userDetails.getUsername(), loginToken, ""); + long id = userAccountsApi.createNewAccount(accountName, instanceUrl, userDetails.getUsername(), loginToken, ""); + UserAccount account = userAccountsApi.getAccountById((int) id); + AppUtil.switchToAccount(AddNewAccountActivity.this, account); Toasty.success(ctx, getResources().getString(R.string.accountAddedMessage)); finish(); } else { - - Toasty.warning(ctx, getResources().getString(R.string.accountAlreadyExistsError)); + UserAccount account = userAccountsApi.getAccountByName(accountName); + if(account.isLoggedIn()) { + Toasty.warning(ctx, getResources().getString(R.string.accountAlreadyExistsError)); + AppUtil.switchToAccount(ctx, account); + } else { + userAccountsApi.updateTokenByAccountName(accountName, loginToken); + userAccountsApi.login(account.getAccountId()); + AppUtil.switchToAccount(AddNewAccountActivity.this, account); + } + finish(); } break; @@ -228,7 +247,7 @@ public class AddNewAccountActivity extends BaseActivity { default: - Toasty.error(ctx, getResources().getString(R.string.genericApiStatusError) + response.code()); + Toasty.error(ctx, getResources().getString(R.string.genericApiError, response.code())); } } diff --git a/app/src/main/java/org/mian/gitnex/activities/AddNewTeamMemberActivity.java b/app/src/main/java/org/mian/gitnex/activities/AddNewTeamMemberActivity.java index 43905572..5cd253e4 100644 --- a/app/src/main/java/org/mian/gitnex/activities/AddNewTeamMemberActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/AddNewTeamMemberActivity.java @@ -19,7 +19,6 @@ import org.gitnex.tea4j.models.UserSearch; import org.mian.gitnex.adapters.UserSearchForTeamMemberAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.ActivityAddNewTeamMemberBinding; -import org.mian.gitnex.helpers.Authorization; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -91,8 +90,8 @@ public class AddNewTeamMemberActivity extends BaseActivity { if(!addNewTeamMember.getText().toString().equals("") && addNewTeamMember.getText().toString().length() > 1) { - adapter = new UserSearchForTeamMemberAdapter(dataList, ctx, Integer.parseInt(teamId)); - loadUserSearchList(addNewTeamMember.getText().toString(), teamId); + adapter = new UserSearchForTeamMemberAdapter(dataList, ctx, Integer.parseInt(teamId), getIntent().getStringExtra("orgName")); + loadUserSearchList(addNewTeamMember.getText().toString()); } } @@ -108,9 +107,9 @@ public class AddNewTeamMemberActivity extends BaseActivity { } - public void loadUserSearchList(String searchKeyword, String teamId) { + public void loadUserSearchList(String searchKeyword) { - Call call = RetrofitClient.getApiInterface(ctx).getUserBySearch(Authorization.get(ctx), searchKeyword, 10, 1); + Call call = RetrofitClient.getApiInterface(ctx).getUserBySearch(getAccount().getAuthorization(), searchKeyword, 10, 1); mProgressBar.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/org/mian/gitnex/activities/AdminCronTasksActivity.java b/app/src/main/java/org/mian/gitnex/activities/AdminCronTasksActivity.java index 7067cb29..65354b95 100644 --- a/app/src/main/java/org/mian/gitnex/activities/AdminCronTasksActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/AdminCronTasksActivity.java @@ -11,7 +11,6 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import org.mian.gitnex.adapters.AdminCronTasksAdapter; import org.mian.gitnex.databinding.ActivityAdminCronTasksBinding; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.viewmodels.AdminCronTasksViewModel; /** @@ -52,11 +51,11 @@ public class AdminCronTasksActivity extends BaseActivity { activityAdminCronTasksBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { activityAdminCronTasksBinding.pullToRefresh.setRefreshing(false); - AdminCronTasksViewModel.loadCronTasksList(ctx, Authorization.get(ctx), PAGE, LIMIT); + AdminCronTasksViewModel.loadCronTasksList(ctx, getAccount().getAuthorization(), PAGE, LIMIT); }, 500)); - fetchDataAsync(ctx, Authorization.get(ctx)); + fetchDataAsync(ctx, getAccount().getAuthorization()); } private void fetchDataAsync(Context ctx, String instanceToken) { @@ -65,7 +64,7 @@ public class AdminCronTasksActivity extends BaseActivity { cronTasksViewModel.getCronTasksList(ctx, instanceToken, PAGE, LIMIT).observe(this, cronTasksListMain -> { - adapter = new AdminCronTasksAdapter(ctx, cronTasksListMain); + adapter = new AdminCronTasksAdapter(cronTasksListMain); if(adapter.getItemCount() > 0) { 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 b02bb7a9..9a6ab974 100644 --- a/app/src/main/java/org/mian/gitnex/activities/AdminGetUsersActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/AdminGetUsersActivity.java @@ -24,7 +24,6 @@ import org.mian.gitnex.adapters.AdminGetUsersAdapter; import org.mian.gitnex.databinding.ActivityAdminGetUsersBinding; import org.mian.gitnex.fragments.BottomSheetAdminUsersFragment; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.structs.BottomSheetListener; import org.mian.gitnex.viewmodels.AdminGetUsersViewModel; @@ -70,11 +69,11 @@ public class AdminGetUsersActivity extends BaseActivity implements BottomSheetLi swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); - AdminGetUsersViewModel.loadUsersList(ctx, Authorization.get(ctx)); + AdminGetUsersViewModel.loadUsersList(ctx, getAccount().getAuthorization()); }, 500)); - fetchDataAsync(ctx, Authorization.get(ctx)); + fetchDataAsync(ctx, getAccount().getAuthorization()); } 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 31d0b90e..cabec454 100644 --- a/app/src/main/java/org/mian/gitnex/activities/BaseActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/BaseActivity.java @@ -7,9 +7,11 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.biometric.BiometricPrompt; import androidx.core.content.ContextCompat; import org.mian.gitnex.R; +import org.mian.gitnex.core.MainApplication; import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TinyDB; +import org.mian.gitnex.helpers.contexts.AccountContext; import org.mian.gitnex.notifications.Notifications; import java.util.Locale; import java.util.concurrent.Executor; @@ -37,47 +39,49 @@ public abstract class BaseActivity extends AppCompatActivity { case 1: - tinyDB.putString("currentTheme", "light"); setTheme(R.style.AppThemeLight); break; case 2: - if(TimeHelper.timeBetweenHours(tinyDB.getInt("darkThemeTimeHour"), tinyDB.getInt("lightThemeTimeHour"), tinyDB.getInt("darkThemeTimeMinute"), tinyDB.getInt("lightThemeTimeMinute"))) { + if(TimeHelper.timeBetweenHours( + tinyDB.getInt("darkThemeTimeHour", 18), + tinyDB.getInt("lightThemeTimeHour", 6), + tinyDB.getInt("darkThemeTimeMinute", 0), + tinyDB.getInt("lightThemeTimeMinute", 0)) + ) { - tinyDB.putString("currentTheme", "dark"); setTheme(R.style.AppTheme); } else { - tinyDB.putString("currentTheme", "light"); setTheme(R.style.AppThemeLight); } break; case 3: - tinyDB.putString("currentTheme", "light"); setTheme(R.style.AppThemeRetro); break; case 4: - if(TimeHelper.timeBetweenHours(tinyDB.getInt("darkThemeTimeHour"), tinyDB.getInt("lightThemeTimeHour"), tinyDB.getInt("darkThemeTimeMinute"), tinyDB.getInt("lightThemeTimeMinute"))) { + if(TimeHelper.timeBetweenHours( + tinyDB.getInt("darkThemeTimeHour", 18), + tinyDB.getInt("lightThemeTimeHour", 6), + tinyDB.getInt("darkThemeTimeMinute", 0), + tinyDB.getInt("lightThemeTimeMinute", 0)) + ) { - tinyDB.putString("currentTheme", "dark"); setTheme(R.style.AppTheme); } else { - tinyDB.putString("currentTheme", "light"); setTheme(R.style.AppThemeRetro); } break; case 5: - tinyDB.putString("currentTheme", "dark"); setTheme(R.style.AppThemePitchBlack); break; default: - tinyDB.putString("currentTheme", "dark"); setTheme(R.style.AppTheme); } @@ -96,7 +100,7 @@ public abstract class BaseActivity extends AppCompatActivity { public void onResume() { super.onResume(); - if(tinyDB.getBoolean("biometricStatus") && !tinyDB.getBoolean("biometricLifeCycle")) { + if(tinyDB.getBoolean("biometricStatus", false) && !tinyDB.getBoolean("biometricLifeCycle")) { Executor executor = ContextCompat.getMainExecutor(this); @@ -131,6 +135,10 @@ public abstract class BaseActivity extends AppCompatActivity { } } + + public AccountContext getAccount() { + return ((MainApplication) getApplication()).currentAccount; + } } 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 75c27cda..ac5aec67 100644 --- a/app/src/main/java/org/mian/gitnex/activities/CommitsActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/CommitsActivity.java @@ -23,10 +23,10 @@ import org.mian.gitnex.R; import org.mian.gitnex.adapters.CommitsAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.ActivityCommitsBinding; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Version; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.ArrayList; import java.util.List; import retrofit2.Call; @@ -42,7 +42,7 @@ public class CommitsActivity extends BaseActivity { private View.OnClickListener onClickListener; private TextView noData; private ProgressBar progressBar; - private String TAG = "CommitsActivity"; + private final String TAG = "CommitsActivity"; private int resultLimit = Constants.resultLimitOldGiteaInstances; private int pageSize = 1; @@ -51,10 +51,13 @@ public class CommitsActivity extends BaseActivity { private CommitsAdapter adapter; private ProgressBar progressLoadMore; + public RepositoryContext repository; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + this.getClass().getName(); ActivityCommitsBinding activityCommitsBinding = ActivityCommitsBinding.inflate(getLayoutInflater()); setContentView(activityCommitsBinding.getRoot()); @@ -62,12 +65,8 @@ public class CommitsActivity extends BaseActivity { Toolbar toolbar = activityCommitsBinding.toolbar; setSupportActionBar(toolbar); - String repoFullName = tinyDB.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - - String branchName = getIntent().getStringExtra("branchName"); + repository = RepositoryContext.fromIntent(getIntent()); + String branchName = repository.getBranchRef(); TextView toolbar_title = activityCommitsBinding.toolbarTitle; toolbar_title.setMovementMethod(new ScrollingMovementMethod()); @@ -83,7 +82,7 @@ public class CommitsActivity extends BaseActivity { closeActivity.setOnClickListener(onClickListener); // if gitea is 1.12 or higher use the new limit (resultLimitNewGiteaInstances) - if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12")) { + if(getAccount().requiresVersion("1.12")) { resultLimit = Constants.resultLimitNewGiteaInstances; } @@ -94,7 +93,7 @@ public class CommitsActivity extends BaseActivity { swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); - loadInitial(Authorization.get(ctx), repoOwner, repoName, branchName, resultLimit); + loadInitial(getAccount().getAuthorization(), repository.getOwner(), repository.getName(), branchName, resultLimit); adapter.notifyDataChanged(); }, 200)); @@ -104,7 +103,7 @@ public class CommitsActivity extends BaseActivity { if(commitsList.size() == resultLimit || pageSize == resultLimit) { int page = (commitsList.size() + resultLimit) / resultLimit; - loadMore(Authorization.get(ctx), repoOwner, repoName, page, branchName, resultLimit); + loadMore(getAccount().getAuthorization(), repository.getOwner(), repository.getName(), page, branchName, resultLimit); } })); @@ -112,7 +111,7 @@ public class CommitsActivity extends BaseActivity { recyclerView.setLayoutManager(new LinearLayoutManager(ctx)); recyclerView.setAdapter(adapter); - loadInitial(Authorization.get(ctx), repoOwner, repoName, branchName, resultLimit); + loadInitial(getAccount().getAuthorization(), repository.getOwner(), repository.getName(), branchName, resultLimit); } private void loadInitial(String token, String repoOwner, String repoName, String branchName, int resultLimit) { @@ -258,11 +257,16 @@ public class CommitsActivity extends BaseActivity { onClickListener = view -> { - getIntent().removeExtra("branchName"); finish(); }; } + @Override + public void onResume() { + super.onResume(); + repository.checkAccountSwitch(this); + } + } diff --git a/app/src/main/java/org/mian/gitnex/activities/CreateFileActivity.java b/app/src/main/java/org/mian/gitnex/activities/CreateFileActivity.java index 674824f9..4d00baa0 100644 --- a/app/src/main/java/org/mian/gitnex/activities/CreateFileActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/CreateFileActivity.java @@ -2,6 +2,7 @@ package org.mian.gitnex.activities; import android.annotation.SuppressLint; import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; @@ -20,9 +21,9 @@ import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.ActivityCreateFileBinding; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.NetworkStatusObserver; import org.mian.gitnex.helpers.Toasty; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.ArrayList; import java.util.List; import retrofit2.Call; @@ -47,8 +48,7 @@ public class CreateFileActivity extends BaseActivity { private final List branches = new ArrayList<>(); - private String repoOwner; - private String repoName; + private RepositoryContext repository; @SuppressLint("ClickableViewAccessibility") @Override @@ -59,10 +59,7 @@ public class CreateFileActivity extends BaseActivity { binding = ActivityCreateFileBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); - String repoFullName = tinyDB.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - repoOwner = parts[0]; - repoName = parts[1]; + repository = RepositoryContext.fromIntent(getIntent()); TextView toolbarTitle = binding.toolbarTitle; @@ -119,7 +116,7 @@ public class CreateFileActivity extends BaseActivity { } - getBranches(repoOwner, repoName); + getBranches(repository.getOwner(), repository.getName()); disableProcessButton(); @@ -162,15 +159,15 @@ public class CreateFileActivity extends BaseActivity { switch(fileAction) { case FILE_ACTION_CREATE: - createNewFile(repoOwner, repoName, newFileName, AppUtil.encodeBase64(newFileContent), newFileCommitMessage, newFileBranchName); + createNewFile(repository.getOwner(), repository.getName(), newFileName, AppUtil.encodeBase64(newFileContent), newFileCommitMessage, newFileBranchName); break; case FILE_ACTION_DELETE: - deleteFile(repoOwner, repoName, filePath, newFileCommitMessage, newFileBranchName, fileSha); + deleteFile(repository.getOwner(), repository.getName(), filePath, newFileCommitMessage, newFileBranchName, fileSha); break; case FILE_ACTION_EDIT: - editFile(repoOwner, repoName, filePath, AppUtil.encodeBase64(newFileContent), newFileCommitMessage, newFileBranchName, fileSha); + editFile(repository.getOwner(), repository.getName(), filePath, AppUtil.encodeBase64(newFileContent), newFileCommitMessage, newFileBranchName, fileSha); break; } @@ -184,7 +181,7 @@ public class CreateFileActivity extends BaseActivity { Call call = RetrofitClient .getApiInterface(ctx) - .createNewFile(Authorization.get(ctx), repoOwner, repoName, fileName, createNewFileJsonStr); + .createNewFile(getAccount().getAuthorization(), repoOwner, repoName, fileName, createNewFileJsonStr); call.enqueue(new Callback() { @@ -196,6 +193,9 @@ public class CreateFileActivity extends BaseActivity { case 201: enableProcessButton(); Toasty.success(ctx, getString(R.string.newFileSuccessMessage)); + Intent result = new Intent(); + result.putExtra("fileModified", true); + setResult(200, result); finish(); break; @@ -239,7 +239,7 @@ public class CreateFileActivity extends BaseActivity { Call call = RetrofitClient .getApiInterface(ctx) - .deleteFile(Authorization.get(ctx), repoOwner, repoName, fileName, deleteFileJsonStr); + .deleteFile(getAccount().getAuthorization(), repoOwner, repoName, fileName, deleteFileJsonStr); call.enqueue(new Callback() { @@ -250,10 +250,10 @@ public class CreateFileActivity extends BaseActivity { case 200: enableProcessButton(); - Toasty.info(ctx, getString(R.string.deleteFileMessage, tinyDB.getString("repoBranch"))); - getIntent().removeExtra("filePath"); - getIntent().removeExtra("fileSha"); - getIntent().removeExtra("fileContents"); + Toasty.info(ctx, getString(R.string.deleteFileMessage, repository.getBranchRef())); + Intent result = new Intent(); + result.putExtra("fileModified", true); + setResult(200, result); finish(); break; @@ -296,7 +296,7 @@ public class CreateFileActivity extends BaseActivity { Call call = RetrofitClient .getApiInterface(ctx) - .editFile(Authorization.get(ctx), repoOwner, repoName, fileName, editFileJsonStr); + .editFile(getAccount().getAuthorization(), repoOwner, repoName, fileName, editFileJsonStr); call.enqueue(new Callback() { @@ -308,10 +308,9 @@ public class CreateFileActivity extends BaseActivity { case 200: enableProcessButton(); Toasty.info(ctx, getString(R.string.editFileMessage, branchName)); - getIntent().removeExtra("filePath"); - getIntent().removeExtra("fileSha"); - getIntent().removeExtra("fileContents"); - tinyDB.putBoolean("fileModified", true); + Intent result = new Intent(); + result.putExtra("fileModified", true); + setResult(200, result); finish(); break; @@ -351,7 +350,7 @@ public class CreateFileActivity extends BaseActivity { Call> call = RetrofitClient .getApiInterface(ctx) - .getBranches(Authorization.get(ctx), repoOwner, repoName); + .getBranches(getAccount().getAuthorization(), repoOwner, repoName); call.enqueue(new Callback>() { @@ -366,7 +365,7 @@ public class CreateFileActivity extends BaseActivity { ArrayAdapter adapter = new ArrayAdapter<>(CreateFileActivity.this, R.layout.list_spinner_items, branches); binding.newFileBranches.setAdapter(adapter); - binding.newFileBranches.setText(tinyDB.getString("repoBranch"), false); + binding.newFileBranches.setText(repository.getBranchRef(), false); enableProcessButton(); @@ -385,4 +384,10 @@ public class CreateFileActivity extends BaseActivity { private void disableProcessButton() { binding.newFileCreate.setEnabled(false); } private void enableProcessButton() { binding.newFileCreate.setEnabled(true); } + @Override + public void onResume() { + super.onResume(); + repository.checkAccountSwitch(this); + } + } diff --git a/app/src/main/java/org/mian/gitnex/activities/CreateIssueActivity.java b/app/src/main/java/org/mian/gitnex/activities/CreateIssueActivity.java index 318a9adf..16be9056 100644 --- a/app/src/main/java/org/mian/gitnex/activities/CreateIssueActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/CreateIssueActivity.java @@ -27,13 +27,12 @@ import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.ActivityCreateIssueBinding; import org.mian.gitnex.databinding.CustomAssigneesSelectionDialogBinding; import org.mian.gitnex.databinding.CustomLabelsSelectionDialogBinding; +import org.mian.gitnex.fragments.IssuesFragment; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; -import org.mian.gitnex.helpers.Version; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.ArrayList; import java.util.Calendar; import java.util.List; @@ -58,9 +57,7 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis private String assigneesSetter; private int milestoneId; - private String loginUid; - private String repoOwner; - private String repoName; + private RepositoryContext repository; private LabelsListAdapter labelsAdapter; private AssigneesListAdapter assigneesAdapter; @@ -84,14 +81,10 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - loginUid = tinyDB.getString("loginUid"); - String repoFullName = tinyDB.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - repoOwner = parts[0]; - repoName = parts[1]; + repository = RepositoryContext.fromIntent(getIntent()); // require gitea 1.12 or higher - if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.0")) { + if(getAccount().requiresVersion("1.12.0")) { resultLimit = Constants.resultLimitNewGiteaInstances; } @@ -121,7 +114,7 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis viewBinding.newIssueLabels.setOnClickListener(this); viewBinding.newIssueDueDate.setOnClickListener(this); - getMilestones(repoOwner, repoName, resultLimit); + getMilestones(repository.getOwner(), repository.getName(), resultLimit); disableProcessButton(); @@ -138,7 +131,7 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis viewBinding.createNewIssueButton.setOnClickListener(this); } - if(!tinyDB.getBoolean("canPush")) { + if(!repository.getPermissions().canPush()) { viewBinding.newIssueAssigneesListLayout.setVisibility(View.GONE); viewBinding.newIssueMilestoneSpinnerLayout.setVisibility(View.GONE); viewBinding.newIssueLabelsLayout.setVisibility(View.GONE); @@ -185,7 +178,7 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis assigneesBinding.cancel.setOnClickListener(assigneesBinding_ -> dialogAssignees.dismiss()); dialogAssignees.show(); - AssigneesActions.getRepositoryAssignees(ctx, repoOwner, repoName, assigneesList, dialogAssignees, assigneesAdapter, assigneesBinding); + AssigneesActions.getRepositoryAssignees(ctx, repository.getOwner(), repository.getName(), assigneesList, dialogAssignees, assigneesAdapter, assigneesBinding); } private void showLabels() { @@ -205,7 +198,7 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis labelsBinding.cancel.setOnClickListener(labelsBinding_ -> dialogLabels.dismiss()); dialogLabels.show(); - LabelsActions.getRepositoryLabels(ctx, repoOwner, repoName, labelsList, dialogLabels, labelsAdapter, labelsBinding); + LabelsActions.getRepositoryLabels(ctx, repository.getOwner(), repository.getName(), labelsList, dialogLabels, labelsAdapter, labelsBinding); } private void processNewIssue() { @@ -238,7 +231,7 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis } disableProcessButton(); - createNewIssueFunc(repoOwner, repoName, loginUid, newIssueDescriptionForm, newIssueDueDateForm, milestoneId, newIssueTitleForm); + createNewIssueFunc(repository.getOwner(), repository.getName(), getAccount().getAccount().getUserName(), newIssueDescriptionForm, newIssueDueDateForm, milestoneId, newIssueTitleForm); } private void createNewIssueFunc(String repoOwner, String repoName, String loginUid, String newIssueDescriptionForm, String newIssueDueDateForm, int newIssueMilestoneIdForm, String newIssueTitleForm) { @@ -249,7 +242,7 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis call3 = RetrofitClient .getApiInterface(ctx) - .createNewIssue(Authorization.get(ctx), repoOwner, repoName, createNewIssueJson); + .createNewIssue(getAccount().getAuthorization(), repoOwner, repoName, createNewIssueJson); call3.enqueue(new Callback() { @@ -258,8 +251,7 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis if(response2.code() == 201) { - TinyDB tinyDb = TinyDB.getInstance(appCtx); - tinyDb.putBoolean("resumeIssues", true); + IssuesFragment.resumeIssues = true; Toasty.success(ctx, getString(R.string.issueCreated)); enableProcessButton(); @@ -301,7 +293,7 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis String msState = "open"; Call> call = RetrofitClient .getApiInterface(ctx) - .getMilestones(Authorization.get(ctx), repoOwner, repoName, 1, resultLimit, msState); + .getMilestones(getAccount().getAuthorization(), repoOwner, repoName, 1, resultLimit, msState); call.enqueue(new Callback>() { @@ -386,4 +378,10 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis viewBinding.createNewIssueButton.setEnabled(true); } + + @Override + public void onResume() { + super.onResume(); + repository.checkAccountSwitch(this); + } } diff --git a/app/src/main/java/org/mian/gitnex/activities/CreateLabelActivity.java b/app/src/main/java/org/mian/gitnex/activities/CreateLabelActivity.java index a05ff823..77bd2519 100644 --- a/app/src/main/java/org/mian/gitnex/activities/CreateLabelActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/CreateLabelActivity.java @@ -20,9 +20,8 @@ import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.ActivityCreateLabelBinding; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import org.mian.gitnex.viewmodels.LabelsViewModel; import org.mian.gitnex.viewmodels.OrganizationLabelsViewModel; import java.util.Objects; @@ -35,11 +34,16 @@ import retrofit2.Callback; public class CreateLabelActivity extends BaseActivity { + public static boolean refreshLabels = false; + private View.OnClickListener onClickListener; private TextView colorPicker; private EditText labelName; private Button createLabelButton; - private TinyDB tinyDB; + + private RepositoryContext repository; + private String labelColor = ""; + private String labelColorDefault = ""; @Override public void onCreate(Bundle savedInstanceState) { @@ -51,15 +55,11 @@ public class CreateLabelActivity extends BaseActivity { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - tinyDB = TinyDB.getInstance(appCtx); - String repoFullName = tinyDB.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; + repository = RepositoryContext.fromIntent(getIntent()); if(getIntent().getStringExtra("labelAction") != null && Objects.requireNonNull(getIntent().getStringExtra("labelAction")).equals("delete")) { - deleteLabel(repoOwner, repoName, Integer.parseInt(Objects.requireNonNull(getIntent().getStringExtra("labelId")))); + deleteLabel(Integer.parseInt(Objects.requireNonNull(getIntent().getStringExtra("labelId")))); finish(); return; } @@ -85,7 +85,7 @@ public class CreateLabelActivity extends BaseActivity { //Log.i("#Hex no alpha", String.format("#%06X", (0xFFFFFF & color))); colorPicker.setBackgroundColor(color); - tinyDB.putString("labelColor", String.format("#%06X", (0xFFFFFF & color))); + labelColor = String.format("#%06X", (0xFFFFFF & color)); cp.dismiss(); }); @@ -94,7 +94,7 @@ public class CreateLabelActivity extends BaseActivity { labelName.setText(getIntent().getStringExtra("labelTitle")); int labelColor_ = Color.parseColor("#" + getIntent().getStringExtra("labelColor")); colorPicker.setBackgroundColor(labelColor_); - tinyDB.putString("labelColorDefault", "#" + getIntent().getStringExtra("labelColor")); + labelColorDefault = "#" + getIntent().getStringExtra("labelColor"); TextView toolbar_title = activityCreateLabelBinding.toolbarTitle; toolbar_title.setText(getResources().getString(R.string.pageTitleLabelUpdate)); @@ -123,21 +123,16 @@ public class CreateLabelActivity extends BaseActivity { boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); - String repoFullName = tinyDB.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - String updateLabelName = labelName.getText().toString(); String updateLabelColor; - if(tinyDB.getString("labelColor").isEmpty()) { + if(labelColor.isEmpty()) { - updateLabelColor = tinyDB.getString("labelColorDefault"); + updateLabelColor = labelColorDefault; } else { - updateLabelColor = tinyDB.getString("labelColor"); + updateLabelColor = labelColor; } if(!connToInternet) { @@ -159,7 +154,7 @@ public class CreateLabelActivity extends BaseActivity { } disableProcessButton(); - patchLabel(repoOwner, repoName, updateLabelName, updateLabelColor, Integer.parseInt( + patchLabel(repository.getOwner(), repository.getName(), updateLabelName, updateLabelColor, Integer.parseInt( Objects.requireNonNull(getIntent().getStringExtra("labelId")))); } @@ -168,21 +163,16 @@ public class CreateLabelActivity extends BaseActivity { boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); - String repoFullName = tinyDB.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - String newLabelName = labelName.getText().toString(); String newLabelColor; - if(tinyDB.getString("labelColor").isEmpty()) { + if(labelColor.isEmpty()) { newLabelColor = String.format("#%06X", (0xFFFFFF & ContextCompat.getColor(ctx, R.color.releasePre))); } else { - newLabelColor = tinyDB.getString("labelColor"); + newLabelColor = labelColor; } if(!connToInternet) { @@ -204,7 +194,7 @@ public class CreateLabelActivity extends BaseActivity { } disableProcessButton(); - createNewLabel(repoOwner, repoName, newLabelName, newLabelColor); + createNewLabel(repository.getOwner(), repository.getName(), newLabelName, newLabelColor); } private void createNewLabel(String repoOwner, String repoName, String newLabelName, String newLabelColor) { @@ -215,11 +205,11 @@ public class CreateLabelActivity extends BaseActivity { if(getIntent().getStringExtra("type") != null && Objects.requireNonNull(getIntent().getStringExtra("type")).equals("org")) { - call = RetrofitClient.getApiInterface(ctx).createOrganizationLabel(Authorization.get(ctx), getIntent().getStringExtra("orgName"), createLabelFunc); + call = RetrofitClient.getApiInterface(ctx).createOrganizationLabel(getAccount().getAuthorization(), getIntent().getStringExtra("orgName"), createLabelFunc); } else { - call = RetrofitClient.getApiInterface(ctx).createLabel(Authorization.get(ctx), repoOwner, repoName, createLabelFunc); + call = RetrofitClient.getApiInterface(ctx).createLabel(getAccount().getAuthorization(), repoOwner, repoName, createLabelFunc); } call.enqueue(new Callback() { @@ -230,8 +220,7 @@ public class CreateLabelActivity extends BaseActivity { if(response.code() == 201) { Toasty.success(ctx, getString(R.string.labelCreated)); - tinyDB.putString("labelColor", ""); - tinyDB.putBoolean("labelsRefresh", true); + refreshLabels = true; finish(); } else if(response.code() == 401) { @@ -245,7 +234,7 @@ public class CreateLabelActivity extends BaseActivity { else { enableProcessButton(); - tinyDB.putString("labelColor", ""); + labelColor = ""; Toasty.error(ctx, getString(R.string.labelGeneralError)); } } @@ -253,7 +242,7 @@ public class CreateLabelActivity extends BaseActivity { @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { - tinyDB.putString("labelColor", ""); + labelColor = ""; Log.e("onFailure", t.toString()); enableProcessButton(); } @@ -269,11 +258,11 @@ public class CreateLabelActivity extends BaseActivity { if(getIntent().getStringExtra("type") != null && Objects.requireNonNull(getIntent().getStringExtra("type")).equals("org")) { - call = RetrofitClient.getApiInterface(ctx).patchOrganizationLabel(Authorization.get(ctx), getIntent().getStringExtra("orgName"), labelId, createLabelFunc); + call = RetrofitClient.getApiInterface(ctx).patchOrganizationLabel(getAccount().getAuthorization(), getIntent().getStringExtra("orgName"), labelId, createLabelFunc); } else { - call = RetrofitClient.getApiInterface(appCtx).patchLabel(Authorization.get(ctx), repoOwner, repoName, labelId, createLabelFunc); + call = RetrofitClient.getApiInterface(ctx).patchLabel(getAccount().getAuthorization(), repoOwner, repoName, labelId, createLabelFunc); } call.enqueue(new Callback() { @@ -286,14 +275,7 @@ public class CreateLabelActivity extends BaseActivity { if(response.code() == 200) { Toasty.success(ctx, getString(R.string.labelUpdated)); - tinyDB.putString("labelColor", ""); - tinyDB.putBoolean("labelsRefresh", true); - tinyDB.putString("labelColorDefault", ""); - getIntent().removeExtra("labelAction"); - getIntent().removeExtra("labelId"); - getIntent().removeExtra("labelTitle"); - getIntent().removeExtra("labelColor"); - getIntent().removeExtra("type"); + refreshLabels = true; finish(); } } @@ -308,8 +290,8 @@ public class CreateLabelActivity extends BaseActivity { else { enableProcessButton(); - tinyDB.putString("labelColor", ""); - tinyDB.putString("labelColorDefault", ""); + labelColor = ""; + labelColorDefault = ""; Toasty.error(ctx, getString(R.string.labelGeneralError)); } } @@ -317,8 +299,8 @@ public class CreateLabelActivity extends BaseActivity { @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { - tinyDB.putString("labelColor", ""); - tinyDB.putString("labelColorDefault", ""); + labelColor = ""; + labelColorDefault = ""; Log.e("onFailure", t.toString()); enableProcessButton(); } @@ -328,28 +310,20 @@ public class CreateLabelActivity extends BaseActivity { private void initCloseListener() { - onClickListener = view -> { - - getIntent().removeExtra("labelAction"); - getIntent().removeExtra("labelId"); - getIntent().removeExtra("labelTitle"); - getIntent().removeExtra("labelColor"); - getIntent().removeExtra("type"); - finish(); - }; + onClickListener = view -> finish(); } - private void deleteLabel(final String repoOwner, final String repoName, int labelId) { + private void deleteLabel(int labelId) { Call call; if(getIntent().getStringExtra("type") != null && Objects.requireNonNull(getIntent().getStringExtra("type")).equals("org")) { - call = RetrofitClient.getApiInterface(appCtx).deleteOrganizationLabel(Authorization.get(ctx), getIntent().getStringExtra("orgName"), labelId); + call = RetrofitClient.getApiInterface(ctx).deleteOrganizationLabel(getAccount().getAuthorization(), getIntent().getStringExtra("orgName"), labelId); } else { - call = RetrofitClient.getApiInterface(appCtx).deleteLabel(Authorization.get(ctx), repoOwner, repoName, labelId); + call = RetrofitClient.getApiInterface(ctx).deleteLabel(getAccount().getAuthorization(), repository.getOwner(), repository.getName(), labelId); } call.enqueue(new Callback() { @@ -364,15 +338,12 @@ public class CreateLabelActivity extends BaseActivity { Toasty.success(ctx, getString(R.string.labelDeleteText)); if(getIntent().getStringExtra("type") != null && Objects.requireNonNull(getIntent().getStringExtra("type")).equals("org")) { - OrganizationLabelsViewModel.loadOrgLabelsList(Authorization.get(ctx), getIntent().getStringExtra("orgName"), ctx, null, null); + OrganizationLabelsViewModel.loadOrgLabelsList(getAccount().getAuthorization(), getIntent().getStringExtra("orgName"), ctx, null, null); } else { - LabelsViewModel.loadLabelsList(Authorization.get(ctx), repoOwner, repoName, ctx); + LabelsViewModel.loadLabelsList(getAccount().getAuthorization(), repository.getOwner(), repository.getName(), ctx); } - getIntent().removeExtra("labelAction"); - getIntent().removeExtra("labelId"); - getIntent().removeExtra("type"); } } else if(response.code() == 401) { @@ -406,4 +377,11 @@ public class CreateLabelActivity extends BaseActivity { createLabelButton.setEnabled(true); } + @Override + public void onResume() { + super.onResume(); + if(repository == null) return; + repository.checkAccountSwitch(this); + } + } diff --git a/app/src/main/java/org/mian/gitnex/activities/CreateMilestoneActivity.java b/app/src/main/java/org/mian/gitnex/activities/CreateMilestoneActivity.java index 52e04e17..f0189fa3 100644 --- a/app/src/main/java/org/mian/gitnex/activities/CreateMilestoneActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/CreateMilestoneActivity.java @@ -3,6 +3,7 @@ package org.mian.gitnex.activities; import android.annotation.SuppressLint; import android.app.DatePickerDialog; import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; @@ -18,10 +19,8 @@ import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.ActivityCreateMilestoneBinding; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; -import org.mian.gitnex.helpers.Version; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.Calendar; import retrofit2.Call; import retrofit2.Callback; @@ -37,6 +36,7 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic private EditText milestoneTitle; private EditText milestoneDescription; private Button createNewMilestoneButton; + private RepositoryContext repository; @SuppressLint("ClickableViewAccessibility") @Override @@ -56,6 +56,7 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic createNewMilestoneButton = activityCreateMilestoneBinding.createNewMilestoneButton; milestoneTitle = activityCreateMilestoneBinding.milestoneTitle; milestoneDescription = activityCreateMilestoneBinding.milestoneDescription; + repository = RepositoryContext.fromIntent(getIntent()); milestoneTitle.requestFocus(); assert imm != null; @@ -93,12 +94,6 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); - TinyDB tinyDb = TinyDB.getInstance(appCtx); - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - String newMilestoneTitle = milestoneTitle.getText().toString(); String newMilestoneDescription = milestoneDescription.getText().toString(); String newMilestoneDueDate = milestoneDueDate.getText().toString(); @@ -130,7 +125,7 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic finalMilestoneDueDate = (AppUtil.customDateCombine(AppUtil.customDateFormat(newMilestoneDueDate))); } - else if (new Version(tinyDb.getString("giteaVersion")).less("1.10.0")) { + else if (!getAccount().requiresVersion("1.10.0")) { // if Gitea version is less than 1.10.0 DueDate is required Toasty.warning(ctx, getString(R.string.milestoneDateEmpty)); @@ -138,7 +133,7 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic } disableProcessButton(); - createNewMilestone(Authorization.get(ctx), repoOwner, repoName, newMilestoneTitle, newMilestoneDescription, finalMilestoneDueDate); + createNewMilestone(getAccount().getAuthorization(), repository.getOwner(), repository.getName(), newMilestoneTitle, newMilestoneDescription, finalMilestoneDueDate); } private void createNewMilestone(final String token, String repoOwner, String repoName, String newMilestoneTitle, String newMilestoneDescription, String newMilestoneDueDate) { @@ -148,7 +143,7 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic Call call; call = RetrofitClient - .getApiInterface(appCtx) + .getApiInterface(ctx) .createMilestone(token, repoOwner, repoName, createMilestone); call.enqueue(new Callback() { @@ -160,8 +155,9 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic if(response.code() == 201) { - TinyDB tinyDb = TinyDB.getInstance(appCtx); - tinyDb.putBoolean("milestoneCreated", true); + Intent result = new Intent(); + result.putExtra("milestoneCreated", true); + setResult(201, result); Toasty.success(ctx, getString(R.string.milestoneCreated)); enableProcessButton(); finish(); @@ -224,4 +220,10 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic createNewMilestoneButton.setEnabled(true); } + @Override + public void onResume() { + super.onResume(); + repository.checkAccountSwitch(this); + } + } diff --git a/app/src/main/java/org/mian/gitnex/activities/CreateNewUserActivity.java b/app/src/main/java/org/mian/gitnex/activities/CreateNewUserActivity.java index 087c4e5b..b1f751b5 100644 --- a/app/src/main/java/org/mian/gitnex/activities/CreateNewUserActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/CreateNewUserActivity.java @@ -16,7 +16,6 @@ import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.ActivityCreateNewUserBinding; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Toasty; import retrofit2.Call; import retrofit2.Callback; @@ -110,7 +109,7 @@ public class CreateNewUserActivity extends BaseActivity { } disableProcessButton(); - createNewUser(Authorization.get(ctx), newFullName, newUserName, newUserEmail, newUserPassword); + createNewUser(getAccount().getAuthorization(), newFullName, newUserName, newUserEmail, newUserPassword); } private void createNewUser(final String instanceToken, String newFullName, String newUserName, String newUserEmail, String newUserPassword) { @@ -120,7 +119,7 @@ public class CreateNewUserActivity extends BaseActivity { Call call; call = RetrofitClient - .getApiInterface(appCtx) + .getApiInterface(ctx) .createNewUser(instanceToken, createUser); call.enqueue(new Callback() { diff --git a/app/src/main/java/org/mian/gitnex/activities/CreateOrganizationActivity.java b/app/src/main/java/org/mian/gitnex/activities/CreateOrganizationActivity.java index 037fd025..96c9d7e1 100644 --- a/app/src/main/java/org/mian/gitnex/activities/CreateOrganizationActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/CreateOrganizationActivity.java @@ -15,10 +15,9 @@ import org.gitnex.tea4j.models.UserOrganizations; import org.mian.gitnex.R; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.ActivityCreateOrganizationBinding; +import org.mian.gitnex.fragments.OrganizationsFragment; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; import retrofit2.Call; import retrofit2.Callback; @@ -124,7 +123,7 @@ public class CreateOrganizationActivity extends BaseActivity { else { disableProcessButton(); - createNewOrganization(Authorization.get(ctx), newOrgName, newOrgDesc); + createNewOrganization(getAccount().getAuthorization(), newOrgName, newOrgDesc); } } @@ -134,7 +133,7 @@ public class CreateOrganizationActivity extends BaseActivity { UserOrganizations createOrganization = new UserOrganizations(orgName, null, orgDesc, null, null); Call call = RetrofitClient - .getApiInterface(appCtx) + .getApiInterface(ctx) .createNewOrganization(token, createOrganization); call.enqueue(new Callback() { @@ -143,9 +142,7 @@ public class CreateOrganizationActivity extends BaseActivity { public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { if(response.code() == 201) { - - TinyDB tinyDb = TinyDB.getInstance(appCtx); - tinyDb.putBoolean("orgCreated", true); + OrganizationsFragment.orgCreated = true; enableProcessButton(); Toasty.success(ctx, getString(R.string.orgCreated)); finish(); diff --git a/app/src/main/java/org/mian/gitnex/activities/CreatePullRequestActivity.java b/app/src/main/java/org/mian/gitnex/activities/CreatePullRequestActivity.java index 1b6ef4cf..5968ae9b 100644 --- a/app/src/main/java/org/mian/gitnex/activities/CreatePullRequestActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/CreatePullRequestActivity.java @@ -23,10 +23,10 @@ import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.ActivityCreatePrBinding; import org.mian.gitnex.databinding.CustomLabelsSelectionDialogBinding; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Version; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.ArrayList; import java.util.Calendar; import java.util.List; @@ -41,18 +41,13 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis private View.OnClickListener onClickListener; private ActivityCreatePrBinding viewBinding; - private CustomLabelsSelectionDialogBinding labelsBinding; private int resultLimit = Constants.resultLimitOldGiteaInstances; private Dialog dialogLabels; - private String labelsSetter; private List labelsIds = new ArrayList<>(); - private List assignees = new ArrayList<>(); + private final List assignees = new ArrayList<>(); private int milestoneId; - private String loginUid; - private String instanceToken; - private String repoOwner; - private String repoName; + private RepositoryContext repository; private LabelsListAdapter labelsAdapter; @@ -69,15 +64,10 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis viewBinding = ActivityCreatePrBinding.inflate(getLayoutInflater()); setContentView(viewBinding.getRoot()); - loginUid = tinyDB.getString("loginUid"); - String repoFullName = tinyDB.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - repoOwner = parts[0]; - repoName = parts[1]; - instanceToken = "token " + tinyDB.getString(loginUid + "-token"); + repository = RepositoryContext.fromIntent(getIntent()); // require gitea 1.12 or higher - if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.0")) { + if(getAccount().requiresVersion("1.12.0")) { resultLimit = Constants.resultLimitNewGiteaInstances; } @@ -106,14 +96,14 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis disableProcessButton(); - getMilestones(repoOwner, repoName, resultLimit); - getBranches(repoOwner, repoName); + getMilestones(repository.getOwner(), repository.getName(), resultLimit); + getBranches(repository.getOwner(), repository.getName()); viewBinding.prLabels.setOnClickListener(prLabels -> showLabels()); viewBinding.createPr.setOnClickListener(createPr -> processPullRequest()); - if(!tinyDB.getBoolean("canPush")) { + if(!repository.getPermissions().canPush()) { viewBinding.prDueDateLayout.setVisibility(View.GONE); viewBinding.prLabelsLayout.setVisibility(View.GONE); } @@ -167,11 +157,11 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis private void createPullRequest(String prTitle, String prDescription, String mergeInto, String pullFrom, int milestoneId, String dueDate, List assignees) { - CreatePullRequest createPullRequest = new CreatePullRequest(prTitle, prDescription, loginUid, mergeInto, pullFrom, milestoneId, dueDate, assignees, labelsIds); + CreatePullRequest createPullRequest = new CreatePullRequest(prTitle, prDescription, getAccount().getAccount().getUserName(), mergeInto, pullFrom, milestoneId, dueDate, assignees, labelsIds); Call transferCall = RetrofitClient - .getApiInterface(appCtx) - .createPullRequest(instanceToken, repoOwner, repoName, createPullRequest); + .getApiInterface(ctx) + .createPullRequest(getAccount().getAuthorization(), repository.getOwner(), repository.getName(), createPullRequest); transferCall.enqueue(new Callback() { @@ -214,7 +204,7 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis @Override public void labelsInterface(List data) { - labelsSetter = String.valueOf(data); + String labelsSetter = String.valueOf(data); viewBinding.prLabels.setText(labelsSetter.replace("]", "").replace("[", "")); } @@ -233,7 +223,8 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis dialogLabels.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); } - labelsBinding = CustomLabelsSelectionDialogBinding.inflate(LayoutInflater.from(ctx)); + org.mian.gitnex.databinding.CustomLabelsSelectionDialogBinding labelsBinding = CustomLabelsSelectionDialogBinding + .inflate(LayoutInflater.from(ctx)); View view = labelsBinding.getRoot(); dialogLabels.setContentView(view); @@ -241,14 +232,14 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis labelsBinding.cancel.setOnClickListener(editProperties -> dialogLabels.dismiss()); dialogLabels.show(); - LabelsActions.getRepositoryLabels(ctx, repoOwner, repoName, labelsList, dialogLabels, labelsAdapter, labelsBinding); + LabelsActions.getRepositoryLabels(ctx, repository.getOwner(), repository.getName(), labelsList, dialogLabels, labelsAdapter, labelsBinding); } private void getBranches(String repoOwner, String repoName) { Call> call = RetrofitClient .getApiInterface(ctx) - .getBranches(Authorization.get(ctx), repoOwner, repoName); + .getBranches(getAccount().getAuthorization(), repoOwner, repoName); call.enqueue(new Callback>() { @@ -296,8 +287,8 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis String msState = "open"; Call> call = RetrofitClient - .getApiInterface(appCtx) - .getMilestones(Authorization.get(ctx), repoOwner, repoName, 1, resultLimit, msState); + .getApiInterface(ctx) + .getMilestones(getAccount().getAuthorization(), repoOwner, repoName, 1, resultLimit, msState); call.enqueue(new Callback>() { @@ -375,4 +366,10 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis viewBinding.createPr.setEnabled(true); } + + @Override + public void onResume() { + super.onResume(); + repository.checkAccountSwitch(this); + } } diff --git a/app/src/main/java/org/mian/gitnex/activities/CreateReleaseActivity.java b/app/src/main/java/org/mian/gitnex/activities/CreateReleaseActivity.java index d8a3b82a..ce1fa5f6 100644 --- a/app/src/main/java/org/mian/gitnex/activities/CreateReleaseActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/CreateReleaseActivity.java @@ -2,6 +2,7 @@ package org.mian.gitnex.activities; import android.annotation.SuppressLint; import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; @@ -23,8 +24,8 @@ import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.ActivityCreateReleaseBinding; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Toasty; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.ArrayList; import java.util.List; import retrofit2.Call; @@ -48,8 +49,7 @@ public class CreateReleaseActivity extends BaseActivity { private String selectedBranch; private Button createNewTag; - private String repoOwner; - private String repoName; + private RepositoryContext repository; List branchesList = new ArrayList<>(); @@ -66,10 +66,7 @@ public class CreateReleaseActivity extends BaseActivity { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - String repoFullName = tinyDB.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - repoOwner = parts[0]; - repoName = parts[1]; + repository = RepositoryContext.fromIntent(getIntent()); closeActivity = activityCreateReleaseBinding.close; releaseTagName = activityCreateReleaseBinding.releaseTagName; @@ -97,7 +94,7 @@ public class CreateReleaseActivity extends BaseActivity { closeActivity.setOnClickListener(onClickListener); releaseBranch = activityCreateReleaseBinding.releaseBranch; - getBranches(Authorization.get(ctx), repoOwner, repoName); + getBranches(getAccount().getAuthorization(), repository.getOwner(), repository.getName()); createNewRelease = activityCreateReleaseBinding.createNewRelease; createNewTag = activityCreateReleaseBinding.createNewTag; @@ -143,7 +140,7 @@ public class CreateReleaseActivity extends BaseActivity { Call call = RetrofitClient .getApiInterface(ctx) - .createTag(Authorization.get(ctx), repoOwner, repoName, createReleaseJson); + .createTag(getAccount().getAuthorization(), repository.getOwner(), repository.getName(), createReleaseJson); call.enqueue(new Callback() { @@ -151,7 +148,6 @@ public class CreateReleaseActivity extends BaseActivity { public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { if (response.code() == 201) { - tinyDB.putBoolean("updateReleases", true); Toasty.success(ctx, getString(R.string.tagCreated)); finish(); } @@ -225,7 +221,7 @@ public class CreateReleaseActivity extends BaseActivity { } disableProcessButton(); - createNewReleaseFunc(Authorization.get(ctx), repoOwner, repoName, newReleaseTagName, newReleaseTitle, newReleaseContent, selectedBranch, newReleaseType, newReleaseDraft); + createNewReleaseFunc(getAccount().getAuthorization(), repository.getOwner(), repository.getName(), newReleaseTagName, newReleaseTitle, newReleaseContent, selectedBranch, newReleaseType, newReleaseDraft); } private void createNewReleaseFunc(final String token, String repoOwner, String repoName, String newReleaseTagName, String newReleaseTitle, String newReleaseContent, String selectedBranch, boolean newReleaseType, boolean newReleaseDraft) { @@ -245,9 +241,10 @@ public class CreateReleaseActivity extends BaseActivity { if (response.code() == 201) { - tinyDB.putBoolean("updateReleases", true); + Intent result = new Intent(); + result.putExtra("updateReleases", true); + setResult(201, result); Toasty.success(ctx, getString(R.string.releaseCreatedText)); - enableProcessButton(); finish(); } else if(response.code() == 401) { @@ -354,4 +351,10 @@ public class CreateReleaseActivity extends BaseActivity { createNewRelease.setEnabled(true); } + @Override + public void onResume() { + super.onResume(); + repository.checkAccountSwitch(this); + } + } diff --git a/app/src/main/java/org/mian/gitnex/activities/CreateRepoActivity.java b/app/src/main/java/org/mian/gitnex/activities/CreateRepoActivity.java index cf819ec8..48f7c2fb 100644 --- a/app/src/main/java/org/mian/gitnex/activities/CreateRepoActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/CreateRepoActivity.java @@ -21,8 +21,6 @@ import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.ActivityCreateRepoBinding; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; import java.util.ArrayList; import java.util.Arrays; @@ -46,7 +44,6 @@ public class CreateRepoActivity extends BaseActivity { private CheckBox repoAccess; private String loginUid; - private String userLogin; private String selectedOwner; @@ -66,8 +63,7 @@ public class CreateRepoActivity extends BaseActivity { boolean connToInternet = AppUtil.hasNetworkConnection(ctx); - loginUid = tinyDB.getString("loginUid"); - userLogin = tinyDB.getString("userLogin"); + loginUid = getAccount().getAccount().getUserName(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); @@ -84,7 +80,7 @@ public class CreateRepoActivity extends BaseActivity { closeActivity.setOnClickListener(onClickListener); spinner = activityCreateRepoBinding.ownerSpinner; - getOrganizations(Authorization.get(ctx), userLogin); + getOrganizations(getAccount().getAuthorization(), loginUid); createRepo = activityCreateRepoBinding.createNewRepoButton; disableProcessButton(); @@ -147,7 +143,7 @@ public class CreateRepoActivity extends BaseActivity { else { disableProcessButton(); - createNewRepository(Authorization.get(ctx), loginUid, newRepoName, newRepoDesc, selectedOwner, newRepoAccess); + createNewRepository(getAccount().getAuthorization(), loginUid, newRepoName, newRepoDesc, selectedOwner, newRepoAccess); } } @@ -176,8 +172,7 @@ public class CreateRepoActivity extends BaseActivity { if(response.code() == 201) { - TinyDB tinyDb = TinyDB.getInstance(appCtx); - tinyDb.putBoolean("repoCreated", true); + MainActivity.repoCreated = true; Toasty.success(ctx, getString(R.string.repoCreated)); enableProcessButton(); finish(); @@ -235,9 +230,8 @@ public class CreateRepoActivity extends BaseActivity { for(int i = 0; i < organizationsList_.size(); i++) { - if(!tinyDB.getString("organizationId").isEmpty()) { - - if(Integer.parseInt(tinyDB.getString("organizationId")) == organizationsList_.get(i).getId()) { + if(!getIntent().getStringExtra("orgName").equals("")) { + if(getIntent().getStringExtra("orgName").equals(organizationsList_.get(i).getUsername())) { organizationId = i + 1; } } @@ -253,7 +247,7 @@ public class CreateRepoActivity extends BaseActivity { spinner.setOnItemClickListener ((parent, view, position, id) -> selectedOwner = organizationsList.get(position).getUsername()); - if(tinyDB.getBoolean("organizationAction") & organizationId != 0) { + if(getIntent().getBooleanExtra("organizationAction", false) && organizationId != 0) { int selectOwnerById = organizationId; new Handler(Looper.getMainLooper()).postDelayed(() -> { @@ -261,8 +255,7 @@ public class CreateRepoActivity extends BaseActivity { spinner.setText(organizationsList.get(selectOwnerById).getUsername(), false); selectedOwner = organizationsList.get(selectOwnerById).getUsername(); }, 500); - - tinyDB.putBoolean("organizationAction", false); + getIntent().removeExtra("organizationAction"); } enableProcessButton(); diff --git a/app/src/main/java/org/mian/gitnex/activities/CreateTeamByOrgActivity.java b/app/src/main/java/org/mian/gitnex/activities/CreateTeamByOrgActivity.java index e013f226..db9c806e 100644 --- a/app/src/main/java/org/mian/gitnex/activities/CreateTeamByOrgActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/CreateTeamByOrgActivity.java @@ -16,10 +16,9 @@ import org.gitnex.tea4j.models.Teams; import org.mian.gitnex.R; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.ActivityCreateTeamByOrgBinding; +import org.mian.gitnex.fragments.TeamsByOrgFragment; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; import java.util.ArrayList; import java.util.Arrays; @@ -224,10 +223,8 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic private void processCreateTeam() { - final TinyDB tinyDb = TinyDB.getInstance(appCtx); - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); - final String orgName = tinyDb.getString("orgName");; + final String instanceToken = getAccount().getAuthorization(); + final String orgName = getIntent().getStringExtra("orgName"); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); String newTeamName = teamName.getText().toString(); @@ -281,7 +278,7 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic newTeamAccessControls_.set(i, newTeamAccessControls_.get(i).trim()); } - createNewTeamCall(instanceToken, orgName, newTeamName, newTeamDesc, newTeamPermission, newTeamAccessControls_, loginUid); + createNewTeamCall(instanceToken, orgName, newTeamName, newTeamDesc, newTeamPermission, newTeamAccessControls_, getAccount().getAccount().getUserName()); } private void createNewTeamCall(final String instanceToken, String orgName, String newTeamName, String newTeamDesc, String newTeamPermission, List newTeamAccessControls, String loginUid) { @@ -292,7 +289,7 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic call3 = RetrofitClient .getApiInterface(ctx) - .createTeamsByOrg(Authorization.get(ctx), orgName, createNewTeamJson); + .createTeamsByOrg(getAccount().getAuthorization(), orgName, createNewTeamJson); call3.enqueue(new Callback() { @@ -303,8 +300,7 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic if(response2.code() == 201) { - TinyDB tinyDb = TinyDB.getInstance(appCtx); - tinyDb.putBoolean("resumeTeams", true); + TeamsByOrgFragment.resumeTeams = true; Toasty.success(ctx, getString(R.string.teamCreated)); finish(); diff --git a/app/src/main/java/org/mian/gitnex/activities/DeepLinksActivity.java b/app/src/main/java/org/mian/gitnex/activities/DeepLinksActivity.java index 161ab723..31e34917 100644 --- a/app/src/main/java/org/mian/gitnex/activities/DeepLinksActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/DeepLinksActivity.java @@ -19,12 +19,12 @@ import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.database.api.BaseApi; import org.mian.gitnex.database.api.RepositoriesApi; import org.mian.gitnex.database.api.UserAccountsApi; -import org.mian.gitnex.database.models.Repository; import org.mian.gitnex.database.models.UserAccount; import org.mian.gitnex.databinding.ActivityDeeplinksBinding; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.UrlHelper; +import org.mian.gitnex.helpers.contexts.IssueContext; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.net.URI; import java.util.ArrayList; import java.util.List; @@ -70,16 +70,17 @@ public class DeepLinksActivity extends BaseActivity { assert data != null; // check for login - if(!tinyDB.getBoolean("loggedInMode")) { + if(tinyDB.getInt("currentActiveAccountId", -1) <= -1) { Intent loginIntent = new Intent(ctx, LoginActivity.class); loginIntent.putExtra("instanceUrl", data.getHost()); ctx.startActivity(loginIntent); finish(); + return; } // check for the links(URI) to be in the db UserAccountsApi userAccountsApi = BaseApi.getInstance(ctx, UserAccountsApi.class); - List userAccounts = userAccountsApi.usersAccounts(); + List userAccounts = userAccountsApi.loggedInUserAccounts(); for(UserAccount userAccount : userAccounts) { @@ -94,7 +95,7 @@ public class DeepLinksActivity extends BaseActivity { accountFound = true; - AppUtil.switchToAccount(ctx, userAccount); + AppUtil.switchToAccount(ctx, userAccount, true); break; } @@ -114,7 +115,7 @@ public class DeepLinksActivity extends BaseActivity { ctx.startActivity(mainIntent); finish(); } - else if(data.getLastPathSegment().equals(tinyDB.getString("userLogin"))) { // your user profile + else if(data.getLastPathSegment().equals(getAccount().getAccount().getUserName())) { // your user profile mainIntent.putExtra("launchFragmentByLinkHandler", "profile"); ctx.startActivity(mainIntent); finish(); @@ -177,29 +178,29 @@ public class DeepLinksActivity extends BaseActivity { issueIntent.putExtra("issueComment", urlSplitted[1]); } - tinyDB.putString("issueNumber", data.getLastPathSegment()); - tinyDB.putString("issueType", "Issue"); - - tinyDB.putString("repoFullName", data.getPathSegments().get(0) + "/" + data.getPathSegments().get(1)); + IssueContext issue = new IssueContext( + new RepositoryContext(data.getPathSegments().get(0), data.getPathSegments().get(1), ctx), + Integer.parseInt(data.getLastPathSegment()), + "Issue" + ); final String repoOwner = data.getPathSegments().get(0); final String repoName = data.getPathSegments().get(1); int currentActiveAccountId = tinyDB.getInt("currentActiveAccountId"); RepositoriesApi repositoryData = BaseApi.getInstance(ctx, RepositoriesApi.class); + assert repositoryData != null; Integer count = repositoryData.checkRepository(currentActiveAccountId, repoOwner, repoName); + int repoId; if(count == 0) { - - long id = repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName); - tinyDB.putLong("repositoryId", id); + repoId = (int) repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName); } else { - - Repository dataRepo = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName); - tinyDB.putLong("repositoryId", dataRepo.getRepositoryId()); + repoId = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName).getRepositoryId(); } + issue.getRepository().setRepositoryId(repoId); ctx.startActivity(issueIntent); finish(); @@ -383,57 +384,33 @@ public class DeepLinksActivity extends BaseActivity { assert prInfo != null; - issueIntent.putExtra("issueNumber", index); - issueIntent.putExtra("prMergeable", prInfo.isMergeable()); issueIntent.putExtra("openedFromLink", "true"); - if(prInfo.getHead() != null) { - - issueIntent.putExtra("prHeadBranch", prInfo.getHead().getRef()); - tinyDB.putString("prHeadBranch", prInfo.getHead().getRef()); - - if(prInfo.getHead().getRepo() != null) { - - tinyDB.putString("prIsFork", String.valueOf(prInfo.getHead().getRepo().isFork())); - tinyDB.putString("prForkFullName", prInfo.getHead().getRepo().getFull_name()); - } - else { - - // pull was done from a deleted fork - tinyDB.putString("prIsFork", "true"); - tinyDB.putString("prForkFullName", ctx.getString(R.string.prDeletedFork)); - } - } - - tinyDB.putString("issueNumber", String.valueOf(index)); - tinyDB.putString("prMergeable", String.valueOf(prInfo.isMergeable())); - tinyDB.putString("issueType", "Pull"); - - tinyDB.putString("repoFullName", repoOwner + "/" + repoName); + IssueContext issue = new IssueContext(prInfo, new RepositoryContext(repoOwner, repoName, ctx)); int currentActiveAccountId = tinyDB.getInt("currentActiveAccountId"); RepositoriesApi repositoryData = BaseApi.getInstance(ctx, RepositoriesApi.class); + assert repositoryData != null; Integer count = repositoryData.checkRepository(currentActiveAccountId, repoOwner, repoName); + int id; if(count == 0) { - - long id = repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName); - tinyDB.putLong("repositoryId", id); + id = (int) repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName); } else { - - Repository dataRepo = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName); - tinyDB.putLong("repositoryId", dataRepo.getRepositoryId()); + id = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName).getRepositoryId(); } + issue.getRepository().setRepositoryId(id); + issueIntent.putExtra(IssueContext.INTENT_EXTRA, issue); ctx.startActivity(issueIntent); finish(); } else { - ctx.startActivity(issueIntent); + ctx.startActivity(mainIntent); finish(); Log.e("onFailure-links-pr", String.valueOf(response.code())); } @@ -459,52 +436,35 @@ public class DeepLinksActivity extends BaseActivity { @Override public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { - UserRepositories repoInfo = response.body(); if (response.code() == 200) { - assert repoInfo != null; - repoIntent.putExtra("repoFullName", repoInfo.getFullName()); + RepositoryContext repo = new RepositoryContext(repoInfo, ctx); + repoIntent.putExtra("goToSection", "yes"); repoIntent.putExtra("goToSectionType", type); - tinyDB.putString("repoFullName", repoInfo.getFullName()); - if(repoInfo.getPrivateFlag()) { - - tinyDB.putString("repoType", getResources().getString(R.string.strPrivate)); - } - else { - - tinyDB.putString("repoType", getResources().getString(R.string.strPublic)); - } - tinyDB.putBoolean("isRepoAdmin", repoInfo.getPermissions().isAdmin()); - tinyDB.putBoolean("canPush", repoInfo.getPermissions().canPush()); - tinyDB.putString("repoBranch", repoInfo.getDefault_branch()); - int currentActiveAccountId = tinyDB.getInt("currentActiveAccountId"); RepositoriesApi repositoryData = BaseApi.getInstance(ctx, RepositoriesApi.class); Integer count = repositoryData.checkRepository(currentActiveAccountId, repoOwner, repoName); + int id; if(count == 0) { - - long id = repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName); - tinyDB.putLong("repositoryId", id); + id = (int) repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName); } else { - - Repository data = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName); - tinyDB.putLong("repositoryId", data.getRepositoryId()); + id = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName).getRepositoryId(); } + repo.setRepositoryId(id); + repoIntent.putExtra(RepositoryContext.INTENT_EXTRA, repo); + ctx.startActivity(repoIntent); finish(); - } - - else { - + } else { ctx.startActivity(mainIntent); finish(); Log.e("onFailure-goToRepo", String.valueOf(response.code())); @@ -536,12 +496,8 @@ public class DeepLinksActivity extends BaseActivity { else if(response.code() == 200) { // org assert response.body() != null; orgIntent.putExtra("orgName", response.body().getUsername()); - - - TinyDB tinyDb = TinyDB.getInstance(ctx); - tinyDb.putString("orgName", response.body().getUsername()); - tinyDb.putString("organizationId", String.valueOf(response.body().getId())); - tinyDb.putBoolean("organizationAction", true); + orgIntent.putExtra("organizationId", response.body().getId()); + orgIntent.putExtra("organizationAction", true); ctx.startActivity(orgIntent); finish(); } @@ -629,73 +585,69 @@ public class DeepLinksActivity extends BaseActivity { private void showNoActionButtons() { viewBinding.progressBar.setVisibility(View.GONE); - if(tinyDB.getInt("defaultScreenId") == 1) { // repos - - mainIntent.putExtra("launchFragmentByLinkHandler", "repos"); - ctx.startActivity(mainIntent); - finish(); - } - else if(tinyDB.getInt("defaultScreenId") == 2) { // org - - mainIntent.putExtra("launchFragmentByLinkHandler", "org"); - ctx.startActivity(mainIntent); - finish(); - } - else if(tinyDB.getInt("defaultScreenId") == 3) { // notifications - - mainIntent.putExtra("launchFragmentByLinkHandler", "notification"); - ctx.startActivity(mainIntent); - finish(); - } - else if(tinyDB.getInt("defaultScreenId") == 4) { // explore - - mainIntent.putExtra("launchFragmentByLinkHandler", "explore"); - ctx.startActivity(mainIntent); - finish(); - } - else if(tinyDB.getInt("defaultScreenId") == 0) { // show options - - viewBinding.noActionFrame.setVisibility(View.VISIBLE); - viewBinding.addNewAccountFrame.setVisibility(View.GONE); - - viewBinding.repository.setOnClickListener(repository -> { - - tinyDB.putInt("defaultScreenId", 1); + switch(tinyDB.getInt("defaultScreenId")) { + case 1: // repos mainIntent.putExtra("launchFragmentByLinkHandler", "repos"); ctx.startActivity(mainIntent); finish(); - }); - - viewBinding.organization.setOnClickListener(organization -> { - - tinyDB.putInt("defaultScreenId", 2); + break; + case 2: // org mainIntent.putExtra("launchFragmentByLinkHandler", "org"); ctx.startActivity(mainIntent); finish(); - }); - - viewBinding.notification.setOnClickListener(notification -> { - - tinyDB.putInt("defaultScreenId", 3); + break; + case 3: // notifications mainIntent.putExtra("launchFragmentByLinkHandler", "notification"); ctx.startActivity(mainIntent); finish(); - }); - - viewBinding.explore.setOnClickListener(explore -> { - - tinyDB.putInt("defaultScreenId", 4); + break; + case 4: // explore mainIntent.putExtra("launchFragmentByLinkHandler", "explore"); ctx.startActivity(mainIntent); finish(); - }); + break; + default: // show options + viewBinding.noActionFrame.setVisibility(View.VISIBLE); + viewBinding.addNewAccountFrame.setVisibility(View.GONE); - viewBinding.launchApp2.setOnClickListener(launchApp2 -> { + viewBinding.repository.setOnClickListener(repository -> { - tinyDB.putInt("defaultScreenId", 0); - ctx.startActivity(mainIntent); - finish(); - }); + tinyDB.putInt("defaultScreenId", 1); + mainIntent.putExtra("launchFragmentByLinkHandler", "repos"); + ctx.startActivity(mainIntent); + finish(); + }); + + viewBinding.organization.setOnClickListener(organization -> { + + tinyDB.putInt("defaultScreenId", 2); + mainIntent.putExtra("launchFragmentByLinkHandler", "org"); + ctx.startActivity(mainIntent); + finish(); + }); + + viewBinding.notification.setOnClickListener(notification -> { + + tinyDB.putInt("defaultScreenId", 3); + mainIntent.putExtra("launchFragmentByLinkHandler", "notification"); + ctx.startActivity(mainIntent); + finish(); + }); + + viewBinding.explore.setOnClickListener(explore -> { + + tinyDB.putInt("defaultScreenId", 4); + mainIntent.putExtra("launchFragmentByLinkHandler", "explore"); + ctx.startActivity(mainIntent); + finish(); + }); + + viewBinding.launchApp2.setOnClickListener(launchApp2 -> { + + tinyDB.putInt("defaultScreenId", 0); + ctx.startActivity(mainIntent); + finish(); + }); } } } diff --git a/app/src/main/java/org/mian/gitnex/activities/EditIssueActivity.java b/app/src/main/java/org/mian/gitnex/activities/EditIssueActivity.java index 148d3a06..8415a34e 100644 --- a/app/src/main/java/org/mian/gitnex/activities/EditIssueActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/EditIssueActivity.java @@ -3,6 +3,7 @@ package org.mian.gitnex.activities; import android.annotation.SuppressLint; import android.app.DatePickerDialog; import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -24,12 +25,13 @@ import org.gitnex.tea4j.models.Milestones; import org.mian.gitnex.R; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.ActivityEditIssueBinding; +import org.mian.gitnex.fragments.IssuesFragment; +import org.mian.gitnex.fragments.PullRequestsFragment; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.Toasty; -import org.mian.gitnex.helpers.Version; +import org.mian.gitnex.helpers.contexts.IssueContext; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -58,11 +60,7 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe List milestonesList = new ArrayList<>(); - private String loginUid; - private String instanceToken; - private String repoOwner; - private String repoName; - private int issueIndex; + private IssueContext issue; @SuppressLint("ClickableViewAccessibility") @Override @@ -75,13 +73,7 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - loginUid = tinyDB.getString("loginUid"); - instanceToken = "token " + tinyDB.getString(loginUid + "-token"); - String repoFullName = tinyDB.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - repoOwner = parts[0]; - repoName = parts[1]; - issueIndex = Integer.parseInt(tinyDB.getString("issueNumber")); + issue = IssueContext.fromIntent(getIntent()); ImageView closeActivity = activityEditIssueBinding.close; editIssueButton = activityEditIssueBinding.editIssueButton; @@ -91,7 +83,7 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe editIssueDueDate = activityEditIssueBinding.editIssueDueDate; // if gitea is 1.12 or higher use the new limit - if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.0")) { + if(getAccount().requiresVersion("1.12.0")) { resultLimit = Constants.resultLimitNewGiteaInstances; } @@ -119,22 +111,19 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe editIssueDueDate.setOnClickListener(this); editIssueButton.setOnClickListener(this); - if(!tinyDB.getString("issueNumber").isEmpty()) { + if(issue.getIssueType().equalsIgnoreCase("Pull")) { - if(tinyDB.getString("issueType").equalsIgnoreCase("Pull")) { + toolbar_title.setText(getString(R.string.editPrNavHeader, String.valueOf(issue.getIssueIndex()))); + } + else { - toolbar_title.setText(getString(R.string.editPrNavHeader, String.valueOf(issueIndex))); - } - else { - - toolbar_title.setText(getString(R.string.editIssueNavHeader, String.valueOf(issueIndex))); - } + toolbar_title.setText(getString(R.string.editIssueNavHeader, String.valueOf(issue.getIssueIndex()))); } disableProcessButton(); - getIssue(instanceToken, loginUid, repoOwner, repoName, issueIndex, resultLimit); + getIssue(issue.getRepository().getOwner(), issue.getRepository().getName(), issue.getIssueIndex(), resultLimit); - if(!tinyDB.getBoolean("canPush")) { + if(!issue.getRepository().getPermissions().canPush()) { findViewById(R.id.editIssueMilestoneSpinnerLayout).setVisibility(View.GONE); findViewById(R.id.editIssueDueDateLayout).setVisibility(View.GONE); } @@ -175,16 +164,16 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe } disableProcessButton(); - editIssue(instanceToken, repoOwner, repoName, issueIndex, loginUid, editIssueTitleForm, editIssueDescriptionForm, editIssueDueDateForm, milestoneId); + editIssue(issue.getRepository().getOwner(), issue.getRepository().getName(), issue.getIssueIndex(), editIssueTitleForm, editIssueDescriptionForm, editIssueDueDateForm, milestoneId); } - private void editIssue(String instanceToken, String repoOwner, String repoName, int issueIndex, String loginUid, String title, String description, String dueDate, int milestoneId) { + private void editIssue(String repoOwner, String repoName, int issueIndex, String title, String description, String dueDate, int milestoneId) { CreateIssue issueData = new CreateIssue(title, description, dueDate, milestoneId); Call call = RetrofitClient .getApiInterface(ctx) - .patchIssue(Authorization.get(ctx), repoOwner, repoName, issueIndex, issueData); + .patchIssue(getAccount().getAuthorization(), repoOwner, repoName, issueIndex, issueData); call.enqueue(new Callback() { @@ -193,7 +182,7 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe if(response.code() == 201) { - if(tinyDB.getString("issueType").equalsIgnoreCase("Pull")) { + if(issue.getIssueType().equalsIgnoreCase("Pull")) { Toasty.success(ctx, getString(R.string.editPrSuccessMessage)); } @@ -202,8 +191,11 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe Toasty.success(ctx, getString(R.string.editIssueSuccessMessage)); } - tinyDB.putBoolean("issueEdited", true); - tinyDB.putBoolean("resumeIssues", true); + Intent result = new Intent(); + result.putExtra("issueEdited", true); + IssuesFragment.resumeIssues = issue.getIssue().getPull_request() == null; + PullRequestsFragment.resumePullRequests = issue.getIssue().getPull_request() != null; + setResult(200, result); finish(); } else if(response.code() == 401) { @@ -252,11 +244,11 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe } - private void getIssue(final String instanceToken, final String loginUid, final String repoOwner, final String repoName, int issueIndex, int resultLimit) { + private void getIssue(final String repoOwner, final String repoName, int issueIndex, int resultLimit) { Call call = RetrofitClient .getApiInterface(ctx) - .getIssueByIndex(Authorization.get(ctx), repoOwner, repoName, issueIndex); + .getIssueByIndex(getAccount().getAuthorization(), repoOwner, repoName, issueIndex); call.enqueue(new Callback() { @@ -280,7 +272,7 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe Call> call_ = RetrofitClient .getApiInterface(ctx) - .getMilestones(Authorization.get(ctx), repoOwner, repoName, 1, resultLimit, msState); + .getMilestones(getAccount().getAuthorization(), repoOwner, repoName, 1, resultLimit, msState); int checkMilestoneId = currentMilestoneId; @@ -379,4 +371,10 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe editIssueButton.setEnabled(true); } + @Override + public void onResume() { + super.onResume(); + issue.getRepository().checkAccountSwitch(this); + } + } diff --git a/app/src/main/java/org/mian/gitnex/activities/FileViewActivity.java b/app/src/main/java/org/mian/gitnex/activities/FileViewActivity.java index bd77091b..1dc571ba 100644 --- a/app/src/main/java/org/mian/gitnex/activities/FileViewActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/FileViewActivity.java @@ -24,11 +24,11 @@ import org.mian.gitnex.databinding.ActivityFileViewBinding; import org.mian.gitnex.fragments.BottomSheetFileViewerFragment; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.Images; import org.mian.gitnex.helpers.Markdown; import org.mian.gitnex.helpers.Toasty; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import org.mian.gitnex.notifications.Notifications; import org.mian.gitnex.structs.BottomSheetListener; import java.io.IOException; @@ -46,6 +46,18 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene private ActivityFileViewBinding binding; private Files file; + private RepositoryContext repository; + private boolean renderMd = false; + + public ActivityResultLauncher editFileLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), + result -> { + if(result.getResultCode() == 200) { + assert result.getData() != null; + if(result.getData().getBooleanExtra("fileModified", false)) { + getSingleFileContents(repository.getOwner(), repository.getName(), file.getPath(), repository.getBranchRef()); + } + } + }); @Override public void onCreate(Bundle savedInstanceState) { @@ -53,12 +65,11 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene super.onCreate(savedInstanceState); binding = ActivityFileViewBinding.inflate(getLayoutInflater()); + repository = RepositoryContext.fromIntent(getIntent()); setContentView(binding.getRoot()); setSupportActionBar(binding.toolbar); - tinyDB.putBoolean("enableMarkdownInFileView", false); - file = (Files) getIntent().getSerializableExtra("file"); binding.close.setOnClickListener(view -> finish()); @@ -66,31 +77,7 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene binding.toolbarTitle.setMovementMethod(new ScrollingMovementMethod()); binding.toolbarTitle.setText(file.getPath()); - String repoFullName = tinyDB.getString("repoFullName"); - String repoBranch = tinyDB.getString("repoBranch"); - String[] parts = repoFullName.split("/"); - String repoOwner = parts[0]; - String repoName = parts[1]; - - getSingleFileContents(repoOwner, repoName, file.getPath(), repoBranch); - - } - - @Override - public void onResume() { - - super.onResume(); - - if(tinyDB.getBoolean("fileModified")) { - String repoFullName = tinyDB.getString("repoFullName"); - String repoBranch = tinyDB.getString("repoBranch"); - String[] parts = repoFullName.split("/"); - String repoOwner = parts[0]; - String repoName = parts[1]; - - getSingleFileContents(repoOwner, repoName, file.getPath(), repoBranch); - tinyDB.putBoolean("fileModified", false); - } + getSingleFileContents(repository.getOwner(), repository.getName(), file.getPath(), repository.getBranchRef()); } private void getSingleFileContents(final String owner, String repo, final String filename, String ref) { @@ -99,7 +86,7 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene Call call = RetrofitClient .getWebInterface(ctx) - .getFileContents(Authorization.getWeb(ctx), owner, repo, ref, filename); + .getFileContents(getAccount().getWebAuthorization(), owner, repo, ref, filename); try { @@ -152,8 +139,8 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene binding.contents.setContent(text, fileExtension); - if(tinyDB.getBoolean("enableMarkdownInFileView")) { - Markdown.render(ctx, EmojiParser.parseToUnicode(text), binding.markdown); + if(renderMd) { + Markdown.render(ctx, EmojiParser.parseToUnicode(text), binding.markdown, repository); binding.contents.setVisibility(View.GONE); binding.markdownFrame.setVisibility(View.VISIBLE); @@ -252,25 +239,26 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene } else if(id == R.id.genericMenu) { BottomSheetFileViewerFragment bottomSheet = new BottomSheetFileViewerFragment(); + bottomSheet.setArguments(repository.getBundle()); bottomSheet.show(getSupportFragmentManager(), "fileViewerBottomSheet"); return true; } else if(id == R.id.markdown) { - if(!tinyDB.getBoolean("enableMarkdownInFileView")) { + if(!renderMd) { if(binding.markdown.getAdapter() == null) { - Markdown.render(ctx, EmojiParser.parseToUnicode(binding.contents.getContent()), binding.markdown); + Markdown.render(ctx, EmojiParser.parseToUnicode(binding.contents.getContent()), binding.markdown, repository); } binding.contents.setVisibility(View.GONE); binding.markdownFrame.setVisibility(View.VISIBLE); - tinyDB.putBoolean("enableMarkdownInFileView", true); + renderMd = true; } else { binding.markdownFrame.setVisibility(View.GONE); binding.contents.setVisibility(View.VISIBLE); - tinyDB.putBoolean("enableMarkdownInFileView", false); + renderMd = false; } return true; @@ -288,12 +276,12 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene } if("deleteFile".equals(text)) { - Intent intent = new Intent(ctx, CreateFileActivity.class); + Intent intent = repository.getIntent(ctx, CreateFileActivity.class); intent.putExtra("fileAction", CreateFileActivity.FILE_ACTION_DELETE); intent.putExtra("filePath", file.getPath()); intent.putExtra("fileSha", file.getSha()); - ctx.startActivity(intent); + editFileLauncher.launch(intent); } if("editFile".equals(text)) { @@ -301,7 +289,7 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene if(binding.contents.getContent() != null && !binding.contents.getContent().isEmpty()) { - Intent intent = new Intent(ctx, CreateFileActivity.class); + Intent intent = repository.getIntent(ctx, CreateFileActivity.class); intent.putExtra("fileAction", CreateFileActivity.FILE_ACTION_EDIT); intent.putExtra("filePath", file.getPath()); @@ -352,19 +340,13 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);; notificationManager.notify(notificationId, builder.build()); - String repoFullName = tinyDB.getString("repoFullName"); - String repoBranch = tinyDB.getString("repoBranch"); - String[] parts = repoFullName.split("/"); - String repoOwner = parts[0]; - String repoName = parts[1]; - Thread thread = new Thread(() -> { try { Call call = RetrofitClient .getWebInterface(ctx) - .getFileContents(Authorization.getWeb(ctx), repoOwner, repoName, repoBranch, file.getPath()); + .getFileContents(getAccount().getWebAuthorization(), repository.getOwner(), repository.getName(), repository.getBranchRef(), file.getPath()); Response response = call.execute(); @@ -400,4 +382,10 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene }); + @Override + public void onResume() { + super.onResume(); + repository.checkAccountSwitch(this); + } + } 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 866a2444..893145e8 100644 --- a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java @@ -20,6 +20,8 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.ScrollView; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.core.content.res.ResourcesCompat; import androidx.core.text.HtmlCompat; @@ -52,7 +54,6 @@ import org.mian.gitnex.fragments.BottomSheetReplyFragment; import org.mian.gitnex.fragments.BottomSheetSingleIssueFragment; 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.ColorInverter; import org.mian.gitnex.helpers.LabelWidthCalculator; @@ -61,7 +62,7 @@ import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; -import org.mian.gitnex.helpers.Version; +import org.mian.gitnex.helpers.contexts.IssueContext; import org.mian.gitnex.structs.BottomSheetListener; import org.mian.gitnex.viewmodels.IssueCommentsViewModel; import org.mian.gitnex.views.ReactionList; @@ -89,6 +90,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt private String repoName; private int issueIndex; private String issueCreator; + private IssueContext issue; private LabelsListAdapter labelsAdapter; private AssigneesListAdapter assigneesAdapter; @@ -107,6 +109,27 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt private CustomAssigneesSelectionDialogBinding assigneesBinding; private ActivityIssueDetailBinding viewBinding; + public boolean singleIssueUpdate = false; + public boolean commentEdited = false; + public boolean commentPosted = false; + + public ActivityResultLauncher editIssueLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), + result -> { + if(result.getResultCode() == 200) { + assert result.getData() != null; + if(result.getData().getBooleanExtra("issueEdited", false)) { + new Handler(Looper.getMainLooper()).postDelayed(() -> { + + viewBinding.frameAssignees.removeAllViews(); + viewBinding.frameLabels.removeAllViews(); + issue.setIssue(null); + getSingleIssue(repoOwner, repoName, issueIndex); + + }, 500); + } + } + }); + @Override public void onCreate(Bundle savedInstanceState) { @@ -115,11 +138,10 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt viewBinding = ActivityIssueDetailBinding.inflate(getLayoutInflater()); setContentView(viewBinding.getRoot()); - String repoFullName = tinyDB.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - repoOwner = parts[0]; - repoName = parts[1]; - issueIndex = Integer.parseInt(tinyDB.getString("issueNumber")); + issue = IssueContext.fromIntent(getIntent()); + repoOwner = issue.getRepository().getOwner(); + repoName = issue.getRepository().getName(); + issueIndex = issue.getIssueIndex(); setSupportActionBar(viewBinding.toolbar); Objects.requireNonNull(getSupportActionBar()).setTitle(repoName); @@ -134,7 +156,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt viewBinding.addNewComment.setOnClickListener(v -> { - BottomSheetReplyFragment bottomSheetReplyFragment = BottomSheetReplyFragment.newInstance(new Bundle()); + BottomSheetReplyFragment bottomSheetReplyFragment = BottomSheetReplyFragment.newInstance(new Bundle(), issue); bottomSheetReplyFragment.setOnInteractedListener(this::onResume); bottomSheetReplyFragment.show(getSupportFragmentManager(), "replyBottomSheet"); @@ -172,7 +194,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt viewBinding.pullToRefresh.setRefreshing(false); IssueCommentsViewModel - .loadIssueComments(Authorization.get(ctx), repoOwner, repoName, issueIndex, + .loadIssueComments(getAccount().getAuthorization(), repoOwner, repoName, issueIndex, ctx); }, 500)); @@ -202,7 +224,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt fetchDataAsync(repoOwner, repoName, issueIndex); if(getIntent().getStringExtra("openPrDiff") != null && getIntent().getStringExtra("openPrDiff").equals("true")) { - startActivity(new Intent(ctx, DiffActivity.class)); + startActivity(issue.getIntent(ctx, DiffActivity.class)); } } @@ -322,7 +344,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt call3 = RetrofitClient .getApiInterface(ctx) - .patchIssueAssignees(Authorization.get(ctx), repoOwner, repoName, issueIndex, updateAssigneeJson); + .patchIssueAssignees(getAccount().getAuthorization(), repoOwner, repoName, issueIndex, updateAssigneeJson); call3.enqueue(new Callback() { @@ -337,6 +359,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt viewBinding.frameAssignees.removeAllViews(); viewBinding.frameLabels.removeAllViews(); + issue.setIssue(null); getSingleIssue(repoOwner, repoName, issueIndex); currentAssignees.clear(); new Handler(Looper.getMainLooper()).postDelayed(() -> AssigneesActions.getCurrentIssueAssignees(ctx, repoOwner, repoName, issueIndex, currentAssignees), 1000); @@ -377,7 +400,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt Call call = RetrofitClient .getApiInterface(ctx) - .updateIssueLabels(Authorization.get(ctx), repoOwner, repoName, issueIndex, patchIssueLabels); + .updateIssueLabels(getAccount().getAuthorization(), repoOwner, repoName, issueIndex, patchIssueLabels); call.enqueue(new Callback() { @@ -391,6 +414,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt viewBinding.frameAssignees.removeAllViews(); viewBinding.frameLabels.removeAllViews(); + issue.setIssue(null); getSingleIssue(repoOwner, repoName, issueIndex); currentLabelsIds.clear(); new Handler(Looper.getMainLooper()).postDelayed(() -> LabelsActions.getCurrentIssueLabels(ctx, repoOwner, repoName, issueIndex, currentLabelsIds), 1000); @@ -441,7 +465,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt if(id == android.R.id.home) { if(getIntent().getStringExtra("openedFromLink") != null && getIntent().getStringExtra("openedFromLink").equals("true")) { - Intent intent = new Intent(ctx, RepoDetailActivity.class); + Intent intent = issue.getRepository().getIntent(ctx, RepoDetailActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); } @@ -450,8 +474,10 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt } else if(id == R.id.genericMenu) { - BottomSheetSingleIssueFragment bottomSheet = new BottomSheetSingleIssueFragment(issueCreator); - bottomSheet.show(getSupportFragmentManager(), "singleIssueBottomSheet"); + if(issue.hasIssue()) { + BottomSheetSingleIssueFragment bottomSheet = new BottomSheetSingleIssueFragment(issue, issueCreator); + bottomSheet.show(getSupportFragmentManager(), "singleIssueBottomSheet"); + } return true; } else { @@ -464,52 +490,40 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt public void onResume() { super.onResume(); + issue.getRepository().checkAccountSwitch(this); - if(tinyDB.getBoolean("commentPosted")) { + if(commentPosted) { viewBinding.scrollViewComments.post(() -> { IssueCommentsViewModel - .loadIssueComments(Authorization.get(ctx), repoOwner, repoName, issueIndex, - ctx); + .loadIssueComments(getAccount().getAuthorization(), repoOwner, repoName, issueIndex, + ctx, () -> viewBinding.scrollViewComments.fullScroll(ScrollView.FOCUS_DOWN)); - new Handler(Looper.getMainLooper()).postDelayed(() -> viewBinding.scrollViewComments.fullScroll(ScrollView.FOCUS_DOWN), 1000); - - tinyDB.putBoolean("commentPosted", false); + commentPosted = false; }); } - if(tinyDB.getBoolean("commentEdited")) { + if(commentEdited) { viewBinding.scrollViewComments.post(() -> { IssueCommentsViewModel - .loadIssueComments(Authorization.get(ctx), repoOwner, repoName, issueIndex, + .loadIssueComments(getAccount().getAuthorization(), repoOwner, repoName, issueIndex, ctx); - tinyDB.putBoolean("commentEdited", false); + commentEdited = false; }); } - if(tinyDB.getBoolean("singleIssueUpdate")) { + if(singleIssueUpdate) { new Handler(Looper.getMainLooper()).postDelayed(() -> { viewBinding.frameAssignees.removeAllViews(); viewBinding.frameLabels.removeAllViews(); + issue.setIssue(null); getSingleIssue(repoOwner, repoName, issueIndex); - tinyDB.putBoolean("singleIssueUpdate", false); - - }, 500); - } - - if(tinyDB.getBoolean("issueEdited")) { - - new Handler(Looper.getMainLooper()).postDelayed(() -> { - - viewBinding.frameAssignees.removeAllViews(); - viewBinding.frameLabels.removeAllViews(); - getSingleIssue(repoOwner, repoName, issueIndex); - tinyDB.putBoolean("issueEdited", false); + singleIssueUpdate = false; }, 500); } @@ -519,7 +533,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt IssueCommentsViewModel issueCommentsModel = new ViewModelProvider(this).get(IssueCommentsViewModel.class); - issueCommentsModel.getIssueCommentList(Authorization.get(ctx), owner, repo, index, ctx) + issueCommentsModel.getIssueCommentList(getAccount().getAuthorization(), owner, repo, index, ctx) .observe(this, issueCommentsMain -> { assert issueCommentsMain != null; @@ -534,7 +548,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt bundle.putString("repoName", repoName); bundle.putInt("issueNumber", issueIndex); - adapter = new IssueCommentsAdapter(ctx, bundle, issueCommentsMain, getSupportFragmentManager(), this::onResume); + adapter = new IssueCommentsAdapter(ctx, bundle, issueCommentsMain, getSupportFragmentManager(), this::onResume, issue); viewBinding.recyclerView.setAdapter(adapter); @@ -542,263 +556,29 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt } private void getSingleIssue(String repoOwner, String repoName, int issueIndex) { - updateTinyDBPermissionValues(); + if(issue.hasIssue()) { + viewBinding.progressBar.setVisibility(View.GONE); + getSubscribed(); + initWithIssue(); + return; + } - final TinyDB tinyDb = TinyDB.getInstance(appCtx); Call call = RetrofitClient.getApiInterface(ctx) - .getIssueByIndex(Authorization.get(ctx), repoOwner, repoName, issueIndex); + .getIssueByIndex(getAccount().getAuthorization(), repoOwner, repoName, issueIndex); call.enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { + viewBinding.progressBar.setVisibility(View.GONE); if(response.code() == 200) { Issues singleIssue = response.body(); assert singleIssue != null; - viewBinding.issuePrState.setVisibility(View.VISIBLE); - - if(singleIssue.getPull_request() != null) { - getPullSourceRepo(); - if(singleIssue.getPull_request().isMerged()) { // merged - - viewBinding.issuePrState.setImageResource(R.drawable.ic_pull_request_merged); - } - else if(!singleIssue.getPull_request().isMerged() && singleIssue.getState().equals("closed")) { // closed - - viewBinding.issuePrState.setImageResource(R.drawable.ic_pull_request_closed); - } - else { // open - - viewBinding.issuePrState.setImageResource(R.drawable.ic_pull_request); - } - } - else if(singleIssue.getState().equals("closed")) { // issue closed - - viewBinding.issuePrState.setImageResource(R.drawable.ic_issue_closed_red); - } - - TinyDB tinyDb = TinyDB.getInstance(appCtx); - final Locale locale = getResources().getConfiguration().locale; - final String timeFormat = tinyDb.getString("dateFormat"); - tinyDb.putString("issueState", singleIssue.getState()); - tinyDb.putString("issueTitle", singleIssue.getTitle()); - tinyDb.putString("singleIssueHtmlUrl", singleIssue.getHtml_url()); - issueCreator = singleIssue.getUser().getLogin(); - - PicassoService.getInstance(ctx).get().load(singleIssue.getUser().getAvatar_url()).placeholder(R.drawable.loader_animated) - .transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(viewBinding.assigneeAvatar); - String issueNumber_ = "" + appCtx.getResources() - .getString(R.string.hash) + singleIssue.getNumber() + ""; - viewBinding.issueTitle.setText(HtmlCompat.fromHtml(issueNumber_ + " " + EmojiParser.parseToUnicode(singleIssue.getTitle()), HtmlCompat.FROM_HTML_MODE_LEGACY)); - String cleanIssueDescription = singleIssue.getBody().trim(); - - viewBinding.assigneeAvatar.setOnClickListener(loginId -> { - Intent intent = new Intent(ctx, ProfileActivity.class); - intent.putExtra("username", singleIssue.getUser().getLogin()); - ctx.startActivity(intent); - }); - - viewBinding.assigneeAvatar.setOnLongClickListener(loginId -> { - AppUtil.copyToClipboard(ctx, singleIssue.getUser().getLogin(), ctx.getString(R.string.copyLoginIdToClipBoard, singleIssue.getUser().getLogin())); - return true; - }); - - Markdown.render(ctx, EmojiParser.parseToUnicode(cleanIssueDescription), viewBinding.issueDescription); - - RelativeLayout.LayoutParams paramsDesc = (RelativeLayout.LayoutParams) viewBinding.issueDescription.getLayoutParams(); - - LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams(80, 80); - params1.setMargins(15, 0, 0, 0); - - if(singleIssue.getAssignees() != null) { - - viewBinding.assigneesScrollView.setVisibility(View.VISIBLE); - - for(int i = 0; i < singleIssue.getAssignees().size(); i++) { - - ImageView assigneesView = new ImageView(ctx); - - PicassoService.getInstance(ctx).get().load(singleIssue.getAssignees().get(i).getAvatar_url()) - .placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(100, 100).centerCrop() - .into(assigneesView); - - viewBinding.frameAssignees.addView(assigneesView); - assigneesView.setLayoutParams(params1); - - int finalI = i; - assigneesView.setOnClickListener(loginId -> { - Intent intent = new Intent(ctx, ProfileActivity.class); - intent.putExtra("username", singleIssue.getAssignees().get(finalI).getLogin()); - ctx.startActivity(intent); - }); - - assigneesView.setOnLongClickListener(loginId -> { - AppUtil.copyToClipboard(ctx, singleIssue.getAssignees().get(finalI).getLogin(), ctx.getString(R.string.copyLoginIdToClipBoard, singleIssue.getAssignees().get(finalI).getLogin())); - return true; - }); - - /*if(!singleIssue.getAssignees().get(i).getFull_name().equals("")) { - - assigneesView.setOnClickListener( - new ClickListener(getString(R.string.assignedTo, singleIssue.getAssignees().get(i).getFull_name()), ctx)); - } - else { - - assigneesView.setOnClickListener( - new ClickListener(getString(R.string.assignedTo, singleIssue.getAssignees().get(i).getLogin()), ctx)); - }*/ - } - } - else { - - viewBinding.assigneesScrollView.setVisibility(View.GONE); - } - - LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, - LinearLayout.LayoutParams.WRAP_CONTENT); - params.setMargins(0, 0, 15, 0); - - if(singleIssue.getLabels() != null) { - - viewBinding.labelsScrollView.setVisibility(View.VISIBLE); - - for(int i = 0; i < singleIssue.getLabels().size(); i++) { - - String labelColor = singleIssue.getLabels().get(i).getColor(); - String labelName = singleIssue.getLabels().get(i).getName(); - int color = Color.parseColor("#" + labelColor); - - ImageView labelsView = new ImageView(ctx); - viewBinding.frameLabels.setOrientation(LinearLayout.HORIZONTAL); - viewBinding.frameLabels.setGravity(Gravity.START | Gravity.TOP); - labelsView.setLayoutParams(params); - - int height = AppUtil.getPixelsFromDensity(ctx, 25); - int textSize = AppUtil.getPixelsFromScaledDensity(ctx, 15); - - TextDrawable drawable = TextDrawable.builder().beginConfig().useFont(Typeface.DEFAULT) - .textColor(new ColorInverter().getContrastColor(color)).fontSize(textSize) - .width(LabelWidthCalculator.calculateLabelWidth(labelName, Typeface.DEFAULT, textSize, AppUtil.getPixelsFromDensity(ctx, 10))) - .height(height).endConfig().buildRoundRect(labelName, color, AppUtil.getPixelsFromDensity(ctx, 5)); - - labelsView.setImageDrawable(drawable); - viewBinding.frameLabels.addView(labelsView); - } - } - else { - - viewBinding.labelsScrollView.setVisibility(View.GONE); - } - - if(singleIssue.getDue_date() != null) { - - if(timeFormat.equals("normal") || timeFormat.equals("pretty")) { - - DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", locale); - String dueDate = formatter.format(singleIssue.getDue_date()); - viewBinding.issueDueDate.setText(dueDate); - viewBinding.issueDueDate - .setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(singleIssue.getDue_date()), ctx)); - } - else if(timeFormat.equals("normal1")) { - - DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", locale); - String dueDate = formatter.format(singleIssue.getDue_date()); - viewBinding.issueDueDate.setText(dueDate); - } - } - else { - - viewBinding.issueDueDate.setVisibility(View.GONE); - } - - String edited; - - if(!singleIssue.getUpdated_at().equals(singleIssue.getCreated_at())) { - - edited = getString(R.string.colorfulBulletSpan) + getString(R.string.modifiedText); - viewBinding.issueModified.setVisibility(View.VISIBLE); - viewBinding.issueModified.setText(edited); - viewBinding.issueModified - .setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(singleIssue.getUpdated_at()), ctx)); - } - else { - - viewBinding.issueModified.setVisibility(View.INVISIBLE); - } - - if((singleIssue.getDue_date() == null && singleIssue.getMilestone() == null) && singleIssue.getAssignees() != null) { - - paramsDesc.setMargins(0, 35, 0, 0); - viewBinding.issueDescription.setLayoutParams(paramsDesc); - } - else if(singleIssue.getDue_date() == null && singleIssue.getMilestone() == null) { - - paramsDesc.setMargins(0, 55, 0, 0); - viewBinding.issueDescription.setLayoutParams(paramsDesc); - } - else if(singleIssue.getAssignees() == null) { - - paramsDesc.setMargins(0, 35, 0, 0); - viewBinding.issueDescription.setLayoutParams(paramsDesc); - } - else { - - paramsDesc.setMargins(0, 15, 0, 0); - viewBinding.issueDescription.setLayoutParams(paramsDesc); - } - - viewBinding.issueCreatedTime.setText(TimeHelper.formatTime(singleIssue.getCreated_at(), locale, timeFormat, ctx)); - viewBinding.issueCreatedTime.setVisibility(View.VISIBLE); - - if(timeFormat.equals("pretty")) { - - viewBinding.issueCreatedTime - .setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(singleIssue.getCreated_at()), ctx)); - } - - Bundle bundle = new Bundle(); - bundle.putString("repoOwner", repoOwner); - bundle.putString("repoName", repoName); - bundle.putInt("issueId", singleIssue.getNumber()); - - ReactionList reactionList = new ReactionList(ctx, bundle); - - viewBinding.commentReactionBadges.removeAllViews(); - viewBinding.commentReactionBadges.addView(reactionList); - - reactionList.setOnReactionAddedListener(() -> { - - if(viewBinding.commentReactionBadges.getVisibility() != View.VISIBLE) { - viewBinding.commentReactionBadges.post(() -> viewBinding.commentReactionBadges.setVisibility(View.VISIBLE)); - } - }); - - if(singleIssue.getMilestone() != null) { - - viewBinding.issueMilestone.setVisibility(View.VISIBLE); - viewBinding.issueMilestone.setText(getString(R.string.issueMilestone, singleIssue.getMilestone().getTitle())); - } - else { - - viewBinding.issueMilestone.setVisibility(View.GONE); - } - - /*if(!singleIssue.getUser().getFull_name().equals("")) { - - viewBinding.assigneeAvatar.setOnClickListener( - new ClickListener(ctx.getResources().getString(R.string.issueCreator) + singleIssue.getUser().getFull_name(), ctx)); - } - else { - - viewBinding.assigneeAvatar.setOnClickListener( - new ClickListener(ctx.getResources().getString(R.string.issueCreator) + singleIssue.getUser().getLogin(), ctx)); - }*/ - - viewBinding.progressBar.setVisibility(View.GONE); + issue.setIssue(singleIssue); + initWithIssue(); } else if(response.code() == 401) { @@ -810,112 +590,338 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt } else if(response.code() == 404) { - if(tinyDb.getString("issueType").equals("Issue")) { - - Toasty.warning(ctx, getResources().getString(R.string.noDataIssueTab)); - } - else if(tinyDb.getString("issueType").equals("Pull")) { - + if("Pull".equals(issue.getIssueType())) { Toasty.warning(ctx, getResources().getString(R.string.noDataPullRequests)); } - - Intent mainIntent = new Intent(ctx, MainActivity.class); - ctx.startActivity(mainIntent); + else { + Toasty.warning(ctx, getResources().getString(R.string.noDataIssueTab)); + } finish(); } } @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { - + viewBinding.progressBar.setVisibility(View.GONE); Log.e("onFailure", t.toString()); } }); - if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) { + getSubscribed(); - Call call2 = RetrofitClient.getApiInterface(appCtx) - .checkIssueWatchStatus(Authorization.get(ctx), repoOwner, repoName, issueIndex); - - call2.enqueue(new Callback() { + } + private void getSubscribed() { + RetrofitClient.getApiInterface(ctx) + .checkIssueWatchStatus(getAccount().getAuthorization(), repoOwner, repoName, issueIndex) + .enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { - if(response.isSuccessful()) { - assert response.body() != null; - tinyDb.putBoolean("issueSubscribed", response.body().getSubscribed()); - } - else { - - tinyDb.putBoolean("issueSubscribed", false); + issue.setSubscribed(response.body().getSubscribed()); + } else { + issue.setSubscribed(false); } } @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { - - tinyDb.putBoolean("issueSubscribed", false); + issue.setSubscribed(false); } - }); - - } - } - private void updateTinyDBPermissionValues() { - RetrofitClient.getApiInterface(this).getUserRepository(Authorization.get(this), repoOwner, repoName).enqueue(new Callback() { + private void initWithIssue() { + if(!issue.getRepository().hasRepository()) { + getRepoInfo(); + } - @Override - public void onResponse(@NonNull Call call, @NonNull Response response) { - if(response.isSuccessful()) { - assert response.body() != null; - tinyDB.putBoolean("isArchived", response.body().isArchived()); - if(response.body().isArchived()) { - viewBinding.addNewComment.setVisibility(View.GONE); - } - tinyDB.putBoolean("isRepoAdmin", response.body().getPermissions().isAdmin()); - tinyDB.putBoolean("canPush", response.body().getPermissions().canPush()); + viewBinding.issuePrState.setVisibility(View.VISIBLE); + + if(issue.getIssue().getPull_request() != null) { + getPullRequest(); + if(issue.getIssue().getPull_request().isMerged()) { // merged + + viewBinding.issuePrState.setImageResource(R.drawable.ic_pull_request_merged); + } + else if(!issue.getIssue().getPull_request().isMerged() && issue.getIssue().getState().equals("closed")) { // closed + + viewBinding.issuePrState.setImageResource(R.drawable.ic_pull_request_closed); + } + else { // open + + viewBinding.issuePrState.setImageResource(R.drawable.ic_pull_request); + } + } + else if(issue.getIssue().getState().equals("closed")) { // issue closed + + viewBinding.issuePrState.setImageResource(R.drawable.ic_issue_closed_red); + } else { + viewBinding.issuePrState.setImageResource(R.drawable.ic_issue); + } + + TinyDB tinyDb = TinyDB.getInstance(appCtx); + final Locale locale = getResources().getConfiguration().locale; + final String timeFormat = tinyDb.getString("dateFormat", "pretty"); + issueCreator = issue.getIssue().getUser().getLogin(); + + PicassoService.getInstance(ctx).get().load(issue.getIssue().getUser().getAvatar_url()).placeholder(R.drawable.loader_animated) + .transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(viewBinding.assigneeAvatar); + String issueNumber_ = "" + appCtx.getResources() + .getString(R.string.hash) + issue.getIssue().getNumber() + ""; + viewBinding.issueTitle.setText(HtmlCompat.fromHtml(issueNumber_ + " " + EmojiParser.parseToUnicode(issue.getIssue().getTitle()), HtmlCompat.FROM_HTML_MODE_LEGACY)); + String cleanIssueDescription = issue.getIssue().getBody().trim(); + + viewBinding.assigneeAvatar.setOnClickListener(loginId -> { + Intent intent = new Intent(ctx, ProfileActivity.class); + intent.putExtra("username", issue.getIssue().getUser().getLogin()); + ctx.startActivity(intent); + }); + + viewBinding.assigneeAvatar.setOnLongClickListener(loginId -> { + AppUtil.copyToClipboard(ctx, issue.getIssue().getUser().getLogin(), ctx.getString(R.string.copyLoginIdToClipBoard, issue.getIssue().getUser().getLogin())); + return true; + }); + + Markdown.render(ctx, EmojiParser.parseToUnicode(cleanIssueDescription), viewBinding.issueDescription, issue.getRepository()); + + RelativeLayout.LayoutParams paramsDesc = (RelativeLayout.LayoutParams) viewBinding.issueDescription.getLayoutParams(); + + LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams(80, 80); + params1.setMargins(15, 0, 0, 0); + + if(issue.getIssue().getAssignees() != null) { + + viewBinding.assigneesScrollView.setVisibility(View.VISIBLE); + + for(int i = 0; i < issue.getIssue().getAssignees().size(); i++) { + + ImageView assigneesView = new ImageView(ctx); + + PicassoService.getInstance(ctx).get().load(issue.getIssue().getAssignees().get(i).getAvatar_url()) + .placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(100, 100).centerCrop() + .into(assigneesView); + + viewBinding.frameAssignees.addView(assigneesView); + assigneesView.setLayoutParams(params1); + + int finalI = i; + assigneesView.setOnClickListener(loginId -> { + Intent intent = new Intent(ctx, ProfileActivity.class); + intent.putExtra("username", issue.getIssue().getAssignees().get(finalI).getLogin()); + ctx.startActivity(intent); + }); + + assigneesView.setOnLongClickListener(loginId -> { + AppUtil.copyToClipboard(ctx, issue.getIssue().getAssignees().get(finalI).getLogin(), ctx.getString(R.string.copyLoginIdToClipBoard, issue.getIssue().getAssignees().get(finalI).getLogin())); + return true; + }); + + /*if(!issue.getIssue().getAssignees().get(i).getFull_name().equals("")) { + + assigneesView.setOnClickListener( + new ClickListener(getString(R.string.assignedTo, issue.getIssue().getAssignees().get(i).getFull_name()), ctx)); } else { - onFailure(call, new Throwable()); + + assigneesView.setOnClickListener( + new ClickListener(getString(R.string.assignedTo, issue.getIssue().getAssignees().get(i).getLogin()), ctx)); + }*/ + } + } + else { + + viewBinding.assigneesScrollView.setVisibility(View.GONE); + } + + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT); + params.setMargins(0, 0, 15, 0); + + if(issue.getIssue().getLabels() != null) { + + viewBinding.labelsScrollView.setVisibility(View.VISIBLE); + + for(int i = 0; i < issue.getIssue().getLabels().size(); i++) { + + String labelColor = issue.getIssue().getLabels().get(i).getColor(); + String labelName = issue.getIssue().getLabels().get(i).getName(); + int color = Color.parseColor("#" + labelColor); + + ImageView labelsView = new ImageView(ctx); + viewBinding.frameLabels.setOrientation(LinearLayout.HORIZONTAL); + viewBinding.frameLabels.setGravity(Gravity.START | Gravity.TOP); + labelsView.setLayoutParams(params); + + int height = AppUtil.getPixelsFromDensity(ctx, 25); + int textSize = AppUtil.getPixelsFromScaledDensity(ctx, 15); + + TextDrawable drawable = TextDrawable.builder().beginConfig().useFont(Typeface.DEFAULT) + .textColor(new ColorInverter().getContrastColor(color)).fontSize(textSize) + .width(LabelWidthCalculator.calculateLabelWidth(labelName, Typeface.DEFAULT, textSize, AppUtil.getPixelsFromDensity(ctx, 10))) + .height(height).endConfig().buildRoundRect(labelName, color, AppUtil.getPixelsFromDensity(ctx, 5)); + + labelsView.setImageDrawable(drawable); + viewBinding.frameLabels.addView(labelsView); + } + } + else { + + viewBinding.labelsScrollView.setVisibility(View.GONE); + } + + if(issue.getIssue().getDue_date() != null) { + + if(timeFormat.equals("normal") || timeFormat.equals("pretty")) { + + DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", locale); + String dueDate = formatter.format(issue.getIssue().getDue_date()); + viewBinding.issueDueDate.setText(dueDate); + viewBinding.issueDueDate + .setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(issue.getIssue().getDue_date()), ctx)); + } + else if(timeFormat.equals("normal1")) { + + DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", locale); + String dueDate = formatter.format(issue.getIssue().getDue_date()); + viewBinding.issueDueDate.setText(dueDate); + } + } + else { + + viewBinding.issueDueDate.setVisibility(View.GONE); + } + + String edited; + + if(!issue.getIssue().getUpdated_at().equals(issue.getIssue().getCreated_at())) { + + edited = getString(R.string.colorfulBulletSpan) + getString(R.string.modifiedText); + viewBinding.issueModified.setVisibility(View.VISIBLE); + viewBinding.issueModified.setText(edited); + viewBinding.issueModified + .setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(issue.getIssue().getUpdated_at()), ctx)); + } + else { + + viewBinding.issueModified.setVisibility(View.INVISIBLE); + } + + if((issue.getIssue().getDue_date() == null && issue.getIssue().getMilestone() == null) && issue.getIssue().getAssignees() != null) { + + paramsDesc.setMargins(0, 35, 0, 0); + viewBinding.issueDescription.setLayoutParams(paramsDesc); + } + else if(issue.getIssue().getDue_date() == null && issue.getIssue().getMilestone() == null) { + + paramsDesc.setMargins(0, 55, 0, 0); + viewBinding.issueDescription.setLayoutParams(paramsDesc); + } + else if(issue.getIssue().getAssignees() == null) { + + paramsDesc.setMargins(0, 35, 0, 0); + viewBinding.issueDescription.setLayoutParams(paramsDesc); + } + else { + + paramsDesc.setMargins(0, 15, 0, 0); + viewBinding.issueDescription.setLayoutParams(paramsDesc); + } + + viewBinding.issueCreatedTime.setText(TimeHelper.formatTime(issue.getIssue().getCreated_at(), locale, timeFormat, ctx)); + viewBinding.issueCreatedTime.setVisibility(View.VISIBLE); + + if(timeFormat.equals("pretty")) { + + viewBinding.issueCreatedTime + .setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(issue.getIssue().getCreated_at()), ctx)); + } + + Bundle bundle = new Bundle(); + bundle.putString("repoOwner", repoOwner); + bundle.putString("repoName", repoName); + bundle.putInt("issueId", issue.getIssue().getNumber()); + + ReactionList reactionList = new ReactionList(ctx, bundle); + + viewBinding.commentReactionBadges.removeAllViews(); + viewBinding.commentReactionBadges.addView(reactionList); + + reactionList.setOnReactionAddedListener(() -> { + + if(viewBinding.commentReactionBadges.getVisibility() != View.VISIBLE) { + viewBinding.commentReactionBadges.post(() -> viewBinding.commentReactionBadges.setVisibility(View.VISIBLE)); + } + }); + + if(issue.getIssue().getMilestone() != null) { + + viewBinding.issueMilestone.setVisibility(View.VISIBLE); + viewBinding.issueMilestone.setText(getString(R.string.issueMilestone, issue.getIssue().getMilestone().getTitle())); + } + else { + + viewBinding.issueMilestone.setVisibility(View.GONE); + } + + /*if(!issue.getIssue().getUser().getFull_name().equals("")) { + + viewBinding.assigneeAvatar.setOnClickListener( + new ClickListener(ctx.getResources().getString(R.string.issueCreator) + issue.getIssue().getUser().getFull_name(), ctx)); + } + else { + + viewBinding.assigneeAvatar.setOnClickListener( + new ClickListener(ctx.getResources().getString(R.string.issueCreator) + issue.getIssue().getUser().getLogin(), ctx)); + }*/ + } + + private void getPullRequest() { + RetrofitClient.getApiInterface(this).getPullRequestByIndex(getAccount().getAuthorization(), repoOwner, repoName, issueIndex).enqueue(new Callback() { + + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + if(response.isSuccessful() && response.body() != null) { + issue.setPullRequest(response.body()); + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + + } + }); + } + + private void getRepoInfo() { + Call call = RetrofitClient.getApiInterface(ctx).getUserRepository(getAccount().getAuthorization(), issue.getRepository().getOwner(), issue.getRepository().getName()); + call.enqueue(new Callback() { + + @Override + public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { + + UserRepositories repoInfo = response.body(); + + if(response.code() == 200) { + assert repoInfo != null; + issue.getRepository().setRepository(repoInfo); + } + else { + Toasty.error(ctx, getString(R.string.genericError)); + Log.e("onFailure", String.valueOf(response.code())); } } @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { - tinyDB.putBoolean("isRepoAdmin", false); - tinyDB.putBoolean("canPush", false); + Toasty.error(ctx, getString(R.string.genericError)); + Log.e("onFailure", t.toString()); } + }); - } - private void getPullSourceRepo() { - if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.15.4")) { - RetrofitClient.getApiInterface(this).getPullRequestByIndex(Authorization.get(this), repoOwner, repoName, issueIndex).enqueue(new Callback() { - - @Override - public void onResponse(@NonNull Call call, @NonNull Response response) { - if(response.isSuccessful() && response.body() != null) { - tinyDB.putBoolean("canPushPullSource", response.body().getHead().getRepo().getPermissions().isPush()); - } - else { - tinyDB.putBoolean("canPushPullSource", false); - } - } - - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - tinyDB.putBoolean("canPushPullSource", false); - } - }); - } - else { - tinyDB.putBoolean("canPushPullSource", true); - } } } diff --git a/app/src/main/java/org/mian/gitnex/activities/LoginActivity.java b/app/src/main/java/org/mian/gitnex/activities/LoginActivity.java index 77ed11f1..ab6a6806 100644 --- a/app/src/main/java/org/mian/gitnex/activities/LoginActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/LoginActivity.java @@ -20,13 +20,7 @@ import org.mian.gitnex.database.api.BaseApi; import org.mian.gitnex.database.api.UserAccountsApi; import org.mian.gitnex.database.models.UserAccount; import org.mian.gitnex.databinding.ActivityLoginBinding; -import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.NetworkStatusObserver; -import org.mian.gitnex.helpers.PathsHelper; -import org.mian.gitnex.helpers.TinyDB; -import org.mian.gitnex.helpers.Toasty; -import org.mian.gitnex.helpers.UrlHelper; -import org.mian.gitnex.helpers.Version; +import org.mian.gitnex.helpers.*; import org.mian.gitnex.structs.Protocol; import java.net.URI; import java.nio.charset.StandardCharsets; @@ -52,6 +46,9 @@ public class LoginActivity extends BaseActivity { private String device_id = "token"; private String selectedProtocol; + private URI instanceUrl; + private Version giteaVersion; + @Override public void onCreate(Bundle savedInstanceState) { @@ -143,12 +140,12 @@ public class LoginActivity extends BaseActivity { URI rawInstanceUrl = UrlBuilder.fromString(UrlHelper.fixScheme(instanceUrlET.getText().toString(), "http")).toUri(); - URI instanceUrl = UrlBuilder.fromUri(rawInstanceUrl).withScheme(selectedProtocol.toLowerCase()).withPath(PathsHelper.join(rawInstanceUrl.getPath(), "/api/v1/")) + instanceUrl = UrlBuilder.fromUri(rawInstanceUrl).withScheme(selectedProtocol.toLowerCase()).withPath(PathsHelper.join(rawInstanceUrl.getPath(), "/api/v1/")) .toUri(); + // cache values to make them available the next time the user wants to log in tinyDB.putString("loginType", loginType.name().toLowerCase()); tinyDB.putString("instanceUrlRaw", instanceUrlET.getText().toString()); - tinyDB.putString("instanceUrl", instanceUrl.toString()); if(instanceUrlET.getText().toString().equals("")) { @@ -166,28 +163,19 @@ public class LoginActivity extends BaseActivity { return; } - if(rawInstanceUrl.getUserInfo() != null) { - - tinyDB.putString("basicAuthPassword", loginPass); - tinyDB.putBoolean("basicAuthFlag", true); - } - if(loginUid.equals("")) { - Toasty.error(ctx, getResources().getString(R.string.emptyFieldUsername)); enableProcessButton(); return; } if(loginPass.equals("")) { - Toasty.error(ctx, getResources().getString(R.string.emptyFieldPassword)); enableProcessButton(); return; } int loginOTP = (otpCode.length() > 0) ? Integer.parseInt(otpCode.getText().toString().trim()) : 0; - tinyDB.putString("loginUid", loginUid); versionCheck(loginUid, loginPass, loginOTP, loginToken, loginType); @@ -220,15 +208,15 @@ public class LoginActivity extends BaseActivity { if(!loginToken.equals("")) { - callVersion = RetrofitClient.getApiInterface(appCtx).getGiteaVersionWithToken("token " + loginToken); + callVersion = RetrofitClient.getApiInterface(ctx).getGiteaVersionWithToken("token " + loginToken); } else { String credential = Credentials.basic(loginUid, loginPass, StandardCharsets.UTF_8); callVersion = - (loginOTP != 0) ? RetrofitClient.getApiInterface(appCtx).getGiteaVersionWithOTP(credential, loginOTP) : - RetrofitClient.getApiInterface(appCtx).getGiteaVersionWithBasic(credential); + (loginOTP != 0) ? RetrofitClient.getApiInterface(ctx).getGiteaVersionWithOTP(credential, loginOTP) : + RetrofitClient.getApiInterface(ctx).getGiteaVersionWithBasic(credential); } callVersion.enqueue(new Callback() { @@ -248,10 +236,9 @@ public class LoginActivity extends BaseActivity { return; } - tinyDB.putString("giteaVersion", version.getVersion()); - Version gitea_version = new Version(version.getVersion()); + giteaVersion = new Version(version.getVersion()); - if(gitea_version.less(getString(R.string.versionLow))) { + if(giteaVersion.less(getString(R.string.versionLow))) { AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ctx) .setTitle(getString(R.string.versionAlertDialogHeader)) @@ -274,7 +261,7 @@ public class LoginActivity extends BaseActivity { alertDialogBuilder.create().show(); } - else if(gitea_version.lessOrEqual(getString(R.string.versionHigh))) { + else if(giteaVersion.lessOrEqual(getString(R.string.versionHigh))) { login(loginType, loginUid, loginPass, loginOTP, loginToken); } @@ -319,7 +306,7 @@ public class LoginActivity extends BaseActivity { private void setupUsingExistingToken(final String loginToken) { - Call call = RetrofitClient.getApiInterface(appCtx).getUserInfo("token " + loginToken); + Call call = RetrofitClient.getApiInterface(ctx).getUserInfo("token " + loginToken); call.enqueue(new Callback() { @@ -333,29 +320,25 @@ public class LoginActivity extends BaseActivity { case 200: assert userDetails != null; - tinyDB.putBoolean("loggedInMode", true); - tinyDB.putString(userDetails.getLogin() + "-token", loginToken); - tinyDB.putString("loginUid", userDetails.getLogin()); - tinyDB.putString("userLogin", userDetails.getUsername()); // insert new account to db if does not exist - String accountName = userDetails.getUsername() + "@" + TinyDB.getInstance(ctx).getString("instanceUrl"); + String accountName = userDetails.getUsername() + "@" + instanceUrl; UserAccountsApi userAccountsApi = BaseApi.getInstance(ctx, UserAccountsApi.class); + assert userAccountsApi != null; boolean userAccountExists = userAccountsApi.userAccountExists(accountName); - long accountId; - + UserAccount account; if(!userAccountExists) { - - accountId = userAccountsApi.createNewAccount(accountName, TinyDB.getInstance(ctx).getString("instanceUrl"), userDetails.getUsername(), loginToken, ""); - tinyDB.putInt("currentActiveAccountId", (int) accountId); + long accountId = userAccountsApi.createNewAccount(accountName, instanceUrl.toString(), userDetails.getUsername(), loginToken, giteaVersion.toString()); + account = userAccountsApi.getAccountById((int) accountId); } else { - userAccountsApi.updateTokenByAccountName(accountName, loginToken); - UserAccount data = userAccountsApi.getAccountByName(accountName); - tinyDB.putInt("currentActiveAccountId", data.getAccountId()); + userAccountsApi.login(userAccountsApi.getAccountByName(accountName).getAccountId()); + account = userAccountsApi.getAccountByName(accountName); } + AppUtil.switchToAccount(LoginActivity.this, account); + enableProcessButton(); startActivity(new Intent(LoginActivity.this, MainActivity.class)); finish(); @@ -367,7 +350,7 @@ public class LoginActivity extends BaseActivity { break; default: - Toasty.error(ctx, getResources().getString(R.string.genericApiStatusError) + response.code()); + Toasty.error(ctx, getResources().getString(R.string.genericApiError, response.code())); enableProcessButton(); } } @@ -391,11 +374,11 @@ public class LoginActivity extends BaseActivity { Call> call; if(loginOTP != 0) { - call = RetrofitClient.getApiInterface(appCtx).getUserTokensWithOTP(credential, loginOTP, loginUid); + call = RetrofitClient.getApiInterface(ctx).getUserTokensWithOTP(credential, loginOTP, loginUid); } else { - call = RetrofitClient.getApiInterface(appCtx).getUserTokens(credential, loginUid); + call = RetrofitClient.getApiInterface(ctx).getUserTokens(credential, loginUid); } call.enqueue(new Callback>() { @@ -438,7 +421,7 @@ public class LoginActivity extends BaseActivity { } else { - Toasty.error(ctx, getResources().getString(R.string.genericApiStatusError) + response.code()); + Toasty.error(ctx, getResources().getString(R.string.genericApiError, response.code())); enableProcessButton(); } } @@ -459,7 +442,7 @@ public class LoginActivity extends BaseActivity { } else { - Toasty.error(ctx, getResources().getString(R.string.genericApiStatusError) + response.code()); + Toasty.error(ctx, getResources().getString(R.string.genericApiError, response.code())); enableProcessButton(); } } @@ -520,31 +503,26 @@ public class LoginActivity extends BaseActivity { case 200: assert userDetails != null; - tinyDB.remove("loginPass"); - tinyDB.putBoolean("loggedInMode", true); - tinyDB.putString("userLogin", userDetails.getUsername()); - tinyDB.putString(loginUid + "-token", newToken.getSha1()); - tinyDB.putString(loginUid + "-token-last-eight", newToken.getToken_last_eight()); // insert new account to db if does not exist - String accountName = userDetails.getUsername() + "@" + TinyDB.getInstance(ctx).getString("instanceUrl"); + String accountName = userDetails.getUsername() + "@" + instanceUrl; UserAccountsApi userAccountsApi = BaseApi.getInstance(ctx, UserAccountsApi.class); + assert userAccountsApi != null; boolean userAccountExists = userAccountsApi.userAccountExists(accountName); - long accountId; + UserAccount account; if(!userAccountExists) { - - accountId = userAccountsApi - .createNewAccount(accountName, TinyDB.getInstance(ctx).getString("instanceUrl"), userDetails.getUsername(), newToken.getSha1(), ""); - tinyDB.putInt("currentActiveAccountId", (int) accountId); + long accountId = userAccountsApi + .createNewAccount(accountName, instanceUrl.toString(), userDetails.getUsername(), newToken.getSha1(), giteaVersion.toString()); + account = userAccountsApi.getAccountById((int) accountId); } else { - userAccountsApi.updateTokenByAccountName(accountName, newToken.getSha1()); - UserAccount data = userAccountsApi.getAccountByName(accountName); - tinyDB.putInt("currentActiveAccountId", data.getAccountId()); + account = userAccountsApi.getAccountByName(accountName); } + AppUtil.switchToAccount(LoginActivity.this, account); + startActivity(new Intent(LoginActivity.this, MainActivity.class)); finish(); break; @@ -555,7 +533,7 @@ public class LoginActivity extends BaseActivity { break; default: - Toasty.error(ctx, getResources().getString(R.string.genericApiStatusError) + response.code()); + Toasty.error(ctx, getResources().getString(R.string.genericApiError, response.code())); enableProcessButton(); } } @@ -572,7 +550,7 @@ public class LoginActivity extends BaseActivity { } else if(responseCreate.code() == 500) { - Toasty.error(ctx, getResources().getString(R.string.genericApiStatusError) + responseCreate.code()); + Toasty.error(ctx, getResources().getString(R.string.genericApiError, responseCreate.code())); enableProcessButton(); } } @@ -602,19 +580,12 @@ public class LoginActivity extends BaseActivity { instanceUrlET.setText(tinyDB.getString("instanceUrlRaw")); } - if(!tinyDB.getString("loginUid").equals("")) { + if(getAccount() != null) { - loginUidET.setText(tinyDB.getString("loginUid")); - } - - if(tinyDB.getBoolean("loggedInMode")) { - - startActivity(new Intent(LoginActivity.this, MainActivity.class)); - finish(); + loginUidET.setText(getAccount().getAccount().getUserName()); } if(!tinyDB.getString("uniqueAppId").isEmpty()) { - device_id = tinyDB.getString("uniqueAppId"); } else { diff --git a/app/src/main/java/org/mian/gitnex/activities/MainActivity.java b/app/src/main/java/org/mian/gitnex/activities/MainActivity.java index ff0651cd..9b24101b 100644 --- a/app/src/main/java/org/mian/gitnex/activities/MainActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/MainActivity.java @@ -1,7 +1,5 @@ package org.mian.gitnex.activities; -import android.app.Activity; -import android.content.Context; import android.content.Intent; import android.graphics.Typeface; import android.os.Bundle; @@ -40,22 +38,19 @@ import org.mian.gitnex.fragments.AdministrationFragment; import org.mian.gitnex.fragments.BottomSheetDraftsFragment; import org.mian.gitnex.fragments.DraftsFragment; import org.mian.gitnex.fragments.ExploreFragment; +import org.mian.gitnex.fragments.MyProfileFragment; import org.mian.gitnex.fragments.MyRepositoriesFragment; import org.mian.gitnex.fragments.NotificationsFragment; import org.mian.gitnex.fragments.OrganizationsFragment; -import org.mian.gitnex.fragments.MyProfileFragment; import org.mian.gitnex.fragments.RepositoriesFragment; import org.mian.gitnex.fragments.SettingsFragment; import org.mian.gitnex.fragments.StarredRepositoriesFragment; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.ChangeLog; import org.mian.gitnex.helpers.ColorInverter; import org.mian.gitnex.helpers.RoundedTransformation; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; -import org.mian.gitnex.helpers.Version; import org.mian.gitnex.structs.BottomSheetListener; import java.util.ArrayList; import java.util.List; @@ -67,19 +62,25 @@ import retrofit2.Callback; * Author M M Arif */ +@SuppressWarnings("ConstantConditions") public class MainActivity extends BaseActivity implements NavigationView.OnNavigationItemSelectedListener, BottomSheetListener { + public static boolean repoCreated = false; + private DrawerLayout drawer; private TextView toolbarTitle; private Typeface myTypeface; - private String loginUid; private String instanceToken; + private boolean noConnection = false; private View hView; + private NavigationView navigationView; private MenuItem navNotifications; private TextView notificationCounter; + private BottomSheetListener profileInitListener; + @Override public void onCreate(Bundle savedInstanceState) { @@ -102,21 +103,11 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig } // DO NOT MOVE - tinyDB.putBoolean("noConnection", false); - - loginUid = tinyDB.getString("loginUid"); - instanceToken = "token " + tinyDB.getString(loginUid + "-token"); - - if(!tinyDB.getBoolean("loggedInMode")) { - - logout(this, ctx); - return; - } + instanceToken = getAccount().getAuthorization(); + noConnection = false; if(tinyDB.getInt("currentActiveAccountId", -1) <= 0) { - AlertDialogs.forceLogoutDialog(ctx, - getResources().getString(R.string.forceLogoutDialogHeader), - getResources().getString(R.string.forceLogoutDialogDescription), getResources().getString(R.string.navLogout)); + AppUtil.logout(ctx); } Toolbar toolbar = activityMainBinding.toolbar; @@ -174,7 +165,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig getNotificationsCount(instanceToken); drawer = activityMainBinding.drawerLayout; - NavigationView navigationView = activityMainBinding.navView; + navigationView = activityMainBinding.navView; navigationView.setNavigationItemSelectedListener(this); hView = navigationView.getHeaderView(0); @@ -189,9 +180,11 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig @Override public void onDrawerOpened(@NonNull View drawerView) { - String userEmailNav = tinyDB.getString("userEmail"); - String userFullNameNav = tinyDB.getString("userFullname"); - String userAvatarNav = tinyDB.getString("userAvatar"); + if(noConnection) { + + Toasty.error(ctx, getResources().getString(R.string.checkNetConnection)); + noConnection = false; + } TextView userEmail = hView.findViewById(R.id.userEmail); TextView userFullName = hView.findViewById(R.id.userFullname); @@ -206,7 +199,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig RecyclerView navRecyclerViewUserAccounts = hView.findViewById(R.id.userAccounts); UserAccountsNavAdapter adapterUserAccounts = new UserAccountsNavAdapter(ctx, userAccountsList, drawer); - userAccountsApi.getAllAccounts().observe((AppCompatActivity) ctx, userAccounts -> { + userAccountsApi.getAllLoggedInAccounts().observe((AppCompatActivity) ctx, userAccounts -> { if(userAccounts.size() > 0) { userAccountsList.clear(); userAccountsList.addAll(userAccounts); @@ -218,40 +211,44 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig userEmail.setTypeface(myTypeface); userFullName.setTypeface(myTypeface); - if(!userEmailNav.equals("")) { - userEmail.setText(userEmailNav); - } - if(!userFullNameNav.equals("")) { - userFullName.setText(Html.fromHtml(userFullNameNav)); - } + if (getAccount().getUserInfo() != null) { + String userEmailNav = getAccount().getUserInfo().getEmail(); + String userFullNameNav = getAccount().getFullName(); + String userAvatarNav = getAccount().getUserInfo().getAvatar(); - if(!userAvatarNav.equals("")) { + if(!userEmailNav.equals("")) { + userEmail.setText(userEmailNav); + } - int avatarRadius = AppUtil.getPixelsFromDensity(ctx, 3); + if(!userFullNameNav.equals("")) { + userFullName.setText(Html.fromHtml(userFullNameNav)); + } - PicassoService.getInstance(ctx).get() - .load(userAvatarNav) - .placeholder(R.drawable.loader_animated) - .transform(new RoundedTransformation(avatarRadius, 0)) - .resize(160, 160) - .centerCrop().into(userAvatar); + if(!userAvatarNav.equals("")) { - PicassoService.getInstance(ctx).get() - .load(userAvatarNav) - .transform(new BlurTransformation(ctx)) - .into(userAvatarBackground, new com.squareup.picasso.Callback() { + int avatarRadius = AppUtil.getPixelsFromDensity(ctx, 3); - @Override - public void onSuccess() { - int textColor = new ColorInverter().getImageViewContrastColor(userAvatarBackground); + PicassoService.getInstance(ctx).get().load(userAvatarNav).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(avatarRadius, 0)).resize(160, 160).centerCrop().into(userAvatar); - userFullName.setTextColor(textColor); - userEmail.setTextColor(textColor); - } + PicassoService.getInstance(ctx).get().load(userAvatarNav).transform(new BlurTransformation(ctx)) + .into(userAvatarBackground, new com.squareup.picasso.Callback() { - @Override public void onError(Exception e) {} - }); + @Override + public void onSuccess() { + + int textColor = new ColorInverter().getImageViewContrastColor(userAvatarBackground); + + userFullName.setTextColor(textColor); + userEmail.setTextColor(textColor); + } + + @Override + public void onError(Exception e) { + + } + }); + } } userAvatar.setOnClickListener(v -> { @@ -269,9 +266,12 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig @Override public void onDrawerSlide(@NonNull View drawerView, float slideOffset) { - navigationView.getMenu().findItem(R.id.nav_administration).setVisible(tinyDB.getBoolean("userIsAdmin")); - navigationView.getMenu().findItem(R.id.nav_notifications).setVisible(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.3")); - + if (getAccount().getUserInfo() != null) { + navigationView.getMenu().findItem(R.id.nav_administration).setVisible(getAccount().getUserInfo().getIs_admin()); + } else { + // hide first + navigationView.getMenu().findItem(R.id.nav_administration).setVisible(false); + } } @Override @@ -351,13 +351,13 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig if(savedInstanceState == null) { - if(!new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.3")) { - if(tinyDB.getInt("homeScreenId") == 7) { + if(!getAccount().requiresVersion("1.12.3")) { + if(tinyDB.getInt("homeScreenId", 0) == 7) { tinyDB.putInt("homeScreenId", 0); } } - switch(tinyDB.getInt("homeScreenId")) { + switch(tinyDB.getInt("homeScreenId", 0)) { case 1: toolbarTitle.setText(getResources().getString(R.string.pageTitleStarredRepos)); @@ -414,27 +414,25 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); if(!connToInternet) { - if(!tinyDB.getBoolean("noConnection")) { + if(!noConnection) { Toasty.error(ctx, getResources().getString(R.string.checkNetConnection)); } - tinyDB.putBoolean("noConnection", true); + noConnection = true; } else { - loadUserInfo(instanceToken, loginUid); + loadUserInfo(); giteaVersion(); - tinyDB.putBoolean("noConnection", false); + noConnection = false; } Log.e("Network status is: ", String.valueOf(connToInternet)); }, 1500); // Changelog popup int versionCode = AppUtil.getAppBuildNo(appCtx); - if(versionCode > tinyDB.getInt("versionCode")) { tinyDB.putInt("versionCode", versionCode); - tinyDB.putBoolean("versionFlag", true); ChangeLog changelogDialog = new ChangeLog(this); changelogDialog.showDialog(); @@ -448,9 +446,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig @Override public void onButtonClicked(String text) { - - TinyDB tinyDb = TinyDB.getInstance(ctx); - int currentActiveAccountId = tinyDb.getInt("currentActiveAccountId"); + int currentActiveAccountId = tinyDB.getInt("currentActiveAccountId"); if("deleteDrafts".equals(text)) { @@ -518,7 +514,6 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new OrganizationsFragment()).commit(); } else if(id == R.id.nav_profile) { - toolbarTitle.setText(getResources().getString(R.string.navProfile)); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyProfileFragment()).commit(); } @@ -534,7 +529,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig } else if(id == R.id.nav_logout) { - logout(this, ctx); + AppUtil.logout(ctx); overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); } else if(id == R.id.nav_starred_repos) { @@ -567,18 +562,6 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig return true; } - public static void logout(Activity activity, Context ctx) { - - TinyDB tinyDB = TinyDB.getInstance(ctx); - - tinyDB.putBoolean("loggedInMode", false); - tinyDB.remove("basicAuthPassword"); - tinyDB.putBoolean("basicAuthFlag", false); - //tinyDb.clear(); - activity.finish(); - ctx.startActivity(new Intent(ctx, LoginActivity.class)); - } - @Override public boolean onOptionsItemSelected(MenuItem item) { @@ -596,7 +579,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig private void giteaVersion() { - Call callVersion = RetrofitClient.getApiInterface(ctx).getGiteaVersionWithToken(Authorization.get(ctx)); + Call callVersion = RetrofitClient.getApiInterface(ctx).getGiteaVersionWithToken(getAccount().getAuthorization()); callVersion.enqueue(new Callback() { @Override @@ -605,8 +588,8 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig if(responseVersion.code() == 200 && responseVersion.body() != null) { String version = responseVersion.body().getVersion(); - tinyDB.putString("giteaVersion", version); BaseApi.getInstance(ctx, UserAccountsApi.class).updateServerVersion(version, tinyDB.getInt("currentActiveAccountId")); + getAccount().setAccount(BaseApi.getInstance(ctx, UserAccountsApi.class).getAccountById(tinyDB.getInt("currentActiveAccountId"))); } } @@ -617,11 +600,8 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig }); } - private void loadUserInfo(String token, String loginUid) { - - final TinyDB tinyDb = TinyDB.getInstance(appCtx); - - Call call = RetrofitClient.getApiInterface(ctx).getUserInfo(Authorization.get(ctx)); + private void loadUserInfo() { + Call call = RetrofitClient.getApiInterface(ctx).getUserInfo(getAccount().getAuthorization()); call.enqueue(new Callback() { @@ -636,34 +616,16 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig assert userDetails != null; - if(userDetails.getIs_admin() != null) { - - tinyDb.putBoolean("userIsAdmin", userDetails.getIs_admin()); - } - - tinyDb.putString("userLogin", userDetails.getLogin()); - tinyDb.putInt("userId", userDetails.getId()); - - if(!userDetails.getFullname().equals("")) { - - tinyDb.putString("userFullname", userDetails.getFullname()); - } - else { - - tinyDb.putString("userFullname", userDetails.getLogin()); - } - - tinyDb.putString("userEmail", userDetails.getEmail()); - tinyDb.putString("userAvatar", userDetails.getAvatar()); - - if(userDetails.getLang() != null) { - - tinyDb.putString("userLang", userDetails.getLang()); - } - else { - - tinyDb.putString("userLang", ""); + getAccount().setUserInfo(userDetails); + navigationView.getMenu().findItem(R.id.nav_administration).setVisible(userDetails.getIs_admin()); + if(!getAccount().getAccount().getUserName().equals(userDetails.getUsername())) { + // user changed it's name -> update database + int accountId = getAccount().getAccount().getAccountId(); + BaseApi.getInstance(MainActivity.this, UserAccountsApi.class).updateUsername(accountId, + userDetails.getUsername()); + getAccount().setAccount(BaseApi.getInstance(MainActivity.this, UserAccountsApi.class).getAccountById(accountId)); } + if(profileInitListener != null) profileInitListener.onButtonClicked(null); } } else if(response.code() == 401) { @@ -672,7 +634,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig } else { - String toastError = getResources().getString(R.string.genericApiStatusError) + response.code(); + String toastError = getResources().getString(R.string.genericApiError, response.code()); Toasty.error(ctx, toastError); } } @@ -713,4 +675,9 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig }); } + public void setProfileInitListener(BottomSheetListener profileInitListener) { + + this.profileInitListener = profileInitListener; + } + } diff --git a/app/src/main/java/org/mian/gitnex/activities/MergePullRequestActivity.java b/app/src/main/java/org/mian/gitnex/activities/MergePullRequestActivity.java index 4647f7d7..5ad50552 100644 --- a/app/src/main/java/org/mian/gitnex/activities/MergePullRequestActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/MergePullRequestActivity.java @@ -2,6 +2,7 @@ package org.mian.gitnex.activities; import android.annotation.SuppressLint; import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; @@ -14,11 +15,11 @@ import org.mian.gitnex.R; import org.mian.gitnex.actions.PullRequestActions; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.ActivityMergePullRequestBinding; +import org.mian.gitnex.fragments.PullRequestsFragment; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Toasty; -import org.mian.gitnex.helpers.Version; +import org.mian.gitnex.helpers.contexts.IssueContext; import java.util.ArrayList; import java.util.Objects; import retrofit2.Call; @@ -32,9 +33,7 @@ public class MergePullRequestActivity extends BaseActivity { private View.OnClickListener onClickListener; - private String repoOwner; - private String repoName; - private int prIndex; + private IssueContext issue; private ActivityMergePullRequestBinding viewBinding; @@ -49,11 +48,7 @@ public class MergePullRequestActivity extends BaseActivity { viewBinding = ActivityMergePullRequestBinding.inflate(getLayoutInflater()); setContentView(viewBinding.getRoot()); - String repoFullName = tinyDB.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - repoOwner = parts[0]; - repoName = parts[1]; - prIndex = Integer.parseInt(tinyDB.getString("issueNumber")); + issue = IssueContext.fromIntent(getIntent()); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); @@ -65,22 +60,22 @@ public class MergePullRequestActivity extends BaseActivity { setMergeAdapter(); - if(!tinyDB.getString("issueTitle").isEmpty()) { + if(!issue.getPullRequest().getTitle().isEmpty()) { - viewBinding.toolbarTitle.setText(tinyDB.getString("issueTitle")); - viewBinding.mergeTitle.setText(tinyDB.getString("issueTitle") + " (#" + tinyDB.getString("issueNumber") + ")"); + viewBinding.toolbarTitle.setText(issue.getPullRequest().getTitle()); + viewBinding.mergeTitle.setText(issue.getPullRequest().getTitle() + " (#" + issue.getIssueIndex() + ")"); } initCloseListener(); viewBinding.close.setOnClickListener(onClickListener); // if gitea version is greater/equal(1.12.0) than user installed version (installed.higherOrEqual(compareVer)) - if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.0")) { + if(getAccount().requiresVersion("1.12.0")) { viewBinding.deleteBranch.setVisibility(View.VISIBLE); } - if(tinyDB.getString("prMergeable").equals("false")) { + if(!issue.getPullRequest().isMergeable()) { disableProcessButton(); viewBinding.mergeInfoDisabledMessage.setVisibility(View.VISIBLE); @@ -90,7 +85,7 @@ public class MergePullRequestActivity extends BaseActivity { viewBinding.mergeInfoDisabledMessage.setVisibility(View.GONE); } - if(tinyDB.getString("prIsFork").equals("true")) { + if(issue.prIsFork()) { viewBinding.deleteBranchForkInfo.setVisibility(View.VISIBLE); } @@ -108,7 +103,7 @@ public class MergePullRequestActivity extends BaseActivity { viewBinding.mergeButton.setOnClickListener(mergePullRequest); } - if(!tinyDB.getBoolean("canPushPullSource")) { + if(!issue.getPullRequest().getHead().getRepo().getPermissions().isPush()) { viewBinding.deleteBranch.setVisibility(View.GONE); viewBinding.deleteBranchForkInfo.setVisibility(View.GONE); } @@ -123,7 +118,7 @@ public class MergePullRequestActivity extends BaseActivity { mergeList.add(new MergePullRequestSpinner("rebase", getResources().getString(R.string.mergeOptionRebase))); mergeList.add(new MergePullRequestSpinner("rebase-merge", getResources().getString(R.string.mergeOptionRebaseCommit))); // squash merge works only on gitea > v1.11.4 due to a bug - if(new Version(tinyDB.getString("giteaVersion")).higher("1.11.4")) { + if(getAccount().requiresVersion("1.12.0")) { mergeList.add(new MergePullRequestSpinner("squash", getResources().getString(R.string.mergeOptionSquash))); } @@ -174,7 +169,7 @@ public class MergePullRequestActivity extends BaseActivity { MergePullRequest mergePR = new MergePullRequest(Do, mergePRDT, mergeTitle); - Call call = RetrofitClient.getApiInterface(ctx).mergePullRequest(Authorization.get(ctx), repoOwner, repoName, prIndex, mergePR); + Call call = RetrofitClient.getApiInterface(ctx).mergePullRequest(getAccount().getAuthorization(), issue.getRepository().getOwner(), issue.getRepository().getName(), issue.getIssueIndex(), mergePR); call.enqueue(new Callback() { @@ -185,43 +180,24 @@ public class MergePullRequestActivity extends BaseActivity { if(deleteBranch) { - if(tinyDB.getString("prIsFork").equals("true")) { - - String repoFullName = tinyDB.getString("prForkFullName"); + if(issue.prIsFork()) { + String repoFullName = issue.getPullRequest().getHead().getRepo().getFull_name(); String[] parts = repoFullName.split("/"); final String repoOwner = parts[0]; final String repoName = parts[1]; - PullRequestActions.deleteHeadBranch(ctx, repoOwner, repoName, tinyDB.getString("prHeadBranch"), false); - - Toasty.success(ctx, getString(R.string.mergePRSuccessMsg)); - tinyDB.putBoolean("prMerged", true); - tinyDB.putBoolean("resumePullRequests", true); - finish(); + PullRequestActions.deleteHeadBranch(ctx, repoOwner, repoName, issue.getPullRequest().getHead().getRef(), false); } else { - - String repoFullName = tinyDB.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - - PullRequestActions.deleteHeadBranch(ctx, repoOwner, repoName, tinyDB.getString("prHeadBranch"), false); - - Toasty.success(ctx, getString(R.string.mergePRSuccessMsg)); - tinyDB.putBoolean("prMerged", true); - tinyDB.putBoolean("resumePullRequests", true); - finish(); + PullRequestActions.deleteHeadBranch(ctx, issue.getRepository().getOwner(), issue.getRepository().getName(), issue.getPullRequest().getHead().getRef(), false); } } - else { - - Toasty.success(ctx, getString(R.string.mergePRSuccessMsg)); - tinyDB.putBoolean("prMerged", true); - tinyDB.putBoolean("resumePullRequests", true); - finish(); - } + Toasty.success(ctx, getString(R.string.mergePRSuccessMsg)); + Intent result = new Intent(); + PullRequestsFragment.resumePullRequests = true; + setResult(200, result); + finish(); } else if(response.code() == 401) { @@ -268,4 +244,10 @@ public class MergePullRequestActivity extends BaseActivity { viewBinding.mergeButton.setEnabled(true); } + @Override + public void onResume() { + super.onResume(); + issue.getRepository().checkAccountSwitch(this); + } + } diff --git a/app/src/main/java/org/mian/gitnex/activities/MyProfileEmailActivity.java b/app/src/main/java/org/mian/gitnex/activities/MyProfileEmailActivity.java index 9a1a0c83..129b5d75 100644 --- a/app/src/main/java/org/mian/gitnex/activities/MyProfileEmailActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/MyProfileEmailActivity.java @@ -15,10 +15,9 @@ import org.gitnex.tea4j.models.AddEmail; import org.mian.gitnex.R; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.ActivityProfileEmailBinding; +import org.mian.gitnex.fragments.MyProfileEmailsFragment; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; import java.util.ArrayList; import java.util.Arrays; @@ -97,18 +96,17 @@ public class MyProfileEmailActivity extends BaseActivity { List newEmailList = new ArrayList<>(Arrays.asList(newUserEmail.split(","))); disableProcessButton(); - addNewEmail(Authorization.get(ctx), newEmailList); + addNewEmail(getAccount().getAuthorization(), newEmailList); } private void addNewEmail(final String token, List newUserEmail) { AddEmail addEmailFunc = new AddEmail(newUserEmail); - final TinyDB tinyDb = TinyDB.getInstance(appCtx); Call call; call = RetrofitClient - .getApiInterface(appCtx) + .getApiInterface(ctx) .addNewEmail(token, addEmailFunc); call.enqueue(new Callback() { @@ -119,7 +117,7 @@ public class MyProfileEmailActivity extends BaseActivity { if(response.code() == 201) { Toasty.success(ctx, getString(R.string.emailAddedText)); - tinyDb.putBoolean("emailsRefresh", true); + MyProfileEmailsFragment.refreshEmails = true; enableProcessButton(); finish(); } diff --git a/app/src/main/java/org/mian/gitnex/activities/OrganizationDetailActivity.java b/app/src/main/java/org/mian/gitnex/activities/OrganizationDetailActivity.java index 64ee85ef..a69f7fe5 100644 --- a/app/src/main/java/org/mian/gitnex/activities/OrganizationDetailActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/OrganizationDetailActivity.java @@ -28,11 +28,8 @@ import org.mian.gitnex.fragments.OrganizationInfoFragment; import org.mian.gitnex.fragments.OrganizationLabelsFragment; import org.mian.gitnex.fragments.RepositoriesByOrgFragment; import org.mian.gitnex.fragments.TeamsByOrgFragment; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.structs.BottomSheetListener; -import org.mian.gitnex.helpers.Version; -import java.util.List; import java.util.Objects; import io.mikael.urlbuilder.UrlBuilder; import retrofit2.Call; @@ -54,7 +51,7 @@ public class OrganizationDetailActivity extends BaseActivity implements BottomSh setContentView(R.layout.activity_org_detail); - String orgName = tinyDB.getString("orgName"); + String orgName = getIntent().getStringExtra("orgName"); Toolbar toolbar = findViewById(R.id.toolbar); TextView toolbarTitle = findViewById(R.id.toolbar_title); @@ -113,9 +110,9 @@ public class OrganizationDetailActivity extends BaseActivity implements BottomSh mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager)); - if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.16.0")) { + if(getAccount().requiresVersion("1.16.0")) { RetrofitClient.getApiInterface(this) - .getOrgPermissions(Authorization.get(this), tinyDB.getString("loginUid"), orgName).enqueue(new Callback() { + .getOrgPermissions(getAccount().getAuthorization(), getAccount().getAccount().getUserName(), orgName).enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { @@ -173,9 +170,11 @@ public class OrganizationDetailActivity extends BaseActivity implements BottomSh switch (text) { case "repository": - - tinyDB.putBoolean("organizationAction", true); - startActivity(new Intent(OrganizationDetailActivity.this, CreateRepoActivity.class)); + Intent intentRepo = new Intent(this, CreateRepoActivity.class); + intentRepo.putExtra("organizationAction", true); + intentRepo.putExtra("orgName", getIntent().getStringExtra("orgName")); + intentRepo.putExtras(getIntent().getExtras()); + startActivity(intentRepo); break; case "label": @@ -185,16 +184,17 @@ public class OrganizationDetailActivity extends BaseActivity implements BottomSh ctx.startActivity(intent); break; case "team": - - startActivity(new Intent(OrganizationDetailActivity.this, CreateTeamByOrgActivity.class)); + Intent intentTeam = new Intent(OrganizationDetailActivity.this, CreateTeamByOrgActivity.class); + intentTeam.putExtras(getIntent().getExtras()); + startActivity(intentTeam); break; case "copyOrgUrl": - String url = UrlBuilder.fromString(tinyDB.getString("instanceUrl")) + String url = UrlBuilder.fromString(getAccount().getAccount().getInstanceUrl()) .withPath("/") .toString(); ClipboardManager clipboard = (ClipboardManager) Objects.requireNonNull(ctx).getSystemService(Context.CLIPBOARD_SERVICE); - ClipData clip = ClipData.newPlainText("orgUrl", url + tinyDB.getString("orgName")); + ClipData clip = ClipData.newPlainText("orgUrl", url + getIntent().getStringExtra("orgName")); assert clipboard != null; clipboard.setPrimaryClip(clip); Toasty.info(ctx, ctx.getString(R.string.copyIssueUrlToastMsg)); @@ -212,15 +212,7 @@ public class OrganizationDetailActivity extends BaseActivity implements BottomSh @Override public Fragment getItem(int position) { - String orgName; - if(getIntent().getStringExtra("orgName") != null || !Objects.equals(getIntent().getStringExtra("orgName"), "")) { - - orgName = getIntent().getStringExtra("orgName"); - } - else { - - orgName = tinyDB.getString("orgName"); - } + String orgName = getIntent().getStringExtra("orgName"); Fragment fragment = null; switch (position) { diff --git a/app/src/main/java/org/mian/gitnex/activities/OrganizationTeamInfoActivity.java b/app/src/main/java/org/mian/gitnex/activities/OrganizationTeamInfoActivity.java index 98890d7f..55039e04 100644 --- a/app/src/main/java/org/mian/gitnex/activities/OrganizationTeamInfoActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/OrganizationTeamInfoActivity.java @@ -19,7 +19,6 @@ import org.mian.gitnex.databinding.ActivityOrgTeamInfoBinding; import org.mian.gitnex.fragments.BottomSheetOrganizationTeamsFragment; import org.mian.gitnex.fragments.OrganizationTeamInfoMembersFragment; import org.mian.gitnex.fragments.OrganizationTeamInfoPermissionsFragment; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.structs.BottomSheetListener; /** @@ -28,8 +27,7 @@ import org.mian.gitnex.structs.BottomSheetListener; public class OrganizationTeamInfoActivity extends BaseActivity implements BottomSheetListener { - private ActivityOrgTeamInfoBinding binding; - private Teams team; + private Teams team; @SuppressLint("SetTextI18n") @Override @@ -37,7 +35,7 @@ public class OrganizationTeamInfoActivity extends BaseActivity implements Bottom super.onCreate(savedInstanceState); - binding = ActivityOrgTeamInfoBinding.inflate(getLayoutInflater()); + org.mian.gitnex.databinding.ActivityOrgTeamInfoBinding binding = ActivityOrgTeamInfoBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); setSupportActionBar(binding.toolbar); @@ -87,16 +85,6 @@ public class OrganizationTeamInfoActivity extends BaseActivity implements Bottom }).attach(); } - @Override - public void onResume() { - super.onResume(); - TinyDB tinyDb = TinyDB.getInstance(appCtx); - - if(tinyDb.getBoolean("teamActionFlag")) { - tinyDb.putBoolean("teamActionFlag", false); - } - } - @Override public boolean onCreateOptionsMenu(Menu menu) { OrgPermissions permissions = (OrgPermissions) getIntent().getSerializableExtra("permissions"); diff --git a/app/src/main/java/org/mian/gitnex/activities/ProfileActivity.java b/app/src/main/java/org/mian/gitnex/activities/ProfileActivity.java index fdd893c0..2405e462 100644 --- a/app/src/main/java/org/mian/gitnex/activities/ProfileActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/ProfileActivity.java @@ -26,7 +26,6 @@ import org.mian.gitnex.fragments.profile.FollowingFragment; import org.mian.gitnex.fragments.profile.OrganizationsFragment; import org.mian.gitnex.fragments.profile.RepositoriesFragment; import org.mian.gitnex.fragments.profile.StarredRepositoriesFragment; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.structs.BottomSheetListener; import java.util.Objects; @@ -105,7 +104,7 @@ public class ProfileActivity extends BaseActivity implements BottomSheetListener } } - if(!username.equals(tinyDB.getString("userLogin"))) { + if(!username.equals(getAccount().getAccount().getUserName())) { checkFollowStatus(); } } @@ -119,7 +118,7 @@ public class ProfileActivity extends BaseActivity implements BottomSheetListener } private void checkFollowStatus() { - RetrofitClient.getApiInterface(this).checkFollowing(Authorization.get(this), username).enqueue(new Callback() { + RetrofitClient.getApiInterface(this).checkFollowing(getAccount().getAuthorization(), username).enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { @@ -144,10 +143,10 @@ public class ProfileActivity extends BaseActivity implements BottomSheetListener private void followUnfollow() { Call call; if (following) { - call = RetrofitClient.getApiInterface(this).unfollowUser(Authorization.get(this), username); + call = RetrofitClient.getApiInterface(this).unfollowUser(getAccount().getAuthorization(), username); } else { - call = RetrofitClient.getApiInterface(this).followUser(Authorization.get(this), username); + call = RetrofitClient.getApiInterface(this).followUser(getAccount().getAuthorization(), username); } call.enqueue(new Callback() { @@ -234,7 +233,7 @@ public class ProfileActivity extends BaseActivity implements BottomSheetListener @Override public boolean onCreateOptionsMenu(Menu menu) { - if(!username.equals(tinyDB.getString("userLogin"))) { + if(!username.equals(getAccount().getAccount().getUserName())) { getMenuInflater().inflate(R.menu.generic_nav_dotted_menu, menu); } return super.onCreateOptionsMenu(menu); diff --git a/app/src/main/java/org/mian/gitnex/activities/RepoDetailActivity.java b/app/src/main/java/org/mian/gitnex/activities/RepoDetailActivity.java index d17dfadb..701020a3 100644 --- a/app/src/main/java/org/mian/gitnex/activities/RepoDetailActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/RepoDetailActivity.java @@ -18,6 +18,8 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.Toolbar; @@ -25,6 +27,7 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapter; import androidx.viewpager.widget.ViewPager; +import com.google.android.material.progressindicator.LinearProgressIndicator; import com.google.android.material.tabs.TabLayout; import com.google.gson.JsonElement; import org.gitnex.tea4j.models.Branches; @@ -50,9 +53,8 @@ import org.mian.gitnex.fragments.PullRequestsFragment; import org.mian.gitnex.fragments.ReleasesFragment; import org.mian.gitnex.fragments.RepoInfoFragment; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import org.mian.gitnex.helpers.Toasty; -import org.mian.gitnex.helpers.Version; import org.mian.gitnex.structs.BottomSheetListener; import org.mian.gitnex.structs.FragmentRefreshListener; import java.util.ArrayList; @@ -71,6 +73,7 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe private TextView textViewBadgeIssue; private TextView textViewBadgePull; private TextView textViewBadgeRelease; + private Typeface myTypeface; private FragmentRefreshListener fragmentRefreshListener; private FragmentRefreshListener fragmentRefreshListenerPr; @@ -79,12 +82,53 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe private FragmentRefreshListener fragmentRefreshListenerFilterIssuesByMilestone; private FragmentRefreshListener fragmentRefreshListenerReleases; - private String repositoryOwner; - private String repositoryName; - - public static ViewPager mViewPager; + public ViewPager mViewPager; private int tabsCount; + public RepositoryContext repository; + + private final ActivityResultLauncher createReleaseLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), + result -> { + if(result.getResultCode() == 201) { + assert result.getData() != null; + if(result.getData().getBooleanExtra("updateReleases", false)) { + if(fragmentRefreshListenerReleases != null) fragmentRefreshListenerReleases.onRefresh(null); + } + } + }); + + private final ActivityResultLauncher createMilestoneLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), + result -> { + if(result.getResultCode() == 201) { + assert result.getData() != null; + if(result.getData().getBooleanExtra("milestoneCreated", false)) { + if(fragmentRefreshListenerMilestone != null) fragmentRefreshListenerMilestone.onRefresh(repository.getMilestoneState().toString()); + } + } + }); + + private final ActivityResultLauncher editFileLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), + result -> { + if(result.getResultCode() == 200) { + assert result.getData() != null; + if(result.getData().getBooleanExtra("fileModified", false)) { + if(fragmentRefreshListenerFiles != null) fragmentRefreshListenerFiles.onRefresh(repository.getBranchRef()); + } + } + }); + + private final ActivityResultLauncher settingsLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), + result -> { + if(result.getResultCode() == 200) { + assert result.getData() != null; + if(result.getData().getBooleanExtra("nameChanged", false)) { + recreate(); + } + } + }); + + + @Override public void onCreate(Bundle savedInstanceState) { @@ -92,33 +136,17 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe setContentView(R.layout.activity_repo_detail); - String[] repoNameParts = tinyDB.getString("repoFullName").split("/"); - repositoryOwner = repoNameParts[0]; - repositoryName = repoNameParts[1]; + repository = RepositoryContext.fromIntent(getIntent()); Toolbar toolbar = findViewById(R.id.toolbar); TextView toolbarTitle = findViewById(R.id.toolbar_title); - ImageView repoTypeToolbar = findViewById(R.id.repoTypeToolbar); - - if(tinyDB.getString("repoType").equalsIgnoreCase("private")) { - repoTypeToolbar.setVisibility(View.VISIBLE); - } - else { - repoTypeToolbar.setVisibility(View.GONE); - } - toolbarTitle.setText(repositoryName); + toolbarTitle.setText(repository.getName()); setSupportActionBar(toolbar); - Objects.requireNonNull(getSupportActionBar()).setTitle(repositoryName); + Objects.requireNonNull(getSupportActionBar()).setTitle(repository.getName()); getSupportActionBar().setDisplayHomeAsUpEnabled(true); - tinyDB.putString("repoIssuesState", "open"); - tinyDB.putString("repoPrState", "open"); - tinyDB.putString("milestoneState", "open"); - - Typeface myTypeface; - switch(tinyDB.getInt("customFontId", -1)) { case 0: @@ -137,208 +165,16 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe toolbarTitle.setTypeface(myTypeface); - TabLayout tabLayout = findViewById(R.id.tabs); + getRepoInfo(getAccount().getAuthorization(), repository.getOwner(), repository.getName()); - ViewGroup viewGroup = (ViewGroup) tabLayout.getChildAt(0); - tabsCount = viewGroup.getChildCount(); - - for(int j = 0; j < tabsCount; j++) { - - ViewGroup vgTab = (ViewGroup) viewGroup.getChildAt(j); - int tabChildCount = vgTab.getChildCount(); - - for(int i = 0; i < tabChildCount; i++) { - - View tabViewChild = vgTab.getChildAt(i); - - if(tabViewChild instanceof TextView) { - - ((TextView) tabViewChild).setTypeface(myTypeface); - } - } - } - - // Only show collaborators tab, if you have permission to - View collaboratorTab = viewGroup.getChildAt(7); - - if(tinyDB.getBoolean("isRepoAdmin") || new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.0")) { - - collaboratorTab.setVisibility(View.VISIBLE); - } - else { - - tabsCount--; - collaboratorTab.setVisibility(View.GONE); - } - - mViewPager = findViewById(R.id.container); - - mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); - tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager)); - - SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); - mViewPager.setAdapter(mSectionsPagerAdapter); - - if(tinyDB.getBoolean("enableCounterBadges")) { - - @SuppressLint("InflateParams") View tabHeader2 = LayoutInflater.from(this).inflate(R.layout.badge_issue, null); - textViewBadgeIssue = tabHeader2.findViewById(R.id.counterBadgeIssue); - - @SuppressLint("InflateParams") View tabHeader4 = LayoutInflater.from(this).inflate(R.layout.badge_pull, null); - textViewBadgePull = tabHeader4.findViewById(R.id.counterBadgePull); - - @SuppressLint("InflateParams") View tabHeader6 = LayoutInflater.from(this).inflate(R.layout.badge_release, null); - textViewBadgeRelease = tabHeader6.findViewById(R.id.counterBadgeRelease); - - textViewBadgeIssue.setVisibility(View.GONE); - textViewBadgePull.setVisibility(View.GONE); - textViewBadgeRelease.setVisibility(View.GONE); - - getRepoInfo(Authorization.get(ctx), repositoryOwner, repositoryName); - ColorStateList textColor = tabLayout.getTabTextColors(); - - // Issue count - if(textViewBadgeIssue.getText() != "") { - - TabLayout.Tab tabOpenIssues = tabLayout.getTabAt(2); - Objects.requireNonNull(tabLayout.getTabAt(2)).setCustomView(tabHeader2); - assert tabOpenIssues != null; // FIXME This should be cleaned up - TextView openIssueTabView = Objects.requireNonNull(tabOpenIssues.getCustomView()).findViewById(R.id.counterBadgeIssueText); - openIssueTabView.setTextColor(textColor); - } - - // Pull request count - if(textViewBadgePull.getText() != "") { // only show if API returned a number - - Objects.requireNonNull(tabLayout.getTabAt(3)).setCustomView(tabHeader4); - TabLayout.Tab tabOpenPulls = tabLayout.getTabAt(3); - assert tabOpenPulls != null; // FIXME This should be cleaned up - TextView openPullTabView = Objects.requireNonNull(tabOpenPulls.getCustomView()).findViewById(R.id.counterBadgePullText); - openPullTabView.setTextColor(textColor); - } - - // Release count - if(new Version("1.11.4").less(tinyDB.getString("giteaVersion"))) { - - if(textViewBadgeRelease.getText() != "") { // only show if API returned a number - - Objects.requireNonNull(tabLayout.getTabAt(4)).setCustomView(tabHeader6); - TabLayout.Tab tabOpenRelease = tabLayout.getTabAt(4); - assert tabOpenRelease != null; // FIXME This should be cleaned up - TextView openReleaseTabView = Objects.requireNonNull(tabOpenRelease.getCustomView()).findViewById(R.id.counterBadgeReleaseText); - openReleaseTabView.setTextColor(textColor); - } - } - } - - Intent mainIntent = getIntent(); - String goToSection = mainIntent.getStringExtra("goToSection"); - String goToSectionType = mainIntent.getStringExtra("goToSectionType"); - - if(goToSection != null) { - - mainIntent.removeExtra("goToSection"); - mainIntent.removeExtra("goToSectionType"); - - switch(goToSectionType) { - case "branchesList": - RepoDetailActivity.mViewPager.setCurrentItem(1); - chooseBranch(); - break; - case "branch": - RepoDetailActivity.mViewPager.setCurrentItem(1); - String selectedBranch = mainIntent.getStringExtra("selectedBranch"); - tinyDB.putString("repoBranch", selectedBranch); - if(getFragmentRefreshListenerFiles() != null) { - getFragmentRefreshListenerFiles().onRefresh(selectedBranch); - } - break; - case "file": - RepoDetailActivity.mViewPager.setCurrentItem(1); - String branch1 = mainIntent.getStringExtra("branch"); - tinyDB.putString("repoBranch", branch1); - if(getFragmentRefreshListenerFiles() != null) { - getFragmentRefreshListenerFiles().onRefresh(branch1); - } - Intent intent = new Intent(ctx, FileViewActivity.class); - intent.putExtra("file", mainIntent.getSerializableExtra("file")); - startActivity(intent); - break; - case "dir": - RepoDetailActivity.mViewPager.setCurrentItem(1); - String branch2 = mainIntent.getStringExtra("branch"); - tinyDB.putString("repoBranch", branch2); - if(getFragmentRefreshListenerFiles() != null) { - getFragmentRefreshListenerFiles().onRefresh(branch2); - } - //((SectionsPagerAdapter) Objects.requireNonNull(RepoDetailActivity.mViewPager.getAdapter())).getItem(1); - break; - case "commitsList": - RepoDetailActivity.mViewPager.setCurrentItem(1); - String branch = mainIntent.getStringExtra("branchName"); - tinyDB.putString("repoBranch", branch); - if(getFragmentRefreshListenerFiles() != null) { - getFragmentRefreshListenerFiles().onRefresh(branch); - } - Intent intent1 = new Intent(ctx, CommitsActivity.class); - intent1.putExtra("branchName", branch); - ctx.startActivity(intent1); - break; - case "commit": - Intent intent2 = new Intent(ctx, CommitDetailActivity.class); - intent2.putExtra("sha", mainIntent.getStringExtra("sha")); - ctx.startActivity(intent2); - break; - case "issue": - RepoDetailActivity.mViewPager.setCurrentItem(2); - break; - case "issueNew": - RepoDetailActivity.mViewPager.setCurrentItem(2); - startActivity(new Intent(RepoDetailActivity.this, CreateIssueActivity.class)); - break; - case "pull": - RepoDetailActivity.mViewPager.setCurrentItem(3); - break; - case "pullNew": - RepoDetailActivity.mViewPager.setCurrentItem(3); - startActivity(new Intent(RepoDetailActivity.this, CreatePullRequestActivity.class)); - break; - case "releases": - RepoDetailActivity.mViewPager.setCurrentItem(4); - break; - case "newRelease": - RepoDetailActivity.mViewPager.setCurrentItem(4); - startActivity(new Intent(RepoDetailActivity.this, CreateReleaseActivity.class)); - break; - case "milestones": - RepoDetailActivity.mViewPager.setCurrentItem(5); - break; - case "milestonesNew": - RepoDetailActivity.mViewPager.setCurrentItem(5); - startActivity(new Intent(RepoDetailActivity.this, CreateMilestoneActivity.class)); - break; - case "labels": - RepoDetailActivity.mViewPager.setCurrentItem(6); - break; - case "settings": - startActivity(new Intent(RepoDetailActivity.this, RepositorySettingsActivity.class)); - break; - } - } - - checkRepositoryStarStatus(Authorization.get(ctx), repositoryOwner, repositoryName); - checkRepositoryWatchStatus(Authorization.get(ctx), repositoryOwner, repositoryName); + checkRepositoryStarStatus(getAccount().getAuthorization(), repository.getOwner(), repository.getName()); + checkRepositoryWatchStatus(getAccount().getAuthorization(), repository.getOwner(), repository.getName()); } @Override public void onResume() { - super.onResume(); - - if(tinyDB.getBoolean("enableCounterIssueBadge")) { - - getRepoInfo(Authorization.get(ctx), repositoryOwner, repositoryName); - } + repository.checkAccountSwitch(this); } @Override @@ -361,8 +197,10 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe } else if(id == R.id.repoMenu) { - BottomSheetRepoFragment bottomSheet = new BottomSheetRepoFragment(); - bottomSheet.show(getSupportFragmentManager(), "repoBottomSheet"); + if(repository.hasRepository()) { + BottomSheetRepoFragment bottomSheet = new BottomSheetRepoFragment(repository); + bottomSheet.show(getSupportFragmentManager(), "repoBottomSheet"); + } return true; } else if(id == R.id.filter) { @@ -390,12 +228,12 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe } else if(id == R.id.branchCommits) { - Intent intent = new Intent(ctx, CommitsActivity.class); - intent.putExtra("branchName", tinyDB.getString("repoBranch")); + Intent intent = repository.getIntent(ctx, CommitsActivity.class); + ctx.startActivity(intent); return true; } - else if(id == R.id.filterReleases && new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.15.0")) { + else if(id == R.id.filterReleases && getAccount().requiresVersion("1.15.0")) { BottomSheetReleasesTagsFragment bottomSheetReleasesTagsFragment = new BottomSheetReleasesTagsFragment(); bottomSheetReleasesTagsFragment.show(getSupportFragmentManager(), "repoFilterReleasesMenuBottomSheet"); return true; @@ -412,19 +250,19 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe case "label": - startActivity(new Intent(RepoDetailActivity.this, CreateLabelActivity.class)); + startActivity(repository.getIntent(ctx, CreateLabelActivity.class)); break; case "newIssue": - startActivity(new Intent(RepoDetailActivity.this, CreateIssueActivity.class)); + startActivity(repository.getIntent(ctx, CreateIssueActivity.class)); break; case "newMilestone": - startActivity(new Intent(RepoDetailActivity.this, CreateMilestoneActivity.class)); + createMilestoneLauncher.launch(repository.getIntent(ctx, CreateMilestoneActivity.class)); break; case "addCollaborator": - startActivity(new Intent(RepoDetailActivity.this, AddCollaboratorToRepositoryActivity.class)); + startActivity(repository.getIntent(ctx, AddCollaboratorToRepositoryActivity.class)); break; case "chooseBranch": @@ -432,71 +270,70 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe break; case "createRelease": - startActivity(new Intent(RepoDetailActivity.this, CreateReleaseActivity.class)); + createReleaseLauncher.launch(repository.getIntent(ctx, CreateReleaseActivity.class)); break; case "openWebRepo": - AppUtil.openUrlInBrowser(this, tinyDB.getString("repoHtmlUrl")); + AppUtil.openUrlInBrowser(this, repository.getRepository().getHtml_url()); break; case "shareRepo": Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); sharingIntent.setType("text/plain"); - sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, tinyDB.getString("repoHtmlUrl")); - sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, tinyDB.getString("repoHtmlUrl")); - startActivity(Intent.createChooser(sharingIntent, tinyDB.getString("repoHtmlUrl"))); + sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, repository.getRepository().getHtml_url()); + sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, repository.getRepository().getHtml_url()); + startActivity(Intent.createChooser(sharingIntent, repository.getRepository().getHtml_url())); break; case "copyRepoUrl": ClipboardManager clipboard = (ClipboardManager) Objects.requireNonNull(ctx).getSystemService(Context.CLIPBOARD_SERVICE); - ClipData clip = ClipData.newPlainText("repoUrl", tinyDB.getString("repoHtmlUrl")); + ClipData clip = ClipData.newPlainText("repoUrl", repository.getRepository().getHtml_url()); assert clipboard != null; clipboard.setPrimaryClip(clip); Toasty.info(ctx, ctx.getString(R.string.copyIssueUrlToastMsg)); break; case "newFile": - startActivity(new Intent(RepoDetailActivity.this, CreateFileActivity.class)); + editFileLauncher.launch(repository.getIntent(ctx, CreateFileActivity.class)); break; case "filterByMilestone": filterIssuesByMilestone(); break; case "openIssues": - + repository.setIssueState(RepositoryContext.State.OPEN); if(getFragmentRefreshListener() != null) { getFragmentRefreshListener().onRefresh("open"); } break; case "closedIssues": - + repository.setIssueState(RepositoryContext.State.CLOSED); if(getFragmentRefreshListener() != null) { getFragmentRefreshListener().onRefresh("closed"); } break; case "openPr": - + repository.setPrState(RepositoryContext.State.OPEN); if(getFragmentRefreshListenerPr() != null) { - getFragmentRefreshListenerPr().onRefresh("open"); } break; case "closedPr": - + repository.setPrState(RepositoryContext.State.CLOSED); if(getFragmentRefreshListenerPr() != null) { getFragmentRefreshListenerPr().onRefresh("closed"); } break; case "openMilestone": - + repository.setMilestoneState(RepositoryContext.State.OPEN); if(getFragmentRefreshListenerMilestone() != null) { getFragmentRefreshListenerMilestone().onRefresh("open"); } break; case "closedMilestone": - + repository.setMilestoneState(RepositoryContext.State.CLOSED); if(getFragmentRefreshListenerMilestone() != null) { getFragmentRefreshListenerMilestone().onRefresh("closed"); @@ -504,11 +341,11 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe break; case "repoSettings": - startActivity(new Intent(RepoDetailActivity.this, RepositorySettingsActivity.class)); + settingsLauncher.launch(repository.getIntent(ctx, RepositorySettingsActivity.class)); break; case "newPullRequest": - startActivity(new Intent(RepoDetailActivity.this, CreatePullRequestActivity.class)); + startActivity(repository.getIntent(ctx, CreatePullRequestActivity.class)); break; case "tags": if(getFragmentRefreshListenerReleases() != null) { @@ -520,6 +357,18 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe getFragmentRefreshListenerReleases().onRefresh("releases"); } break; + case "unwatch": + repository.setWatched(false); + break; + case "watch": + repository.setWatched(true); + break; + case "unstar": + repository.setStarred(false); + break; + case "star": + repository.setStarred(true); + break; } } @@ -531,7 +380,7 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe Call> call = RetrofitClient .getApiInterface(ctx) - .getMilestones(Authorization.get(ctx), repositoryOwner, repositoryName, 1, 50, "open"); + .getMilestones(getAccount().getAuthorization(), repository.getOwner(), repository.getName(), 1, 50, "open"); call.enqueue(new Callback>() { @@ -550,11 +399,8 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe for(int i = 0; i < response.body().size(); i++) { milestones = response.body().get(i); milestonesList.add(milestones.getTitle()); - } - - for(int j = 0; j < milestonesList.size(); j++) { - if(tinyDB.getString("issueMilestoneFilterId").equals(milestonesList.get(j))) { - selectedMilestone = j; + if(repository.getIssueMilestoneFilterName().equals(milestones.getTitle())) { + selectedMilestone = i; } } @@ -563,7 +409,7 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe pBuilder.setSingleChoiceItems(milestonesList.toArray(new String[0]), selectedMilestone, (dialogInterface, i) -> { - tinyDB.putString("issueMilestoneFilterId", milestonesList.get(i)); + repository.setIssueMilestoneFilterName(response.body().get(i).getTitle()); if(getFragmentRefreshListenerFilterIssuesByMilestone() != null) { getFragmentRefreshListenerFilterIssuesByMilestone().onRefresh(milestonesList.get(i)); @@ -587,12 +433,13 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe private void chooseBranch() { Dialog progressDialog = new Dialog(this); + progressDialog.setCancelable(false); progressDialog.setContentView(R.layout.custom_progress_loader); progressDialog.show(); Call> call = RetrofitClient .getApiInterface(ctx) - .getBranches(Authorization.get(ctx), repositoryOwner, repositoryName); + .getBranches(getAccount().getAuthorization(), repository.getOwner(), repository.getName()); call.enqueue(new Callback>() { @@ -611,7 +458,7 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe Branches branches = response.body().get(i); branchesList.add(branches.getName()); - if(tinyDB.getString("repoBranch").equals(branches.getName())) { + if(repository.getBranchRef().equals(branches.getName())) { selectedBranch = i; } } @@ -621,7 +468,7 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe pBuilder.setSingleChoiceItems(branchesList.toArray(new String[0]), selectedBranch, (dialogInterface, i) -> { - tinyDB.putString("repoBranch", branchesList.get(i)); + repository.setBranchRef(branchesList.get(i)); if(getFragmentRefreshListenerFiles() != null) { getFragmentRefreshListenerFiles().onRefresh(branchesList.get(i)); @@ -645,45 +492,43 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe public class SectionsPagerAdapter extends FragmentStatePagerAdapter { SectionsPagerAdapter(FragmentManager fm) { - super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); } @NonNull @Override public Fragment getItem(int position) { - Fragment fragment = null; switch(position) { case 0: // Repository details - return RepoInfoFragment.newInstance(repositoryOwner, repositoryName); + return RepoInfoFragment.newInstance(repository); case 1: // Files - return FilesFragment.newInstance(repositoryOwner, repositoryName, tinyDB.getString("repoBranch")); + return FilesFragment.newInstance(repository); case 2: // Issues - fragment = new IssuesFragment(); + fragment = IssuesFragment.newInstance(repository); break; case 3: // Pull requests - fragment = new PullRequestsFragment(); + fragment = PullRequestsFragment.newInstance(repository); break; case 4: // Releases - return ReleasesFragment.newInstance(repositoryOwner, repositoryName); + return ReleasesFragment.newInstance(repository); case 5: // Milestones - fragment = new MilestonesFragment(); + fragment = MilestonesFragment.newInstance(repository); break; case 6: // Labels - return LabelsFragment.newInstance(repositoryOwner, repositoryName); + return LabelsFragment.newInstance(repository); case 7: // Collaborators - return CollaboratorsFragment.newInstance(repositoryOwner, repositoryName); + return CollaboratorsFragment.newInstance(repository); } assert fragment != null; @@ -699,6 +544,13 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe private void getRepoInfo(String token, final String owner, String repo) { + LinearProgressIndicator loading = findViewById(R.id.loadingIndicator); + if(repository.hasRepository()) { + loading.setVisibility(View.GONE); + initWithRepo(); + return; + } + Call call = RetrofitClient.getApiInterface(ctx).getUserRepository(token, owner, repo); call.enqueue(new Callback() { @@ -706,49 +558,213 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { UserRepositories repoInfo = response.body(); + loading.setVisibility(View.GONE); if(response.code() == 200) { - - if(tinyDB.getBoolean("enableCounterBadges")) { - - assert repoInfo != null; - - if(repoInfo.getOpen_issues_count() != null) { - - textViewBadgeIssue.setVisibility(View.VISIBLE); - textViewBadgeIssue.setText(repoInfo.getOpen_issues_count()); - } - - if(repoInfo.getOpen_pull_count() != null) { - - textViewBadgePull.setVisibility(View.VISIBLE); - textViewBadgePull.setText(repoInfo.getOpen_pull_count()); - } - - if(repoInfo.getRelease_count() != null) { - - textViewBadgeRelease.setVisibility(View.VISIBLE); - textViewBadgeRelease.setText(repoInfo.getRelease_count()); - } - } - + assert repoInfo != null; + repository.setRepository(repoInfo); + initWithRepo(); } else { - + Toasty.error(ctx, getString(R.string.genericError)); Log.e("onFailure", String.valueOf(response.code())); + finish(); } } @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { - + Toasty.error(ctx, getString(R.string.genericError)); Log.e("onFailure", t.toString()); + finish(); } }); } + private void initWithRepo() { + repository.setBranchRef(repository.getRepository().getDefault_branch()); + + ImageView repoTypeToolbar = findViewById(R.id.repoTypeToolbar); + if(repository.getRepository().isPrivateFlag()) { + repoTypeToolbar.setVisibility(View.VISIBLE); + } else { + repoTypeToolbar.setVisibility(View.GONE); + } + + TabLayout tabLayout = findViewById(R.id.tabs); + tabLayout.setVisibility(View.VISIBLE); + + ViewGroup viewGroup = (ViewGroup) tabLayout.getChildAt(0); + tabsCount = viewGroup.getChildCount(); + + for(int j = 0; j < tabsCount; j++) { + + ViewGroup vgTab = (ViewGroup) viewGroup.getChildAt(j); + int tabChildCount = vgTab.getChildCount(); + + for(int i = 0; i < tabChildCount; i++) { + + View tabViewChild = vgTab.getChildAt(i); + + if(tabViewChild instanceof TextView) { + + ((TextView) tabViewChild).setTypeface(myTypeface); + } + } + } + + mViewPager = findViewById(R.id.container); + mViewPager.setVisibility(View.VISIBLE); + + mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager)); + + SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); + mViewPager.setAdapter(mSectionsPagerAdapter); + + if(tinyDB.getBoolean("enableCounterBadges", true)) { + @SuppressLint("InflateParams") View tabHeader2 = LayoutInflater.from(ctx).inflate(R.layout.badge_issue, null); + textViewBadgeIssue = tabHeader2.findViewById(R.id.counterBadgeIssue); + + @SuppressLint("InflateParams") View tabHeader4 = LayoutInflater.from(ctx).inflate(R.layout.badge_pull, null); + textViewBadgePull = tabHeader4.findViewById(R.id.counterBadgePull); + + @SuppressLint("InflateParams") View tabHeader6 = LayoutInflater.from(ctx).inflate(R.layout.badge_release, null); + textViewBadgeRelease = tabHeader6.findViewById(R.id.counterBadgeRelease); + + ColorStateList textColor = tabLayout.getTabTextColors(); + + if(repository.getRepository().getOpen_issues_count() != null) { + textViewBadgeIssue.setVisibility(View.VISIBLE); + textViewBadgeIssue.setText(repository.getRepository().getOpen_issues_count()); + + TabLayout.Tab tabOpenIssues = tabLayout.getTabAt(2); + assert tabOpenIssues != null; + + tabOpenIssues.setCustomView(tabHeader2); + TextView openIssueTabView = Objects.requireNonNull(tabOpenIssues.getCustomView()).findViewById(R.id.counterBadgeIssueText); + openIssueTabView.setTextColor(textColor); + } else { + textViewBadgeIssue.setVisibility(View.GONE); + } + + if(repository.getRepository().getOpen_pull_count() != null) { + textViewBadgePull.setVisibility(View.VISIBLE); + textViewBadgePull.setText(repository.getRepository().getOpen_pull_count()); + + Objects.requireNonNull(tabLayout.getTabAt(3)).setCustomView(tabHeader4); + TabLayout.Tab tabOpenPulls = tabLayout.getTabAt(3); + assert tabOpenPulls != null; // FIXME This should be cleaned up + TextView openPullTabView = Objects.requireNonNull(tabOpenPulls.getCustomView()).findViewById(R.id.counterBadgePullText); + openPullTabView.setTextColor(textColor); + } else { + textViewBadgePull.setVisibility(View.GONE); + } + + if(repository.getRepository().getRelease_count() != null) { + textViewBadgeRelease.setVisibility(View.VISIBLE); + textViewBadgeRelease.setText(repository.getRepository().getRelease_count()); + + Objects.requireNonNull(tabLayout.getTabAt(4)).setCustomView(tabHeader6); + TabLayout.Tab tabOpenRelease = tabLayout.getTabAt(4); + assert tabOpenRelease != null; // FIXME This should be cleaned up + TextView openReleaseTabView = Objects.requireNonNull(tabOpenRelease.getCustomView()).findViewById(R.id.counterBadgeReleaseText); + openReleaseTabView.setTextColor(textColor); + } else { + textViewBadgeRelease.setVisibility(View.GONE); + } + } + + Intent mainIntent = getIntent(); + String goToSection = mainIntent.getStringExtra("goToSection"); + String goToSectionType = mainIntent.getStringExtra("goToSectionType"); + + if(goToSection != null) { + mainIntent.removeExtra("goToSection"); + mainIntent.removeExtra("goToSectionType"); + + switch(goToSectionType) { + case "branchesList": + mViewPager.setCurrentItem(1); + chooseBranch(); + break; + case "branch": + mViewPager.setCurrentItem(1); + String selectedBranch = mainIntent.getStringExtra("selectedBranch"); + repository.setBranchRef(selectedBranch); + if(getFragmentRefreshListenerFiles() != null) { + getFragmentRefreshListenerFiles().onRefresh(selectedBranch); + } + break; + case "file": + mViewPager.setCurrentItem(1); + String branch1 = mainIntent.getStringExtra("branch"); + repository.setBranchRef(branch1); + if(getFragmentRefreshListenerFiles() != null) { + getFragmentRefreshListenerFiles().onRefresh(branch1); + } + Intent intent = repository.getIntent(ctx, FileViewActivity.class); + intent.putExtra("file", mainIntent.getSerializableExtra("file")); + startActivity(intent); + break; + case "dir": + mViewPager.setCurrentItem(1); + String branch2 = mainIntent.getStringExtra("branch"); + repository.setBranchRef(branch2); + if(getFragmentRefreshListenerFiles() != null) { + getFragmentRefreshListenerFiles().onRefresh(branch2); + } + break; + case "commitsList": + mViewPager.setCurrentItem(1); + String branch = mainIntent.getStringExtra("branchName"); + repository.setBranchRef(branch); + if(getFragmentRefreshListenerFiles() != null) { + getFragmentRefreshListenerFiles().onRefresh(branch); + } + Intent intent1 = repository.getIntent(ctx, CommitsActivity.class); + ctx.startActivity(intent1); + break; + case "issue": + mViewPager.setCurrentItem(2); + break; + case "issueNew": + mViewPager.setCurrentItem(2); + startActivity(repository.getIntent(ctx, CreateIssueActivity.class)); + break; + case "pull": + mViewPager.setCurrentItem(3); + break; + case "pullNew": + mViewPager.setCurrentItem(3); + startActivity(repository.getIntent(ctx, CreatePullRequestActivity.class)); + break; + case "releases": + mViewPager.setCurrentItem(4); + break; + case "newRelease": + mViewPager.setCurrentItem(4); + createReleaseLauncher.launch(repository.getIntent(ctx, CreateReleaseActivity.class)); + break; + case "milestones": + mViewPager.setCurrentItem(5); + break; + case "milestonesNew": + mViewPager.setCurrentItem(5); + createMilestoneLauncher.launch(repository.getIntent(ctx, CreateMilestoneActivity.class)); + break; + case "labels": + mViewPager.setCurrentItem(6); + break; + case "settings": + settingsLauncher.launch(repository.getIntent(ctx, RepositorySettingsActivity.class)); + break; + } + } + } + private void checkRepositoryStarStatus(String instanceToken, final String owner, String repo) { Call call = RetrofitClient.getApiInterface(ctx).checkRepoStarStatus(instanceToken, owner, repo); @@ -757,7 +773,7 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe @Override public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { - tinyDB.putInt("repositoryStarStatus", response.code()); + repository.setStarred(response.code() == 204); } @Override @@ -780,17 +796,11 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { if(response.code() == 200) { - assert response.body() != null; - - if(response.body().getSubscribed()) { - - tinyDB.putBoolean("repositoryWatchStatus", true); - } + repository.setWatched(response.body().getSubscribed()); } else { - - tinyDB.putBoolean("repositoryWatchStatus", false); + repository.setWatched(false); } } @@ -803,19 +813,6 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe } - @Override - protected void onDestroy() { - super.onDestroy(); - if(!isFinishing()) { - return; - } - if(getIntent().getBooleanExtra("switchAccountBackOnFinish", false)) { - UserAccount a = BaseApi.getInstance(this, UserAccountsApi.class) - .getAccountById(getIntent().getIntExtra("oldAccountId", 0)); - AppUtil.switchToAccount(this, a); - } - } - // Issues milestone filter interface public FragmentRefreshListener getFragmentRefreshListenerFilterIssuesByMilestone() { return fragmentRefreshListenerFilterIssuesByMilestone; } 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 b8aab2a0..f8f79791 100644 --- a/app/src/main/java/org/mian/gitnex/activities/RepoForksActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/RepoForksActivity.java @@ -25,10 +25,7 @@ import org.mian.gitnex.R; import org.mian.gitnex.adapters.RepoForksAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.ActivityRepoForksBinding; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; -import org.mian.gitnex.helpers.TinyDB; -import org.mian.gitnex.helpers.Version; import java.util.ArrayList; import java.util.List; import retrofit2.Call; @@ -64,8 +61,6 @@ public class RepoForksActivity extends BaseActivity { Toolbar toolbar = activityRepoForksBinding.toolbar; setSupportActionBar(toolbar); - TinyDB tinyDb = TinyDB.getInstance(appCtx); - String repoFullNameForForks = getIntent().getStringExtra("repoFullNameForForks"); assert repoFullNameForForks != null; String[] parts = repoFullNameForForks.split("/"); @@ -86,7 +81,8 @@ public class RepoForksActivity extends BaseActivity { }); // if gitea is 1.12 or higher use the new limit (resultLimitNewGiteaInstances) - if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12")) { + if(getAccount().requiresVersion("1.12")) { + resultLimit = Constants.resultLimitNewGiteaInstances; } @@ -98,7 +94,7 @@ public class RepoForksActivity extends BaseActivity { swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); - loadInitial(Authorization.get(ctx), repoOwner, repoName, pageSize, resultLimit); + loadInitial(getAccount().getAuthorization(), repoOwner, repoName, pageSize, resultLimit); adapter.notifyDataChanged(); }, 200)); @@ -109,7 +105,7 @@ public class RepoForksActivity extends BaseActivity { if(forksList.size() == resultLimit || pageSize == resultLimit) { int page = (forksList.size() + resultLimit) / resultLimit; - loadMore(Authorization.get(ctx), repoOwner, repoName, page, resultLimit); + loadMore(getAccount().getAuthorization(), repoOwner, repoName, page, resultLimit); } })); @@ -117,7 +113,7 @@ public class RepoForksActivity extends BaseActivity { recyclerView.setLayoutManager(new LinearLayoutManager(ctx)); recyclerView.setAdapter(adapter); - loadInitial(Authorization.get(ctx), repoOwner, repoName, pageSize, resultLimit); + loadInitial(getAccount().getAuthorization(), repoOwner, repoName, pageSize, resultLimit); } private void loadInitial(String instanceToken, String repoOwner, String repoName, int pageSize, int resultLimit) { diff --git a/app/src/main/java/org/mian/gitnex/activities/RepoStargazersActivity.java b/app/src/main/java/org/mian/gitnex/activities/RepoStargazersActivity.java index ae8fd057..59aed397 100644 --- a/app/src/main/java/org/mian/gitnex/activities/RepoStargazersActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/RepoStargazersActivity.java @@ -10,7 +10,7 @@ import androidx.lifecycle.ViewModelProvider; import org.mian.gitnex.R; import org.mian.gitnex.adapters.UserGridAdapter; import org.mian.gitnex.databinding.ActivityRepoStargazersBinding; -import org.mian.gitnex.helpers.Authorization; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import org.mian.gitnex.viewmodels.RepoStargazersViewModel; /** @@ -25,6 +25,8 @@ public class RepoStargazersActivity extends BaseActivity { private GridView mGridView; private ProgressBar mProgressBar; + private RepositoryContext repository; + @Override public void onCreate(Bundle savedInstanceState) { @@ -39,17 +41,16 @@ public class RepoStargazersActivity extends BaseActivity { mGridView = activityRepoStargazersBinding.gridView; mProgressBar = activityRepoStargazersBinding.progressBar; - String repoFullNameForStars = getIntent().getStringExtra("repoFullNameForStars"); - String[] parts = repoFullNameForStars.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; + repository = RepositoryContext.fromIntent(getIntent()); + final String repoOwner = repository.getOwner(); + final String repoName = repository.getName(); initCloseListener(); closeActivity.setOnClickListener(onClickListener); toolbarTitle.setText(R.string.repoStargazersInMenu); - fetchDataAsync(Authorization.get(ctx), repoOwner, repoName); + fetchDataAsync(getAccount().getAuthorization(), repoOwner, repoName); } private void fetchDataAsync(String instanceToken, String repoOwner, String repoName) { @@ -82,4 +83,10 @@ public class RepoStargazersActivity extends BaseActivity { onClickListener = view -> finish(); } + @Override + public void onResume() { + super.onResume(); + repository.checkAccountSwitch(this); + } + } diff --git a/app/src/main/java/org/mian/gitnex/activities/RepoWatchersActivity.java b/app/src/main/java/org/mian/gitnex/activities/RepoWatchersActivity.java index dc22ab3e..d03e9639 100644 --- a/app/src/main/java/org/mian/gitnex/activities/RepoWatchersActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/RepoWatchersActivity.java @@ -10,7 +10,7 @@ import androidx.lifecycle.ViewModelProvider; import org.mian.gitnex.R; import org.mian.gitnex.adapters.UserGridAdapter; import org.mian.gitnex.databinding.ActivityRepoWatchersBinding; -import org.mian.gitnex.helpers.Authorization; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import org.mian.gitnex.viewmodels.RepoWatchersViewModel; /** @@ -25,6 +25,8 @@ public class RepoWatchersActivity extends BaseActivity { private GridView mGridView; private ProgressBar mProgressBar; + private RepositoryContext repository; + @Override public void onCreate(Bundle savedInstanceState) { @@ -39,17 +41,16 @@ public class RepoWatchersActivity extends BaseActivity { mGridView = activityRepoWatchersBinding.gridView; mProgressBar = activityRepoWatchersBinding.progressBar; - String repoFullNameForWatchers = getIntent().getStringExtra("repoFullNameForWatchers"); - String[] parts = repoFullNameForWatchers.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; + repository = RepositoryContext.fromIntent(getIntent()); + final String repoOwner = repository.getOwner(); + final String repoName = repository.getName(); initCloseListener(); closeActivity.setOnClickListener(onClickListener); toolbarTitle.setText(R.string.repoWatchersInMenu); - fetchDataAsync(Authorization.get(ctx), repoOwner, repoName); + fetchDataAsync(getAccount().getAuthorization(), repoOwner, repoName); } private void fetchDataAsync(String instanceToken, String repoOwner, String repoName) { @@ -82,4 +83,10 @@ public class RepoWatchersActivity extends BaseActivity { onClickListener = view -> finish(); } + @Override + public void onResume() { + super.onResume(); + repository.checkAccountSwitch(this); + } + } diff --git a/app/src/main/java/org/mian/gitnex/activities/RepositorySettingsActivity.java b/app/src/main/java/org/mian/gitnex/activities/RepositorySettingsActivity.java index 1d5abfb6..d2ff4695 100644 --- a/app/src/main/java/org/mian/gitnex/activities/RepositorySettingsActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/RepositorySettingsActivity.java @@ -21,7 +21,7 @@ import org.mian.gitnex.databinding.CustomRepositoryDeleteDialogBinding; import org.mian.gitnex.databinding.CustomRepositoryEditPropertiesDialogBinding; import org.mian.gitnex.databinding.CustomRepositoryTransferDialogBinding; import org.mian.gitnex.helpers.Toasty; -import org.mian.gitnex.helpers.Version; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import retrofit2.Call; import retrofit2.Callback; @@ -40,11 +40,7 @@ public class RepositorySettingsActivity extends BaseActivity { private Dialog dialogTransferRepository; private View.OnClickListener onClickListener; - private String loginUid; - private String instanceToken; - - private String repositoryOwner; - private String repositoryName; + private RepositoryContext repository; @Override public void onCreate(Bundle savedInstanceState) { @@ -54,12 +50,7 @@ public class RepositorySettingsActivity extends BaseActivity { viewBinding = ActivityRepositorySettingsBinding.inflate(getLayoutInflater()); setContentView(viewBinding.getRoot()); - loginUid = tinyDB.getString("loginUid"); - String repoFullName = tinyDB.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - repositoryOwner = parts[0]; - repositoryName = parts[1]; - instanceToken = "token " + tinyDB.getString(loginUid + "-token"); + repository = RepositoryContext.fromIntent(getIntent()); ImageView closeActivity = findViewById(R.id.close); @@ -67,7 +58,7 @@ public class RepositorySettingsActivity extends BaseActivity { closeActivity.setOnClickListener(onClickListener); // require gitea 1.12 or higher - if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.0")) { + if(getAccount().requiresVersion("1.12.0")) { viewBinding.transferOwnerFrame.setVisibility(View.VISIBLE); } @@ -100,7 +91,7 @@ public class RepositorySettingsActivity extends BaseActivity { String newOwner = String.valueOf(transferRepoBinding.ownerNameForTransfer.getText()); String repoName = String.valueOf(transferRepoBinding.repoNameForTransfer.getText()); - if(!repositoryName.equals(repoName)) { + if(!repository.getName().equals(repoName)) { Toasty.error(ctx, getString(R.string.repoSettingsDeleteError)); } @@ -124,7 +115,7 @@ public class RepositorySettingsActivity extends BaseActivity { Call transferCall = RetrofitClient .getApiInterface(ctx) - .transferRepository(instanceToken, repositoryOwner, repositoryName, repositoryTransfer); + .transferRepository(getAccount().getAuthorization(), repository.getOwner(), repository.getName(), repositoryTransfer); transferCall.enqueue(new Callback() { @@ -140,7 +131,7 @@ public class RepositorySettingsActivity extends BaseActivity { Toasty.success(ctx, getString(R.string.repoTransferSuccess)); finish(); - BaseApi.getInstance(ctx, RepositoriesApi.class).deleteRepository((int) tinyDB.getLong("repositoryId", 0)); + BaseApi.getInstance(ctx, RepositoriesApi.class).deleteRepository(repository.getRepositoryId()); Intent intent = new Intent(RepositorySettingsActivity.this, MainActivity.class); RepositorySettingsActivity.this.startActivity(intent); } @@ -187,7 +178,7 @@ public class RepositorySettingsActivity extends BaseActivity { deleteRepoBinding.delete.setOnClickListener(deleteRepo -> { - if(!repositoryName.equals(String.valueOf(deleteRepoBinding.repoNameForDeletion.getText()))) { + if(!repository.getName().equals(String.valueOf(deleteRepoBinding.repoNameForDeletion.getText()))) { Toasty.error(ctx, getString(R.string.repoSettingsDeleteError)); } @@ -205,7 +196,7 @@ public class RepositorySettingsActivity extends BaseActivity { Call deleteCall = RetrofitClient .getApiInterface(ctx) - .deleteRepository(instanceToken, repositoryOwner, repositoryName); + .deleteRepository(getAccount().getAuthorization(), repository.getOwner(), repository.getName()); deleteCall.enqueue(new Callback() { @@ -221,7 +212,7 @@ public class RepositorySettingsActivity extends BaseActivity { Toasty.success(ctx, getString(R.string.repoDeletionSuccess)); finish(); - BaseApi.getInstance(ctx, RepositoriesApi.class).deleteRepository((int) tinyDB.getLong("repositoryId", 0)); + BaseApi.getInstance(ctx, RepositoriesApi.class).deleteRepository(repository.getRepositoryId()); Intent intent = new Intent(RepositorySettingsActivity.this, MainActivity.class); RepositorySettingsActivity.this.startActivity(intent); } @@ -259,75 +250,47 @@ public class RepositorySettingsActivity extends BaseActivity { dialogProp.setContentView(view); propBinding.cancel.setOnClickListener(editProperties -> dialogProp.dismiss()); + UserRepositories repoInfo = repository.getRepository(); - Call call = RetrofitClient - .getApiInterface(ctx) - .getUserRepository(instanceToken, repositoryOwner, repositoryName); + propBinding.progressBar.setVisibility(View.GONE); + propBinding.mainView.setVisibility(View.VISIBLE); - call.enqueue(new Callback() { - @Override - public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { + assert repoInfo != null; + propBinding.repoName.setText(repoInfo.getName()); + propBinding.repoWebsite.setText(repoInfo.getWebsite()); + propBinding.repoDescription.setText(repoInfo.getDescription()); + propBinding.repoPrivate.setChecked(repoInfo.getPrivateFlag()); + propBinding.repoAsTemplate.setChecked(repoInfo.isTemplate()); - UserRepositories repoInfo = response.body(); + propBinding.repoEnableIssues.setChecked(repoInfo.getHas_issues()); - propBinding.progressBar.setVisibility(View.GONE); - propBinding.mainView.setVisibility(View.VISIBLE); - - if (response.code() == 200) { - - assert repoInfo != null; - propBinding.repoName.setText(repoInfo.getName()); - propBinding.repoWebsite.setText(repoInfo.getWebsite()); - propBinding.repoDescription.setText(repoInfo.getDescription()); - propBinding.repoPrivate.setChecked(repoInfo.getPrivateFlag()); - propBinding.repoAsTemplate.setChecked(repoInfo.isTemplate()); - - propBinding.repoEnableIssues.setChecked(repoInfo.getHas_issues()); - - propBinding.repoEnableIssues.setOnCheckedChangeListener((buttonView, isChecked) -> { - - if (isChecked) { - - propBinding.repoEnableTimer.setVisibility(View.VISIBLE); - } - else { - - propBinding.repoEnableTimer.setVisibility(View.GONE); - } - }); - - if(repoInfo.getInternal_tracker() != null) { - - propBinding.repoEnableTimer.setChecked(repoInfo.getInternal_tracker().isEnable_time_tracker()); - } - else { - - propBinding.repoEnableTimer.setVisibility(View.GONE); - } - - propBinding.repoEnableWiki.setChecked(repoInfo.isHas_wiki()); - propBinding.repoEnablePr.setChecked(repoInfo.isHas_pull_requests()); - propBinding.repoEnableMerge.setChecked(repoInfo.isAllow_merge_commits()); - propBinding.repoEnableRebase.setChecked(repoInfo.isAllow_rebase()); - propBinding.repoEnableSquash.setChecked(repoInfo.isAllow_squash_merge()); - propBinding.repoEnableForceMerge.setChecked(repoInfo.isAllow_rebase_explicit()); - - } - else { - - Toasty.error(ctx, getString(R.string.genericError)); - } + propBinding.repoEnableIssues.setOnCheckedChangeListener((buttonView, isChecked) -> { + if (isChecked) { + propBinding.repoEnableTimer.setVisibility(View.VISIBLE); } - - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - - Toasty.error(ctx, getString(R.string.genericServerResponseError)); + else { + propBinding.repoEnableTimer.setVisibility(View.GONE); } }); + if(repoInfo.getInternal_tracker() != null) { + + propBinding.repoEnableTimer.setChecked(repoInfo.getInternal_tracker().isEnable_time_tracker()); + } + else { + + propBinding.repoEnableTimer.setVisibility(View.GONE); + } + + propBinding.repoEnableWiki.setChecked(repoInfo.isHas_wiki()); + propBinding.repoEnablePr.setChecked(repoInfo.isHas_pull_requests()); + propBinding.repoEnableMerge.setChecked(repoInfo.isAllow_merge_commits()); + propBinding.repoEnableRebase.setChecked(repoInfo.isAllow_rebase()); + propBinding.repoEnableSquash.setChecked(repoInfo.isAllow_squash_merge()); + propBinding.repoEnableForceMerge.setChecked(repoInfo.isAllow_rebase_explicit()); + propBinding.save.setOnClickListener(saveProperties -> saveRepositoryProperties(String.valueOf(propBinding.repoName.getText()), String.valueOf(propBinding.repoWebsite.getText()), String.valueOf(propBinding.repoDescription.getText()), @@ -363,7 +326,7 @@ public class RepositorySettingsActivity extends BaseActivity { Call propsCall = RetrofitClient .getApiInterface(ctx) - .updateRepositoryProperties(instanceToken, repositoryOwner, repositoryName, repoProps); + .updateRepositoryProperties(getAccount().getAuthorization(), repository.getOwner(), repository.getName(), repoProps); propsCall.enqueue(new Callback() { @@ -375,18 +338,17 @@ public class RepositorySettingsActivity extends BaseActivity { if (response.code() == 200) { - tinyDB.putBoolean("hasIssues", repoEnableIssues); - tinyDB.putBoolean("hasPullRequests", repoEnablePr); - dialogProp.dismiss(); Toasty.success(ctx, getString(R.string.repoPropertiesSaveSuccess)); + assert response.body() != null; + repository.setRepository(response.body()); - if(!repositoryName.equals(repoName)) { - + if(!repository.getName().equals(repoName)) { + BaseApi.getInstance(ctx, RepositoriesApi.class).updateRepositoryOwnerAndName(repository.getOwner(), repoName, repository.getRepositoryId()); + Intent result = new Intent(); + result.putExtra("nameChanged", true); + setResult(200, result); finish(); - BaseApi.getInstance(ctx, RepositoriesApi.class).updateRepositoryOwnerAndName(repositoryOwner, repoName, (int) tinyDB.getLong("repositoryId", 0)); - Intent intent = new Intent(RepositorySettingsActivity.this, MainActivity.class); - RepositorySettingsActivity.this.startActivity(intent); } } else { @@ -411,4 +373,10 @@ public class RepositorySettingsActivity extends BaseActivity { onClickListener = view -> finish(); } + @Override + public void onResume() { + super.onResume(); + repository.checkAccountSwitch(this); + } + } diff --git a/app/src/main/java/org/mian/gitnex/activities/SettingsAppearanceActivity.java b/app/src/main/java/org/mian/gitnex/activities/SettingsAppearanceActivity.java index c543e5ab..07f09b9a 100644 --- a/app/src/main/java/org/mian/gitnex/activities/SettingsAppearanceActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/SettingsAppearanceActivity.java @@ -3,7 +3,6 @@ package org.mian.gitnex.activities; import android.app.Dialog; import android.app.TimePickerDialog; import android.os.Bundle; -import android.text.format.DateFormat; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; @@ -14,6 +13,7 @@ import androidx.fragment.app.DialogFragment; import com.google.android.material.switchmaterial.SwitchMaterial; import org.mian.gitnex.R; import org.mian.gitnex.databinding.ActivitySettingsAppearanceBinding; +import org.mian.gitnex.fragments.SettingsFragment; import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; @@ -69,11 +69,15 @@ public class SettingsAppearanceActivity extends BaseActivity { if(darkMinute.length() == 1) darkMinute = "0" + darkMinute; if(darkHour.length() == 1) darkHour = "0" + darkHour; + timeSelectedChoice = tinyDB.getInt("timeId"); + customFontSelectedChoice = tinyDB.getInt("customFontId", 1); + themeSelectedChoice = tinyDB.getInt("themeId"); + activitySettingsAppearanceBinding.lightThemeSelectedTime.setText(ctx.getResources().getString(R.string.settingsThemeTimeSelectedHint, lightHour, lightMinute)); activitySettingsAppearanceBinding.darkThemeSelectedTime.setText(ctx.getResources().getString(R.string.settingsThemeTimeSelectedHint, darkHour, darkMinute)); - activitySettingsAppearanceBinding.tvDateTimeSelected.setText(tinyDB.getString("timeStr")); + activitySettingsAppearanceBinding.tvDateTimeSelected.setText(themeList[themeSelectedChoice]); activitySettingsAppearanceBinding.customFontSelected.setText(tinyDB.getString("customFontStr", "Manrope")); activitySettingsAppearanceBinding.themeSelected.setText(tinyDB.getString("themeStr", "Dark")); @@ -86,11 +90,7 @@ public class SettingsAppearanceActivity extends BaseActivity { lightTimeFrame.setVisibility(View.GONE); } - timeSelectedChoice = tinyDB.getInt("timeId"); - customFontSelectedChoice = tinyDB.getInt("customFontId", 1); - themeSelectedChoice = tinyDB.getInt("themeId"); - - counterBadgesSwitch.setChecked(tinyDB.getBoolean("enableCounterBadges")); + counterBadgesSwitch.setChecked(tinyDB.getBoolean("enableCounterBadges", true)); // counter badge switcher counterBadgesSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> { @@ -112,10 +112,9 @@ public class SettingsAppearanceActivity extends BaseActivity { themeSelectedChoice = i; activitySettingsAppearanceBinding.themeSelected.setText(themeList[i]); - tinyDB.putString("themeStr", themeList[i]); tinyDB.putInt("themeId", i); - tinyDB.putBoolean("refreshParent", true); + SettingsFragment.refreshParent = true; this.recreate(); this.overridePendingTransition(0, 0); dialogInterfaceTheme.dismiss(); @@ -151,7 +150,7 @@ public class SettingsAppearanceActivity extends BaseActivity { tinyDB.putString("customFontStr", customFontList[i]); tinyDB.putInt("customFontId", i); - tinyDB.putBoolean("refreshParent", true); + SettingsFragment.refreshParent = true; this.recreate(); this.overridePendingTransition(0, 0); dialogInterfaceCustomFont.dismiss(); @@ -217,7 +216,7 @@ public class SettingsAppearanceActivity extends BaseActivity { public void onTimeSet(TimePicker view, int hourOfDay, int minute) { db.putInt("lightThemeTimeHour", hourOfDay); db.putInt("lightThemeTimeMinute", minute); - db.putBoolean("refreshParent", true); + SettingsFragment.refreshParent = true; requireActivity().overridePendingTransition(0, 0); this.dismiss(); Toasty.success(requireActivity().getApplicationContext(), requireContext().getResources().getString(R.string.settingsSave)); @@ -242,7 +241,7 @@ public class SettingsAppearanceActivity extends BaseActivity { public void onTimeSet(TimePicker view, int hourOfDay, int minute) { db.putInt("darkThemeTimeHour", hourOfDay); db.putInt("darkThemeTimeMinute", minute); - db.putBoolean("refreshParent", true); + SettingsFragment.refreshParent = true; requireActivity().overridePendingTransition(0, 0); this.dismiss(); Toasty.success(requireActivity().getApplicationContext(), requireContext().getResources().getString(R.string.settingsSave)); diff --git a/app/src/main/java/org/mian/gitnex/activities/SettingsDraftsActivity.java b/app/src/main/java/org/mian/gitnex/activities/SettingsDraftsActivity.java index f6fa3d76..f6070af5 100644 --- a/app/src/main/java/org/mian/gitnex/activities/SettingsDraftsActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/SettingsDraftsActivity.java @@ -28,7 +28,7 @@ public class SettingsDraftsActivity extends BaseActivity { initCloseListener(); closeActivity.setOnClickListener(onClickListener); - activitySettingsDraftsBinding.commentsDeletionSwitch.setChecked(tinyDB.getBoolean("draftsCommentsDeletionEnabled")); + activitySettingsDraftsBinding.commentsDeletionSwitch.setChecked(tinyDB.getBoolean("draftsCommentsDeletionEnabled", true)); // delete comments on submit switcher activitySettingsDraftsBinding.commentsDeletionSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> { diff --git a/app/src/main/java/org/mian/gitnex/activities/SettingsGeneralActivity.java b/app/src/main/java/org/mian/gitnex/activities/SettingsGeneralActivity.java index 8f4213f3..bc1f8052 100644 --- a/app/src/main/java/org/mian/gitnex/activities/SettingsGeneralActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/SettingsGeneralActivity.java @@ -44,7 +44,7 @@ public class SettingsGeneralActivity extends BaseActivity { String[] appHomeDefaultScreenNew = getResources().getStringArray(R.array.appDefaultHomeScreenNew); - if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.3")) { + if(getAccount().requiresVersion("1.12.3")) { appHomeDefaultScreen = appHomeDefaultScreenNew; } @@ -55,7 +55,7 @@ public class SettingsGeneralActivity extends BaseActivity { if(homeScreenSelectedChoice == 0) { - homeScreenSelectedChoice = tinyDB.getInt("homeScreenId"); + homeScreenSelectedChoice = tinyDB.getInt("homeScreenId", 0); viewBinding.homeScreenSelected.setText(getResources().getString(R.string.navMyRepos)); } diff --git a/app/src/main/java/org/mian/gitnex/activities/SettingsReportsActivity.java b/app/src/main/java/org/mian/gitnex/activities/SettingsReportsActivity.java index c6366225..f3f8b850 100644 --- a/app/src/main/java/org/mian/gitnex/activities/SettingsReportsActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/SettingsReportsActivity.java @@ -28,7 +28,7 @@ public class SettingsReportsActivity extends BaseActivity { initCloseListener(); closeActivity.setOnClickListener(onClickListener); - activitySettingsReportsBinding.crashReportsSwitch.setChecked(tinyDB.getBoolean("crashReportingEnabled")); + activitySettingsReportsBinding.crashReportsSwitch.setChecked(tinyDB.getBoolean("crashReportingEnabled", true)); // crash reports switcher activitySettingsReportsBinding.crashReportsSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> { 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 2c221015..2f750f98 100644 --- a/app/src/main/java/org/mian/gitnex/activities/SettingsSecurityActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/SettingsSecurityActivity.java @@ -16,6 +16,7 @@ import com.google.android.material.switchmaterial.SwitchMaterial; import org.apache.commons.io.FileUtils; import org.mian.gitnex.R; import org.mian.gitnex.databinding.ActivitySettingsSecurityBinding; +import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.ssl.MemorizingTrustManager; import java.io.File; @@ -64,15 +65,8 @@ public class SettingsSecurityActivity extends BaseActivity { cacheSizeDataList = getResources().getStringArray(R.array.cacheSizeList); cacheSizeImagesList = getResources().getStringArray(R.array.cacheSizeList); - if(!tinyDB.getString("cacheSizeStr").isEmpty()) { - - cacheSizeDataSelected.setText(tinyDB.getString("cacheSizeStr")); - } - - if(!tinyDB.getString("cacheSizeImagesStr").isEmpty()) { - - cacheSizeImagesSelected.setText(tinyDB.getString("cacheSizeImagesStr")); - } + cacheSizeDataSelected.setText(tinyDB.getString("cacheSizeStr", getString(R.string.cacheSizeDataSelectionSelectedText))); + cacheSizeImagesSelected.setText(tinyDB.getString("cacheSizeImagesStr", getString(R.string.cacheSizeImagesSelectionSelectedText))); if(cacheSizeDataSelectedChoice == 0) { @@ -84,7 +78,7 @@ public class SettingsSecurityActivity extends BaseActivity { cacheSizeImagesSelectedChoice = tinyDB.getInt("cacheSizeImagesId"); } - switchBiometric.setChecked(tinyDB.getBoolean("biometricStatus")); + switchBiometric.setChecked(tinyDB.getBoolean("biometricStatus", false)); // biometric switcher switchBiometric.setOnCheckedChangeListener((buttonView, isChecked) -> { @@ -237,14 +231,7 @@ public class SettingsSecurityActivity extends BaseActivity { builder.setPositiveButton(R.string.menuDeleteText, (dialog, which) -> { appCtx.getSharedPreferences(MemorizingTrustManager.KEYSTORE_NAME, Context.MODE_PRIVATE).edit().remove(MemorizingTrustManager.KEYSTORE_KEY).apply(); - - tinyDB.putBoolean("loggedInMode", false); - tinyDB.remove("basicAuthPassword"); - tinyDB.putBoolean("basicAuthFlag", false); - - Intent loginActivityIntent = new Intent().setClass(appCtx, LoginActivity.class); - loginActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - appCtx.startActivity(loginActivityIntent); + AppUtil.logout(this); }); builder.setNeutralButton(R.string.cancelButton, (dialog, which) -> dialog.dismiss()); diff --git a/app/src/main/java/org/mian/gitnex/activities/SettingsTranslationActivity.java b/app/src/main/java/org/mian/gitnex/activities/SettingsTranslationActivity.java index f8df2174..abf87396 100644 --- a/app/src/main/java/org/mian/gitnex/activities/SettingsTranslationActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/SettingsTranslationActivity.java @@ -10,6 +10,7 @@ import android.widget.TextView; import androidx.appcompat.app.AlertDialog; import org.mian.gitnex.R; import org.mian.gitnex.databinding.ActivitySettingsTranslationBinding; +import org.mian.gitnex.fragments.SettingsFragment; import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.Toasty; import java.util.LinkedHashMap; @@ -54,9 +55,8 @@ public class SettingsTranslationActivity extends BaseActivity { AppUtil.openUrlInBrowser(this, getResources().getString(R.string.crowdInLink)); }); - tvLanguageSelected.setText(tinyDB.getString("localeStr")); - langSelectedChoice = tinyDB.getInt("langId"); + tvLanguageSelected.setText(langs.get(langs.keySet().toArray(new String[0])[langSelectedChoice])); // language dialog langFrame.setOnClickListener(view -> { @@ -69,11 +69,10 @@ public class SettingsTranslationActivity extends BaseActivity { lBuilder.setSingleChoiceItems(langs.values().toArray(new String[0]), langSelectedChoice, (dialogInterface, i) -> { String selectedLanguage = langs.keySet().toArray(new String[0])[i]; - tinyDB.putString("localeStr", langs.get(selectedLanguage)); tinyDB.putInt("langId", i); tinyDB.putString("locale", selectedLanguage); - tinyDB.putBoolean("refreshParent", true); + SettingsFragment.refreshParent = true; this.overridePendingTransition(0, 0); dialogInterface.dismiss(); Toasty.success(appCtx, getResources().getString(R.string.settingsSave)); diff --git a/app/src/main/java/org/mian/gitnex/adapters/AdminCronTasksAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/AdminCronTasksAdapter.java index d8626211..57594fe2 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/AdminCronTasksAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/AdminCronTasksAdapter.java @@ -14,6 +14,7 @@ import com.google.gson.JsonElement; import org.apache.commons.lang3.StringUtils; import org.gitnex.tea4j.models.CronTasks; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.TimeHelper; @@ -31,7 +32,6 @@ import retrofit2.Callback; public class AdminCronTasksAdapter extends RecyclerView.Adapter { private final List tasksList; - private static TinyDB tinyDb; static class CronTasksViewHolder extends RecyclerView.ViewHolder { @@ -45,7 +45,7 @@ public class AdminCronTasksAdapter extends RecyclerView.Adapter tasksListMain) { - - tinyDb = TinyDB.getInstance(ctx); + public AdminCronTasksAdapter(List tasksListMain) { this.tasksList = tasksListMain; } @@ -117,12 +115,9 @@ public class AdminCronTasksAdapter extends RecyclerView.Adapter call = RetrofitClient .getApiInterface(ctx) - .adminRunCronTask(instanceToken, taskName); + .adminRunCronTask(((BaseActivity) ctx).getAccount().getAuthorization(), taskName); call.enqueue(new Callback() { diff --git a/app/src/main/java/org/mian/gitnex/adapters/UserSearchAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/CollaboratorSearchAdapter.java similarity index 78% rename from app/src/main/java/org/mian/gitnex/adapters/UserSearchAdapter.java rename to app/src/main/java/org/mian/gitnex/adapters/CollaboratorSearchAdapter.java index ac368599..677f38f7 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/UserSearchAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/CollaboratorSearchAdapter.java @@ -17,14 +17,14 @@ import org.gitnex.tea4j.models.Collaborators; import org.gitnex.tea4j.models.UserInfo; import org.mian.gitnex.R; import org.mian.gitnex.actions.CollaboratorActions; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.ProfileActivity; import org.mian.gitnex.clients.PicassoService; 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.RoundedTransformation; -import org.mian.gitnex.helpers.TinyDB; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.List; import retrofit2.Call; import retrofit2.Callback; @@ -34,17 +34,19 @@ import retrofit2.Response; * Author M M Arif */ -public class UserSearchAdapter extends RecyclerView.Adapter { +public class CollaboratorSearchAdapter extends RecyclerView.Adapter { private final List usersSearchList; private final Context context; + private final RepositoryContext repository; - public UserSearchAdapter(List dataList, Context ctx) { + public CollaboratorSearchAdapter(List dataList, Context ctx, RepositoryContext repository) { this.context = ctx; this.usersSearchList = dataList; + this.repository = repository; } - class UserSearchViewHolder extends RecyclerView.ViewHolder { + class CollaboratorSearchViewHolder extends RecyclerView.ViewHolder { private UserInfo userInfo; @@ -57,7 +59,7 @@ public class UserSearchAdapter extends RecyclerView.Adapter { - - }) + pBuilder.setSingleChoiceItems(permissionList, permissionSelectedChoice, null) .setCancelable(false) .setNegativeButton(R.string.cancelButton, null) .setPositiveButton(R.string.addButton, (dialog, which) -> { @@ -80,20 +80,14 @@ public class UserSearchAdapter extends RecyclerView.Adapter { - AlertDialogs.collaboratorRemoveDialog(context, userInfo.getUsername(), - context.getResources().getString(R.string.removeCollaboratorDialogTitle), - context.getResources().getString(R.string.removeCollaboratorMessage), - context.getResources().getString(R.string.removeButton), - context.getResources().getString(R.string.cancelButton), "fa"); - }); + addCollaboratorButtonRemove.setOnClickListener(v -> AlertDialogs.collaboratorRemoveDialog(context, userInfo.getUsername(), repository)); userAvatar.setOnClickListener(loginId -> { Intent intent = new Intent(context, ProfileActivity.class); @@ -111,13 +105,13 @@ public class UserSearchAdapter extends RecyclerView.Adapter 0) { - TinyDB tinyDb = TinyDB.getInstance(context); - final String loginUid = tinyDb.getString("loginUid"); - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; + final String loginUid = ((BaseActivity) context).getAccount().getAccount().getUserName(); Call call = RetrofitClient .getApiInterface(context) - .checkRepoCollaborator(Authorization.get(context), repoOwner, repoName, currentItem.getUsername()); + .checkRepoCollaborator(((BaseActivity) context).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), currentItem.getUsername()); call.enqueue(new Callback() { @@ -157,7 +146,7 @@ public class UserSearchAdapter extends RecyclerView.Adapter call, @NonNull Response response) { if(response.code() == 204) { - if(!currentItem.getUsername().equals(loginUid) && !currentItem.getUsername().equals(repoOwner)) { + if(!currentItem.getUsername().equals(loginUid) && !currentItem.getUsername().equals(repository.getOwner())) { holder.addCollaboratorButtonRemove.setVisibility(View.VISIBLE); } else { @@ -165,7 +154,7 @@ public class UserSearchAdapter extends RecyclerView.Adapter { - Intent intent = new Intent(context, CommitDetailActivity.class); + Intent intent = ((CommitsActivity) context).repository.getIntent(context, CommitDetailActivity.class); intent.putExtra("sha", commitsModel.getSha()); context.startActivity(intent); }); diff --git a/app/src/main/java/org/mian/gitnex/adapters/DiffAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/DiffAdapter.java index c7f1a5d4..e085ca7b 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/DiffAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/DiffAdapter.java @@ -12,6 +12,7 @@ import androidx.fragment.app.FragmentManager; import org.mian.gitnex.R; import org.mian.gitnex.fragments.BottomSheetReplyFragment; import org.mian.gitnex.helpers.AppUtil; +import org.mian.gitnex.helpers.contexts.IssueContext; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -25,6 +26,7 @@ public class DiffAdapter extends BaseAdapter { private final Context context; private final FragmentManager fragmentManager; private final List lines; + private final IssueContext issue; private final List selectedLines; private final Typeface typeface; @@ -36,11 +38,12 @@ public class DiffAdapter extends BaseAdapter { private static int COLOR_SELECTED; private static int COLOR_FONT; - public DiffAdapter(Context context, FragmentManager fragmentManager, List lines, String type) { + public DiffAdapter(Context context, FragmentManager fragmentManager, List lines, IssueContext issue, String type) { this.context = context; this.fragmentManager = fragmentManager; this.lines = lines; + this.issue = issue; this.type = type; selectedLines = new ArrayList<>(); @@ -120,8 +123,8 @@ public class DiffAdapter extends BaseAdapter { bundle.putString("commentBody", stringBuilder.toString()); bundle.putBoolean("cursorToEnd", true); - BottomSheetReplyFragment.newInstance(bundle).show(fragmentManager, "replyBottomSheet"); - } + BottomSheetReplyFragment.newInstance(bundle, issue).show(fragmentManager, "replyBottomSheet"); + } return true; 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 ebdc20a8..99bf3c1c 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/DraftsAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/DraftsAdapter.java @@ -22,8 +22,9 @@ 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.Markdown; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; +import org.mian.gitnex.helpers.contexts.IssueContext; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.List; /** @@ -56,7 +57,7 @@ public class DraftsAdapter extends RecyclerView.Adapter { int getDraftId = draftWithRepository.getDraftId(); - deleteDraft(getAdapterPosition()); + deleteDraft(getBindingAdapterPosition()); DraftsApi draftsApi = BaseApi.getInstance(context, DraftsApi.class); assert draftsApi != null; @@ -66,11 +67,13 @@ public class DraftsAdapter extends RecyclerView.Adapter { - Bundle bundle = new Bundle(); + RepositoryContext repository = new RepositoryContext(draftWithRepository.getRepositoryOwner(), draftWithRepository.getRepositoryName(), context); + repository.setRepositoryId(draftWithRepository.getRepositoryId()); + IssueContext issue = new IssueContext(repository, draftWithRepository.getIssueId(), draftWithRepository.getIssueType()); + Bundle bundle = issue.getBundle(); bundle.putString("commentBody", draftWithRepository.getDraftText()); bundle.putString("issueNumber", String.valueOf(draftWithRepository.getIssueId())); - bundle.putString("repositoryId", String.valueOf(draftWithRepository.getRepositoryId())); bundle.putString("draftTitle", repoInfo.getText().toString()); bundle.putString("commentId", draftWithRepository.getCommentId()); bundle.putString("draftId", String.valueOf(draftWithRepository.getDraftId())); @@ -79,14 +82,20 @@ public class DraftsAdapter extends RecyclerView.Adapter context.startActivity(new Intent(context, IssueDetailActivity.class))); + BottomSheetReplyFragment bottomSheetReplyFragment = BottomSheetReplyFragment.newInstance(bundle, issue); + bottomSheetReplyFragment.setOnInteractedListener(() -> { + Intent i = new IssueContext( + new RepositoryContext( + draftWithRepository.getRepositoryOwner(), + draftWithRepository.getRepositoryName(), + context + ), + draftWithRepository.getIssueId(), + draftWithRepository.getIssueType() + ).getIntent(context, IssueDetailActivity.class); + i.putExtra("openedFromLink", "true"); + context.startActivity(i); + }); bottomSheetReplyFragment.show(fragmentManager, "replyBottomSheet"); }); diff --git a/app/src/main/java/org/mian/gitnex/adapters/ExploreIssuesAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/ExploreIssuesAdapter.java index bd561c7d..387238e8 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/ExploreIssuesAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/ExploreIssuesAdapter.java @@ -14,6 +14,7 @@ import androidx.core.text.HtmlCompat; import androidx.recyclerview.widget.RecyclerView; import org.gitnex.tea4j.models.Issues; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.IssueDetailActivity; import org.mian.gitnex.activities.ProfileActivity; import org.mian.gitnex.clients.PicassoService; @@ -25,6 +26,8 @@ import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TinyDB; +import org.mian.gitnex.helpers.contexts.IssueContext; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import org.ocpsoft.prettytime.PrettyTime; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -104,36 +107,34 @@ public class ExploreIssuesAdapter extends RecyclerView.Adapter { - Intent intent = new Intent(context, IssueDetailActivity.class); - intent.putExtra("issueNumber", issue.getNumber()); - intent.putExtra("openedFromLink", "true"); - - tinyDb.putString("issueNumber", String.valueOf(issue.getNumber())); - tinyDb.putString("issueType", "Issue"); - - tinyDb.putString("repoFullName", issue.getRepository().getFull_name()); - String[] parts = issue.getRepository().getFull_name().split("/"); final String repoOwner = parts[0]; final String repoName = parts[1]; - int currentActiveAccountId = tinyDb.getInt("currentActiveAccountId"); + + + int currentActiveAccountId = ((BaseActivity) context).getAccount().getAccount().getAccountId(); RepositoriesApi repositoryData = BaseApi.getInstance(context, RepositoriesApi.class); assert repositoryData != null; Integer count = repositoryData.checkRepository(currentActiveAccountId, repoOwner, repoName); - if(count == 0) { + RepositoryContext repo = new RepositoryContext(repoOwner, repoName, context); + if(count == 0) { long id = repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName); - tinyDb.putLong("repositoryId", id); + repo.setRepositoryId((int) id); } else { - Repository data = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName); - tinyDb.putLong("repositoryId", data.getRepositoryId()); + repo.setRepositoryId(data.getRepositoryId()); } + Intent intent = new IssueContext( + issue, + repo + ).getIntent(context, IssueDetailActivity.class); + intent.putExtra("openedFromLink", "true"); context.startActivity(intent); }); @@ -155,7 +156,7 @@ public class ExploreIssuesAdapter extends RecyclerView.Adapter { - Context context = v.getContext(); - Intent intent = new Intent(context, RepoDetailActivity.class); - intent.putExtra("repoFullName", userRepositories.getFullName()); - - tinyDb.putString("repoFullName", userRepositories.getFullName()); - tinyDb.putBoolean("resumeIssues", true); - tinyDb.putBoolean("isRepoAdmin", isRepoAdmin.isChecked()); - tinyDb.putString("repoBranch", userRepositories.getDefault_branch()); - - if(userRepositories.getPrivateFlag()) { - tinyDb.putString("repoType", context.getResources().getString(R.string.strPrivate)); - } - else { - tinyDb.putString("repoType", context.getResources().getString(R.string.strPublic)); - } - - String[] parts = userRepositories.getFullName().split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; + RepositoryContext repo = new RepositoryContext(userRepositories, context); + Intent intent = repo.getIntent(context, RepoDetailActivity.class); int currentActiveAccountId = tinyDb.getInt("currentActiveAccountId"); RepositoriesApi repositoryData = BaseApi.getInstance(context, RepositoriesApi.class); - //RepositoriesRepository.deleteRepositoriesByAccount(currentActiveAccountId); assert repositoryData != null; - Integer count = repositoryData.checkRepository(currentActiveAccountId, repoOwner, repoName); + Integer count = repositoryData.checkRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); if(count == 0) { - - long id = repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName); - tinyDb.putLong("repositoryId", id); + long id = repositoryData.insertRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); + repo.setRepositoryId((int) id); } else { - - Repository data = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName); - tinyDb.putLong("repositoryId", data.getRepositoryId()); + Repository data = repositoryData.getRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); + repo.setRepositoryId(data.getRepositoryId()); } - //store if user is watching this repo - { - - final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token"); - - WatchInfo watch = new WatchInfo(); - Call call; - call = RetrofitClient.getApiInterface(context).checkRepoWatchStatus(token, repoOwner, repoName); - - call.enqueue(new Callback() { - @Override - public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { - - if(response.isSuccessful()) { - assert response.body() != null; - tinyDb.putBoolean("repoWatch", response.body().getSubscribed()); - } - else { - tinyDb.putBoolean("repoWatch", false); - if(response.code() != 404) { - Toasty.error(context, context.getString(R.string.genericApiStatusError)); - } - } - } - - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - tinyDb.putBoolean("repoWatch", false); - Toasty.error(context, context.getString(R.string.genericApiStatusError)); - } - }); - } context.startActivity(intent); - }); } @@ -201,7 +144,7 @@ public class ExploreRepositoriesAdapter extends RecyclerView.Adapter issuesCommentsMain, FragmentManager fragmentManager, Runnable onInteractedListener) { + public IssueCommentsAdapter(Context ctx, Bundle bundle, List issuesCommentsMain, FragmentManager fragmentManager, Runnable onInteractedListener, IssueContext issue) { this.context = ctx; this.bundle = bundle; @@ -64,6 +67,7 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter { - final String loginUid = tinyDB.getString("loginUid"); + final String loginUid = ((BaseActivity) context).getAccount().getAccount().getUserName(); @SuppressLint("InflateParams") View vw = LayoutInflater.from(context).inflate(R.layout.bottom_sheet_issue_comments, null); @@ -102,14 +106,14 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter { - tinyDB.putBoolean("commentEdited", true); - onInteractedListener.run(); dialog.dismiss(); }); @@ -152,7 +154,7 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter { ClipboardManager clipboard = (ClipboardManager) Objects.requireNonNull(context).getSystemService(Context.CLIPBOARD_SERVICE); assert clipboard != null; - ClipData clip = ClipData.newPlainText("Comment on issue #" + tinyDB.getString("issueNumber"), issueComment.getBody()); + ClipData clip = ClipData.newPlainText("Comment on issue #" + issue.getIssueIndex(), issueComment.getBody()); clipboard.setPrimaryClip(clip); dialog.dismiss(); @@ -252,20 +254,9 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter call = RetrofitClient .getApiInterface(ctx) - .deleteComment(instanceToken, repoOwner, repoName, commentId); + .deleteComment(((BaseActivity) context).getAccount().getAuthorization(), issue.getRepository().getOwner(), issue.getRepository().getName(), commentId); call.enqueue(new Callback() { @@ -318,7 +309,7 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter issueCreatedTime = itemView.findViewById(R.id.issueCreatedTime); itemView.setOnClickListener(layoutView -> { - Intent intent = new Intent(context, IssueDetailActivity.class); - intent.putExtra("issueNumber", issue.getNumber()); - - TinyDB tinyDb = TinyDB.getInstance(context); - tinyDb.putString("issueNumber", String.valueOf(issue.getNumber())); - tinyDb.putString("issueType", "Issue"); + Intent intent = new IssueContext( + issue, + ((RepoDetailActivity) context).repository + ).getIntent(context, IssueDetailActivity.class); context.startActivity(intent); }); @@ -137,7 +137,7 @@ public class IssuesAdapter extends RecyclerView.Adapter TinyDB tinyDb = TinyDB.getInstance(context); Locale locale = context.getResources().getConfiguration().locale; - String timeFormat = tinyDb.getString("dateFormat"); + String timeFormat = tinyDb.getString("dateFormat", "pretty"); int imgRadius = AppUtil.getPixelsFromDensity(context, 3); diff --git a/app/src/main/java/org/mian/gitnex/adapters/LabelsAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/LabelsAdapter.java index fcf497b2..37cc8aeb 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/LabelsAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/LabelsAdapter.java @@ -19,9 +19,10 @@ import org.gitnex.tea4j.models.Labels; import org.mian.gitnex.R; import org.mian.gitnex.activities.CreateLabelActivity; import org.mian.gitnex.activities.OrganizationDetailActivity; +import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.ColorInverter; -import org.mian.gitnex.helpers.TinyDB; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.List; /** @@ -31,10 +32,10 @@ import java.util.List; public class LabelsAdapter extends RecyclerView.Adapter { private final List labelsList; - private static String type; - private static String orgName; + private final String type; + private final String orgName; - static class LabelsViewHolder extends RecyclerView.ViewHolder { + class LabelsViewHolder extends RecyclerView.ViewHolder { private Labels labels; @@ -50,7 +51,7 @@ public class LabelsAdapter extends RecyclerView.Adapter { + RepositoryContext repo; + if(type.equals("repo")) { + repo = ((RepoDetailActivity) itemView.getContext()).repository; + } else { + repo = null; + } AlertDialogs.labelDeleteDialog(context, labels.getName(), String.valueOf(labels.getId()), - context.getResources().getString(R.string.labelDeleteTitle), - context.getResources().getString(R.string.labelDeleteMessage), - context.getResources().getString(R.string.menuDeleteText), - context.getResources().getString(R.string.cancelButton), - type, orgName); + type, orgName, repo); dialog.dismiss(); }); @@ -102,8 +106,8 @@ public class LabelsAdapter extends RecyclerView.Adapter labelsMain, String type, String orgName) { this.labelsList = labelsMain; - LabelsAdapter.type = type; - LabelsAdapter.orgName = orgName; + this.type = type; + this.orgName = orgName; } @NonNull diff --git a/app/src/main/java/org/mian/gitnex/adapters/MilestonesAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/MilestonesAdapter.java index 463b0276..df3a04d6 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/MilestonesAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/MilestonesAdapter.java @@ -17,11 +17,13 @@ import com.vdurmont.emoji.EmojiParser; import org.gitnex.tea4j.models.Milestones; import org.mian.gitnex.R; import org.mian.gitnex.actions.MilestoneActions; +import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.Markdown; import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TinyDB; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -41,9 +43,10 @@ public class MilestonesAdapter extends RecyclerView.Adapter dataListMain) { - + public MilestonesAdapter(Context ctx, List dataListMain, RepositoryContext repository) { + this.repository = repository; this.context = ctx; this.dataList = dataListMain; } @@ -100,7 +103,7 @@ public class MilestonesAdapter extends RecyclerView.Adapter { @@ -130,14 +133,14 @@ public class MilestonesAdapter extends RecyclerView.Adapter { - MilestoneActions.closeMilestone(ctx, milestoneId_); + MilestoneActions.closeMilestone(ctx, milestoneId_, repository); dialog.dismiss(); updateAdapter(getAdapterPosition()); }); openMilestone.setOnClickListener(v12 -> { - MilestoneActions.openMilestone(ctx, milestoneId_); + MilestoneActions.openMilestone(ctx, milestoneId_, repository); dialog.dismiss(); updateAdapter(getAdapterPosition()); }); @@ -152,7 +155,7 @@ public class MilestonesAdapter extends RecyclerView.Adapter notificationThreads, OnMoreClickedListener onMoreClickedListener, OnNotificationClickedListener onNotificationClickedListener) { - this.tinyDb = TinyDB.getInstance(context); + this.context = context; this.notificationThreads = notificationThreads; this.onMoreClickedListener = onMoreClickedListener; @@ -169,28 +164,7 @@ public class NotificationsAdapter extends RecyclerView.Adapter { - - onNotificationClickedListener.onNotificationClicked(notificationThread); - - String[] parts = notificationThread.getRepository().getFullName().split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - - int currentActiveAccountId = tinyDb.getInt("currentActiveAccountId"); - RepositoriesApi repositoryData = BaseApi.getInstance(context, RepositoriesApi.class); - - Integer count = repositoryData.checkRepository(currentActiveAccountId, repoOwner, repoName); - - if(count == 0) { - long id = repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName); - tinyDb.putLong("repositoryId", id); - } - else { - Repository data = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName); - tinyDb.putLong("repositoryId", data.getRepositoryId()); - } - }); + frame.setOnClickListener(v -> onNotificationClickedListener.onNotificationClicked(notificationThread)); more.setOnClickListener(v -> onMoreClickedListener.onMoreClicked(notificationThread)); } diff --git a/app/src/main/java/org/mian/gitnex/adapters/OrganizationsListAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/OrganizationsListAdapter.java index 3ded4a57..2dcff53b 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/OrganizationsListAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/OrganizationsListAdapter.java @@ -18,7 +18,6 @@ import org.mian.gitnex.activities.OrganizationDetailActivity; import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.RoundedTransformation; -import org.mian.gitnex.helpers.TinyDB; import java.util.ArrayList; import java.util.List; @@ -47,15 +46,9 @@ public class OrganizationsListAdapter extends RecyclerView.Adapter { - Context context = v.getContext(); Intent intent = new Intent(context, OrganizationDetailActivity.class); intent.putExtra("orgName", userOrganizations.getUsername()); - - TinyDB tinyDb = TinyDB.getInstance(context); - tinyDb.putString("orgName", userOrganizations.getUsername()); - tinyDb.putString("organizationId", String.valueOf(userOrganizations.getId())); - tinyDb.putBoolean("organizationAction", true); context.startActivity(intent); }); } diff --git a/app/src/main/java/org/mian/gitnex/adapters/PullRequestsAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/PullRequestsAdapter.java index afa5a663..0b93f9be 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/PullRequestsAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/PullRequestsAdapter.java @@ -23,6 +23,8 @@ import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TinyDB; +import org.mian.gitnex.helpers.contexts.IssueContext; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.List; import java.util.Locale; @@ -105,27 +107,12 @@ public class PullRequestsAdapter extends RecyclerView.Adapter { - Intent intent = new Intent(context, IssueDetailActivity.class); - intent.putExtra("issueNumber", pullRequest.getNumber()); - intent.putExtra("prMergeable", pullRequest.isMergeable()); - intent.putExtra("prHeadBranch", pullRequest.getHead().getRef()); + Intent intent = new IssueContext( + pullRequest, + new RepositoryContext(pullRequest.getBase().getRepo().getFull_name().split("/")[0], pullRequest.getBase().getRepo().getName(), context) + ) + .getIntent(context, IssueDetailActivity.class); - TinyDB tinyDb = TinyDB.getInstance(context); - tinyDb.putString("issueNumber", String.valueOf(pullRequest.getNumber())); - tinyDb.putString("prMergeable", String.valueOf(pullRequest.isMergeable())); - tinyDb.putString("prHeadBranch", pullRequest.getHead().getRef()); - - if(pullRequest.getHead() != null && pullRequest.getHead().getRepo() != null) { - tinyDb.putString("prIsFork", String.valueOf(pullRequest.getHead().getRepo().isFork())); - tinyDb.putString("prForkFullName", pullRequest.getHead().getRepo().getFull_name()); - } - else { - // pull was done from a deleted fork - tinyDb.putString("prIsFork", "true"); - tinyDb.putString("prForkFullName", context.getString(R.string.prDeletedFork)); - } - - tinyDb.putString("issueType", "Pull"); context.startActivity(intent); }); @@ -147,7 +134,7 @@ public class PullRequestsAdapter extends RecyclerView.Adapter() { - - @Override - public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { - - if(response.isSuccessful() && response.body() != null) { - - tinyDb.putBoolean("repoWatch", response.body().getSubscribed()); - } else { - tinyDb.putBoolean("repoWatch", false); - - if(response.code() != 404) { - Toasty.error(context, context.getString(R.string.genericApiStatusError)); - } - } - } - - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - tinyDb.putBoolean("repoWatch", false); - Toasty.error(context, context.getString(R.string.genericApiStatusError)); - } - }); + repo.setRepositoryId(data.getRepositoryId()); } context.startActivity(intent); diff --git a/app/src/main/java/org/mian/gitnex/adapters/ReposListAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/ReposListAdapter.java index 0ef6075b..8f94e87c 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/ReposListAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/ReposListAdapter.java @@ -30,6 +30,7 @@ import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import org.ocpsoft.prettytime.PrettyTime; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -75,95 +76,26 @@ public class ReposListAdapter extends RecyclerView.Adapter { - Context context = v.getContext(); - TinyDB tinyDb = TinyDB.getInstance(context); + RepositoryContext repo = new RepositoryContext(userRepositories, context); + Intent intent = repo.getIntent(context, RepoDetailActivity.class); - Intent intent = new Intent(context, RepoDetailActivity.class); - intent.putExtra("repoFullName", userRepositories.getFullName()); - - tinyDb.putString("repoFullName", userRepositories.getFullName()); - //tinyDb.putBoolean("resumeIssues", true); - tinyDb.putBoolean("isRepoAdmin", isRepoAdmin.isChecked()); - tinyDb.putString("repoBranch", userRepositories.getDefault_branch()); - - if(userRepositories.getPrivateFlag()) { - tinyDb.putString("repoType", context.getResources().getString(R.string.strPrivate)); - } - else { - tinyDb.putString("repoType", context.getResources().getString(R.string.strPublic)); - } - - String[] parts = userRepositories.getFullName().split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - - int currentActiveAccountId = tinyDb.getInt("currentActiveAccountId"); + int currentActiveAccountId = TinyDB.getInstance(context).getInt("currentActiveAccountId"); RepositoriesApi repositoryData = BaseApi.getInstance(context, RepositoriesApi.class); - //RepositoriesRepository.deleteRepositoriesByAccount(currentActiveAccountId); assert repositoryData != null; - Integer count = repositoryData.checkRepository(currentActiveAccountId, repoOwner, repoName); + Integer count = repositoryData.checkRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); if(count == 0) { - - long id = repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName); - tinyDb.putLong("repositoryId", id); + long id = repositoryData.insertRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); + repo.setRepositoryId((int) id); } else { - - Repository data = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName); - tinyDb.putLong("repositoryId", data.getRepositoryId()); - } - - //store if user is watching this repo - { - - final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token"); - - WatchInfo watch = new WatchInfo(); - - Call call; - - call = RetrofitClient.getApiInterface(context).checkRepoWatchStatus(token, repoOwner, repoName); - - call.enqueue(new Callback() { - - @Override - public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { - - if(response.isSuccessful()) { - - assert response.body() != null; - tinyDb.putBoolean("repoWatch", response.body().getSubscribed()); - - } else { - - tinyDb.putBoolean("repoWatch", false); - - if(response.code() != 404) { - - Toasty.error(context, context.getString(R.string.genericApiStatusError)); - - } - - } - - } - - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - - tinyDb.putBoolean("repoWatch", false); - Toasty.error(context, context.getString(R.string.genericApiStatusError)); - - } - }); - + Repository data = repositoryData.getRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); + repo.setRepositoryId(data.getRepositoryId()); } context.startActivity(intent); - }); } @@ -192,7 +124,7 @@ public class ReposListAdapter extends RecyclerView.Adapter { + itemView.setOnClickListener(v -> { + Context context = v.getContext(); + RepositoryContext repo = new RepositoryContext(userRepositories, context); + Intent intent = repo.getIntent(context, RepoDetailActivity.class); - Context context = v.getContext(); - TinyDB tinyDb = TinyDB.getInstance(context); + int currentActiveAccountId = TinyDB.getInstance(context).getInt("currentActiveAccountId"); + RepositoriesApi repositoryData = BaseApi.getInstance(context, RepositoriesApi.class); - Intent intent = new Intent(context, RepoDetailActivity.class); - intent.putExtra("repoFullName", userRepositories.getFullName()); + assert repositoryData != null; + Integer count = repositoryData.checkRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); - tinyDb.putString("repoFullName", userRepositories.getFullName()); - //tinyDb.putBoolean("resumeIssues", true); - tinyDb.putBoolean("isRepoAdmin", isRepoAdmin.isChecked()); - tinyDb.putString("repoBranch", userRepositories.getDefault_branch()); + if(count == 0) { + long id = repositoryData.insertRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); + repo.setRepositoryId((int) id); + } + else { + Repository data = repositoryData.getRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); + repo.setRepositoryId(data.getRepositoryId()); + } - if(userRepositories.getPrivateFlag()) { - tinyDb.putString("repoType", context.getResources().getString(R.string.strPrivate)); - } - else { - tinyDb.putString("repoType", context.getResources().getString(R.string.strPublic)); - } - - String[] parts = userRepositories.getFullName().split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - - int currentActiveAccountId = tinyDb.getInt("currentActiveAccountId"); - RepositoriesApi repositoryData = BaseApi.getInstance(context, RepositoriesApi.class); - - //RepositoriesRepository.deleteRepositoriesByAccount(currentActiveAccountId); - assert repositoryData != null; - Integer count = repositoryData.checkRepository(currentActiveAccountId, repoOwner, repoName); - - if(count == 0) { - - long id = repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName); - tinyDb.putLong("repositoryId", id); - } - else { - - Repository data = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName); - tinyDb.putLong("repositoryId", data.getRepositoryId()); - } - - //store if user is watching this repo - { - - final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token"); - - Call call; - - call = RetrofitClient.getApiInterface(context).checkRepoWatchStatus(token, repoOwner, repoName); - - call.enqueue(new Callback() { - - @Override - public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { - - if(response.isSuccessful()) { - - assert response.body() != null; - tinyDb.putBoolean("repoWatch", response.body().getSubscribed()); - - } else { - - tinyDb.putBoolean("repoWatch", false); - - if(response.code() != 404) { - - Toasty.error(context, context.getString(R.string.genericApiStatusError)); - - } - - } - - } - - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - - tinyDb.putBoolean("repoWatch", false); - Toasty.error(context, context.getString(R.string.genericApiStatusError)); - - } - }); - - } - - context.startActivity(intent); - }); + context.startActivity(intent); + }); } } @@ -189,7 +124,7 @@ public class RepositoriesByOrgAdapter extends RecyclerView.Adapter teamListFull; private final OrgPermissions permissions; + private final String orgName; static class OrgTeamsViewHolder extends RecyclerView.ViewHolder { @@ -48,6 +49,7 @@ public class TeamsByOrgAdapter extends RecyclerView.Adapter userInfos; private final TeamMembersByOrgPreviewAdapter adapter; + private String orgName; private OrgTeamsViewHolder(View itemView) { super(itemView); @@ -70,16 +72,18 @@ public class TeamsByOrgAdapter extends RecyclerView.Adapter teamListMain, OrgPermissions permissions) { + public TeamsByOrgAdapter(Context ctx, List teamListMain, OrgPermissions permissions, String orgName) { this.context = ctx; this.teamList = teamListMain; this.permissions = permissions; teamListFull = new ArrayList<>(teamList); + this.orgName = orgName; } @NonNull @@ -97,13 +101,14 @@ public class TeamsByOrgAdapter extends RecyclerView.Adapter>() { @Override public void onResponse(@NonNull Call> call, @NonNull Response> response) { @@ -168,7 +173,7 @@ public class TeamsByOrgAdapter extends RecyclerView.Adapter) results.values); notifyDataSetChanged(); } }; diff --git a/app/src/main/java/org/mian/gitnex/adapters/UserAccountsAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/UserAccountsAdapter.java index 45b3d846..8ff6ca89 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/UserAccountsAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/UserAccountsAdapter.java @@ -4,6 +4,7 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.app.Dialog; import android.content.Context; +import android.content.Intent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -14,6 +15,8 @@ import androidx.appcompat.app.AlertDialog; import androidx.appcompat.content.res.AppCompatResources; import androidx.recyclerview.widget.RecyclerView; import org.mian.gitnex.R; +import org.mian.gitnex.activities.AddNewAccountActivity; +import org.mian.gitnex.activities.LoginActivity; import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.database.api.BaseApi; import org.mian.gitnex.database.api.UserAccountsApi; @@ -23,6 +26,7 @@ import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; import java.util.List; +import java.util.Objects; import io.mikael.urlbuilder.UrlBuilder; /** @@ -33,7 +37,6 @@ public class UserAccountsAdapter extends RecyclerView.Adapter userAccountsList; private final Context context; - private TinyDB tinyDB; private final Dialog dialog; class UserAccountsViewHolder extends RecyclerView.ViewHolder { @@ -79,6 +82,36 @@ public class UserAccountsAdapter extends RecyclerView.Adapter userAccountsListMain, Dialog dialog) { + public UserAccountsAdapter(Context ctx, Dialog dialog) { this.dialog = dialog; this.context = ctx; - this.userAccountsList = userAccountsListMain; + this.userAccountsList = Objects.requireNonNull(BaseApi.getInstance(context, UserAccountsApi.class)).usersAccounts(); } private void updateLayoutByPosition(int position) { @@ -123,7 +156,7 @@ public class UserAccountsAdapter extends RecyclerView.Adapter { - customDialogUserAccountsList(userAccountsList); + customDialogUserAccountsList(); drawer.closeDrawers(); }); @@ -95,7 +95,7 @@ public class UserAccountsNavAdapter extends RecyclerView.Adapter allAccountsList) { + private void customDialogUserAccountsList() { Dialog dialog = new Dialog(context, R.style.ThemeOverlay_MaterialComponents_Dialog_Alert); dialog.setContentView(R.layout.custom_user_accounts_dialog); @@ -113,7 +113,7 @@ public class UserAccountsNavAdapter extends RecyclerView.Adapter usersSearchList; private final Context context; - private static int teamId; + private final int teamId; + private final String orgName; - public UserSearchForTeamMemberAdapter(List dataList, Context ctx, int teamId) { + public UserSearchForTeamMemberAdapter(List dataList, Context ctx, int teamId, String orgName) { this.context = ctx; this.usersSearchList = dataList; - UserSearchForTeamMemberAdapter.teamId = teamId; + this.teamId = teamId; + this.orgName = orgName; } class UserSearchViewHolder extends RecyclerView.ViewHolder { @@ -122,15 +124,11 @@ public class UserSearchForTeamMemberAdapter extends RecyclerView.Adapter 0) { - TinyDB tinyDb = TinyDB.getInstance(context); - final String loginUid = tinyDb.getString("loginUid"); - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; + final String loginUid = ((BaseActivity) context).getAccount().getAccount().getUserName(); Call call = RetrofitClient .getApiInterface(context) - .checkTeamMember(Authorization.get(context), teamId, currentItem.getLogin()); + .checkTeamMember(((BaseActivity) context).getAccount().getAuthorization(), teamId, currentItem.getLogin()); call.enqueue(new Callback() { @@ -139,7 +137,7 @@ public class UserSearchForTeamMemberAdapter extends RecyclerView.Adapter { + Context context = v.getContext(); + Intent intent = new Intent(context, OrganizationDetailActivity.class); + intent.putExtra("orgName", userOrganizations.getUsername()); + context.startActivity(intent); + }); } @SuppressLint("SetTextI18n") diff --git a/app/src/main/java/org/mian/gitnex/adapters/profile/RepositoriesAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/profile/RepositoriesAdapter.java index 01fcba63..6ae99bad 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/profile/RepositoriesAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/profile/RepositoriesAdapter.java @@ -2,6 +2,7 @@ package org.mian.gitnex.adapters.profile; import android.annotation.SuppressLint; import android.content.Context; +import android.content.Intent; import android.graphics.Typeface; import android.view.LayoutInflater; import android.view.View; @@ -15,12 +16,17 @@ import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.util.ColorGenerator; import org.gitnex.tea4j.models.UserRepositories; import org.mian.gitnex.R; +import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.clients.PicassoService; +import org.mian.gitnex.database.api.BaseApi; +import org.mian.gitnex.database.api.RepositoriesApi; +import org.mian.gitnex.database.models.Repository; import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TinyDB; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.List; import java.util.Locale; @@ -105,6 +111,30 @@ public class RepositoriesAdapter extends RecyclerView.Adapter { + Context context = v.getContext(); + RepositoryContext repo = new RepositoryContext(userRepositories, context); + Intent intent = repo.getIntent(context, RepoDetailActivity.class); + + int currentActiveAccountId = TinyDB.getInstance(context).getInt("currentActiveAccountId"); + RepositoriesApi repositoryData = BaseApi.getInstance(context, RepositoriesApi.class); + + assert repositoryData != null; + Integer count = repositoryData.checkRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); + + if(count == 0) { + long id = repositoryData.insertRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); + repo.setRepositoryId((int) id); + } + else { + Repository data = repositoryData.getRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); + repo.setRepositoryId(data.getRepositoryId()); + } + + context.startActivity(intent); + }); + } @SuppressLint("SetTextI18n") @@ -115,7 +145,7 @@ public class RepositoriesAdapter extends RecyclerView.Adapter { + Context context = v.getContext(); + RepositoryContext repo = new RepositoryContext(userRepositories, context); + Intent intent = repo.getIntent(context, RepoDetailActivity.class); + + int currentActiveAccountId = TinyDB.getInstance(context).getInt("currentActiveAccountId"); + RepositoriesApi repositoryData = BaseApi.getInstance(context, RepositoriesApi.class); + + assert repositoryData != null; + Integer count = repositoryData.checkRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); + + if(count == 0) { + long id = repositoryData.insertRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); + repo.setRepositoryId((int) id); + } + else { + Repository data = repositoryData.getRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); + repo.setRepositoryId(data.getRepositoryId()); + } + + context.startActivity(intent); + }); } @SuppressLint("SetTextI18n") @@ -115,7 +144,7 @@ public class StarredRepositoriesAdapter extends RecyclerView.Adapter { @@ -85,13 +87,12 @@ public class RetrofitClient { } public static ApiInterface getApiInterface(Context context) { - - return getApiInterface(context, TinyDB.getInstance(context).getString("instanceUrl")); + return getApiInterface(context, ((BaseActivity) context).getAccount().getAccount().getInstanceUrl()); } public static WebInterface getWebInterface(Context context) { - String instanceUrl = TinyDB.getInstance(context).getString("instanceUrl"); + String instanceUrl = ((BaseActivity) context).getAccount().getAccount().getInstanceUrl(); instanceUrl = instanceUrl.substring(0, instanceUrl.lastIndexOf("api/v1/")); return getWebInterface(context, instanceUrl); diff --git a/app/src/main/java/org/mian/gitnex/core/MainApplication.java b/app/src/main/java/org/mian/gitnex/core/MainApplication.java index d340ba55..e3bd7bcd 100644 --- a/app/src/main/java/org/mian/gitnex/core/MainApplication.java +++ b/app/src/main/java/org/mian/gitnex/core/MainApplication.java @@ -14,10 +14,12 @@ import org.acra.config.LimiterConfigurationBuilder; import org.acra.config.MailSenderConfigurationBuilder; import org.acra.data.StringFormat; import org.mian.gitnex.R; +import org.mian.gitnex.database.models.UserAccount; import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.FontsOverride; import org.mian.gitnex.helpers.TinyDB; +import org.mian.gitnex.helpers.contexts.AccountContext; import org.mian.gitnex.notifications.Notifications; /** @@ -36,6 +38,7 @@ import org.mian.gitnex.notifications.Notifications; public class MainApplication extends Application { private TinyDB tinyDB; + public AccountContext currentAccount; @Override public void onCreate() { @@ -45,9 +48,9 @@ public class MainApplication extends Application { Context appCtx = getApplicationContext(); tinyDB = TinyDB.getInstance(appCtx); - tinyDB.putBoolean("biometricLifeCycle", false); + currentAccount = AccountContext.fromId(tinyDB.getInt("currentActiveAccountId", 0), appCtx); - setDefaults(); + tinyDB.putBoolean("biometricLifeCycle", false); switch(tinyDB.getInt("customFontId", -1)) { @@ -83,7 +86,7 @@ public class MainApplication extends Application { tinyDB = TinyDB.getInstance(context); - if(tinyDB.getBoolean("crashReportingEnabled")) { + if(tinyDB.getBoolean("crashReportingEnabled", true)) { CoreConfigurationBuilder ACRABuilder = new CoreConfigurationBuilder(this); @@ -96,78 +99,13 @@ public class MainApplication extends Application { } } - private void setDefaults() { - - // enabling counter badges by default - if(tinyDB.getString("enableCounterBadgesInit").isEmpty()) { - tinyDB.putBoolean("enableCounterBadges", true); - tinyDB.putString("enableCounterBadgesInit", "yes"); + public boolean switchToAccount(UserAccount userAccount, boolean tmp) { + if(!tmp || tinyDB.getInt("currentActiveAccountId") != userAccount.getAccountId()) { + currentAccount = new AccountContext(userAccount); + if(!tmp) tinyDB.putInt("currentActiveAccountId", userAccount.getAccountId()); + return true; } - // enable crash reports by default - if(tinyDB.getString("crashReportingEnabledInit").isEmpty()) { - tinyDB.putBoolean("crashReportingEnabled", true); - tinyDB.putString("crashReportingEnabledInit", "yes"); - } - - // default cache setter - if(tinyDB.getString("cacheSizeStr").isEmpty()) { - tinyDB.putString("cacheSizeStr", getResources().getString(R.string.cacheSizeDataSelectionSelectedText)); - } - if(tinyDB.getString("cacheSizeImagesStr").isEmpty()) { - tinyDB.putString("cacheSizeImagesStr", getResources().getString(R.string.cacheSizeImagesSelectionSelectedText)); - } - - // enable comment drafts by default - if(tinyDB.getString("draftsCommentsDeletionEnabledInit").isEmpty()) { - tinyDB.putBoolean("draftsCommentsDeletionEnabled", true); - tinyDB.putString("draftsCommentsDeletionEnabledInit", "yes"); - } - - // setting default polling delay - if(tinyDB.getInt("pollingDelayMinutes", 0) <= 0) { - tinyDB.putInt("pollingDelayMinutes", Constants.defaultPollingDelay); - } - - // disable biometric by default - if(tinyDB.getString("biometricStatusInit").isEmpty()) { - tinyDB.putBoolean("biometricStatus", false); - tinyDB.putString("biometricStatusInit", "yes"); - } - - // set default date format - if(tinyDB.getString("dateFormat").isEmpty()) { - tinyDB.putString("dateFormat", "pretty"); - } - - if(tinyDB.getString("codeBlockStr").isEmpty()) { - tinyDB.putInt("codeBlockColor", ResourcesCompat.getColor(getResources(), R.color.colorLightGreen, null)); - tinyDB.putInt("codeBlockBackground", ResourcesCompat.getColor(getResources(), R.color.black, null)); - } - - if(tinyDB.getString("enableCounterIssueBadgeInit").isEmpty()) { - tinyDB.putBoolean("enableCounterIssueBadge", true); - } - - if(tinyDB.getString("homeScreenStr").isEmpty()) { - tinyDB.putString("homeScreenStr", "yes"); - tinyDB.putInt("homeScreenId", 0); - } - - if(tinyDB.getString("localeStr").isEmpty()) { - tinyDB.putString("localeStr", getString(R.string.settingsLanguageSystem)); - tinyDB.putInt("langId", 0); - } - - if(tinyDB.getInt("darkThemeTimeHour", 100) == 100) { - tinyDB.putInt("lightThemeTimeHour", 6); - tinyDB.putInt("lightThemeTimeMinute", 0); - tinyDB.putInt("darkThemeTimeHour", 18); - tinyDB.putInt("darkThemeTimeMinute", 0); - } - - if(tinyDB.getString("timeStr").isEmpty()) { - tinyDB.putString("timeStr", getString(R.string.settingsDateTimeHeaderDefault)); - } + return false; } } diff --git a/app/src/main/java/org/mian/gitnex/database/api/UserAccountsApi.java b/app/src/main/java/org/mian/gitnex/database/api/UserAccountsApi.java index 80b5d920..2dc45180 100644 --- a/app/src/main/java/org/mian/gitnex/database/api/UserAccountsApi.java +++ b/app/src/main/java/org/mian/gitnex/database/api/UserAccountsApi.java @@ -2,6 +2,7 @@ package org.mian.gitnex.database.api; import android.content.Context; import androidx.lifecycle.LiveData; +import androidx.room.Query; import org.mian.gitnex.database.dao.UserAccountsDao; import org.mian.gitnex.database.models.UserAccount; import java.util.List; @@ -27,6 +28,7 @@ public class UserAccountsApi extends BaseApi { userAccount.setUserName(userName); userAccount.setToken(token); userAccount.setServerVersion(serverVersion); + userAccount.setLoggedIn(true); return userAccountsDao.createAccount(userAccount); @@ -44,6 +46,10 @@ public class UserAccountsApi extends BaseApi { executorService.execute(() -> userAccountsDao.updateAccountTokenByAccountName(accountName, token)); } + public void updateUsername(final int accountId, final String newName) { + executorService.execute(() -> userAccountsDao.updateUserName(newName, accountId)); + } + public UserAccount getAccountByName(String accountName) { return userAccountsDao.getAccountByName(accountName); } @@ -64,12 +70,28 @@ public class UserAccountsApi extends BaseApi { return userAccountsDao.getAllAccounts(); } + public LiveData> getAllLoggedInAccounts() { + return userAccountsDao.getAllLoggedInAccounts(); + } + public List usersAccounts() { return userAccountsDao.userAccounts(); } + public List loggedInUserAccounts() { + return userAccountsDao.loggedInUserAccounts(); + } + public void deleteAccount(final int accountId) { executorService.execute(() -> userAccountsDao.deleteAccount(accountId)); } + public void logout(int accountId) { + userAccountsDao.logout(accountId); + } + + public void login(int accountId) { + executorService.execute(() -> userAccountsDao.login(accountId)); + } + } diff --git a/app/src/main/java/org/mian/gitnex/database/dao/UserAccountsDao.java b/app/src/main/java/org/mian/gitnex/database/dao/UserAccountsDao.java index fd1e249b..51a1ef79 100644 --- a/app/src/main/java/org/mian/gitnex/database/dao/UserAccountsDao.java +++ b/app/src/main/java/org/mian/gitnex/database/dao/UserAccountsDao.java @@ -20,10 +20,16 @@ public interface UserAccountsDao { @Query("SELECT * FROM UserAccounts ORDER BY accountId ASC") LiveData> getAllAccounts(); + @Query("SELECT * FROM UserAccounts WHERE isLoggedIn = 1 ORDER BY accountId ASC") + LiveData> getAllLoggedInAccounts(); + @Query("SELECT * FROM UserAccounts ORDER BY accountId ASC") List userAccounts(); - @Query("SELECT COUNT(accountId) FROM UserAccounts") + @Query("SELECT * FROM UserAccounts WHERE isLoggedIn = 1 ORDER BY accountId ASC") + List loggedInUserAccounts(); + + @Query("SELECT COUNT(accountId) FROM UserAccounts WHERE isLoggedIn = 1") Integer getCount(); @Query("SELECT COUNT(accountId) FROM UserAccounts WHERE accountName = :accountName LIMIT 1") @@ -56,6 +62,12 @@ public interface UserAccountsDao { @Query("UPDATE UserAccounts SET instanceUrl = :instanceUrl, token = :token, userName = :userName, serverVersion = :serverVersion WHERE accountId = :accountId") void updateAll(String instanceUrl, String token, String userName, String serverVersion, int accountId); + @Query("UPDATE UserAccounts SET isLoggedIn = 0 WHERE accountId = :accountId") + void logout(int accountId); + + @Query("UPDATE UserAccounts SET isLoggedIn = 1 WHERE accountId = :accountId") + void login(int accountId); + @Query("DELETE FROM UserAccounts WHERE accountId = :accountId") void deleteAccount(int accountId); diff --git a/app/src/main/java/org/mian/gitnex/database/db/GitnexDatabase.java b/app/src/main/java/org/mian/gitnex/database/db/GitnexDatabase.java index b0fa21ac..c6747fe0 100644 --- a/app/src/main/java/org/mian/gitnex/database/db/GitnexDatabase.java +++ b/app/src/main/java/org/mian/gitnex/database/db/GitnexDatabase.java @@ -19,7 +19,7 @@ import org.mian.gitnex.database.models.UserAccount; */ @Database(entities = {Draft.class, Repository.class, UserAccount.class}, - version = 3, exportSchema = false) + version = 4, exportSchema = false) public abstract class GitnexDatabase extends RoomDatabase { private static final String DB_NAME = "gitnex"; @@ -44,6 +44,14 @@ public abstract class GitnexDatabase extends RoomDatabase { } }; + private static final Migration MIGRATION_3_4 = new Migration(3, 4) { + + @Override + public void migrate(@NonNull SupportSQLiteDatabase database) { + database.execSQL("ALTER TABLE 'userAccounts' ADD COLUMN 'isLoggedIn' INTEGER NOT NULL DEFAULT 1"); + } + }; + public static GitnexDatabase getDatabaseInstance(Context context) { if (gitnexDatabase == null) { @@ -53,7 +61,7 @@ public abstract class GitnexDatabase extends RoomDatabase { gitnexDatabase = Room.databaseBuilder(context, GitnexDatabase.class, DB_NAME) // .fallbackToDestructiveMigration() .allowMainThreadQueries() - .addMigrations(MIGRATION_1_2, MIGRATION_2_3) + .addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4) .build(); } diff --git a/app/src/main/java/org/mian/gitnex/database/models/UserAccount.java b/app/src/main/java/org/mian/gitnex/database/models/UserAccount.java index 3ee77b12..8a07ef26 100644 --- a/app/src/main/java/org/mian/gitnex/database/models/UserAccount.java +++ b/app/src/main/java/org/mian/gitnex/database/models/UserAccount.java @@ -22,6 +22,7 @@ public class UserAccount implements Serializable { private String token; @Nullable private String serverVersion; + private boolean isLoggedIn; public int getAccountId() { return accountId; @@ -72,4 +73,13 @@ public class UserAccount implements Serializable { public void setServerVersion(@Nullable String serverVersion) { this.serverVersion = serverVersion; } + + public boolean isLoggedIn() { + return isLoggedIn; + } + + public void setLoggedIn(boolean loggedIn) { + isLoggedIn = loggedIn; + } + } diff --git a/app/src/main/java/org/mian/gitnex/fragments/AdministrationFragment.java b/app/src/main/java/org/mian/gitnex/fragments/AdministrationFragment.java index 7377e218..0cd5a943 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/AdministrationFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/AdministrationFragment.java @@ -11,9 +11,8 @@ import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import org.mian.gitnex.activities.AdminCronTasksActivity; import org.mian.gitnex.activities.AdminGetUsersActivity; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.databinding.FragmentAdministrationBinding; -import org.mian.gitnex.helpers.TinyDB; -import org.mian.gitnex.helpers.Version; /** * Author M M Arif @@ -21,19 +20,15 @@ import org.mian.gitnex.helpers.Version; public class AdministrationFragment extends Fragment { - private Context ctx; - private TinyDB tinyDB; - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - ctx = getContext(); - tinyDB = TinyDB.getInstance(ctx); + Context ctx = getContext(); FragmentAdministrationBinding fragmentAdministrationBinding = FragmentAdministrationBinding.inflate(inflater, container, false); fragmentAdministrationBinding.adminUsers.setOnClickListener(v1 -> startActivity(new Intent(getContext(), AdminGetUsersActivity.class))); // if gitea version is greater/equal(1.13.0) than user installed version (installed.higherOrEqual(compareVer)) - if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.13.0")) { + if(((BaseActivity) requireActivity()).getAccount().requiresVersion("1.13.0")) { fragmentAdministrationBinding.adminCron.setVisibility(View.VISIBLE); } diff --git a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetAdminUsersFragment.java b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetAdminUsersFragment.java index dda3faeb..c5eb0126 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetAdminUsersFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetAdminUsersFragment.java @@ -43,7 +43,7 @@ public class BottomSheetAdminUsersFragment extends BottomSheetDialogFragment { bmListener = (BottomSheetListener) context; } catch (ClassCastException e) { - throw new ClassCastException(context.toString() + " must implement BottomSheetListener"); + throw new ClassCastException(context + " must implement BottomSheetListener"); } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetFileViewerFragment.java b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetFileViewerFragment.java index 68089a59..3666cef3 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetFileViewerFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetFileViewerFragment.java @@ -9,8 +9,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import org.mian.gitnex.databinding.BottomSheetFileViewerBinding; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import org.mian.gitnex.structs.BottomSheetListener; -import org.mian.gitnex.helpers.TinyDB; /** * Author M M Arif @@ -24,9 +24,10 @@ public class BottomSheetFileViewerFragment extends BottomSheetDialogFragment { @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + RepositoryContext repository = RepositoryContext.fromBundle(requireArguments()); BottomSheetFileViewerBinding bottomSheetFileViewerBinding = BottomSheetFileViewerBinding.inflate(inflater, container, false); - if(!TinyDB.getInstance(requireContext()).getBoolean("canPush")) { + if(!repository.getPermissions().canPush()) { bottomSheetFileViewerBinding.deleteFile.setVisibility(View.GONE); bottomSheetFileViewerBinding.editFile.setVisibility(View.GONE); } @@ -57,12 +58,10 @@ public class BottomSheetFileViewerFragment extends BottomSheetDialogFragment { super.onAttach(context); try { - bmListener = (BottomSheetListener) context; } catch (ClassCastException e) { - - throw new ClassCastException(context.toString() + " must implement BottomSheetListener"); + throw new ClassCastException(context + " must implement BottomSheetListener"); } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetIssuesFilterFragment.java b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetIssuesFilterFragment.java index e647b731..049cf9e2 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetIssuesFilterFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetIssuesFilterFragment.java @@ -8,6 +8,7 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.databinding.BottomSheetIssuesFilterBinding; import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Version; @@ -26,9 +27,8 @@ public class BottomSheetIssuesFilterFragment extends BottomSheetDialogFragment { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { BottomSheetIssuesFilterBinding bottomSheetIssuesFilterBinding = BottomSheetIssuesFilterBinding.inflate(inflater, container, false); - TinyDB tinyDb = TinyDB.getInstance(getContext()); - if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.14.0")) { + if(((BaseActivity) requireActivity()).getAccount().requiresVersion("1.14.0")) { bottomSheetIssuesFilterBinding.filterByMilestone.setVisibility(View.VISIBLE); bottomSheetIssuesFilterBinding.filterByMilestone.setOnClickListener(v1 -> { bmListener.onButtonClicked("filterByMilestone"); @@ -58,7 +58,7 @@ public class BottomSheetIssuesFilterFragment extends BottomSheetDialogFragment { bmListener = (BottomSheetListener) context; } catch(ClassCastException e) { - throw new ClassCastException(context.toString() + " must implement BottomSheetListener"); + throw new ClassCastException(context + " must implement BottomSheetListener"); } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetNotificationsFilterFragment.java b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetNotificationsFilterFragment.java index 426d1c37..1730c2f1 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetNotificationsFilterFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetNotificationsFilterFragment.java @@ -1,6 +1,5 @@ package org.mian.gitnex.fragments; -import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -9,7 +8,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import org.mian.gitnex.databinding.BottomSheetNotificationsFilterBinding; -import org.mian.gitnex.helpers.TinyDB; +import org.mian.gitnex.structs.BottomSheetListener; /** * Author opyale @@ -17,57 +16,28 @@ import org.mian.gitnex.helpers.TinyDB; public class BottomSheetNotificationsFilterFragment extends BottomSheetDialogFragment { - private TinyDB tinyDB; - private Runnable onDismissedListener; - - @Override - public void onAttach(@NonNull Context context) { - - super.onAttach(context); - - this.tinyDB = TinyDB.getInstance(context); - - } + private BottomSheetListener listener; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + BottomSheetNotificationsFilterBinding binding = BottomSheetNotificationsFilterBinding.inflate(inflater, container, false); - BottomSheetNotificationsFilterBinding bottomSheetNotificationsFilterBinding = BottomSheetNotificationsFilterBinding.inflate(inflater, container, false); - - bottomSheetNotificationsFilterBinding.readNotifications.setOnClickListener(v1 -> { - - tinyDB.putString("notificationsFilterState", "read"); + binding.readNotifications.setOnClickListener(v1 -> { + listener.onButtonClicked("read"); dismiss(); - }); - bottomSheetNotificationsFilterBinding.unreadNotifications.setOnClickListener(v12 -> { - - tinyDB.putString("notificationsFilterState", "unread"); + binding.unreadNotifications.setOnClickListener(v12 -> { + listener.onButtonClicked("unread"); dismiss(); - }); - return bottomSheetNotificationsFilterBinding.getRoot(); - + return binding.getRoot(); } - @Override - public void dismiss() { - - if(onDismissedListener != null) { - - onDismissedListener.run(); - } - - super.dismiss(); - - } - - public void setOnDismissedListener(Runnable onDismissedListener) { - - this.onDismissedListener = onDismissedListener; + public void setOnClickListener(BottomSheetListener listener) { + this.listener = listener; } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetNotificationsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetNotificationsFragment.java index fb7af3a8..6349aed8 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetNotificationsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetNotificationsFragment.java @@ -10,10 +10,10 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import org.gitnex.tea4j.models.NotificationThread; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.BottomSheetNotificationsBinding; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.SimpleCallback; /** @@ -56,7 +56,7 @@ public class BottomSheetNotificationsFragment extends BottomSheetDialogFragment markPinned.setOnClickListener(v12 -> RetrofitClient.getApiInterface(context) - .markNotificationThreadAsRead(Authorization.get(context), notificationThread.getId(), "pinned") + .markNotificationThreadAsRead(((BaseActivity) context).getAccount().getAuthorization(), notificationThread.getId(), "pinned") .enqueue((SimpleCallback) (call, voidResponse) -> { // reload without any checks, because Gitea returns a 205 and Java expects this to be empty @@ -72,7 +72,7 @@ public class BottomSheetNotificationsFragment extends BottomSheetDialogFragment markRead.setOnClickListener(v1 -> RetrofitClient.getApiInterface(context) - .markNotificationThreadAsRead(Authorization.get(context), notificationThread.getId(), "read") + .markNotificationThreadAsRead(((BaseActivity) context).getAccount().getAuthorization(), notificationThread.getId(), "read") .enqueue((SimpleCallback) (call, voidResponse) -> { // reload without any checks, because Gitea returns a 205 and Java expects this to be empty @@ -90,7 +90,7 @@ public class BottomSheetNotificationsFragment extends BottomSheetDialogFragment markUnread.setOnClickListener(v13 -> RetrofitClient.getApiInterface(context) - .markNotificationThreadAsRead(Authorization.get(context), notificationThread.getId(), "unread") + .markNotificationThreadAsRead(((BaseActivity) context).getAccount().getAuthorization(), notificationThread.getId(), "unread") .enqueue((SimpleCallback) (call, voidResponse) -> { // reload without any checks, because Gitea returns a 205 and Java expects this to be empty diff --git a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetOrganizationFragment.java b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetOrganizationFragment.java index 5befcb09..be37e10a 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetOrganizationFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetOrganizationFragment.java @@ -9,16 +9,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import org.gitnex.tea4j.models.OrgPermissions; -import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.BottomSheetOrganizationBinding; import org.mian.gitnex.structs.BottomSheetListener; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; -import org.mian.gitnex.helpers.Version; -import java.util.List; -import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Response; /** * Author M M Arif diff --git a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetReplyFragment.java b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetReplyFragment.java index bfaf8934..22dbc6de 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetReplyFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetReplyFragment.java @@ -17,12 +17,15 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import com.vdurmont.emoji.EmojiParser; import org.mian.gitnex.R; import org.mian.gitnex.actions.ActionResult; import org.mian.gitnex.actions.IssueActions; +import org.mian.gitnex.activities.BaseActivity; +import org.mian.gitnex.activities.IssueDetailActivity; import org.mian.gitnex.activities.MainActivity; import org.mian.gitnex.database.api.BaseApi; import org.mian.gitnex.database.api.DraftsApi; @@ -30,6 +33,7 @@ import org.mian.gitnex.databinding.BottomSheetReplyLayoutBinding; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; +import org.mian.gitnex.helpers.contexts.IssueContext; import java.util.Objects; /** @@ -44,9 +48,8 @@ public class BottomSheetReplyFragment extends BottomSheetDialogFragment { private TinyDB tinyDB; private DraftsApi draftsApi; - private int repositoryId; private int currentActiveAccountId; - private int issueNumber; + private IssueContext issue; private long draftId; private Runnable onInteractedListener; @@ -60,9 +63,8 @@ public class BottomSheetReplyFragment extends BottomSheetDialogFragment { tinyDB = TinyDB.getInstance(context); draftsApi = BaseApi.getInstance(context, DraftsApi.class); - repositoryId = (int) tinyDB.getLong("repositoryId", 0); - currentActiveAccountId = tinyDB.getInt("currentActiveAccountId"); - issueNumber = Integer.parseInt(tinyDB.getString("issueNumber")); + currentActiveAccountId = ((BaseActivity) requireActivity()).getAccount().getAccount().getAccountId(); + issue = IssueContext.fromBundle(requireArguments()); } @SuppressLint("ClickableViewAccessibility") @@ -95,9 +97,9 @@ public class BottomSheetReplyFragment extends BottomSheetDialogFragment { draftId = Long.parseLong(arguments.getString("draftId")); } - if(!tinyDB.getString("issueTitle").isEmpty()) { + if(issue.getIssue() != null && !issue.getIssue().getTitle().isEmpty()) { - toolbarTitle.setText(EmojiParser.parseToUnicode(tinyDB.getString("issueTitle"))); + toolbarTitle.setText(EmojiParser.parseToUnicode(issue.getIssue().getTitle())); } else if(arguments.getString("draftTitle") != null) { @@ -179,20 +181,21 @@ public class BottomSheetReplyFragment extends BottomSheetDialogFragment { if(mode == Mode.SEND) { IssueActions - .reply(getContext(), comment.getText().toString(), issueNumber) + .reply(getContext(), comment.getText().toString(), issue) .accept((status, result) -> { if(status == ActionResult.Status.SUCCESS) { - Toasty.success(getContext(), getString(R.string.commentSuccess)); - - if(draftId != 0 && tinyDB.getBoolean("draftsCommentsDeletionEnabled")) { - draftsApi.deleteSingleDraft((int) draftId); + FragmentActivity activity = requireActivity(); + if(activity instanceof IssueDetailActivity) { + ((IssueDetailActivity) activity).commentPosted = true; } - tinyDB.putBoolean("commentPosted", true); - tinyDB.putBoolean("resumeIssues", true); - tinyDB.putBoolean("resumePullRequests", true); + Toasty.success(getContext(), getString(R.string.commentSuccess)); + + if(draftId != 0 && tinyDB.getBoolean("draftsCommentsDeletionEnabled", true)) { + draftsApi.deleteSingleDraft((int) draftId); + } if(onInteractedListener != null) { onInteractedListener.run(); @@ -209,17 +212,20 @@ public class BottomSheetReplyFragment extends BottomSheetDialogFragment { } else { IssueActions - .edit(getContext(), comment.getText().toString(), arguments.getInt("commentId")) + .edit(getContext(), comment.getText().toString(), arguments.getInt("commentId"), issue) .accept((status, result) -> { + FragmentActivity activity = requireActivity(); + if(activity instanceof IssueDetailActivity) { + ((IssueDetailActivity) activity).commentEdited = true; + } + if(status == ActionResult.Status.SUCCESS) { - if(draftId != 0 && tinyDB.getBoolean("draftsCommentsDeletionEnabled")) { + if(draftId != 0 && tinyDB.getBoolean("draftsCommentsDeletionEnabled", true)) { draftsApi.deleteSingleDraft((int) draftId); } - tinyDB.putBoolean("commentEdited", true); - if(onInteractedListener != null) { onInteractedListener.run(); } @@ -263,11 +269,11 @@ public class BottomSheetReplyFragment extends BottomSheetDialogFragment { else { String draftType; - if(tinyDB.getString("issueType").equalsIgnoreCase("Issue")) { + if(issue.getIssueType().equalsIgnoreCase("Issue")) { draftType = Constants.draftTypeIssue; } - else if(tinyDB.getString("issueType").equalsIgnoreCase("Pull")) { + else if(issue.getIssueType().equalsIgnoreCase("Pull")) { draftType = Constants.draftTypePull; } @@ -278,7 +284,7 @@ public class BottomSheetReplyFragment extends BottomSheetDialogFragment { if(draftId == 0) { - draftId = draftsApi.insertDraft(repositoryId, currentActiveAccountId, issueNumber, text, draftType, "TODO", tinyDB.getString("issueType")); + draftId = draftsApi.insertDraft(issue.getRepository().getRepositoryId(), currentActiveAccountId, issue.getIssueIndex(), text, draftType, "TODO", issue.getIssueType()); } else { @@ -290,9 +296,10 @@ public class BottomSheetReplyFragment extends BottomSheetDialogFragment { } } - public static BottomSheetReplyFragment newInstance(Bundle bundle) { + public static BottomSheetReplyFragment newInstance(Bundle bundle, IssueContext issue) { BottomSheetReplyFragment fragment = new BottomSheetReplyFragment(); + bundle.putSerializable(IssueContext.INTENT_EXTRA, issue); fragment.setArguments(bundle); return fragment; diff --git a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetRepoFragment.java b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetRepoFragment.java index 72f220e6..3da09599 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetRepoFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetRepoFragment.java @@ -11,7 +11,7 @@ import androidx.annotation.Nullable; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import org.mian.gitnex.actions.RepositoryActions; import org.mian.gitnex.databinding.BottomSheetRepoBinding; -import org.mian.gitnex.helpers.TinyDB; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import org.mian.gitnex.structs.BottomSheetListener; /** @@ -21,16 +21,19 @@ import org.mian.gitnex.structs.BottomSheetListener; public class BottomSheetRepoFragment extends BottomSheetDialogFragment { private BottomSheetListener bmListener; + private final RepositoryContext repository; - @Nullable + public BottomSheetRepoFragment(RepositoryContext repository) { + this.repository = repository; + } + + @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { BottomSheetRepoBinding bottomSheetRepoBinding = BottomSheetRepoBinding.inflate(inflater, container, false); - final TinyDB tinyDb = TinyDB.getInstance(getContext()); - - TextView createLabel = bottomSheetRepoBinding.createLabel; + TextView createLabel = bottomSheetRepoBinding.createLabel; TextView createIssue = bottomSheetRepoBinding.createNewIssue; TextView createMilestone = bottomSheetRepoBinding.createNewMilestone; TextView addCollaborator = bottomSheetRepoBinding.addCollaborator; @@ -47,7 +50,7 @@ public class BottomSheetRepoFragment extends BottomSheetDialogFragment { TextView repoSettings = bottomSheetRepoBinding.repoSettings; TextView createPullRequest = bottomSheetRepoBinding.createPullRequest; - boolean canPush = tinyDb.getBoolean("canPush"); + boolean canPush = repository.getPermissions().canPush(); if(!canPush) { createMilestone.setVisibility(View.GONE); createLabel.setVisibility(View.GONE); @@ -55,7 +58,7 @@ public class BottomSheetRepoFragment extends BottomSheetDialogFragment { newFile.setVisibility(View.GONE); } - boolean archived = tinyDb.getBoolean("isArchived"); + boolean archived = repository.getRepository().isArchived(); if(archived) { createIssue.setVisibility(View.GONE); createPullRequest.setVisibility(View.GONE); @@ -72,7 +75,7 @@ public class BottomSheetRepoFragment extends BottomSheetDialogFragment { dismiss(); }); - if(tinyDb.getBoolean("hasIssues") && !archived) { + if(repository.getRepository().getHas_issues() && !archived) { createIssue.setVisibility(View.VISIBLE); createIssue.setOnClickListener(v12 -> { @@ -86,7 +89,7 @@ public class BottomSheetRepoFragment extends BottomSheetDialogFragment { createIssue.setVisibility(View.GONE); } - if(tinyDb.getBoolean("hasPullRequests") && !archived) { + if(repository.getRepository().isHas_pull_requests() && !archived) { createPullRequest.setVisibility(View.VISIBLE); createPullRequest.setOnClickListener(vPr -> { @@ -106,7 +109,7 @@ public class BottomSheetRepoFragment extends BottomSheetDialogFragment { dismiss(); }); - if (tinyDb.getBoolean("isRepoAdmin")) { + if (repository.getPermissions().isAdmin()) { repoSettings.setOnClickListener(repoSettingsView -> { @@ -157,50 +160,48 @@ public class BottomSheetRepoFragment extends BottomSheetDialogFragment { dismiss(); }); - if(tinyDb.getInt("repositoryStarStatus") == 204) { // star a repo + if(repository.isStarred()) { starRepository.setVisibility(View.GONE); unStarRepository.setOnClickListener(v18 -> { - RepositoryActions.unStarRepository(getContext()); - tinyDb.putInt("repositoryStarStatus", 404); + RepositoryActions.unStarRepository(getContext(), repository); + bmListener.onButtonClicked("unstar"); dismiss(); }); - } - else if(tinyDb.getInt("repositoryStarStatus") == 404) { + } else { unStarRepository.setVisibility(View.GONE); starRepository.setOnClickListener(v19 -> { - RepositoryActions.starRepository(getContext()); - tinyDb.putInt("repositoryStarStatus", 204); + RepositoryActions.starRepository(getContext(), repository); + bmListener.onButtonClicked("star"); dismiss(); }); } - if(tinyDb.getBoolean("repositoryWatchStatus")) { // watch a repo + if(repository.isWatched()) { watchRepository.setVisibility(View.GONE); unWatchRepository.setOnClickListener(v110 -> { - RepositoryActions.unWatchRepository(getContext()); - tinyDb.putBoolean("repositoryWatchStatus", false); + RepositoryActions.unWatchRepository(getContext(), repository); + bmListener.onButtonClicked("unwatch"); dismiss(); }); - } - else { + } else { unWatchRepository.setVisibility(View.GONE); watchRepository.setOnClickListener(v111 -> { - RepositoryActions.watchRepository(getContext()); - tinyDb.putBoolean("repositoryWatchStatus", true); + RepositoryActions.watchRepository(getContext(), repository); + bmListener.onButtonClicked("watch"); dismiss(); }); @@ -218,7 +219,7 @@ public class BottomSheetRepoFragment extends BottomSheetDialogFragment { bmListener = (BottomSheetListener) context; } catch (ClassCastException e) { - throw new ClassCastException(context.toString() + " must implement BottomSheetListener"); + throw new ClassCastException(context + " must implement BottomSheetListener"); } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetSingleIssueFragment.java b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetSingleIssueFragment.java index 5a0b5d96..5a8dc875 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/BottomSheetSingleIssueFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/BottomSheetSingleIssueFragment.java @@ -17,13 +17,14 @@ import org.mian.gitnex.R; import org.mian.gitnex.actions.IssueActions; import org.mian.gitnex.actions.PullRequestActions; import org.mian.gitnex.activities.DiffActivity; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.EditIssueActivity; +import org.mian.gitnex.activities.IssueDetailActivity; import org.mian.gitnex.activities.MergePullRequestActivity; import org.mian.gitnex.databinding.BottomSheetSingleIssueBinding; import org.mian.gitnex.helpers.AlertDialogs; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; -import org.mian.gitnex.helpers.Version; +import org.mian.gitnex.helpers.contexts.IssueContext; import org.mian.gitnex.structs.BottomSheetListener; import org.mian.gitnex.views.ReactionSpinner; import java.util.Objects; @@ -35,9 +36,11 @@ import java.util.Objects; public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment { private BottomSheetListener bmListener; + private final IssueContext issue; private final String issueCreator; - public BottomSheetSingleIssueFragment(String username) { + public BottomSheetSingleIssueFragment(IssueContext issue, String username) { + this.issue = issue; issueCreator = username; } @@ -48,21 +51,16 @@ public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment { BottomSheetSingleIssueBinding binding = BottomSheetSingleIssueBinding.inflate(inflater, container, false); final Context ctx = getContext(); - final TinyDB tinyDB = TinyDB.getInstance(ctx); - boolean userIsCreator = issueCreator.equals(tinyDB.getString("loginUid")); - boolean isRepoAdmin = tinyDB.getBoolean("isRepoAdmin"); - boolean canPush = tinyDB.getBoolean("canPush"); - boolean archived = tinyDB.getBoolean("isArchived"); - - String repoFullName = tinyDB.getString("repoFullName"); - String[] parts = repoFullName.split("/"); + boolean userIsCreator = issueCreator.equals(((BaseActivity) requireActivity()).getAccount().getAccount().getUserName()); + boolean isRepoAdmin = issue.getRepository().getPermissions().isAdmin(); + boolean canPush = issue.getRepository().getPermissions().canPush(); + boolean archived = issue.getRepository().getRepository().isArchived(); Bundle bundle = new Bundle(); - - bundle.putString("repoOwner", parts[0]); - bundle.putString("repoName", parts[1]); - bundle.putInt("issueId", Integer.parseInt(tinyDB.getString("issueNumber"))); + bundle.putString("repoOwner", issue.getRepository().getOwner()); + bundle.putString("repoName", issue.getRepository().getName()); + bundle.putInt("issueId", issue.getIssueIndex()); TextView loadReactions = new TextView(ctx); loadReactions.setText(Objects.requireNonNull(ctx).getString(R.string.genericWaitFor)); @@ -73,7 +71,7 @@ public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment { ReactionSpinner reactionSpinner = new ReactionSpinner(ctx, bundle); reactionSpinner.setOnInteractedListener(() -> { - tinyDB.putBoolean("singleIssueUpdate", true); + ((IssueDetailActivity) requireActivity()).singleIssueUpdate = true; bmListener.onButtonClicked("onResume"); dismiss(); @@ -84,14 +82,14 @@ public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment { binding.commentReactionButtons.addView(reactionSpinner); }); - if(tinyDB.getString("issueType").equalsIgnoreCase("Pull")) { + if(issue.getIssueType().equalsIgnoreCase("Pull")) { binding.editIssue.setText(R.string.editPrText); binding.copyIssueUrl.setText(R.string.copyPrUrlText); binding.shareIssue.setText(R.string.sharePr); - boolean canPushPullSource = tinyDB.getBoolean("canPushPullSource"); - if(tinyDB.getBoolean("prMerged") || tinyDB.getString("repoPrState").equals("closed")) { + boolean canPushPullSource = issue.getPullRequest().getHead().getRepo().getPermissions().isPush(); + if(issue.getPullRequest().isMerged() || issue.getIssue().getState().equals("closed")) { binding.updatePullRequest.setVisibility(View.GONE); binding.mergePullRequest.setVisibility(View.GONE); if(canPushPullSource) { @@ -114,7 +112,7 @@ public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment { if(!userIsCreator && !canPush) { binding.editIssue.setVisibility(View.GONE); } - if(canPush && !tinyDB.getString("prMergeable").equals("false")) { + if(canPush && !issue.getPullRequest().isMergeable()) { binding.mergePullRequest.setVisibility(View.VISIBLE); } else { @@ -123,18 +121,8 @@ public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment { binding.deletePrHeadBranch.setVisibility(View.GONE); } - if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.13.0")) { - binding.openFilesDiff.setVisibility(View.VISIBLE); - } - else if(tinyDB.getString("repoType").equals("public")) { - binding.openFilesDiff.setVisibility(View.VISIBLE); - } - else { - binding.openFilesDiff.setVisibility(View.GONE); - } - - } - else { + binding.openFilesDiff.setVisibility(View.VISIBLE); + } else { if(!userIsCreator && !canPush) { binding.editIssue.setVisibility(View.GONE); } @@ -144,35 +132,35 @@ public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment { } binding.updatePullRequest.setOnClickListener(v -> { - if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.16.0")) { - AlertDialogs.selectPullUpdateStrategy(requireContext(), parts[0], parts[1], tinyDB.getString("issueNumber")); - } - else { - PullRequestActions.updatePr(requireContext(), parts[0], parts[1], tinyDB.getString("issueNumber"), null); + if(((BaseActivity) requireActivity()).getAccount().requiresVersion("1.16.0")) { + AlertDialogs.selectPullUpdateStrategy(requireContext(), issue.getRepository().getOwner(), issue.getRepository().getName(), + String.valueOf(issue.getIssueIndex())); + } else { + PullRequestActions.updatePr(requireContext(), issue.getRepository().getOwner(), issue.getRepository().getName(), + String.valueOf(issue.getIssueIndex()), null); } dismiss(); }); binding.mergePullRequest.setOnClickListener(v13 -> { - startActivity(new Intent(ctx, MergePullRequestActivity.class)); - dismiss(); - }); - binding.openFilesDiff.setOnClickListener(v14 -> { - startActivity(new Intent(ctx, DiffActivity.class)); + startActivity(issue.getIntent(ctx, MergePullRequestActivity.class)); dismiss(); }); binding.deletePrHeadBranch.setOnClickListener(v -> { - PullRequestActions.deleteHeadBranch(ctx, parts[0], parts[1], tinyDB.getString("prHeadBranch"), true); + PullRequestActions.deleteHeadBranch(ctx, issue.getRepository().getOwner(), issue.getRepository().getName(), issue.getPullRequest().getHead().getRef(), true); dismiss(); }); - + binding.openFilesDiff.setOnClickListener(v14 -> { + startActivity(issue.getIntent(ctx, DiffActivity.class)); + dismiss(); + }); binding.editIssue.setOnClickListener(v15 -> { - startActivity(new Intent(ctx, EditIssueActivity.class)); + ((IssueDetailActivity) requireActivity()).editIssueLauncher.launch(issue.getIntent(ctx, EditIssueActivity.class)); dismiss(); }); @@ -190,9 +178,9 @@ public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment { Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); sharingIntent.setType("text/plain"); - sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, getResources().getString(R.string.hash) + tinyDB.getString("issueNumber") + " " + tinyDB.getString("issueTitle")); - sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, tinyDB.getString("singleIssueHtmlUrl")); - startActivity(Intent.createChooser(sharingIntent, getResources().getString(R.string.hash) + tinyDB.getString("issueNumber") + " " + tinyDB.getString("issueTitle"))); + sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, getResources().getString(R.string.hash) + issue.getIssueIndex() + " " + issue.getIssue().getTitle()); + sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, issue.getIssue().getHtml_url()); + startActivity(Intent.createChooser(sharingIntent, getResources().getString(R.string.hash) + issue.getIssueIndex() + " " + issue.getIssue().getTitle())); dismiss(); }); @@ -201,7 +189,7 @@ public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment { // copy to clipboard ClipboardManager clipboard = (ClipboardManager) Objects.requireNonNull(ctx).getSystemService(Context.CLIPBOARD_SERVICE); - ClipData clip = ClipData.newPlainText("issueUrl", tinyDB.getString("singleIssueHtmlUrl")); + ClipData clip = ClipData.newPlainText("issueUrl", issue.getIssue().getHtml_url()); assert clipboard != null; clipboard.setPrimaryClip(clip); @@ -210,22 +198,22 @@ public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment { dismiss(); }); - if(tinyDB.getString("issueState").equals("open")) { // close issue + if(issue.getIssue().getState().equals("open")) { // close issue if(!userIsCreator && !canPush) { binding.closeIssue.setVisibility(View.GONE); binding.dividerCloseReopenIssue.setVisibility(View.GONE); } - else if(tinyDB.getString("issueType").equalsIgnoreCase("Pull")) { + else if(issue.getIssueType().equalsIgnoreCase("Pull")) { binding.closeIssue.setText(R.string.closePr); } binding.closeIssue.setOnClickListener(closeSingleIssue -> { - IssueActions.closeReopenIssue(ctx, Integer.parseInt(tinyDB.getString("issueNumber")), "closed"); + IssueActions.closeReopenIssue(ctx, "closed", issue); dismiss(); }); } - else if(tinyDB.getString("issueState").equals("closed")) { + else if(issue.getIssue().getState().equals("closed")) { if(userIsCreator || canPush) { - if(tinyDB.getString("issueType").equalsIgnoreCase("Pull")) { + if(issue.getIssueType().equalsIgnoreCase("Pull")) { binding.closeIssue.setText(R.string.reopenPr); } else { @@ -237,28 +225,26 @@ public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment { binding.dividerCloseReopenIssue.setVisibility(View.GONE); } binding.closeIssue.setOnClickListener(closeSingleIssue -> { - IssueActions.closeReopenIssue(ctx, Integer.parseInt(tinyDB.getString("issueNumber")), "open"); + IssueActions.closeReopenIssue(ctx, "open", issue); dismiss(); }); } binding.subscribeIssue.setOnClickListener(subscribeToIssue -> { - IssueActions.subscribe(ctx); + IssueActions.subscribe(ctx, issue); + issue.setSubscribed(true); dismiss(); }); binding.unsubscribeIssue.setOnClickListener(unsubscribeToIssue -> { - IssueActions.unsubscribe(ctx); + IssueActions.unsubscribe(ctx, issue); + issue.setSubscribed(false); dismiss(); }); - if(new Version(tinyDB.getString("giteaVersion")).less("1.12.0")) { - binding.subscribeIssue.setVisibility(View.GONE); - binding.unsubscribeIssue.setVisibility(View.GONE); - } - else if(tinyDB.getBoolean("issueSubscribed")) { + if(issue.isSubscribed()) { binding.subscribeIssue.setVisibility(View.GONE); binding.unsubscribeIssue.setVisibility(View.VISIBLE); } @@ -293,7 +279,7 @@ public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment { } catch(ClassCastException e) { - throw new ClassCastException(context.toString() + " must implement BottomSheetListener"); + throw new ClassCastException(context + " must implement BottomSheetListener"); } } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/CollaboratorsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/CollaboratorsFragment.java index cf8bbea1..bfb6c878 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/CollaboratorsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/CollaboratorsFragment.java @@ -1,6 +1,5 @@ package org.mian.gitnex.fragments; -import android.net.Uri; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -14,9 +13,10 @@ import androidx.fragment.app.Fragment; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; import org.gitnex.tea4j.models.Collaborators; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.adapters.CollaboratorsAdapter; import org.mian.gitnex.databinding.FragmentCollaboratorsBinding; -import org.mian.gitnex.helpers.Authorization; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import org.mian.gitnex.viewmodels.CollaboratorsViewModel; import java.util.List; @@ -26,35 +26,28 @@ import java.util.List; public class CollaboratorsFragment extends Fragment { + public static boolean refreshCollaborators = false; + private ProgressBar mProgressBar; private CollaboratorsAdapter adapter; private GridView mGridView; private TextView noDataCollaborators; - private static String repoNameF = "param2"; - private static String repoOwnerF = "param1"; - private String repoName; - private String repoOwner; + private RepositoryContext repository; public CollaboratorsFragment() { } - public static CollaboratorsFragment newInstance(String param1, String param2) { + public static CollaboratorsFragment newInstance(RepositoryContext repository) { CollaboratorsFragment fragment = new CollaboratorsFragment(); - Bundle args = new Bundle(); - args.putString(repoOwnerF, param1); - args.putString(repoNameF, param2); - fragment.setArguments(args); + fragment.setArguments(repository.getBundle()); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (getArguments() != null) { - repoName = getArguments().getString(repoNameF); - repoOwner = getArguments().getString(repoOwnerF); - } + repository = RepositoryContext.fromBundle(requireArguments()); } @Override @@ -67,7 +60,7 @@ public class CollaboratorsFragment extends Fragment { mProgressBar = fragmentCollaboratorsBinding.progressBar; mGridView = fragmentCollaboratorsBinding.gridView; - fetchDataAsync(Authorization.get(getContext()), repoOwner, repoName); + fetchDataAsync(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName()); return fragmentCollaboratorsBinding.getRoot(); } @@ -95,4 +88,14 @@ public class CollaboratorsFragment extends Fragment { } + @Override + public void onResume() { + + super.onResume(); + if(refreshCollaborators) { + fetchDataAsync(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName()); + refreshCollaborators = false; + } + } + } diff --git a/app/src/main/java/org/mian/gitnex/fragments/CommitDetailFragment.java b/app/src/main/java/org/mian/gitnex/fragments/CommitDetailFragment.java index 6a01217e..9559a673 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/CommitDetailFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/CommitDetailFragment.java @@ -16,6 +16,7 @@ import com.vdurmont.emoji.EmojiParser; import org.gitnex.tea4j.models.Commits; import org.gitnex.tea4j.models.FileDiffView; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.ProfileActivity; import org.mian.gitnex.adapters.DiffFilesAdapter; import org.mian.gitnex.clients.PicassoService; @@ -23,6 +24,7 @@ import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.CustomCommitHeaderBinding; import org.mian.gitnex.databinding.FragmentCommitDetailsBinding; import org.mian.gitnex.helpers.*; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.io.IOException; import java.util.List; import java.util.Objects; @@ -56,10 +58,9 @@ public class CommitDetailFragment extends Fragment { binding = FragmentCommitDetailsBinding.inflate(getLayoutInflater(), container, false); - String repoFullName = TinyDB.getInstance(requireContext()).getString("repoFullName"); - String[] parts = repoFullName.split("/"); - repoOwner = parts[0]; - repoName = parts[1]; + RepositoryContext repository = RepositoryContext.fromIntent(requireActivity().getIntent()); + repoOwner = repository.getOwner(); + repoName = repository.getName(); sha = requireActivity().getIntent().getStringExtra("sha"); binding.toolbarTitle.setText(sha.substring(0, Math.min(sha.length(), 10))); @@ -78,8 +79,8 @@ public class CommitDetailFragment extends Fragment { private void getDiff() { Call call = new Version(TinyDB.getInstance(requireContext()).getString("giteaVersion")).higherOrEqual("1.16.0") ? - RetrofitClient.getApiInterface(requireContext()).getCommitDiff(Authorization.get(requireContext()), repoOwner, repoName, sha) : - RetrofitClient.getWebInterface(requireContext()).getCommitDiff(Authorization.getWeb(requireContext()), repoOwner, repoName, sha); + RetrofitClient.getApiInterface(requireContext()).getCommitDiff(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repoOwner, repoName, sha) : + RetrofitClient.getWebInterface(requireContext()).getCommitDiff(((BaseActivity) requireActivity()).getAccount().getWebAuthorization(), repoOwner, repoName, sha); call.enqueue(new Callback() { @@ -130,7 +131,7 @@ public class CommitDetailFragment extends Fragment { private void getCommit() { - RetrofitClient.getApiInterface(requireContext()).getCommit(Authorization.get(requireContext()), repoOwner, repoName, sha) + RetrofitClient.getApiInterface(requireContext()).getCommit(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repoOwner, repoName, sha) .enqueue(new Callback() { @Override diff --git a/app/src/main/java/org/mian/gitnex/fragments/DiffFilesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/DiffFilesFragment.java index 1c2e64e1..54ee8347 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/DiffFilesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/DiffFilesFragment.java @@ -6,19 +6,15 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import org.gitnex.tea4j.models.FileDiffView; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.adapters.DiffFilesAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.FragmentDiffFilesBinding; -import org.mian.gitnex.helpers.AlertDialogs; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.ParseDiff; -import org.mian.gitnex.helpers.TinyDB; -import org.mian.gitnex.helpers.Toasty; -import org.mian.gitnex.helpers.Version; +import org.mian.gitnex.helpers.*; +import org.mian.gitnex.helpers.contexts.IssueContext; import java.io.IOException; import java.util.List; import okhttp3.ResponseBody; @@ -33,7 +29,6 @@ public class DiffFilesFragment extends Fragment { private FragmentDiffFilesBinding binding; private Context ctx; - private TinyDB tinyDB; public DiffFilesFragment() {} @@ -46,14 +41,7 @@ public class DiffFilesFragment extends Fragment { binding = FragmentDiffFilesBinding.inflate(inflater, container, false); ctx = requireContext(); - tinyDB = TinyDB.getInstance(ctx); - - String repoFullName = tinyDB.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - - String pullIndex = tinyDB.getString("issueNumber"); + IssueContext issue = IssueContext.fromIntent(requireActivity().getIntent()); binding.progressBar.setVisibility(View.VISIBLE); binding.toolbarTitle.setText(R.string.processingText); @@ -61,10 +49,10 @@ public class DiffFilesFragment extends Fragment { binding.diffFiles.setOnItemClickListener((parent, view, position, id) -> requireActivity().getSupportFragmentManager() .beginTransaction() - .replace(R.id.fragment_container, DiffFragment.newInstance((FileDiffView) parent.getItemAtPosition(position), "pull")) + .replace(R.id.fragment_container, DiffFragment.newInstance((FileDiffView) parent.getItemAtPosition(position), issue)) .commit()); - getPullDiffFiles(repoOwner, repoName, pullIndex); + getPullDiffFiles(issue.getRepository().getOwner(), issue.getRepository().getName(), String.valueOf(issue.getIssueIndex())); return binding.getRoot(); @@ -74,14 +62,18 @@ public class DiffFilesFragment extends Fragment { Thread thread = new Thread(() -> { - Call call = new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.13.0") ? - RetrofitClient.getApiInterface(ctx).getPullDiffContent(Authorization.get(ctx), owner, repo, pullIndex) : - RetrofitClient.getWebInterface(ctx).getPullDiffContent(Authorization.getWeb(ctx), owner, repo, pullIndex); + Call call = ((BaseActivity) ctx).getAccount().requiresVersion("1.13.0") ? + RetrofitClient.getApiInterface(ctx).getPullDiffContent(((BaseActivity) requireActivity()).getAccount().getAuthorization(), owner, repo, pullIndex) : + RetrofitClient.getWebInterface(ctx).getPullDiffContent(((BaseActivity) requireActivity()).getAccount().getWebAuthorization(), owner, repo, pullIndex); try { Response response = call.execute(); - assert response.body() != null; + if(response.body() == null) { + Toasty.error(requireContext(), getString(R.string.genericError)); + requireActivity().finish(); + return; + } switch(response.code()) { diff --git a/app/src/main/java/org/mian/gitnex/fragments/DiffFragment.java b/app/src/main/java/org/mian/gitnex/fragments/DiffFragment.java index 4a452558..a39d7831 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/DiffFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/DiffFragment.java @@ -11,6 +11,7 @@ import org.gitnex.tea4j.models.FileDiffView; import org.mian.gitnex.R; import org.mian.gitnex.adapters.DiffAdapter; import org.mian.gitnex.databinding.FragmentDiffBinding; +import org.mian.gitnex.helpers.contexts.IssueContext; import java.util.Arrays; import java.util.Objects; @@ -24,6 +25,7 @@ public class DiffFragment extends Fragment { private Context ctx; private FileDiffView fileDiffView; + private IssueContext issue; private String type; public DiffFragment() {} @@ -32,6 +34,20 @@ public class DiffFragment extends Fragment { this.fileDiffView = fileDiffView; } + public void setIssue(IssueContext issue) { + + this.issue = issue; + } + + public static DiffFragment newInstance(FileDiffView fileDiffView, IssueContext issue) { + + DiffFragment fragment = new DiffFragment(); + fragment.setFileDiffView(fileDiffView); + fragment.setIssue(issue); + return fragment; + + } + public static DiffFragment newInstance(FileDiffView fileDiffView, String type) { DiffFragment fragment = new DiffFragment(); @@ -55,7 +71,7 @@ public class DiffFragment extends Fragment { binding.toolbarTitle.setText(fileDiffView.getFileName()); binding.diff.setDivider(null); - binding.diff.setAdapter(new DiffAdapter(ctx, getChildFragmentManager(), Arrays.asList(fileDiffView.toString().split("\\R")), type)); + binding.diff.setAdapter(new DiffAdapter(ctx, getChildFragmentManager(), Arrays.asList(fileDiffView.toString().split("\\R")), issue, type)); return binding.getRoot(); diff --git a/app/src/main/java/org/mian/gitnex/fragments/ExploreIssuesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ExploreIssuesFragment.java index badb245a..96982b75 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ExploreIssuesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ExploreIssuesFragment.java @@ -16,10 +16,10 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import org.gitnex.tea4j.models.Issues; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.adapters.ExploreIssuesAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.FragmentSearchIssuesBinding; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.SnackBar; import java.util.ArrayList; @@ -100,7 +100,7 @@ public class ExploreIssuesFragment extends Fragment { private void loadInitial(String searchKeyword, int resultLimit) { Call> call = RetrofitClient - .getApiInterface(context).queryIssues(Authorization.get(getContext()), searchKeyword, "issues", "open", resultLimit, 1); + .getApiInterface(context).queryIssues(((BaseActivity) requireActivity()).getAccount().getAuthorization(), searchKeyword, "issues", "open", resultLimit, 1); call.enqueue(new Callback>() { @Override public void onResponse(@NonNull Call> call, @NonNull Response> response) { @@ -138,7 +138,7 @@ public class ExploreIssuesFragment extends Fragment { viewBinding.progressBar.setVisibility(View.VISIBLE); Call> call = RetrofitClient.getApiInterface(context) - .queryIssues(Authorization.get(getContext()), searchKeyword, "issues", "open", resultLimit, page); + .queryIssues(((BaseActivity) requireActivity()).getAccount().getAuthorization(), searchKeyword, "issues", "open", resultLimit, page); call.enqueue(new Callback>() { @Override public void onResponse(@NonNull Call> call, @NonNull Response> response) { diff --git a/app/src/main/java/org/mian/gitnex/fragments/ExplorePublicOrganizationsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ExplorePublicOrganizationsFragment.java index 113ed8ba..a0d21a1e 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ExplorePublicOrganizationsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ExplorePublicOrganizationsFragment.java @@ -15,13 +15,12 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import org.gitnex.tea4j.models.Organization; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.adapters.ExplorePublicOrganizationsAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.FragmentOrganizationsBinding; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.SnackBar; -import org.mian.gitnex.helpers.TinyDB; import java.util.ArrayList; import java.util.List; import retrofit2.Call; @@ -49,10 +48,6 @@ public class ExplorePublicOrganizationsFragment extends Fragment { fragmentPublicOrgBinding = FragmentOrganizationsBinding.inflate(inflater, container, false); context = getContext(); - TinyDB tinyDb = TinyDB.getInstance(getContext()); - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); - resultLimit = Constants.getCurrentResultLimit(context); fragmentPublicOrgBinding.addNewOrganization.setVisibility(View.GONE); @@ -60,7 +55,7 @@ public class ExplorePublicOrganizationsFragment extends Fragment { fragmentPublicOrgBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { fragmentPublicOrgBinding.pullToRefresh.setRefreshing(false); - loadInitial(instanceToken, resultLimit); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), resultLimit); adapter.notifyDataChanged(); }, 200)); @@ -68,7 +63,7 @@ public class ExplorePublicOrganizationsFragment extends Fragment { adapter.setLoadMoreListener(() -> fragmentPublicOrgBinding.recyclerView.post(() -> { if(organizationsList.size() == resultLimit || pageSize == resultLimit) { int page = (organizationsList.size() + resultLimit) / resultLimit; - loadMore(Authorization.get(getContext()), page, resultLimit); + loadMore(((BaseActivity) requireActivity()).getAccount().getAuthorization(), page, resultLimit); } })); @@ -78,7 +73,7 @@ public class ExplorePublicOrganizationsFragment extends Fragment { fragmentPublicOrgBinding.recyclerView.setLayoutManager(new LinearLayoutManager(context)); fragmentPublicOrgBinding.recyclerView.setAdapter(adapter); - loadInitial(Authorization.get(getContext()), resultLimit); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), resultLimit); return fragmentPublicOrgBinding.getRoot(); } diff --git a/app/src/main/java/org/mian/gitnex/fragments/ExploreRepositoriesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ExploreRepositoriesFragment.java index 4279e545..376c680e 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ExploreRepositoriesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ExploreRepositoriesFragment.java @@ -24,14 +24,13 @@ import androidx.recyclerview.widget.LinearLayoutManager; import org.gitnex.tea4j.models.ExploreRepositories; import org.gitnex.tea4j.models.UserRepositories; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.adapters.ExploreRepositoriesAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.CustomExploreRepositoriesDialogBinding; import org.mian.gitnex.databinding.FragmentExploreRepoBinding; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.SnackBar; -import org.mian.gitnex.helpers.TinyDB; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -49,7 +48,6 @@ public class ExploreRepositoriesFragment extends Fragment { private FragmentExploreRepoBinding viewBinding; private Context context; - private TinyDB tinyDb; private int pageSize; private final boolean repoTypeInclude = true; @@ -63,6 +61,11 @@ public class ExploreRepositoriesFragment extends Fragment { private Dialog dialogFilterOptions; private CustomExploreRepositoriesDialogBinding filterBinding; + private boolean includeTopic = false; + private boolean includeDescription = false; + private boolean includeTemplate = false; + private boolean onlyArchived = false; + @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -70,16 +73,9 @@ public class ExploreRepositoriesFragment extends Fragment { setHasOptionsMenu(true); context = getContext(); - tinyDb = TinyDB.getInstance(getContext()); - dataList = new ArrayList<>(); adapter = new ExploreRepositoriesAdapter(dataList, context); - tinyDb.putBoolean("exploreRepoIncludeTopic", false); - tinyDb.putBoolean("exploreRepoIncludeDescription", false); - tinyDb.putBoolean("exploreRepoIncludeTemplate", false); - tinyDb.putBoolean("exploreRepoOnlyArchived", false); - resultLimit = Constants.getCurrentResultLimit(context); viewBinding.searchKeyword.setOnEditorActionListener((v1, actionId, event) -> { @@ -89,12 +85,12 @@ public class ExploreRepositoriesFragment extends Fragment { imm.hideSoftInputFromWindow(viewBinding.searchKeyword.getWindowToken(), 0); viewBinding.progressBar.setVisibility(View.VISIBLE); - loadInitial(String.valueOf(viewBinding.searchKeyword.getText()), tinyDb.getBoolean("exploreRepoIncludeTopic"), tinyDb.getBoolean("exploreRepoIncludeDescription"), tinyDb.getBoolean("exploreRepoIncludeTemplate"), tinyDb.getBoolean("exploreRepoOnlyArchived"), resultLimit); + loadInitial(String.valueOf(viewBinding.searchKeyword.getText()), resultLimit); adapter.setLoadMoreListener(() -> viewBinding.recyclerViewReposSearch.post(() -> { if(dataList.size() == resultLimit || pageSize == resultLimit) { int page = (dataList.size() + resultLimit) / resultLimit; - loadMore(String.valueOf(viewBinding.searchKeyword.getText()), tinyDb.getBoolean("exploreRepoIncludeTopic"), tinyDb.getBoolean("exploreRepoIncludeDescription"), tinyDb.getBoolean("exploreRepoIncludeTemplate"), tinyDb.getBoolean("exploreRepoOnlyArchived"), resultLimit, page); + loadMore(String.valueOf(viewBinding.searchKeyword.getText()), resultLimit, page); } })); } @@ -104,14 +100,14 @@ public class ExploreRepositoriesFragment extends Fragment { viewBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { viewBinding.pullToRefresh.setRefreshing(false); - loadInitial("", tinyDb.getBoolean("exploreRepoIncludeTopic"), tinyDb.getBoolean("exploreRepoIncludeDescription"), tinyDb.getBoolean("exploreRepoIncludeTemplate"), tinyDb.getBoolean("exploreRepoOnlyArchived"), resultLimit); + loadInitial("", resultLimit); adapter.notifyDataChanged(); }, 200)); adapter.setLoadMoreListener(() -> viewBinding.recyclerViewReposSearch.post(() -> { if(dataList.size() == resultLimit || pageSize == resultLimit) { int page = (dataList.size() + resultLimit) / resultLimit; - loadMore(String.valueOf(viewBinding.searchKeyword.getText()), tinyDb.getBoolean("exploreRepoIncludeTopic"), tinyDb.getBoolean("exploreRepoIncludeDescription"), tinyDb.getBoolean("exploreRepoIncludeTemplate"), tinyDb.getBoolean("exploreRepoOnlyArchived"), resultLimit, page); + loadMore(String.valueOf(viewBinding.searchKeyword.getText()), resultLimit, page); } })); @@ -121,15 +117,15 @@ public class ExploreRepositoriesFragment extends Fragment { viewBinding.recyclerViewReposSearch.setLayoutManager(new LinearLayoutManager(context)); viewBinding.recyclerViewReposSearch.setAdapter(adapter); - loadInitial("", tinyDb.getBoolean("exploreRepoIncludeTopic"), tinyDb.getBoolean("exploreRepoIncludeDescription"), tinyDb.getBoolean("exploreRepoIncludeTemplate"), tinyDb.getBoolean("exploreRepoOnlyArchived"), resultLimit); + loadInitial("", resultLimit); return viewBinding.getRoot(); } - private void loadInitial(String searchKeyword, boolean exploreRepoIncludeTopic, boolean exploreRepoIncludeDescription, boolean exploreRepoIncludeTemplate, boolean exploreRepoOnlyArchived, int resultLimit) { + private void loadInitial(String searchKeyword, int resultLimit) { Call call = RetrofitClient - .getApiInterface(context).queryRepos(Authorization.get(getContext()), searchKeyword, repoTypeInclude, sort, order, exploreRepoIncludeTopic, exploreRepoIncludeDescription, exploreRepoIncludeTemplate, exploreRepoOnlyArchived, resultLimit, 1); + .getApiInterface(context).queryRepos(((BaseActivity) requireActivity()).getAccount().getAuthorization(), searchKeyword, repoTypeInclude, sort, order, includeTopic, includeDescription, includeTemplate, onlyArchived, resultLimit, 1); call.enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { @@ -163,11 +159,11 @@ public class ExploreRepositoriesFragment extends Fragment { }); } - private void loadMore(String searchKeyword, boolean exploreRepoIncludeTopic, boolean exploreRepoIncludeDescription, boolean exploreRepoIncludeTemplate, boolean exploreRepoOnlyArchived, int resultLimit, int page) { + private void loadMore(String searchKeyword, int resultLimit, int page) { viewBinding.progressBar.setVisibility(View.VISIBLE); Call call = RetrofitClient.getApiInterface(context) - .queryRepos(Authorization.get(getContext()), searchKeyword, repoTypeInclude, sort, order, exploreRepoIncludeTopic, exploreRepoIncludeDescription, exploreRepoIncludeTemplate, exploreRepoOnlyArchived, resultLimit, page); + .queryRepos(((BaseActivity) requireActivity()).getAccount().getAuthorization(), searchKeyword, repoTypeInclude, sort, order, includeTopic, includeDescription, includeTemplate, onlyArchived, resultLimit, page); call.enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { @@ -225,30 +221,20 @@ public class ExploreRepositoriesFragment extends Fragment { View view = filterBinding.getRoot(); dialogFilterOptions.setContentView(view); - filterBinding.includeTopic.setOnClickListener(includeTopic -> { - tinyDb.putBoolean("exploreRepoIncludeTopic", filterBinding.includeTopic.isChecked()); - }); + filterBinding.includeTopic.setOnClickListener(includeTopic -> this.includeTopic = filterBinding.includeTopic.isChecked()); - filterBinding.includeDesc.setOnClickListener(includeDesc -> { - tinyDb.putBoolean("exploreRepoIncludeDescription", filterBinding.includeDesc.isChecked()); - }); + filterBinding.includeDesc.setOnClickListener(includeDesc -> this.includeDescription = filterBinding.includeDesc.isChecked()); - filterBinding.includeTemplate.setOnClickListener(includeTemplate -> { - tinyDb.putBoolean("exploreRepoIncludeTemplate", filterBinding.includeTemplate.isChecked()); - }); + filterBinding.includeTemplate.setOnClickListener(includeTemplate -> this.includeTemplate = filterBinding.includeTemplate.isChecked()); - filterBinding.onlyArchived.setOnClickListener(onlyArchived -> { - tinyDb.putBoolean("exploreRepoOnlyArchived", filterBinding.onlyArchived.isChecked()); - }); + filterBinding.onlyArchived.setOnClickListener(onlyArchived -> this.onlyArchived = filterBinding.onlyArchived.isChecked()); - filterBinding.includeTopic.setChecked(tinyDb.getBoolean("exploreRepoIncludeTopic")); - filterBinding.includeDesc.setChecked(tinyDb.getBoolean("exploreRepoIncludeDescription")); - filterBinding.includeTemplate.setChecked(tinyDb.getBoolean("exploreRepoIncludeTemplate")); - filterBinding.onlyArchived.setChecked(tinyDb.getBoolean("exploreRepoOnlyArchived")); + filterBinding.includeTopic.setChecked(includeTopic); + filterBinding.includeDesc.setChecked(includeDescription); + filterBinding.includeTemplate.setChecked(includeTemplate); + filterBinding.onlyArchived.setChecked(onlyArchived); - filterBinding.cancel.setOnClickListener(editProperties -> { - dialogFilterOptions.dismiss(); - }); + filterBinding.cancel.setOnClickListener(editProperties -> dialogFilterOptions.dismiss()); dialogFilterOptions.show(); } diff --git a/app/src/main/java/org/mian/gitnex/fragments/ExploreUsersFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ExploreUsersFragment.java index 6eda8c1b..cbfa9b8b 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ExploreUsersFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ExploreUsersFragment.java @@ -17,10 +17,10 @@ import androidx.recyclerview.widget.LinearLayoutManager; import org.gitnex.tea4j.models.UserInfo; import org.gitnex.tea4j.models.UserSearch; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.adapters.UsersAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.FragmentExploreUsersBinding; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.SnackBar; import java.util.ArrayList; @@ -63,12 +63,12 @@ public class ExploreUsersFragment extends Fragment { imm.hideSoftInputFromWindow(viewBinding.searchKeyword.getWindowToken(), 0); viewBinding.progressBar.setVisibility(View.VISIBLE); - loadInitial(Authorization.get(context), String.valueOf(viewBinding.searchKeyword.getText()), resultLimit); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), String.valueOf(viewBinding.searchKeyword.getText()), resultLimit); adapter.setLoadMoreListener(() -> viewBinding.recyclerViewExploreUsers.post(() -> { if(usersList.size() == resultLimit || pageSize == resultLimit) { int page = (usersList.size() + resultLimit) / resultLimit; - loadMore(Authorization.get(context), String.valueOf(viewBinding.searchKeyword.getText()), resultLimit, page); + loadMore(((BaseActivity) requireActivity()).getAccount().getAuthorization(), String.valueOf(viewBinding.searchKeyword.getText()), resultLimit, page); } })); } @@ -78,14 +78,14 @@ public class ExploreUsersFragment extends Fragment { viewBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { viewBinding.pullToRefresh.setRefreshing(false); - loadInitial(Authorization.get(context), "", resultLimit); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), "", resultLimit); adapter.notifyDataChanged(); }, 200)); adapter.setLoadMoreListener(() -> viewBinding.recyclerViewExploreUsers.post(() -> { if(usersList.size() == resultLimit || pageSize == resultLimit) { int page = (usersList.size() + resultLimit) / resultLimit; - loadMore(Authorization.get(context), "", resultLimit, page); + loadMore(((BaseActivity) requireActivity()).getAccount().getAuthorization(), "", resultLimit, page); } })); @@ -95,7 +95,7 @@ public class ExploreUsersFragment extends Fragment { viewBinding.recyclerViewExploreUsers.setLayoutManager(new LinearLayoutManager(context)); viewBinding.recyclerViewExploreUsers.setAdapter(adapter); - loadInitial(Authorization.get(context), "", resultLimit); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), "", resultLimit); return viewBinding.getRoot(); } diff --git a/app/src/main/java/org/mian/gitnex/fragments/FilesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/FilesFragment.java index 93e0881c..bf7585cb 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/FilesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/FilesFragment.java @@ -19,30 +19,24 @@ import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import org.gitnex.tea4j.models.Files; -import org.gitnex.tea4j.models.UserRepositories; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.FileViewActivity; import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.adapters.FilesAdapter; -import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.database.api.BaseApi; -import org.mian.gitnex.database.api.RepositoriesApi; import org.mian.gitnex.database.api.UserAccountsApi; -import org.mian.gitnex.database.models.Repository; import org.mian.gitnex.database.models.UserAccount; import org.mian.gitnex.databinding.FragmentFilesBinding; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Path; -import org.mian.gitnex.helpers.TinyDB; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import org.mian.gitnex.viewmodels.FilesViewModel; import java.util.ArrayList; import java.util.Collections; import java.util.List; import moe.feng.common.view.breadcrumbs.DefaultBreadcrumbsCallback; import moe.feng.common.view.breadcrumbs.model.BreadcrumbItem; -import retrofit2.Call; -import retrofit2.Callback; /** * Author M M Arif @@ -52,13 +46,7 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter private FragmentFilesBinding binding; - private static final String repoNameF = "param2"; - private static final String repoOwnerF = "param1"; - private static final String repoRefF = "param3"; - - private String repoName; - private String repoOwner; - private String ref; + private RepositoryContext repository; private final Path path = new Path(); @@ -66,30 +54,18 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter public FilesFragment() {} - public static FilesFragment newInstance(String param1, String param2, String param3) { + public static FilesFragment newInstance(RepositoryContext repository) { FilesFragment fragment = new FilesFragment(); - - Bundle args = new Bundle(); - args.putString(repoOwnerF, param1); - args.putString(repoNameF, param2); - args.putString(repoRefF, param3); - - fragment.setArguments(args); + fragment.setArguments(repository.getBundle()); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { - + repository = RepositoryContext.fromBundle(requireArguments()); super.onCreate(savedInstanceState); - - if(getArguments() != null) { - repoName = getArguments().getString(repoNameF); - repoOwner = getArguments().getString(repoOwnerF); - ref = getArguments().getString(repoRefF); - } } @Override @@ -105,7 +81,7 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter binding.recyclerView.setAdapter(filesAdapter); binding.recyclerView.addItemDecoration(new DividerItemDecoration(binding.recyclerView.getContext(), DividerItemDecoration.VERTICAL)); - binding.breadcrumbsView.setItems(new ArrayList<>(Collections.singletonList(BreadcrumbItem.createSimpleItem(getResources().getString(R.string.filesBreadcrumbRoot) + getResources().getString(R.string.colonDivider) + ref)))); + binding.breadcrumbsView.setItems(new ArrayList<>(Collections.singletonList(BreadcrumbItem.createSimpleItem(getResources().getString(R.string.filesBreadcrumbRoot) + getResources().getString(R.string.colonDivider) + repository.getBranchRef())))); // noinspection unchecked binding.breadcrumbsView.setCallback(new DefaultBreadcrumbsCallback() { @@ -129,16 +105,16 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter @Override public void handleOnBackPressed() { - if(path.size() == 0 || RepoDetailActivity.mViewPager.getCurrentItem() != 1) { + if(path.size() == 0 || ((RepoDetailActivity) requireActivity()).mViewPager.getCurrentItem() != 1) { requireActivity().finish(); return; } path.remove(path.size() - 1); binding.breadcrumbsView.removeLastItem(); if(path.size() == 0) { - fetchDataAsync(Authorization.get(getContext()), repoOwner, repoName, ref); + fetchDataAsync(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), repository.getBranchRef()); } else { - fetchDataAsyncSub(Authorization.get(getContext()), repoOwner, repoName, path.toString(), ref); + fetchDataAsyncSub(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), path.toString(), repository.getBranchRef()); } } }); @@ -150,11 +126,10 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter ((RepoDetailActivity) requireActivity()).setFragmentRefreshListenerFiles(repoBranch -> { + repository.setBranchRef(repoBranch); path.clear(); - ref = repoBranch; - binding.breadcrumbsView.setItems(new ArrayList<>(Collections.singletonList(BreadcrumbItem.createSimpleItem(getResources().getString(R.string.filesBreadcrumbRoot) + getResources().getString(R.string.colonDivider) + ref)))); + binding.breadcrumbsView.setItems(new ArrayList<>(Collections.singletonList(BreadcrumbItem.createSimpleItem(getResources().getString(R.string.filesBreadcrumbRoot) + getResources().getString(R.string.colonDivider) + repository.getBranchRef())))); refresh(); - }); @@ -184,7 +159,7 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter case "file": case "symlink": - Intent intent = new Intent(getContext(), FileViewActivity.class); + Intent intent = repository.getIntent(getContext(), FileViewActivity.class); intent.putExtra("file", file); requireContext().startActivity(intent); @@ -199,7 +174,7 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter String host = url.getHost(); UserAccountsApi userAccountsApi = BaseApi.getInstance(requireContext(), UserAccountsApi.class); - List userAccounts = userAccountsApi.usersAccounts(); + List userAccounts = userAccountsApi.loggedInUserAccounts(); UserAccount account = null; for(UserAccount userAccount : userAccounts) { @@ -208,16 +183,14 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter account = userAccount; // if scheme is wrong fix it if (!url.getScheme().equals(instanceUri.getScheme())) { - url = AppUtil.changeScheme(url,instanceUri.getScheme()); + url = AppUtil.changeScheme(url, instanceUri.getScheme()); } break; } } if(account != null) { - TinyDB tinyDB = TinyDB.getInstance(requireContext()); - int oldId = tinyDB.getInt("currentActiveAccountId"); - AppUtil.switchToAccount(requireContext(), account); + AppUtil.switchToAccount(requireContext(), account, true); List splittedUrl = url.getPathSegments(); if(splittedUrl.size() < 2) { AppUtil.openUrlInBrowser(requireContext(), url.toString()); @@ -228,62 +201,7 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter repo = repo.substring(0, repo.length() - 4); } - Call call = RetrofitClient - .getApiInterface(requireContext(), account.getInstanceUrl()) - .getUserRepository(Authorization.get(requireContext()), owner, repo); - - Uri finalUrl = url; - call.enqueue(new Callback() { - - @Override - public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { - - UserRepositories repoInfo = response.body(); - - if (response.code() == 200) { - - assert repoInfo != null; - - Intent repoIntent = new Intent(requireContext(), RepoDetailActivity.class); - repoIntent.putExtra("repoFullName", repoInfo.getFullName()); - repoIntent.putExtra("goToSection", "yes"); - repoIntent.putExtra("goToSectionType", "repo"); - repoIntent.putExtra("switchAccountBackOnFinish", true); - repoIntent.putExtra("oldAccountId", oldId); - - tinyDB.putString("repoFullName", repoInfo.getFullName()); - if(repoInfo.getPrivateFlag()) { - tinyDB.putString("repoType", getResources().getString(R.string.strPrivate)); - } - else { - tinyDB.putString("repoType", getResources().getString(R.string.strPublic)); - } - tinyDB.putBoolean("isRepoAdmin", repoInfo.getPermissions().isAdmin()); - tinyDB.putString("repoBranch", repoInfo.getDefault_branch()); - - int currentActiveAccountId = tinyDB.getInt("currentActiveAccountId"); - - RepositoriesApi repositoryData = BaseApi.getInstance(requireContext(), RepositoriesApi.class); - Integer count = repositoryData.checkRepository(currentActiveAccountId, repoOwner, repoName); - if(count == 0) { - long id = repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName); - tinyDB.putLong("repositoryId", id); - } else { - Repository data = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName); - tinyDB.putLong("repositoryId", data.getRepositoryId()); - } - - startActivity(repoIntent); - } else { - AppUtil.openUrlInBrowser(requireContext(), finalUrl.toString()); - } - } - - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - AppUtil.openUrlInBrowser(requireContext(), finalUrl.toString()); - } - }); + startActivity(new RepositoryContext(owner, repo, requireContext()).getIntent(requireContext(), RepoDetailActivity.class)); } else { AppUtil.openUrlInBrowser(requireContext(), url.toString()); } @@ -293,9 +211,9 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter public void refresh() { if(path.size() > 0) { - fetchDataAsyncSub(Authorization.get(getContext()), repoOwner, repoName, path.toString(), ref); + fetchDataAsyncSub(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), path.toString(), repository.getBranchRef()); } else { - fetchDataAsync(Authorization.get(getContext()), repoOwner, repoName, ref); + fetchDataAsync(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), repository.getBranchRef()); } } 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 4c293dde..cf7b5cf9 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/IssuesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/IssuesFragment.java @@ -19,15 +19,14 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import org.gitnex.tea4j.models.Issues; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.adapters.IssuesAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.FragmentIssuesBinding; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.SnackBar; -import org.mian.gitnex.helpers.TinyDB; -import org.mian.gitnex.helpers.Version; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.ArrayList; import java.util.List; import retrofit2.Call; @@ -40,6 +39,8 @@ import retrofit2.Response; public class IssuesFragment extends Fragment { + public static boolean resumeIssues = false; + private FragmentIssuesBinding fragmentIssuesBinding; private Context context; @@ -52,6 +53,14 @@ public class IssuesFragment extends Fragment { private int resultLimit = Constants.resultLimitOldGiteaInstances; private final String requestType = Constants.issuesRequestType; + private RepositoryContext repository; + + public static IssuesFragment newInstance(RepositoryContext repository) { + IssuesFragment f = new IssuesFragment(); + f.setArguments(repository.getBundle()); + return f; + } + @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -60,16 +69,10 @@ public class IssuesFragment extends Fragment { setHasOptionsMenu(true); context = getContext(); - TinyDB tinyDb = TinyDB.getInstance(context); - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); + repository = RepositoryContext.fromBundle(requireArguments()); // if gitea is 1.12 or higher use the new limit - if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) { + if(((BaseActivity) requireActivity()).getAccount().requiresVersion("1.12.0")) { resultLimit = Constants.resultLimitNewGiteaInstances; } @@ -77,7 +80,7 @@ public class IssuesFragment extends Fragment { fragmentIssuesBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { fragmentIssuesBinding.pullToRefresh.setRefreshing(false); - loadInitial(instanceToken, repoOwner, repoName, resultLimit, requestType, tinyDb.getString("repoIssuesState"), ""); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), resultLimit, requestType, repository.getIssueState().toString(), ""); adapter.notifyDataChanged(); }, 200)); @@ -85,7 +88,7 @@ public class IssuesFragment extends Fragment { adapter.setLoadMoreListener(() -> fragmentIssuesBinding.recyclerView.post(() -> { if(issuesList.size() == resultLimit || pageSize == resultLimit) { int page = (issuesList.size() + resultLimit) / resultLimit; - loadMore(Authorization.get(context), repoOwner, repoName, page, resultLimit, requestType, tinyDb.getString("repoIssuesState"), ""); + loadMore(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), page, resultLimit, requestType, repository.getIssueState().toString(), ""); } })); @@ -111,16 +114,14 @@ public class IssuesFragment extends Fragment { if(issuesList.size() == resultLimit || pageSize == resultLimit) { int page = (issuesList.size() + resultLimit) / resultLimit; - loadMore(Authorization.get(context), repoOwner, repoName, page, resultLimit, requestType, tinyDb.getString("repoIssuesState"), ""); + loadMore(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), page, resultLimit, requestType, repository.getIssueState().toString(), repository.getIssueMilestoneFilterName()); } })); - tinyDb.putString("repoIssuesState", issueState); - fragmentIssuesBinding.progressBar.setVisibility(View.VISIBLE); fragmentIssuesBinding.noDataIssues.setVisibility(View.GONE); - loadInitial(Authorization.get(context), repoOwner, repoName, resultLimit, requestType, issueState, ""); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), resultLimit, requestType, issueState, repository.getIssueMilestoneFilterName()); fragmentIssuesBinding.recyclerView.setAdapter(adapter); }); @@ -133,38 +134,28 @@ public class IssuesFragment extends Fragment { if(issuesList.size() == resultLimit || pageSize == resultLimit) { int page = (issuesList.size() + resultLimit) / resultLimit; - loadMore(Authorization.get(context), repoOwner, repoName, page, resultLimit, requestType, tinyDb.getString("repoIssuesState"), tinyDb.getString("issueMilestoneFilterId")); + loadMore(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), page, resultLimit, requestType, repository.getIssueState().toString(), repository.getIssueMilestoneFilterName()); } })); - tinyDb.putString("issueMilestoneFilterId", filterIssueByMilestone); - fragmentIssuesBinding.progressBar.setVisibility(View.VISIBLE); fragmentIssuesBinding.noDataIssues.setVisibility(View.GONE); - loadInitial(Authorization.get(context), repoOwner, repoName, resultLimit, requestType, tinyDb.getString("repoIssuesState"), filterIssueByMilestone); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), resultLimit, requestType, repository.getIssueState().toString(), filterIssueByMilestone); fragmentIssuesBinding.recyclerView.setAdapter(adapter); }); - loadInitial(Authorization.get(context), repoOwner, repoName, resultLimit, requestType, tinyDb.getString("repoIssuesState"), tinyDb.getString("issueMilestoneFilterId")); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), resultLimit, requestType, repository.getIssueState().toString(), repository.getIssueMilestoneFilterName()); return fragmentIssuesBinding.getRoot(); } @Override public void onResume() { - super.onResume(); - TinyDB tinyDb = TinyDB.getInstance(context); - - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - - if(tinyDb.getBoolean("resumeIssues")) { - loadInitial(Authorization.get(context), repoOwner, repoName, resultLimit, requestType, tinyDb.getString("repoIssuesState"), tinyDb.getString("issueMilestoneFilterId")); - tinyDb.putBoolean("resumeIssues", false); + if(resumeIssues) { + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), resultLimit, requestType, repository.getIssueState().toString(), repository.getIssueMilestoneFilterName()); + resumeIssues = false; } } @@ -251,9 +242,7 @@ public class IssuesFragment extends Fragment { inflater.inflate(R.menu.filter_menu, menu); super.onCreateOptionsMenu(menu, inflater); - TinyDB tinyDb = TinyDB.getInstance(context); - - if(tinyDb.getString("repoIssuesState").equals("closed")) { + if(repository.getIssueState().toString().equals("closed")) { menu.getItem(1).setIcon(R.drawable.ic_filter_closed); } else { 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 eaffe210..e40e3c9b 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/LabelsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/LabelsFragment.java @@ -16,10 +16,11 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import org.mian.gitnex.activities.BaseActivity; +import org.mian.gitnex.activities.CreateLabelActivity; import org.mian.gitnex.adapters.LabelsAdapter; import org.mian.gitnex.databinding.FragmentLabelsBinding; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import org.mian.gitnex.viewmodels.LabelsViewModel; /** @@ -32,36 +33,23 @@ public class LabelsFragment extends Fragment { private RecyclerView mRecyclerView; private LabelsAdapter adapter; private TextView noData; - private static String repoNameF = "param2"; - private static String repoOwnerF = "param1"; - private final String type = "repo"; - private String repoName; - private String repoOwner; + private RepositoryContext repository; public LabelsFragment() { } - public static LabelsFragment newInstance(String param1, String param2) { + public static LabelsFragment newInstance(RepositoryContext repository) { LabelsFragment fragment = new LabelsFragment(); - Bundle args = new Bundle(); - args.putString(repoOwnerF, param1); - args.putString(repoNameF, param2); - fragment.setArguments(args); + fragment.setArguments(repository.getBundle()); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - if (getArguments() != null) { - - repoName = getArguments().getString(repoNameF); - repoOwner = getArguments().getString(repoOwnerF); - } + repository = RepositoryContext.fromBundle(requireArguments()); } @Override @@ -86,10 +74,10 @@ public class LabelsFragment extends Fragment { swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); - LabelsViewModel.loadLabelsList(Authorization.get(getContext()), repoOwner, repoName, getContext()); + LabelsViewModel.loadLabelsList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), getContext()); }, 200)); - fetchDataAsync(Authorization.get(getContext()), repoOwner, repoName); + fetchDataAsync(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName()); return fragmentLabelsBinding.getRoot(); } @@ -98,17 +86,11 @@ public class LabelsFragment extends Fragment { public void onResume() { super.onResume(); - final TinyDB tinyDb = TinyDB.getInstance(getContext()); - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; + if(CreateLabelActivity.refreshLabels) { - if(tinyDb.getBoolean("labelsRefresh")) { - - LabelsViewModel.loadLabelsList(Authorization.get(getContext()), repoOwner, repoName, getContext()); - tinyDb.putBoolean("labelsRefresh", false); + LabelsViewModel.loadLabelsList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), getContext()); + CreateLabelActivity.refreshLabels = false; } } @@ -118,7 +100,7 @@ public class LabelsFragment extends Fragment { labelsModel.getLabelsList(instanceToken, owner, repo, getContext()).observe(getViewLifecycleOwner(), labelsListMain -> { - adapter = new LabelsAdapter(getContext(), labelsListMain, type, owner); + adapter = new LabelsAdapter(getContext(), labelsListMain, "repo", owner); if(adapter.getItemCount() > 0) { diff --git a/app/src/main/java/org/mian/gitnex/fragments/MembersByOrgFragment.java b/app/src/main/java/org/mian/gitnex/fragments/MembersByOrgFragment.java index ef58cfba..ddbcba90 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/MembersByOrgFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/MembersByOrgFragment.java @@ -13,19 +13,14 @@ import android.widget.GridView; 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.ViewModelProvider; -import org.gitnex.tea4j.models.UserInfo; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.adapters.UserGridAdapter; import org.mian.gitnex.databinding.FragmentMembersByOrgBinding; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.viewmodels.MembersByOrgViewModel; -import java.util.List; import java.util.Objects; /** @@ -67,15 +62,12 @@ public class MembersByOrgFragment extends Fragment { FragmentMembersByOrgBinding fragmentMembersByOrgBinding = FragmentMembersByOrgBinding.inflate(inflater, container, false); setHasOptionsMenu(true); - TinyDB tinyDb = TinyDB.getInstance(getContext()); - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); noDataMembers = fragmentMembersByOrgBinding.noDataMembers; progressBar = fragmentMembersByOrgBinding.progressBar; mGridView = fragmentMembersByOrgBinding.gridView; - fetchDataAsync(Authorization.get(getContext()), orgName); + fetchDataAsync(((BaseActivity) requireActivity()).getAccount().getAuthorization(), orgName); return fragmentMembersByOrgBinding.getRoot(); } @@ -84,22 +76,19 @@ public class MembersByOrgFragment extends Fragment { MembersByOrgViewModel membersModel= new ViewModelProvider(this).get(MembersByOrgViewModel.class); - membersModel.getMembersList(instanceToken, owner, getContext()).observe(getViewLifecycleOwner(), new Observer>() { - @Override - public void onChanged(@Nullable List membersListMain) { - adapter = new UserGridAdapter(getContext(), membersListMain); - if(adapter.getCount() > 0) { - mGridView.setAdapter(adapter); - noDataMembers.setVisibility(View.GONE); - } - else { - adapter.notifyDataSetChanged(); - mGridView.setAdapter(adapter); - noDataMembers.setVisibility(View.VISIBLE); - } - - progressBar.setVisibility(View.GONE); + membersModel.getMembersList(instanceToken, owner, getContext()).observe(getViewLifecycleOwner(), membersListMain -> { + adapter = new UserGridAdapter(getContext(), membersListMain); + if(adapter.getCount() > 0) { + mGridView.setAdapter(adapter); + noDataMembers.setVisibility(View.GONE); } + else { + adapter.notifyDataSetChanged(); + mGridView.setAdapter(adapter); + noDataMembers.setVisibility(View.VISIBLE); + } + + progressBar.setVisibility(View.GONE); }); } 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 703638a9..50374c4c 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/MilestonesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/MilestonesFragment.java @@ -13,19 +13,19 @@ import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import org.gitnex.tea4j.models.Milestones; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.adapters.MilestonesAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.FragmentMilestonesBinding; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; -import org.mian.gitnex.helpers.TinyDB; -import org.mian.gitnex.helpers.Version; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.ArrayList; import java.util.List; import retrofit2.Call; @@ -45,48 +45,53 @@ public class MilestonesFragment extends Fragment { private MilestonesAdapter adapter; private Context ctx; private int pageSize = Constants.milestonesPageInit; - private String TAG = Constants.tagMilestonesFragment; + private final String TAG = Constants.tagMilestonesFragment; private int resultLimit = Constants.resultLimitOldGiteaInstances; + private RepositoryContext repository; private String milestoneId; - @Override + public static MilestonesFragment newInstance(RepositoryContext repository) { + MilestonesFragment fragment = new MilestonesFragment(); + fragment.setArguments(repository.getBundle()); + return fragment; + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + repository = RepositoryContext.fromBundle(requireArguments()); + super.onCreate(savedInstanceState); + } + + @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { viewBinding = FragmentMilestonesBinding.inflate(inflater, container, false); setHasOptionsMenu(true); ctx = getContext(); - TinyDB tinyDb = TinyDB.getInstance(getContext()); - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); - - milestoneId = requireActivity().getIntent().getStringExtra("milestoneId"); + milestoneId = requireActivity().getIntent().getStringExtra("milestoneId"); requireActivity().getIntent().removeExtra("milestoneId"); viewBinding.recyclerView.setHasFixedSize(true); viewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); // if gitea is 1.12 or higher use the new limit - if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) { + if(((BaseActivity) requireActivity()).getAccount().requiresVersion("1.12.0")) { resultLimit = Constants.resultLimitNewGiteaInstances; } dataList = new ArrayList<>(); - adapter = new MilestonesAdapter(ctx, dataList); + adapter = new MilestonesAdapter(ctx, dataList, repository); - if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) { + if(((BaseActivity) requireActivity()).getAccount().requiresVersion("1.12.0")) { adapter.setLoadMoreListener(() -> viewBinding.recyclerView.post(() -> { if(dataList.size() == resultLimit || pageSize == resultLimit) { int page = (dataList.size() + resultLimit) / resultLimit; - loadMore(Authorization.get(getContext()), repoOwner, repoName, page, resultLimit, tinyDb.getString("milestoneState")); + loadMore(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), page, resultLimit, repository.getMilestoneState().toString()); } @@ -104,7 +109,7 @@ public class MilestonesFragment extends Fragment { dataList.clear(); viewBinding.pullToRefresh.setRefreshing(false); - loadInitial(Authorization.get(getContext()), repoOwner, repoName, resultLimit, tinyDb.getString("milestoneState")); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), resultLimit, repository.getMilestoneState().toString()); adapter.updateList(dataList); }, 50)); @@ -120,16 +125,16 @@ public class MilestonesFragment extends Fragment { dataList.clear(); - adapter = new MilestonesAdapter(ctx, dataList); + adapter = new MilestonesAdapter(ctx, dataList, repository); - if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) { + if(((BaseActivity) requireActivity()).getAccount().requiresVersion("1.12.0")) { adapter.setLoadMoreListener(() -> viewBinding.recyclerView.post(() -> { if(dataList.size() == resultLimit || pageSize == resultLimit) { int page = (dataList.size() + resultLimit) / resultLimit; - loadMore(Authorization.get(getContext()), repoOwner, repoName, page, resultLimit, milestoneState); + loadMore(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), page, resultLimit, milestoneState); } @@ -137,43 +142,19 @@ public class MilestonesFragment extends Fragment { } - tinyDb.putString("milestoneState", milestoneState); - viewBinding.progressBar.setVisibility(View.VISIBLE); viewBinding.noDataMilestone.setVisibility(View.GONE); - loadInitial(Authorization.get(getContext()), repoOwner, repoName, resultLimit, milestoneState); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), resultLimit, milestoneState); viewBinding.recyclerView.setAdapter(adapter); }); - loadInitial(Authorization.get(getContext()), repoOwner, repoName, resultLimit, tinyDb.getString("milestoneState")); - + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), resultLimit, repository.getMilestoneState().toString()); return viewBinding.getRoot(); } - @Override - public void onResume() { - - super.onResume(); - TinyDB tinyDb = TinyDB.getInstance(getContext()); - final String loginUid = tinyDb.getString("loginUid"); - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); - - if(tinyDb.getBoolean("milestoneCreated")) { - - loadInitial(Authorization.get(getContext()), repoOwner, repoName, resultLimit, tinyDb.getString("milestoneState")); - tinyDb.putBoolean("milestoneCreated", false); - - } - - } - private void loadInitial(String token, String repoOwner, String repoName, int resultLimit, String milestoneState) { Call> call = RetrofitClient.getApiInterface(ctx).getMilestones(token, repoOwner, repoName, 1, resultLimit, milestoneState); @@ -295,12 +276,9 @@ public class MilestonesFragment extends Fragment { inflater.inflate(R.menu.filter_menu_milestone, menu); super.onCreateOptionsMenu(menu, inflater); - TinyDB tinyDb = TinyDB.getInstance(ctx); - - if(tinyDb.getString("milestoneState").equals("closed")) { + if(repository.getMilestoneState() == RepositoryContext.State.CLOSED) { menu.getItem(1).setIcon(R.drawable.ic_filter_closed); - } - else { + } else { menu.getItem(1).setIcon(R.drawable.ic_filter); } diff --git a/app/src/main/java/org/mian/gitnex/fragments/MyProfileEmailsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/MyProfileEmailsFragment.java index b4cf50c3..37d34611 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/MyProfileEmailsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/MyProfileEmailsFragment.java @@ -9,20 +9,17 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; import android.widget.TextView; -import androidx.annotation.Nullable; +import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; -import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import org.gitnex.tea4j.models.Emails; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.adapters.MyProfileEmailsAdapter; import org.mian.gitnex.databinding.FragmentProfileEmailsBinding; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.viewmodels.ProfileEmailsViewModel; -import java.util.List; /** * Author M M Arif @@ -30,39 +27,18 @@ import java.util.List; public class MyProfileEmailsFragment extends Fragment { + public static boolean refreshEmails = false; + private ProgressBar mProgressBar; private MyProfileEmailsAdapter adapter; private RecyclerView mRecyclerView; private TextView noDataEmails; - private static String repoNameF = "param2"; - private static String repoOwnerF = "param1"; - - private String repoName; - private String repoOwner; public MyProfileEmailsFragment() { } - public static MyProfileEmailsFragment newInstance(String param1, String param2) { - MyProfileEmailsFragment fragment = new MyProfileEmailsFragment(); - Bundle args = new Bundle(); - args.putString(repoOwnerF, param1); - args.putString(repoNameF, param2); - fragment.setArguments(args); - return fragment; - } - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (getArguments() != null) { - repoName = getArguments().getString(repoNameF); - repoOwner = getArguments().getString(repoOwnerF); - } - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { FragmentProfileEmailsBinding fragmentProfileEmailsBinding = FragmentProfileEmailsBinding.inflate(inflater, container, false); @@ -83,11 +59,11 @@ public class MyProfileEmailsFragment extends Fragment { swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); - ProfileEmailsViewModel.loadEmailsList(Authorization.get(getContext()), getContext()); + ProfileEmailsViewModel.loadEmailsList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), getContext()); }, 200)); - fetchDataAsync(Authorization.get(getContext())); + fetchDataAsync(((BaseActivity) requireActivity()).getAccount().getAuthorization()); return fragmentProfileEmailsBinding.getRoot(); @@ -97,22 +73,31 @@ public class MyProfileEmailsFragment extends Fragment { ProfileEmailsViewModel profileEmailModel = new ViewModelProvider(this).get(ProfileEmailsViewModel.class); - profileEmailModel.getEmailsList(instanceToken, getContext()).observe(getViewLifecycleOwner(), new Observer>() { - @Override - public void onChanged(@Nullable List emailsListMain) { - adapter = new MyProfileEmailsAdapter(getContext(), emailsListMain); - if(adapter.getItemCount() > 0) { - mRecyclerView.setAdapter(adapter); - noDataEmails.setVisibility(View.GONE); - } - else { - adapter.notifyDataSetChanged(); - mRecyclerView.setAdapter(adapter); - noDataEmails.setVisibility(View.VISIBLE); - } - mProgressBar.setVisibility(View.GONE); + profileEmailModel.getEmailsList(instanceToken, getContext()).observe(getViewLifecycleOwner(), emailsListMain -> { + adapter = new MyProfileEmailsAdapter(getContext(), emailsListMain); + if(adapter.getItemCount() > 0) { + mRecyclerView.setAdapter(adapter); + noDataEmails.setVisibility(View.GONE); } + else { + adapter.notifyDataSetChanged(); + mRecyclerView.setAdapter(adapter); + noDataEmails.setVisibility(View.VISIBLE); + } + mProgressBar.setVisibility(View.GONE); }); } + + @Override + public void onResume() { + + super.onResume(); + + if(refreshEmails) { + ProfileEmailsViewModel.loadEmailsList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), getContext()); + refreshEmails = false; + } + } + } diff --git a/app/src/main/java/org/mian/gitnex/fragments/MyProfileFollowersFragment.java b/app/src/main/java/org/mian/gitnex/fragments/MyProfileFollowersFragment.java index 5e497403..6b6a5285 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/MyProfileFollowersFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/MyProfileFollowersFragment.java @@ -14,10 +14,10 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import org.gitnex.tea4j.models.UserInfo; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.adapters.UsersAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.FragmentProfileFollowersFollowingBinding; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.SnackBar; import java.util.ArrayList; @@ -80,7 +80,7 @@ public class MyProfileFollowersFragment extends Fragment { Call> call = RetrofitClient .getApiInterface(context) - .getFollowers(Authorization.get(getContext()), 1, resultLimit); + .getFollowers(((BaseActivity) requireActivity()).getAccount().getAuthorization(), 1, resultLimit); call.enqueue(new Callback>() { @Override public void onResponse(@NonNull Call> call, @NonNull Response> response) { @@ -118,7 +118,7 @@ public class MyProfileFollowersFragment extends Fragment { viewBinding.progressBar.setVisibility(View.VISIBLE); Call> call = RetrofitClient.getApiInterface(context) - .getFollowers(Authorization.get(getContext()), page, resultLimit); + .getFollowers(((BaseActivity) requireActivity()).getAccount().getAuthorization(), page, resultLimit); call.enqueue(new Callback>() { @Override public void onResponse(@NonNull Call> call, @NonNull Response> response) { diff --git a/app/src/main/java/org/mian/gitnex/fragments/MyProfileFollowingFragment.java b/app/src/main/java/org/mian/gitnex/fragments/MyProfileFollowingFragment.java index 1d898b03..c4291e21 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/MyProfileFollowingFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/MyProfileFollowingFragment.java @@ -14,10 +14,10 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import org.gitnex.tea4j.models.UserInfo; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.adapters.UsersAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.FragmentProfileFollowersFollowingBinding; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.SnackBar; import java.util.ArrayList; @@ -79,7 +79,7 @@ public class MyProfileFollowingFragment extends Fragment { Call> call = RetrofitClient .getApiInterface(context) - .getFollowing(Authorization.get(getContext()), 1, resultLimit); + .getFollowing(((BaseActivity) requireActivity()).getAccount().getAuthorization(), 1, resultLimit); call.enqueue(new Callback>() { @Override public void onResponse(@NonNull Call> call, @NonNull Response> response) { @@ -117,7 +117,7 @@ public class MyProfileFollowingFragment extends Fragment { viewBinding.progressBar.setVisibility(View.VISIBLE); Call> call = RetrofitClient.getApiInterface(context) - .getFollowing(Authorization.get(getContext()), page, resultLimit); + .getFollowing(((BaseActivity) requireActivity()).getAccount().getAuthorization(), page, resultLimit); call.enqueue(new Callback>() { @Override public void onResponse(@NonNull Call> call, @NonNull Response> response) { diff --git a/app/src/main/java/org/mian/gitnex/fragments/MyProfileFragment.java b/app/src/main/java/org/mian/gitnex/fragments/MyProfileFragment.java index 85429cec..49a4e69e 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/MyProfileFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/MyProfileFragment.java @@ -20,15 +20,18 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapter; import androidx.viewpager.widget.ViewPager; +import com.google.android.material.progressindicator.LinearProgressIndicator; import com.google.android.material.tabs.TabLayout; import com.squareup.picasso.Callback; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.MainActivity; import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.ColorInverter; import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.TinyDB; +import org.mian.gitnex.helpers.contexts.AccountContext; import java.util.Locale; import jp.wasabeef.picasso.transformations.BlurTransformation; @@ -51,108 +54,18 @@ public class MyProfileFragment extends Fragment { ((MainActivity) requireActivity()).setActionBarTitle(getResources().getString(R.string.navProfile)); - TinyDB tinyDb = TinyDB.getInstance(getContext()); - - TextView userFullName = v.findViewById(R.id.userFullName); - ImageView userAvatarBackground = v.findViewById(R.id.userAvatarBackground); - ImageView userAvatar = v.findViewById(R.id.userAvatar); - TextView userLogin = v.findViewById(R.id.userLogin); - View divider = v.findViewById(R.id.divider); - TextView userLanguage = v.findViewById(R.id.userLanguage); - ImageView userLanguageIcon = v.findViewById(R.id.userLanguageIcon); - - String[] userLanguageCodes = tinyDb.getString("userLang").split("-"); - - if(userLanguageCodes.length >= 2) { - Locale locale = new Locale(userLanguageCodes[0], userLanguageCodes[1]); - userLanguage.setText(locale.getDisplayLanguage()); - } - else { - userLanguage.setText(getResources().getConfiguration().locale.getDisplayLanguage()); - } - - userAvatar.setOnClickListener(loginId -> - AppUtil.copyToClipboard(ctx, - tinyDb.getString("userLogin"), - ctx.getString(R.string.copyLoginIdToClipBoard, tinyDb.getString("userLogin")))); - - userFullName.setText(Html.fromHtml(tinyDb.getString("userFullname"))); - userLogin.setText(getString(R.string.usernameWithAt, tinyDb.getString("userLogin"))); - - int avatarRadius = AppUtil.getPixelsFromDensity(ctx, 3); - - PicassoService.getInstance(ctx).get() - .load(tinyDb.getString("userAvatar")) - .transform(new RoundedTransformation(avatarRadius, 0)) - .placeholder(R.drawable.loader_animated) - .resize(120, 120) - .centerCrop().into(userAvatar); - - PicassoService.getInstance(ctx).get() - .load(tinyDb.getString("userAvatar")) - .transform(new BlurTransformation(ctx)) - .into(userAvatarBackground, new Callback() { - - @Override - public void onSuccess() { - int invertedColor = new ColorInverter().getImageViewContrastColor(userAvatarBackground); - - userFullName.setTextColor(invertedColor); - divider.setBackgroundColor(invertedColor); - userLogin.setTextColor(invertedColor); - userLanguage.setTextColor(invertedColor); - - ImageViewCompat.setImageTintList(userLanguageIcon, ColorStateList.valueOf(invertedColor)); - } - - @Override public void onError(Exception e) {} + AccountContext account = ((BaseActivity) requireActivity()).getAccount(); + if(account.getUserInfo() != null) { + viewData(v, account); + } else { + // we have to wait until loading is finished + LinearProgressIndicator loading = v.findViewById(R.id.loadingIndicator); + loading.setVisibility(View.VISIBLE); + ((MainActivity) requireActivity()).setProfileInitListener((text) -> { + loading.setVisibility(View.GONE); + viewData(v, account); }); - - MyProfileFragment.SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager()); - - ViewPager mViewPager = v.findViewById(R.id.container); - mViewPager.setAdapter(mSectionsPagerAdapter); - - Typeface myTypeface; - - switch(tinyDb.getInt("customFontId", -1)) { - - case 0: - myTypeface = Typeface.createFromAsset(requireContext().getAssets(), "fonts/roboto.ttf"); - break; - - case 2: - myTypeface = Typeface.createFromAsset(requireContext().getAssets(), "fonts/sourcecodeproregular.ttf"); - break; - - default: - myTypeface = Typeface.createFromAsset(requireContext().getAssets(), "fonts/manroperegular.ttf"); - break; - - } - - TabLayout tabLayout = v.findViewById(R.id.tabs); - - ViewGroup vg = (ViewGroup) tabLayout.getChildAt(0); - int tabsCount = vg.getChildCount(); - - for (int j = 0; j < tabsCount; j++) { - - ViewGroup vgTab = (ViewGroup) vg.getChildAt(j); - int tabChildCount = vgTab.getChildCount(); - - for (int i = 0; i < tabChildCount; i++) { - - View tabViewChild = vgTab.getChildAt(i); - - if (tabViewChild instanceof TextView) { - ((TextView) tabViewChild).setTypeface(myTypeface); - } - } - } - - mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); - tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager)); + } return v; } @@ -176,7 +89,7 @@ public class MyProfileFragment extends Fragment { return new MyProfileFollowingFragment(); case 2: // emails - return MyProfileEmailsFragment.newInstance("repoOwner", "repoName"); + return new MyProfileEmailsFragment(); } @@ -215,4 +128,104 @@ public class MyProfileFragment extends Fragment { return super.onOptionsItemSelected(item); } } + + public void viewData(View v, AccountContext account) { + TinyDB tinyDb = TinyDB.getInstance(getContext()); + + TextView userFullName = v.findViewById(R.id.userFullName); + ImageView userAvatarBackground = v.findViewById(R.id.userAvatarBackground); + ImageView userAvatar = v.findViewById(R.id.userAvatar); + TextView userLogin = v.findViewById(R.id.userLogin); + View divider = v.findViewById(R.id.divider); + TextView userLanguage = v.findViewById(R.id.userLanguage); + ImageView userLanguageIcon = v.findViewById(R.id.userLanguageIcon); + + String[] userLanguageCodes = account.getUserInfo().getLang() != null ? account.getUserInfo().getLang().split("-") : new String[]{""}; + + if(userLanguageCodes.length >= 2) { + Locale locale = new Locale(userLanguageCodes[0], userLanguageCodes[1]); + userLanguage.setText(locale.getDisplayLanguage()); + } + else { + userLanguage.setText(getResources().getConfiguration().locale.getDisplayLanguage()); + } + + userAvatar.setOnClickListener(loginId -> AppUtil.copyToClipboard(ctx, account.getAccount().getUserName(), + ctx.getString(R.string.copyLoginIdToClipBoard, account.getAccount().getUserName()))); + + userFullName.setText(Html.fromHtml(account.getFullName())); + userLogin.setText(getString(R.string.usernameWithAt, account.getAccount().getUserName())); + + int avatarRadius = AppUtil.getPixelsFromDensity(ctx, 3); + + PicassoService.getInstance(ctx).get().load(account.getUserInfo().getAvatar()).transform(new RoundedTransformation(avatarRadius, 0)).placeholder(R.drawable.loader_animated).resize(120, 120).centerCrop().into(userAvatar); + + PicassoService.getInstance(ctx).get().load(account.getUserInfo().getAvatar()).transform(new BlurTransformation(ctx)) + .into(userAvatarBackground, new Callback() { + + @Override + public void onSuccess() { + + int invertedColor = new ColorInverter().getImageViewContrastColor(userAvatarBackground); + + userFullName.setTextColor(invertedColor); + divider.setBackgroundColor(invertedColor); + userLogin.setTextColor(invertedColor); + userLanguage.setTextColor(invertedColor); + + ImageViewCompat.setImageTintList(userLanguageIcon, ColorStateList.valueOf(invertedColor)); + } + + @Override + public void onError(Exception e) { + + } + }); + + MyProfileFragment.SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager()); + + ViewPager mViewPager = v.findViewById(R.id.container); + mViewPager.setAdapter(mSectionsPagerAdapter); + + Typeface myTypeface; + + switch(tinyDb.getInt("customFontId", -1)) { + + case 0: + myTypeface = Typeface.createFromAsset(requireContext().getAssets(), "fonts/roboto.ttf"); + break; + + case 2: + myTypeface = Typeface.createFromAsset(requireContext().getAssets(), "fonts/sourcecodeproregular.ttf"); + break; + + default: + myTypeface = Typeface.createFromAsset(requireContext().getAssets(), "fonts/manroperegular.ttf"); + break; + + } + + TabLayout tabLayout = v.findViewById(R.id.tabs); + + ViewGroup vg = (ViewGroup) tabLayout.getChildAt(0); + int tabsCount = vg.getChildCount(); + + for(int j = 0; j < tabsCount; j++) { + + ViewGroup vgTab = (ViewGroup) vg.getChildAt(j); + int tabChildCount = vgTab.getChildCount(); + + for(int i = 0; i < tabChildCount; i++) { + + View tabViewChild = vgTab.getChildAt(i); + + if(tabViewChild instanceof TextView) { + ((TextView) tabViewChild).setTypeface(myTypeface); + } + } + } + + mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager)); + } } 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 ba214ddd..392933f5 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/MyRepositoriesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/MyRepositoriesFragment.java @@ -23,12 +23,11 @@ import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.CreateRepoActivity; import org.mian.gitnex.activities.MainActivity; import org.mian.gitnex.adapters.ReposListAdapter; import org.mian.gitnex.databinding.FragmentMyRepositoriesBinding; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.viewmodels.MyRepositoriesViewModel; /** @@ -37,8 +36,6 @@ import org.mian.gitnex.viewmodels.MyRepositoriesViewModel; public class MyRepositoriesFragment extends Fragment { - private static final String ARG_PARAM1 = "param1"; - private static final String ARG_PARAM2 = "param2"; private ProgressBar mProgressBar; private RecyclerView mRecyclerView; private ReposListAdapter adapter; @@ -48,28 +45,9 @@ public class MyRepositoriesFragment extends Fragment { private int pageSize = 1; private int resultLimit = 50; - private String mParam1; - private String mParam2; - - public MyRepositoriesFragment() { - } - - public static MyRepositoriesFragment newInstance(String param1, String param2) { - MyRepositoriesFragment fragment = new MyRepositoriesFragment(); - Bundle args = new Bundle(); - args.putString(ARG_PARAM1, param1); - args.putString(ARG_PARAM2, param2); - fragment.setArguments(args); - return fragment; - } - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (getArguments() != null) { - mParam1 = getArguments().getString(ARG_PARAM1); - mParam2 = getArguments().getString(ARG_PARAM2); - } } @Override @@ -80,9 +58,7 @@ public class MyRepositoriesFragment extends Fragment { setHasOptionsMenu(true); - TinyDB tinyDb = TinyDB.getInstance(getContext()); - final String userLogin = tinyDb.getString("userLogin"); - tinyDb.putBoolean("isRepoAdmin", true); + final String userLogin = ((BaseActivity) requireActivity()).getAccount().getAccount().getUserName(); final SwipeRefreshLayout swipeRefresh = fragmentMyRepositoriesBinding.pullToRefresh; @@ -126,11 +102,11 @@ public class MyRepositoriesFragment extends Fragment { swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); - MyRepositoriesViewModel.loadMyReposList(Authorization.get(getContext()), userLogin, getContext(), pageSize, resultLimit); + MyRepositoriesViewModel.loadMyReposList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), userLogin, getContext(), pageSize, resultLimit); }, 50)); - fetchDataAsync(Authorization.get(getContext()), userLogin, pageSize, resultLimit); + fetchDataAsync(((BaseActivity) requireActivity()).getAccount().getAuthorization(), userLogin, pageSize, resultLimit); return fragmentMyRepositoriesBinding.getRoot(); @@ -139,12 +115,11 @@ public class MyRepositoriesFragment extends Fragment { @Override public void onResume() { super.onResume(); - TinyDB tinyDb = TinyDB.getInstance(getContext()); - final String userLogin = tinyDb.getString("userLogin"); + final String userLogin = ((BaseActivity) requireActivity()).getAccount().getAccount().getUserName(); - if(tinyDb.getBoolean("repoCreated")) { - MyRepositoriesViewModel.loadMyReposList(Authorization.get(getContext()), userLogin, getContext(), pageSize, resultLimit); - tinyDb.putBoolean("repoCreated", false); + if(MainActivity.repoCreated) { + MyRepositoriesViewModel.loadMyReposList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), userLogin, getContext(), pageSize, resultLimit); + MainActivity.repoCreated = false; } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/NotificationsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/NotificationsFragment.java index 319b2b63..0a9494ee 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/NotificationsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/NotificationsFragment.java @@ -19,17 +19,22 @@ import androidx.recyclerview.widget.RecyclerView; import org.apache.commons.lang3.StringUtils; import org.gitnex.tea4j.models.NotificationThread; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.IssueDetailActivity; import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.adapters.NotificationsAdapter; import org.mian.gitnex.clients.RetrofitClient; +import org.mian.gitnex.database.api.BaseApi; +import org.mian.gitnex.database.api.RepositoriesApi; +import org.mian.gitnex.database.models.Repository; import org.mian.gitnex.databinding.FragmentNotificationsBinding; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.SimpleCallback; import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; +import org.mian.gitnex.helpers.contexts.IssueContext; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -47,13 +52,11 @@ public class NotificationsFragment extends Fragment implements NotificationsAdap private Activity activity; private Context context; - private TinyDB tinyDB; private Menu menu; private int pageCurrentIndex = 1; private int pageResultLimit; private String currentFilterMode = "unread"; - private final String TAG = Constants.tagNotifications; private String instanceToken; @Override @@ -71,12 +74,10 @@ public class NotificationsFragment extends Fragment implements NotificationsAdap activity = requireActivity(); context = getContext(); - tinyDB = TinyDB.getInstance(context); - instanceToken = Authorization.get(context); + instanceToken = ((BaseActivity) requireActivity()).getAccount().getAuthorization(); pageResultLimit = Constants.getCurrentResultLimit(context); - tinyDB.putString("notificationsFilterState", currentFilterMode); notificationsAdapter = new NotificationsAdapter(context, notificationThreads, this, this); @@ -116,7 +117,7 @@ public class NotificationsFragment extends Fragment implements NotificationsAdap viewBinding.markAllAsRead.setOnClickListener(v1 -> RetrofitClient.getApiInterface(context) - .markNotificationThreadsAsRead(Authorization.get(context), AppUtil.getTimestampFromDate(context, new Date()), true, new String[]{"unread", "pinned"}, "read") + .markNotificationThreadsAsRead(instanceToken, AppUtil.getTimestampFromDate(context, new Date()), true, new String[]{"unread", "pinned"}, "read") .enqueue((SimpleCallback) (call, voidResponse) -> { if(voidResponse.isPresent() && voidResponse.get().isSuccessful()) { @@ -142,8 +143,7 @@ public class NotificationsFragment extends Fragment implements NotificationsAdap viewBinding.noDataNotifications.setVisibility(View.GONE); viewBinding.progressBar.setVisibility(View.VISIBLE); - - String[] filter = tinyDB.getString("notificationsFilterState").equals("read") ? + String[] filter = currentFilterMode.equals("read") ? new String[]{"pinned", "read"} : new String[]{"pinned", "unread"}; @@ -221,9 +221,8 @@ public class NotificationsFragment extends Fragment implements NotificationsAdap BottomSheetNotificationsFilterFragment bottomSheetNotificationsFilterFragment = new BottomSheetNotificationsFilterFragment(); bottomSheetNotificationsFilterFragment.show(getChildFragmentManager(), "notificationsFilterBottomSheet"); - bottomSheetNotificationsFilterFragment.setOnDismissedListener(() -> { - - currentFilterMode = tinyDB.getString("notificationsFilterState"); + bottomSheetNotificationsFilterFragment.setOnClickListener((text) -> { + currentFilterMode = text; changeFilterMode(); pageCurrentIndex = 1; loadNotifications(false); @@ -238,7 +237,7 @@ public class NotificationsFragment extends Fragment implements NotificationsAdap public void onNotificationClicked(NotificationThread notificationThread) { if(notificationThread.isUnread() && !notificationThread.isPinned()) { - RetrofitClient.getApiInterface(context).markNotificationThreadAsRead(Authorization.get(context), notificationThread.getId(), "read").enqueue((SimpleCallback) (call, voidResponse) -> { + RetrofitClient.getApiInterface(context).markNotificationThreadAsRead(instanceToken, notificationThread.getId(), "read").enqueue((SimpleCallback) (call, voidResponse) -> { // reload without any checks, because Gitea returns a 205 and Java expects this to be empty // but Gitea send a response -> results in a call of onFailure and no response is present //if(voidResponse.isPresent() && voidResponse.get().isSuccessful()) { @@ -250,19 +249,32 @@ public class NotificationsFragment extends Fragment implements NotificationsAdap if(StringUtils.containsAny(notificationThread.getSubject().getType().toLowerCase(), "pull", "issue")) { - Intent intent = new Intent(context, IssueDetailActivity.class); - intent.putExtra("openedFromLink", "true"); + RepositoryContext repo = new RepositoryContext(notificationThread.getRepository(), context); String issueUrl = notificationThread.getSubject().getUrl(); - tinyDB.putString("issueNumber", issueUrl.substring(issueUrl.lastIndexOf("/") + 1)); - tinyDB.putString("issueType", notificationThread.getSubject().getType()); - tinyDB.putString("repoFullName", notificationThread.getRepository().getFullName()); + int currentActiveAccountId = TinyDB.getInstance(requireContext()).getInt("currentActiveAccountId"); + RepositoriesApi repositoryData = BaseApi.getInstance(context, RepositoriesApi.class); + + Integer count = repositoryData.checkRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); + + if(count == 0) { + long id = repositoryData.insertRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); + repo.setRepositoryId((int) id); + } + else { + Repository data = repositoryData.getRepository(currentActiveAccountId, repo.getOwner(), repo.getName()); + repo.setRepositoryId(data.getRepositoryId()); + } + + Intent intent = new IssueContext( + new RepositoryContext(notificationThread.getRepository(), context), + Integer.parseInt(issueUrl.substring(issueUrl.lastIndexOf("/") + 1)), + notificationThread.getSubject().getType() + ).getIntent(context, IssueDetailActivity.class); + intent.putExtra("openedFromLink", "true"); startActivity(intent); } else if(notificationThread.getSubject().getType().equalsIgnoreCase("repository")) { - Intent intent = new Intent(context, RepoDetailActivity.class); - tinyDB.putString("repoFullName", notificationThread.getRepository().getFullName()); - - startActivity(intent); + startActivity(new RepositoryContext(notificationThread.getRepository(), context).getIntent(context, RepoDetailActivity.class)); } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/OrganizationInfoFragment.java b/app/src/main/java/org/mian/gitnex/fragments/OrganizationInfoFragment.java index ae9e448f..9f08608d 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/OrganizationInfoFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/OrganizationInfoFragment.java @@ -15,10 +15,10 @@ import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import org.gitnex.tea4j.models.Organization; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.FragmentOrganizationInfoBinding; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Markdown; import org.mian.gitnex.helpers.RoundedTransformation; import retrofit2.Call; @@ -78,7 +78,7 @@ public class OrganizationInfoFragment extends Fragment { orgNameInfo.setText(orgName); - getOrgInfo(Authorization.get(getContext()), orgName); + getOrgInfo(((BaseActivity) requireActivity()).getAccount().getAuthorization(), orgName); return fragmentOrganizationInfoBinding.getRoot(); diff --git a/app/src/main/java/org/mian/gitnex/fragments/OrganizationLabelsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/OrganizationLabelsFragment.java index fe457f72..c96ab2ed 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/OrganizationLabelsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/OrganizationLabelsFragment.java @@ -16,10 +16,10 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import org.mian.gitnex.activities.BaseActivity; +import org.mian.gitnex.activities.CreateLabelActivity; import org.mian.gitnex.adapters.LabelsAdapter; import org.mian.gitnex.databinding.FragmentLabelsBinding; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.viewmodels.OrganizationLabelsViewModel; /** @@ -79,11 +79,11 @@ public class OrganizationLabelsFragment extends Fragment { swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); - OrganizationLabelsViewModel.loadOrgLabelsList(Authorization.get(getContext()), repoOwner, getContext(), mProgressBar, noData); + OrganizationLabelsViewModel.loadOrgLabelsList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repoOwner, getContext(), mProgressBar, noData); }, 200)); - fetchDataAsync(Authorization.get(getContext()), repoOwner); + fetchDataAsync(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repoOwner); return fragmentLabelsBinding.getRoot(); @@ -93,12 +93,11 @@ public class OrganizationLabelsFragment extends Fragment { public void onResume() { super.onResume(); - final TinyDB tinyDb = TinyDB.getInstance(getContext()); - if(tinyDb.getBoolean("labelsRefresh")) { + if(CreateLabelActivity.refreshLabels) { - OrganizationLabelsViewModel.loadOrgLabelsList(Authorization.get(getContext()), repoOwner, getContext(), mProgressBar, noData); - tinyDb.putBoolean("labelsRefresh", false); + OrganizationLabelsViewModel.loadOrgLabelsList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repoOwner, getContext(), mProgressBar, noData); + CreateLabelActivity.refreshLabels = false; } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/OrganizationTeamInfoMembersFragment.java b/app/src/main/java/org/mian/gitnex/fragments/OrganizationTeamInfoMembersFragment.java index 2386efe5..97d5da7a 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/OrganizationTeamInfoMembersFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/OrganizationTeamInfoMembersFragment.java @@ -10,10 +10,10 @@ import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import org.gitnex.tea4j.models.Teams; import org.gitnex.tea4j.models.UserInfo; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.adapters.UserGridAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.FragmentOrganizationTeamInfoMembersBinding; -import org.mian.gitnex.helpers.Authorization; import java.util.ArrayList; import java.util.List; import retrofit2.Call; @@ -64,7 +64,7 @@ public class OrganizationTeamInfoMembersFragment extends Fragment { Call> call = RetrofitClient .getApiInterface(ctx) - .getTeamMembersByOrg(Authorization.get(ctx), team.getId()); + .getTeamMembersByOrg(((BaseActivity) requireActivity()).getAccount().getAuthorization(), team.getId()); binding.progressBar.setVisibility(View.VISIBLE); 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 f304e9cf..d1529a76 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/OrganizationsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/OrganizationsFragment.java @@ -23,12 +23,11 @@ import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.CreateOrganizationActivity; import org.mian.gitnex.activities.MainActivity; import org.mian.gitnex.adapters.OrganizationsListAdapter; import org.mian.gitnex.databinding.FragmentOrganizationsBinding; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.viewmodels.OrganizationListViewModel; /** @@ -37,6 +36,8 @@ import org.mian.gitnex.viewmodels.OrganizationListViewModel; public class OrganizationsFragment extends Fragment { + public static boolean orgCreated = false; + private ProgressBar mProgressBar; private OrganizationsListAdapter adapter; private RecyclerView mRecyclerView; @@ -91,11 +92,11 @@ public class OrganizationsFragment extends Fragment { swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); - OrganizationListViewModel.loadOrgsList(Authorization.get(getContext()), getContext()); + OrganizationListViewModel.loadOrgsList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), getContext()); }, 50)); - fetchDataAsync(Authorization.get(getContext())); + fetchDataAsync(((BaseActivity) requireActivity()).getAccount().getAuthorization()); return fragmentOrganizationsBinding.getRoot(); @@ -104,13 +105,10 @@ public class OrganizationsFragment extends Fragment { @Override public void onResume(){ super.onResume(); - TinyDB tinyDb = TinyDB.getInstance(getContext()); - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); - if(tinyDb.getBoolean("orgCreated")) { - OrganizationListViewModel.loadOrgsList(Authorization.get(getContext()), getContext()); - tinyDb.putBoolean("orgCreated", false); + if(orgCreated) { + OrganizationListViewModel.loadOrgsList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), getContext()); + orgCreated = false; } } 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 e8bac4d9..1117d82f 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/PullRequestsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/PullRequestsFragment.java @@ -20,14 +20,14 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import org.gitnex.tea4j.models.PullRequests; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.adapters.PullRequestsAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.FragmentPullRequestsBinding; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Toasty; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.ArrayList; import java.util.List; import retrofit2.Call; @@ -40,6 +40,8 @@ import retrofit2.Response; public class PullRequestsFragment extends Fragment { + public static boolean resumePullRequests = false; + private FragmentPullRequestsBinding fragmentPullRequestsBinding; private Menu menu; @@ -50,6 +52,14 @@ public class PullRequestsFragment extends Fragment { private int pageSize = Constants.prPageInit; private int resultLimit; + private RepositoryContext repository; + + public static PullRequestsFragment newInstance(RepositoryContext repository) { + PullRequestsFragment f = new PullRequestsFragment(); + f.setArguments(repository.getBundle()); + return f; + } + @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -58,22 +68,15 @@ public class PullRequestsFragment extends Fragment { setHasOptionsMenu(true); context = getContext(); - TinyDB tinyDb = TinyDB.getInstance(getContext()); - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); - final SwipeRefreshLayout swipeRefresh = fragmentPullRequestsBinding.pullToRefresh; resultLimit = Constants.getCurrentResultLimit(context); prList = new ArrayList<>(); + repository = RepositoryContext.fromBundle(requireArguments()); swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); - loadInitial(instanceToken, repoOwner, repoName, pageSize, tinyDb.getString("repoPrState"), resultLimit); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), pageSize, repository.getPrState().toString(), resultLimit); adapter.notifyDataChanged(); }, 200)); @@ -82,7 +85,7 @@ public class PullRequestsFragment extends Fragment { if(prList.size() == resultLimit || pageSize == resultLimit) { int page = (prList.size() + resultLimit) / resultLimit; - loadMore(Authorization.get(getContext()), repoOwner, repoName, page, tinyDb.getString("repoPrState"), resultLimit); + loadMore(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), page, repository.getPrState().toString(), resultLimit); } })); @@ -109,21 +112,19 @@ public class PullRequestsFragment extends Fragment { if(prList.size() == resultLimit || pageSize == resultLimit) { int page = (prList.size() + resultLimit) / resultLimit; - loadMore(Authorization.get(getContext()), repoOwner, repoName, page, tinyDb.getString("repoPrState"), resultLimit); + loadMore(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), page, repository.getPrState().toString(), resultLimit); } })); - tinyDb.putString("repoPrState", prState); - fragmentPullRequestsBinding.progressBar.setVisibility(View.VISIBLE); fragmentPullRequestsBinding.noData.setVisibility(View.GONE); - loadInitial(Authorization.get(context), repoOwner, repoName, pageSize, prState, resultLimit); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), pageSize, prState, resultLimit); fragmentPullRequestsBinding.recyclerView.setAdapter(adapter); }); - loadInitial(Authorization.get(getContext()), repoOwner, repoName, pageSize, tinyDb.getString("repoPrState"), resultLimit); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), pageSize, repository.getPrState().toString(), resultLimit); return fragmentPullRequestsBinding.getRoot(); } @@ -132,17 +133,10 @@ public class PullRequestsFragment extends Fragment { public void onResume() { super.onResume(); - TinyDB tinyDb = TinyDB.getInstance(getContext()); - String repoFullName = tinyDb.getString("repoFullName"); - String[] parts = repoFullName.split("/"); - final String repoOwner = parts[0]; - final String repoName = parts[1]; - - if(tinyDb.getBoolean("resumePullRequests")) { - loadInitial(Authorization.get(getContext()), repoOwner, repoName, pageSize, tinyDb.getString("repoPrState"), resultLimit); - tinyDb.putBoolean("resumePullRequests", false); - tinyDb.putBoolean("prMerged", false); + if(resumePullRequests) { + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), pageSize, repository.getPrState().toString(), resultLimit); + resumePullRequests = false; } } @@ -239,9 +233,7 @@ public class PullRequestsFragment extends Fragment { inflater.inflate(R.menu.filter_menu_pr, menu); super.onCreateOptionsMenu(menu, inflater); - TinyDB tinyDb = TinyDB.getInstance(context); - - if(tinyDb.getString("repoPrState").equals("closed")) { + if(repository.getPrState().toString().equals("closed")) { menu.getItem(1).setIcon(R.drawable.ic_filter_closed); } else { 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 76575e02..222b826d 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ReleasesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ReleasesFragment.java @@ -12,9 +12,7 @@ import android.view.ViewGroup; 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.ViewModelProvider; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; @@ -22,13 +20,12 @@ import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import org.gitnex.tea4j.models.Releases; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.adapters.ReleasesAdapter; import org.mian.gitnex.adapters.TagsAdapter; import org.mian.gitnex.databinding.FragmentReleasesBinding; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; -import org.mian.gitnex.helpers.Version; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import org.mian.gitnex.viewmodels.ReleasesViewModel; import java.util.List; @@ -43,35 +40,25 @@ public class ReleasesFragment extends Fragment { private TagsAdapter tagsAdapter; private RecyclerView mRecyclerView; private TextView noDataReleases; - private static String repoNameF = "param2"; - private static String repoOwnerF = "param1"; - private String repoName; - private String repoOwner; + private RepositoryContext repository; private String releaseTag; - private boolean viewTypeIsTags = false; private int page = 1; private int pageReleases = 1; public ReleasesFragment() { } - public static ReleasesFragment newInstance(String param1, String param2) { + public static ReleasesFragment newInstance(RepositoryContext repository) { ReleasesFragment fragment = new ReleasesFragment(); - Bundle args = new Bundle(); - args.putString(repoOwnerF, param1); - args.putString(repoNameF, param2); - fragment.setArguments(args); + fragment.setArguments(repository.getBundle()); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (getArguments() != null) { - repoName = getArguments().getString(repoNameF); - repoOwner = getArguments().getString(repoOwnerF); - } + repository = RepositoryContext.fromBundle(requireArguments()); releaseTag = requireActivity().getIntent().getStringExtra("releaseTagName"); } @@ -98,26 +85,26 @@ public class ReleasesFragment extends Fragment { swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); - if(viewTypeIsTags) { - ReleasesViewModel.loadTagsList(Authorization.get(getContext()), repoOwner, repoName, getContext()); + if(repository.isReleasesViewTypeIsTag()) { + ReleasesViewModel.loadTagsList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), getContext()); } else { - ReleasesViewModel.loadReleasesList(Authorization.get(getContext()), repoOwner, repoName, getContext()); + ReleasesViewModel.loadReleasesList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), getContext()); } mProgressBar.setVisibility(View.VISIBLE); }, 50)); - fetchDataAsync(Authorization.get(getContext()), repoOwner, repoName); + fetchDataAsync(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName()); setHasOptionsMenu(true); ((RepoDetailActivity) requireActivity()).setFragmentRefreshListenerReleases(type -> { - viewTypeIsTags = type.equals("tags"); + if(type != null) repository.setReleasesViewTypeIsTag(type.equals("tags")); page = 1; pageReleases = 1; - if(viewTypeIsTags) { - ReleasesViewModel.loadTagsList(Authorization.get(getContext()), repoOwner, repoName, getContext()); + if(repository.isReleasesViewTypeIsTag()) { + ReleasesViewModel.loadTagsList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), getContext()); } else { - ReleasesViewModel.loadReleasesList(Authorization.get(getContext()), repoOwner, repoName, getContext()); + ReleasesViewModel.loadReleasesList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), getContext()); } mProgressBar.setVisibility(View.VISIBLE); }); @@ -126,69 +113,49 @@ public class ReleasesFragment extends Fragment { } - @Override - public void onResume() { - - super.onResume(); - TinyDB tinyDb = TinyDB.getInstance(getContext()); - - if(tinyDb.getBoolean("updateReleases")) { - if(viewTypeIsTags) { - ReleasesViewModel.loadTagsList(Authorization.get(getContext()), repoOwner, repoName, getContext()); - } else { - ReleasesViewModel.loadReleasesList(Authorization.get(getContext()), repoOwner, repoName, getContext()); - } - mProgressBar.setVisibility(View.VISIBLE); - tinyDb.putBoolean("updateReleases", false); - } - } - private void fetchDataAsync(String instanceToken, String owner, String repo) { ReleasesViewModel releasesModel = new ViewModelProvider(this).get(ReleasesViewModel.class); - releasesModel.getReleasesList(instanceToken, owner, repo, getContext()).observe(getViewLifecycleOwner(), new Observer>() { - @Override - public void onChanged(@Nullable List releasesListMain) { - if(!viewTypeIsTags) { - adapter = new ReleasesAdapter(getContext(), releasesListMain); - adapter.setLoadMoreListener(new ReleasesAdapter.OnLoadMoreListener() { + releasesModel.getReleasesList(instanceToken, owner, repo, getContext()).observe(getViewLifecycleOwner(), releasesListMain -> { + if(!repository.isReleasesViewTypeIsTag()) { + adapter = new ReleasesAdapter(getContext(), releasesListMain); + adapter.setLoadMoreListener(new ReleasesAdapter.OnLoadMoreListener() { - @Override - public void onLoadMore() { - pageReleases += 1; - ReleasesViewModel.loadMoreReleases(instanceToken, owner, repo , pageReleases, getContext(), adapter); - mProgressBar.setVisibility(View.VISIBLE); - } + @Override + public void onLoadMore() { + pageReleases += 1; + ReleasesViewModel.loadMoreReleases(instanceToken, owner, repo, pageReleases, getContext(), adapter); + mProgressBar.setVisibility(View.VISIBLE); + } - @Override - public void onLoadFinished() { - mProgressBar.setVisibility(View.GONE); - } - }); - if(adapter.getItemCount() > 0) { - mRecyclerView.setAdapter(adapter); - if(releasesListMain != null && releaseTag != null) { - int index = getReleaseIndex(releaseTag, releasesListMain); - releaseTag = null; - if(index != -1) { - mRecyclerView.scrollToPosition(index); - } - } - noDataReleases.setVisibility(View.GONE); - } - else { - adapter.notifyDataSetChanged(); - mRecyclerView.setAdapter(adapter); - noDataReleases.setVisibility(View.VISIBLE); - } - mProgressBar.setVisibility(View.GONE); - } - } + @Override + public void onLoadFinished() { + mProgressBar.setVisibility(View.GONE); + } + }); + if(adapter.getItemCount() > 0) { + mRecyclerView.setAdapter(adapter); + if(releasesListMain != null && releaseTag != null) { + int index = getReleaseIndex(releaseTag, releasesListMain); + releaseTag = null; + if(index != -1) { + mRecyclerView.scrollToPosition(index); + } + } + noDataReleases.setVisibility(View.GONE); + } + else { + adapter.notifyDataSetChanged(); + mRecyclerView.setAdapter(adapter); + noDataReleases.setVisibility(View.VISIBLE); + } + mProgressBar.setVisibility(View.GONE); + } }); releasesModel.getTagsList(instanceToken, owner, repo, getContext()).observe(getViewLifecycleOwner(), tagList -> { - if(viewTypeIsTags) { + if(repository.isReleasesViewTypeIsTag()) { tagsAdapter = new TagsAdapter(getContext(), tagList, owner, repo); tagsAdapter.setLoadMoreListener(new TagsAdapter.OnLoadMoreListener() { @@ -230,7 +197,7 @@ public class ReleasesFragment extends Fragment { @Override public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - if(new Version(TinyDB.getInstance(requireContext()).getString("giteaVersion")).less("1.15.0")) + if(!((BaseActivity) requireActivity()).getAccount().requiresVersion("1.15.0")) return; inflater.inflate(R.menu.filter_menu_releases, menu); super.onCreateOptionsMenu(menu, inflater); 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 f6915347..7a74e98d 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/RepoInfoFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/RepoInfoFragment.java @@ -1,7 +1,6 @@ package org.mian.gitnex.fragments; import android.content.Context; -import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.util.Log; @@ -16,13 +15,14 @@ import androidx.fragment.app.Fragment; import org.apache.commons.io.FileUtils; import org.gitnex.tea4j.models.UserRepositories; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.RepoDetailActivity; -import org.mian.gitnex.activities.RepoForksActivity; import org.mian.gitnex.activities.RepoStargazersActivity; import org.mian.gitnex.activities.RepoWatchersActivity; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.FragmentRepoInfoBinding; import org.mian.gitnex.helpers.*; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.Locale; import retrofit2.Call; import retrofit2.Callback; @@ -35,32 +35,23 @@ public class RepoInfoFragment extends Fragment { private Context ctx; private LinearLayout pageContent; - private static final String repoNameF = "param2"; - private static final String repoOwnerF = "param1"; private FragmentRepoInfoBinding binding; - private String repoName; - private String repoOwner; + private RepositoryContext repository; public RepoInfoFragment() {} - public static RepoInfoFragment newInstance(String param1, String param2) { + public static RepoInfoFragment newInstance(RepositoryContext repository) { RepoInfoFragment fragment = new RepoInfoFragment(); - Bundle args = new Bundle(); - args.putString(repoOwnerF, param1); - args.putString(repoNameF, param2); - fragment.setArguments(args); + fragment.setArguments(repository.getBundle()); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (getArguments() != null) { - repoName = getArguments().getString(repoNameF); - repoOwner = getArguments().getString(repoOwnerF); - } + repository = RepositoryContext.fromBundle(requireArguments()); } @Override @@ -76,8 +67,8 @@ public class RepoInfoFragment extends Fragment { binding.repoMetaFrame.setVisibility(View.GONE); - getRepoInfo(Authorization.get(getContext()), repoOwner, repoName, locale, tinyDb.getString("dateFormat")); - getFileContents(Authorization.get(getContext()), repoOwner, repoName, getResources().getString(R.string.defaultFilename)); + setRepoInfo(locale, tinyDb.getString("dateFormat", "pretty")); + getFileContents(((BaseActivity) requireActivity()).getAccount().getAuthorization(), repository.getOwner(), repository.getName(), getResources().getString(R.string.defaultFilename)); if(isExpandViewVisible()) { toggleExpandView(); @@ -90,28 +81,11 @@ public class RepoInfoFragment extends Fragment { binding.fileContentsFrameHeader.setOnClickListener(v1 -> toggleExpandView()); binding.repoMetaFrameHeader.setOnClickListener(v12 -> toggleExpandViewMeta()); - binding.repoMetaStarsFrame.setOnClickListener(metaStars -> { + binding.repoMetaStarsFrame.setOnClickListener(metaStars -> ctx.startActivity(repository.getIntent(ctx, RepoStargazersActivity.class))); - Intent intent = new Intent(ctx, RepoStargazersActivity.class); - intent.putExtra("repoFullNameForStars", repoOwner + "/" + repoName); - ctx.startActivity(intent); - }); + binding.repoMetaWatchersFrame.setOnClickListener(metaWatchers -> ctx.startActivity(repository.getIntent(ctx, RepoWatchersActivity.class))); - binding.repoMetaWatchersFrame.setOnClickListener(metaWatchers -> { - - Intent intent = new Intent(ctx, RepoWatchersActivity.class); - intent.putExtra("repoFullNameForWatchers", repoOwner + "/" + repoName); - ctx.startActivity(intent); - }); - - binding.repoMetaForksFrame.setOnClickListener(v -> { - - Intent intent = new Intent(ctx, RepoForksActivity.class); - intent.putExtra("repoFullNameForForks", repoOwner + "/" + repoName); - ctx.startActivity(intent); - }); - - binding.repoMetaPullRequestsFrame.setOnClickListener(metaPR -> RepoDetailActivity.mViewPager.setCurrentItem(3)); + binding.repoMetaPullRequestsFrame.setOnClickListener(metaPR -> ((RepoDetailActivity) requireActivity()).mViewPager.setCurrentItem(3)); return binding.getRoot(); } @@ -156,150 +130,100 @@ public class RepoInfoFragment extends Fragment { return binding.repoMetaFrame.getVisibility() == View.VISIBLE; } - private void getRepoInfo(String token, final String owner, String repo, Locale locale, final String timeFormat) { + private void setRepoInfo(Locale locale, final String timeFormat) { + UserRepositories repoInfo = repository.getRepository(); - final TinyDB tinyDb = TinyDB.getInstance(getContext()); - - Call call = RetrofitClient - .getApiInterface(ctx) - .getUserRepository(token, owner, repo); - - call.enqueue(new Callback() { - - @Override - public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { - - UserRepositories repoInfo = response.body(); - - if (isAdded()) { - - if (response.isSuccessful()) { - - if (response.code() == 200) { - - assert repoInfo != null; - binding.repoMetaName.setText(repoInfo.getName()); - - if(!repoInfo.getDescription().isEmpty()) { - Markdown.render(ctx, repoInfo.getDescription(), binding.repoMetaDescription); - } - else { - binding.repoMetaDescription.setText(getString(R.string.noDataDescription)); - } - - binding.repoMetaStars.setText(repoInfo.getStars_count()); - - if(repoInfo.getOpen_pull_count() != null) { - binding.repoMetaPullRequests.setText(repoInfo.getOpen_pull_count()); - } - else { - binding.repoMetaPullRequestsFrame.setVisibility(View.GONE); - } - - binding.repoMetaForks.setText(repoInfo.getForks_count()); - binding.repoMetaWatchers.setText(repoInfo.getWatchers_count()); - binding.repoMetaSize.setText(FileUtils.byteCountToDisplaySize((int) repoInfo.getSize() * 1024)); - - binding.repoMetaCreatedAt.setText(TimeHelper.formatTime(repoInfo.getCreated_at(), locale, timeFormat, ctx)); - if(timeFormat.equals("pretty")) { - binding.repoMetaCreatedAt.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(repoInfo.getCreated_at()), ctx)); - } - - String repoMetaUpdatedAt = TimeHelper.formatTime(repoInfo.getUpdated_at(), locale, timeFormat, ctx); - - String website = (repoInfo.getWebsite().isEmpty()) ? getResources().getString(R.string.noDataWebsite) : repoInfo.getWebsite(); - binding.repoMetaWebsite.setText(website); - binding.repoMetaWebsite.setLinksClickable(false); - binding.websiteFrame.setOnClickListener((v) -> AppUtil.openUrlInBrowser(requireContext(), repoInfo.getWebsite())); - - binding.repoAdditionalButton.setOnClickListener(v -> { - - View view = LayoutInflater.from(ctx).inflate(R.layout.layout_repo_more_info, null); - - TextView defaultBranchHeader = view.findViewById(R.id.defaultBranchHeader); - TextView defaultBranchContent = view.findViewById(R.id.defaultBranchContent); - - TextView lastUpdatedHeader = view.findViewById(R.id.lastUpdatedHeader); - TextView lastUpdatedContent = view.findViewById(R.id.lastUpdatedContent); - - TextView sshUrlHeader = view.findViewById(R.id.sshUrlHeader); - TextView sshUrlContent = view.findViewById(R.id.sshUrlContent); - - TextView cloneUrlHeader = view.findViewById(R.id.cloneUrlHeader); - TextView cloneUrlContent = view.findViewById(R.id.cloneUrlContent); - - TextView repoUrlHeader = view.findViewById(R.id.repoUrlHeader); - TextView repoUrlContent = view.findViewById(R.id.repoUrlContent); - - defaultBranchHeader.setText(getString(R.string.infoTabRepoDefaultBranch)); - defaultBranchContent.setText(repoInfo.getDefault_branch()); - - lastUpdatedHeader.setText(getString(R.string.infoTabRepoUpdatedAt)); - lastUpdatedContent.setText(repoMetaUpdatedAt); - - sshUrlHeader.setText(getString(R.string.infoTabRepoSshUrl)); - sshUrlContent.setText(repoInfo.getSsh_url()); - - cloneUrlHeader.setText(getString(R.string.infoTabRepoCloneUrl)); - cloneUrlContent.setText(repoInfo.getClone_url()); - - repoUrlHeader.setText(getString(R.string.infoTabRepoRepoUrl)); - repoUrlContent.setText(repoInfo.getHtml_url()); - - AlertDialog.Builder alertDialog = new AlertDialog.Builder(ctx); - - alertDialog.setTitle(getResources().getString(R.string.infoMoreInformation)); - alertDialog.setView(view); - alertDialog.setPositiveButton(getString(R.string.okButton), null); - alertDialog.create().show(); - - }); - - if(repoInfo.getHas_issues() != null) { - tinyDb.putBoolean("hasIssues", repoInfo.getHas_issues()); - } - else { - tinyDb.putBoolean("hasIssues", true); - } - - if(repoInfo.isHas_pull_requests()) { - tinyDb.putBoolean("hasPullRequests", repoInfo.isHas_pull_requests()); - } - else { - tinyDb.putBoolean("hasPullRequests", false); - } - - tinyDb.putBoolean("isArchived", repoInfo.isArchived()); - if(repoInfo.isArchived()) { - binding.repoIsArchived.setVisibility(View.VISIBLE); - } - else { - binding.repoIsArchived.setVisibility(View.GONE); - } - - tinyDb.putString("repoHtmlUrl", repoInfo.getHtml_url()); - tinyDb.putBoolean("canPush", repoInfo.getPermissions().canPush()); - - binding.progressBar.setVisibility(View.GONE); - pageContent.setVisibility(View.VISIBLE); - - } - - } - else { - Log.e("onFailure", String.valueOf(response.code())); - } - - } + if (isAdded()) { + assert repoInfo != null; + binding.repoMetaName.setText(repoInfo.getName()); + if(!repoInfo.getDescription().isEmpty()) { + Markdown.render(ctx, repoInfo.getDescription(), binding.repoMetaDescription); + } + else { + binding.repoMetaDescription.setText(getString(R.string.noDataDescription)); } - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - Log.e("onFailure", t.toString()); - } - }); + binding.repoMetaStars.setText(repoInfo.getStars_count()); + if(repoInfo.getOpen_pull_count() != null) { + binding.repoMetaPullRequests.setText(repoInfo.getOpen_pull_count()); + } + else { + binding.repoMetaPullRequestsFrame.setVisibility(View.GONE); + } + + binding.repoMetaForks.setText(repoInfo.getForks_count()); + binding.repoMetaWatchers.setText(repoInfo.getWatchers_count()); + binding.repoMetaSize.setText(FileUtils.byteCountToDisplaySize((int) repoInfo.getSize() * 1024)); + + binding.repoMetaCreatedAt.setText(TimeHelper.formatTime(repoInfo.getCreated_at(), locale, timeFormat, ctx)); + if(timeFormat.equals("pretty")) { + binding.repoMetaCreatedAt.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(repoInfo.getCreated_at()), ctx)); + } + + String repoMetaUpdatedAt = TimeHelper.formatTime(repoInfo.getUpdated_at(), locale, timeFormat, ctx); + + String website = (repoInfo.getWebsite().isEmpty()) ? getResources().getString(R.string.noDataWebsite) : repoInfo.getWebsite(); + binding.repoMetaWebsite.setText(website); + binding.repoMetaWebsite.setLinksClickable(false); + binding.websiteFrame.setOnClickListener((v) -> { + if (!repoInfo.getWebsite().isEmpty()) AppUtil.openUrlInBrowser(requireContext(), repoInfo.getWebsite()); + }); + + binding.repoAdditionalButton.setOnClickListener(v -> { + + View view = LayoutInflater.from(ctx).inflate(R.layout.layout_repo_more_info, null); + + TextView defaultBranchHeader = view.findViewById(R.id.defaultBranchHeader); + TextView defaultBranchContent = view.findViewById(R.id.defaultBranchContent); + + TextView lastUpdatedHeader = view.findViewById(R.id.lastUpdatedHeader); + TextView lastUpdatedContent = view.findViewById(R.id.lastUpdatedContent); + + TextView sshUrlHeader = view.findViewById(R.id.sshUrlHeader); + TextView sshUrlContent = view.findViewById(R.id.sshUrlContent); + + TextView cloneUrlHeader = view.findViewById(R.id.cloneUrlHeader); + TextView cloneUrlContent = view.findViewById(R.id.cloneUrlContent); + + TextView repoUrlHeader = view.findViewById(R.id.repoUrlHeader); + TextView repoUrlContent = view.findViewById(R.id.repoUrlContent); + + defaultBranchHeader.setText(getString(R.string.infoTabRepoDefaultBranch)); + defaultBranchContent.setText(repoInfo.getDefault_branch()); + + lastUpdatedHeader.setText(getString(R.string.infoTabRepoUpdatedAt)); + lastUpdatedContent.setText(repoMetaUpdatedAt); + + sshUrlHeader.setText(getString(R.string.infoTabRepoSshUrl)); + sshUrlContent.setText(repoInfo.getSsh_url()); + + cloneUrlHeader.setText(getString(R.string.infoTabRepoCloneUrl)); + cloneUrlContent.setText(repoInfo.getClone_url()); + + repoUrlHeader.setText(getString(R.string.infoTabRepoRepoUrl)); + repoUrlContent.setText(repoInfo.getHtml_url()); + + AlertDialog.Builder alertDialog = new AlertDialog.Builder(ctx); + + alertDialog.setTitle(getResources().getString(R.string.infoMoreInformation)); + alertDialog.setView(view); + alertDialog.setPositiveButton(getString(R.string.okButton), null); + alertDialog.create().show(); + + }); + + if(repoInfo.isArchived()) { + binding.repoIsArchived.setVisibility(View.VISIBLE); + } + else { + binding.repoIsArchived.setVisibility(View.GONE); + } + + pageContent.setVisibility(View.VISIBLE); + + } } private void getFileContents(String token, final String owner, String repo, final String filename) { @@ -318,7 +242,7 @@ public class RepoInfoFragment extends Fragment { switch(response.code()) { case 200: - Markdown.render(ctx, response.body(), binding.repoFileContents); + Markdown.render(ctx, response.body(), binding.repoFileContents, repository); break; case 401: @@ -330,6 +254,8 @@ public class RepoInfoFragment extends Fragment { case 403: Toasty.error(ctx, ctx.getString(R.string.authorizeError)); + binding.fileContentsFrameHeader.setVisibility(View.GONE); + binding.fileContentsFrame.setVisibility(View.GONE); break; case 404: @@ -339,6 +265,8 @@ public class RepoInfoFragment extends Fragment { default: Toasty.error(getContext(), getString(R.string.genericError)); + binding.fileContentsFrameHeader.setVisibility(View.GONE); + binding.fileContentsFrame.setVisibility(View.GONE); break; } 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 1fe46002..258f07e7 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/RepositoriesByOrgFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/RepositoriesByOrgFragment.java @@ -24,11 +24,11 @@ import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import org.gitnex.tea4j.models.UserRepositories; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; +import org.mian.gitnex.activities.MainActivity; import org.mian.gitnex.adapters.RepositoriesByOrgAdapter; import org.mian.gitnex.databinding.FragmentRepositoriesByOrgBinding; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.viewmodels.RepositoriesByOrgViewModel; import java.util.List; @@ -90,11 +90,11 @@ public class RepositoriesByOrgFragment extends Fragment { swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); - RepositoriesByOrgViewModel.loadOrgRepos(Authorization.get(getContext()), orgName, getContext(), pageSize, resultLimit); + RepositoriesByOrgViewModel.loadOrgRepos(((BaseActivity) requireActivity()).getAccount().getAuthorization(), orgName, getContext(), pageSize, resultLimit); }, 200)); - fetchDataAsync(Authorization.get(getContext()), orgName, pageSize, resultLimit); + fetchDataAsync(((BaseActivity) requireActivity()).getAccount().getAuthorization(), orgName, pageSize, resultLimit); return fragmentRepositoriesByOrgBinding.getRoot(); } @@ -103,11 +103,10 @@ public class RepositoriesByOrgFragment extends Fragment { public void onResume() { super.onResume(); - TinyDB tinyDb = TinyDB.getInstance(getContext()); - if(tinyDb.getBoolean("repoCreated")) { - RepositoriesByOrgViewModel.loadOrgRepos(Authorization.get(getContext()), orgName, getContext(), pageSize, resultLimit); - tinyDb.putBoolean("repoCreated", false); + if(MainActivity.repoCreated) { + RepositoriesByOrgViewModel.loadOrgRepos(((BaseActivity) requireActivity()).getAccount().getAuthorization(), orgName, getContext(), pageSize, resultLimit); + MainActivity.repoCreated = false; } } 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 25149685..90c8251b 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/RepositoriesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/RepositoriesFragment.java @@ -23,12 +23,11 @@ import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.CreateRepoActivity; import org.mian.gitnex.activities.MainActivity; import org.mian.gitnex.adapters.ReposListAdapter; import org.mian.gitnex.databinding.FragmentRepositoriesBinding; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.viewmodels.RepositoriesListViewModel; /** @@ -93,11 +92,11 @@ public class RepositoriesFragment extends Fragment { swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); - RepositoriesListViewModel.loadReposList(Authorization.get(getContext()), getContext(), pageSize, resultLimit); + RepositoriesListViewModel.loadReposList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), getContext(), pageSize, resultLimit); }, 50)); - fetchDataAsync(Authorization.get(getContext()), pageSize, resultLimit); + fetchDataAsync(((BaseActivity) requireActivity()).getAccount().getAuthorization(), pageSize, resultLimit); return fragmentRepositoriesBinding.getRoot(); } @@ -105,13 +104,10 @@ public class RepositoriesFragment extends Fragment { @Override public void onResume() { super.onResume(); - TinyDB tinyDb = TinyDB.getInstance(getContext()); - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); - if(tinyDb.getBoolean("repoCreated")) { - RepositoriesListViewModel.loadReposList(Authorization.get(getContext()), getContext(), pageSize, resultLimit); - tinyDb.putBoolean("repoCreated", false); + if(MainActivity.repoCreated) { + RepositoriesListViewModel.loadReposList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), getContext(), pageSize, resultLimit); + MainActivity.repoCreated = false; } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/SettingsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/SettingsFragment.java index bf015f18..661f6d27 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/SettingsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/SettingsFragment.java @@ -15,6 +15,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.MainActivity; import org.mian.gitnex.activities.SettingsAppearanceActivity; import org.mian.gitnex.activities.SettingsDraftsActivity; @@ -26,8 +27,6 @@ import org.mian.gitnex.activities.SettingsTranslationActivity; import org.mian.gitnex.databinding.CustomAboutDialogBinding; import org.mian.gitnex.databinding.FragmentSettingsBinding; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.TinyDB; -import org.mian.gitnex.helpers.Version; /** * Author M M Arif @@ -35,8 +34,9 @@ import org.mian.gitnex.helpers.Version; public class SettingsFragment extends Fragment { + public static boolean refreshParent = false; + private Context ctx; - private TinyDB tinyDB; private Dialog aboutAppDialog; @Nullable @@ -46,12 +46,11 @@ public class SettingsFragment extends Fragment { FragmentSettingsBinding fragmentSettingsBinding = FragmentSettingsBinding.inflate(inflater, container, false); ctx = getContext(); - tinyDB = TinyDB.getInstance(ctx); aboutAppDialog = new Dialog(ctx, R.style.ThemeOverlay_MaterialComponents_Dialog_Alert); ((MainActivity) requireActivity()).setActionBarTitle(getResources().getString(R.string.navSettings)); - if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.3")) { + if(((BaseActivity) requireActivity()).getAccount().requiresVersion("1.12.3")) { fragmentSettingsBinding.notificationsFrame.setVisibility(View.VISIBLE); } @@ -88,7 +87,7 @@ public class SettingsFragment extends Fragment { aboutAppDialog.setContentView(view); aboutAppDialogBinding.appVersionBuild.setText(getString(R.string.appVersionBuild, AppUtil.getAppVersion(ctx), AppUtil.getAppBuildNo(ctx))); - aboutAppDialogBinding.userServerVersion.setText(tinyDB.getString("giteaVersion")); + aboutAppDialogBinding.userServerVersion.setText(((BaseActivity) requireActivity()).getAccount().getServerVersion().toString()); aboutAppDialogBinding.donationLinkPatreon.setOnClickListener(v12 -> { AppUtil.openUrlInBrowser(requireContext(), getResources().getString(R.string.supportLinkPatreon)); @@ -126,10 +125,10 @@ public class SettingsFragment extends Fragment { public void onResume() { super.onResume(); - if(tinyDB.getBoolean("refreshParent")) { + if(refreshParent) { requireActivity().recreate(); requireActivity().overridePendingTransition(0, 0); - tinyDB.putBoolean("refreshParent", false); + refreshParent = false; } } } diff --git a/app/src/main/java/org/mian/gitnex/fragments/StarredRepositoriesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/StarredRepositoriesFragment.java index cef0fd7b..e319db72 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/StarredRepositoriesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/StarredRepositoriesFragment.java @@ -23,12 +23,11 @@ import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.CreateRepoActivity; import org.mian.gitnex.activities.MainActivity; import org.mian.gitnex.adapters.ReposListAdapter; import org.mian.gitnex.databinding.FragmentStarredRepositoriesBinding; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.viewmodels.StarredRepositoriesViewModel; /** @@ -37,8 +36,6 @@ import org.mian.gitnex.viewmodels.StarredRepositoriesViewModel; public class StarredRepositoriesFragment extends Fragment { - private static final String ARG_PARAM1 = "param1"; - private static final String ARG_PARAM2 = "param2"; private ProgressBar mProgressBar; private RecyclerView mRecyclerView; private ReposListAdapter adapter; @@ -47,27 +44,6 @@ public class StarredRepositoriesFragment extends Fragment { private int pageSize = 1; private int resultLimit = 50; - public StarredRepositoriesFragment() { - } - - public static StarredRepositoriesFragment newInstance(String param1, String param2) { - StarredRepositoriesFragment fragment = new StarredRepositoriesFragment(); - Bundle args = new Bundle(); - args.putString(ARG_PARAM1, param1); - args.putString(ARG_PARAM2, param2); - fragment.setArguments(args); - return fragment; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (getArguments() != null) { - String mParam1 = getArguments().getString(ARG_PARAM1); - String mParam2 = getArguments().getString(ARG_PARAM2); - } - } - @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -117,29 +93,15 @@ public class StarredRepositoriesFragment extends Fragment { swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); - StarredRepositoriesViewModel.loadStarredReposList(Authorization.get(getContext()), getContext(), pageSize, resultLimit); + StarredRepositoriesViewModel.loadStarredReposList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), getContext(), pageSize, resultLimit); }, 50)); - fetchDataAsync(Authorization.get(getContext()), pageSize, resultLimit); + fetchDataAsync(((BaseActivity) requireActivity()).getAccount().getAuthorization(), pageSize, resultLimit); return fragmentStarredRepositoriesBinding.getRoot(); } - @Override - public void onResume() { - - super.onResume(); - TinyDB tinyDb = TinyDB.getInstance(getContext()); - final String loginUid = tinyDb.getString("loginUid"); - final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); - - if(tinyDb.getBoolean("repoCreated")) { - StarredRepositoriesViewModel.loadStarredReposList(Authorization.get(getContext()), getContext(), pageSize, resultLimit); - tinyDb.putBoolean("repoCreated", false); - } - } - private void fetchDataAsync(String instanceToken, int pageSize, int resultLimit) { StarredRepositoriesViewModel starredRepoModel = new ViewModelProvider(this).get(StarredRepositoriesViewModel.class); @@ -193,4 +155,15 @@ public class StarredRepositoriesFragment extends Fragment { }); } + + @Override + public void onResume() { + super.onResume(); + + if(MainActivity.repoCreated) { + StarredRepositoriesViewModel.loadStarredReposList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), getContext(), pageSize, resultLimit); + MainActivity.repoCreated = false; + } + + } } 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 f897261c..a3001478 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/TeamsByOrgFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/TeamsByOrgFragment.java @@ -21,12 +21,10 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import org.gitnex.tea4j.models.OrgPermissions; -import org.gitnex.tea4j.models.Teams; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.adapters.TeamsByOrgAdapter; import org.mian.gitnex.databinding.FragmentTeamsByOrgBinding; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.viewmodels.TeamsByOrgViewModel; /** @@ -35,6 +33,8 @@ import org.mian.gitnex.viewmodels.TeamsByOrgViewModel; public class TeamsByOrgFragment extends Fragment { + public static boolean resumeTeams = false; + private ProgressBar mProgressBar; private RecyclerView mRecyclerView; private TextView noDataTeams; @@ -65,7 +65,7 @@ public class TeamsByOrgFragment extends Fragment { } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { FragmentTeamsByOrgBinding fragmentTeamsByOrgBinding = FragmentTeamsByOrgBinding.inflate(inflater, container, false); @@ -88,11 +88,11 @@ public class TeamsByOrgFragment extends Fragment { swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setRefreshing(false); - TeamsByOrgViewModel.loadTeamsByOrgList(Authorization.get(getContext()), orgName, getContext(), noDataTeams, mProgressBar); + TeamsByOrgViewModel.loadTeamsByOrgList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), orgName, getContext(), noDataTeams, mProgressBar); }, 200)); - fetchDataAsync(Authorization.get(getContext()), orgName); + fetchDataAsync(((BaseActivity) requireActivity()).getAccount().getAuthorization(), orgName); return fragmentTeamsByOrgBinding.getRoot(); } @@ -100,11 +100,9 @@ public class TeamsByOrgFragment extends Fragment { @Override public void onResume() { super.onResume(); - TinyDB tinyDb = TinyDB.getInstance(getContext()); - - if(tinyDb.getBoolean("resumeTeams")) { - TeamsByOrgViewModel.loadTeamsByOrgList(Authorization.get(getContext()), orgName, getContext(), noDataTeams, mProgressBar); - tinyDb.putBoolean("resumeTeams", false); + if(resumeTeams) { + TeamsByOrgViewModel.loadTeamsByOrgList(((BaseActivity) requireActivity()).getAccount().getAuthorization(), orgName, getContext(), noDataTeams, mProgressBar); + resumeTeams = false; } } @@ -113,7 +111,7 @@ public class TeamsByOrgFragment extends Fragment { TeamsByOrgViewModel teamModel = new ViewModelProvider(this).get(TeamsByOrgViewModel.class); teamModel.getTeamsByOrg(instanceToken, owner, getContext(), noDataTeams, mProgressBar).observe(getViewLifecycleOwner(), orgTeamsListMain -> { - adapter = new TeamsByOrgAdapter(getContext(), orgTeamsListMain, permissions); + adapter = new TeamsByOrgAdapter(getContext(), orgTeamsListMain, permissions, orgName); if(adapter.getItemCount() > 0) { mRecyclerView.setAdapter(adapter); noDataTeams.setVisibility(View.GONE); diff --git a/app/src/main/java/org/mian/gitnex/fragments/profile/DetailFragment.java b/app/src/main/java/org/mian/gitnex/fragments/profile/DetailFragment.java index d1394935..03ae517f 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/profile/DetailFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/profile/DetailFragment.java @@ -9,12 +9,12 @@ import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import org.gitnex.tea4j.models.UserInfo; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.FragmentProfileDetailBinding; 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.ColorInverter; import org.mian.gitnex.helpers.RoundedTransformation; @@ -75,7 +75,7 @@ public class DetailFragment extends Fragment { Call call = RetrofitClient .getApiInterface(context) - .getUserProfile(Authorization.get(context), username); + .getUserProfile(((BaseActivity) requireActivity()).getAccount().getAuthorization(), username); call.enqueue(new Callback() { @Override @@ -89,7 +89,7 @@ public class DetailFragment extends Fragment { String email = !response.body().getEmail().isEmpty() ? response.body().getEmail() : ""; int imgRadius = AppUtil.getPixelsFromDensity(context, 3); - String timeFormat = tinyDb.getString("dateFormat"); + String timeFormat = tinyDb.getString("dateFormat", "pretty"); binding.userFullName.setText(username); binding.userLogin.setText(getString(R.string.usernameWithAt, response.body().getLogin())); diff --git a/app/src/main/java/org/mian/gitnex/fragments/profile/FollowersFragment.java b/app/src/main/java/org/mian/gitnex/fragments/profile/FollowersFragment.java index fedb9649..1a66367b 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/profile/FollowersFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/profile/FollowersFragment.java @@ -18,11 +18,11 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import org.gitnex.tea4j.models.UserInfo; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.adapters.UsersAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.FragmentProfileFollowersFollowingBinding; import org.mian.gitnex.helpers.AlertDialogs; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.SnackBar; import org.mian.gitnex.helpers.Toasty; @@ -81,7 +81,7 @@ public class FollowersFragment extends Fragment { fragmentProfileFollowersFollowingBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { fragmentProfileFollowersFollowingBinding.pullToRefresh.setRefreshing(false); - loadInitial(Authorization.get(context), username, resultLimit); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), username, resultLimit); adapter.notifyDataChanged(); }, 200)); @@ -89,7 +89,7 @@ public class FollowersFragment extends Fragment { adapter.setLoadMoreListener(() -> fragmentProfileFollowersFollowingBinding.recyclerView.post(() -> { if(usersList.size() == resultLimit || pageSize == resultLimit) { int page = (usersList.size() + resultLimit) / resultLimit; - loadMore(Authorization.get(context), username, page, resultLimit); + loadMore(((BaseActivity) requireActivity()).getAccount().getAuthorization(), username, page, resultLimit); } })); @@ -99,7 +99,7 @@ public class FollowersFragment extends Fragment { fragmentProfileFollowersFollowingBinding.recyclerView.setLayoutManager(new LinearLayoutManager(context)); fragmentProfileFollowersFollowingBinding.recyclerView.setAdapter(adapter); - loadInitial(Authorization.get(context), username, resultLimit); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), username, resultLimit); return fragmentProfileFollowersFollowingBinding.getRoot(); } diff --git a/app/src/main/java/org/mian/gitnex/fragments/profile/FollowingFragment.java b/app/src/main/java/org/mian/gitnex/fragments/profile/FollowingFragment.java index 3551f847..66188563 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/profile/FollowingFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/profile/FollowingFragment.java @@ -18,11 +18,11 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import org.gitnex.tea4j.models.UserInfo; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.adapters.UsersAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.FragmentProfileFollowersFollowingBinding; import org.mian.gitnex.helpers.AlertDialogs; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.SnackBar; import org.mian.gitnex.helpers.Toasty; @@ -81,7 +81,7 @@ public class FollowingFragment extends Fragment { fragmentProfileFollowersFollowingBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { fragmentProfileFollowersFollowingBinding.pullToRefresh.setRefreshing(false); - loadInitial(Authorization.get(context), username, resultLimit); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), username, resultLimit); adapter.notifyDataChanged(); }, 200)); @@ -89,7 +89,7 @@ public class FollowingFragment extends Fragment { adapter.setLoadMoreListener(() -> fragmentProfileFollowersFollowingBinding.recyclerView.post(() -> { if(usersList.size() == resultLimit || pageSize == resultLimit) { int page = (usersList.size() + resultLimit) / resultLimit; - loadMore(Authorization.get(context), username, page, resultLimit); + loadMore(((BaseActivity) requireActivity()).getAccount().getAuthorization(), username, page, resultLimit); } })); @@ -99,7 +99,7 @@ public class FollowingFragment extends Fragment { fragmentProfileFollowersFollowingBinding.recyclerView.setLayoutManager(new LinearLayoutManager(context)); fragmentProfileFollowersFollowingBinding.recyclerView.setAdapter(adapter); - loadInitial(Authorization.get(context), username, resultLimit); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), username, resultLimit); return fragmentProfileFollowersFollowingBinding.getRoot(); } diff --git a/app/src/main/java/org/mian/gitnex/fragments/profile/OrganizationsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/profile/OrganizationsFragment.java index def61f0f..1888bbe7 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/profile/OrganizationsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/profile/OrganizationsFragment.java @@ -18,11 +18,11 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import org.gitnex.tea4j.models.UserOrganizations; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.adapters.profile.OrganizationsAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.FragmentOrganizationsBinding; import org.mian.gitnex.helpers.AlertDialogs; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.SnackBar; import org.mian.gitnex.helpers.Toasty; @@ -83,7 +83,7 @@ public class OrganizationsFragment extends Fragment { fragmentOrganizationsBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { fragmentOrganizationsBinding.pullToRefresh.setRefreshing(false); - loadInitial(Authorization.get(context), username, resultLimit); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), username, resultLimit); adapter.notifyDataChanged(); }, 200)); @@ -91,7 +91,7 @@ public class OrganizationsFragment extends Fragment { adapter.setLoadMoreListener(() -> fragmentOrganizationsBinding.recyclerView.post(() -> { if(organizationsList.size() == resultLimit || pageSize == resultLimit) { int page = (organizationsList.size() + resultLimit) / resultLimit; - loadMore(Authorization.get(context), username, page, resultLimit); + loadMore(((BaseActivity) requireActivity()).getAccount().getAuthorization(), username, page, resultLimit); } })); @@ -101,7 +101,7 @@ public class OrganizationsFragment extends Fragment { fragmentOrganizationsBinding.recyclerView.setLayoutManager(new LinearLayoutManager(context)); fragmentOrganizationsBinding.recyclerView.setAdapter(adapter); - loadInitial(Authorization.get(context), username, resultLimit); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), username, resultLimit); return fragmentOrganizationsBinding.getRoot(); } diff --git a/app/src/main/java/org/mian/gitnex/fragments/profile/RepositoriesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/profile/RepositoriesFragment.java index c250372d..0853b223 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/profile/RepositoriesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/profile/RepositoriesFragment.java @@ -18,11 +18,11 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import org.gitnex.tea4j.models.UserRepositories; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.adapters.profile.RepositoriesAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.FragmentRepositoriesBinding; import org.mian.gitnex.helpers.AlertDialogs; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.SnackBar; import org.mian.gitnex.helpers.Toasty; @@ -83,7 +83,7 @@ public class RepositoriesFragment extends Fragment { fragmentRepositoriesBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { fragmentRepositoriesBinding.pullToRefresh.setRefreshing(false); - loadInitial(Authorization.get(context), username, resultLimit); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), username, resultLimit); adapter.notifyDataChanged(); }, 200)); @@ -91,7 +91,7 @@ public class RepositoriesFragment extends Fragment { adapter.setLoadMoreListener(() -> fragmentRepositoriesBinding.recyclerView.post(() -> { if(reposList.size() == resultLimit || pageSize == resultLimit) { int page = (reposList.size() + resultLimit) / resultLimit; - loadMore(Authorization.get(context), username, page, resultLimit); + loadMore(((BaseActivity) requireActivity()).getAccount().getAuthorization(), username, page, resultLimit); } })); @@ -101,7 +101,7 @@ public class RepositoriesFragment extends Fragment { fragmentRepositoriesBinding.recyclerView.setLayoutManager(new LinearLayoutManager(context)); fragmentRepositoriesBinding.recyclerView.setAdapter(adapter); - loadInitial(Authorization.get(context), username, resultLimit); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), username, resultLimit); return fragmentRepositoriesBinding.getRoot(); } diff --git a/app/src/main/java/org/mian/gitnex/fragments/profile/StarredRepositoriesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/profile/StarredRepositoriesFragment.java index 3c88a385..4c9730e4 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/profile/StarredRepositoriesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/profile/StarredRepositoriesFragment.java @@ -18,11 +18,11 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import org.gitnex.tea4j.models.UserRepositories; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.adapters.profile.StarredRepositoriesAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.FragmentRepositoriesBinding; import org.mian.gitnex.helpers.AlertDialogs; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.SnackBar; import org.mian.gitnex.helpers.Toasty; @@ -83,7 +83,7 @@ public class StarredRepositoriesFragment extends Fragment { fragmentRepositoriesBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { fragmentRepositoriesBinding.pullToRefresh.setRefreshing(false); - loadInitial(Authorization.get(context), username, resultLimit); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), username, resultLimit); adapter.notifyDataChanged(); }, 200)); @@ -91,7 +91,7 @@ public class StarredRepositoriesFragment extends Fragment { adapter.setLoadMoreListener(() -> fragmentRepositoriesBinding.recyclerView.post(() -> { if(reposList.size() == resultLimit || pageSize == resultLimit) { int page = (reposList.size() + resultLimit) / resultLimit; - loadMore(Authorization.get(context), username, page, resultLimit); + loadMore(((BaseActivity) requireActivity()).getAccount().getAuthorization(), username, page, resultLimit); } })); @@ -101,7 +101,7 @@ public class StarredRepositoriesFragment extends Fragment { fragmentRepositoriesBinding.recyclerView.setLayoutManager(new LinearLayoutManager(context)); fragmentRepositoriesBinding.recyclerView.setAdapter(adapter); - loadInitial(Authorization.get(context), username, resultLimit); + loadInitial(((BaseActivity) requireActivity()).getAccount().getAuthorization(), username, resultLimit); return fragmentRepositoriesBinding.getRoot(); } diff --git a/app/src/main/java/org/mian/gitnex/helpers/AlertDialogs.java b/app/src/main/java/org/mian/gitnex/helpers/AlertDialogs.java index 83b8426a..b5755f26 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/AlertDialogs.java +++ b/app/src/main/java/org/mian/gitnex/helpers/AlertDialogs.java @@ -1,5 +1,6 @@ package org.mian.gitnex.helpers; +import android.annotation.SuppressLint; import android.app.Dialog; import android.content.Context; import android.content.Intent; @@ -12,8 +13,10 @@ import org.mian.gitnex.R; import org.mian.gitnex.actions.CollaboratorActions; import org.mian.gitnex.actions.PullRequestActions; import org.mian.gitnex.actions.TeamActions; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.CreateLabelActivity; import org.mian.gitnex.activities.LoginActivity; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import org.mian.gitnex.clients.RetrofitClient; import retrofit2.Call; import retrofit2.Callback; @@ -34,15 +37,8 @@ public class AlertDialogs { .setIcon(R.drawable.ic_warning) .setNeutralButton(copyNegativeButton, (dialog, which) -> dialog.dismiss()) .setPositiveButton(copyPositiveButton, (dialog, which) -> { - - final TinyDB tinyDb = TinyDB.getInstance(context); - tinyDb.putBoolean("loggedInMode", false); - tinyDb.remove("basicAuthPassword"); - tinyDb.putBoolean("basicAuthFlag", false); - Intent intent = new Intent(context, LoginActivity.class); - context.startActivity(intent); + AppUtil.logout(context); dialog.dismiss(); - }); alertDialogBuilder.create().show(); @@ -57,14 +53,7 @@ public class AlertDialogs { .setCancelable(false) .setIcon(R.drawable.ic_info) .setPositiveButton(copyPositiveButton, (dialog, which) -> { - - final TinyDB tinyDb = TinyDB.getInstance(context); - tinyDb.putBoolean("loggedInMode", false); - tinyDb.remove("basicAuthPassword"); - tinyDb.putBoolean("basicAuthFlag", false); - - Intent intent = new Intent(context, LoginActivity.class); - context.startActivity(intent); + AppUtil.logout(context); dialog.dismiss(); }); @@ -72,23 +61,25 @@ public class AlertDialogs { alertDialogBuilder.create().show(); } - public static void labelDeleteDialog(final Context context, final String labelTitle, final String labelId, String title, String message, String positiveButton, String negativeButton, String type, String orgName) { + public static void labelDeleteDialog(final Context context, final String labelTitle, final String labelId, String type, String orgName, + RepositoryContext repository) { new AlertDialog.Builder(context) - .setTitle(String.format(title, labelTitle)) - .setMessage(message) + .setTitle(context.getString(R.string.deleteLabelTitle, labelTitle)) + .setMessage(R.string.labelDeleteMessage) .setIcon(R.drawable.ic_delete) - .setPositiveButton(positiveButton, (dialog, whichButton) -> { + .setPositiveButton(R.string.menuDeleteText, (dialog, whichButton) -> { Intent intent = new Intent(context, CreateLabelActivity.class); intent.putExtra("labelId", labelId); intent.putExtra("labelAction", "delete"); intent.putExtra("type", type); intent.putExtra("orgName", orgName); + intent.putExtra(RepositoryContext.INTENT_EXTRA, repository); context.startActivity(intent); }) - .setNeutralButton(negativeButton, null).show(); + .setNeutralButton(R.string.cancelButton, null).show(); } @@ -97,7 +88,7 @@ public class AlertDialogs { .setTitle(String.format(context.getString(R.string.deleteTagTitle), tagName)) .setMessage(R.string.deleteTagConfirmation) .setIcon(R.drawable.ic_delete) - .setPositiveButton(R.string.menuDeleteText, (dialog, whichButton) -> RetrofitClient.getApiInterface(context).deleteTag(Authorization.get(context), owner, repo, tagName).enqueue(new Callback() { + .setPositiveButton(R.string.menuDeleteText, (dialog, whichButton) -> RetrofitClient.getApiInterface(context).deleteTag(((BaseActivity) context).getAccount().getAuthorization(), owner, repo, tagName).enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { @@ -120,13 +111,13 @@ public class AlertDialogs { .setNeutralButton(R.string.cancelButton, null).show(); } - public static void collaboratorRemoveDialog(final Context context, final String userNameMain, String title, String message, String positiveButton, String negativeButton, final String searchKeyword) { + public static void collaboratorRemoveDialog(final Context context, final String userNameMain, RepositoryContext repository) { new AlertDialog.Builder(context) - .setTitle(String.format(title, userNameMain)) - .setMessage(message) - .setPositiveButton(positiveButton, (dialog, whichButton) -> CollaboratorActions.deleteCollaborator(context, searchKeyword, userNameMain)) - .setNeutralButton(negativeButton, null).show(); + .setTitle(context.getString(R.string.removeCollaboratorDialogTitle, userNameMain)) + .setMessage(R.string.removeCollaboratorMessage) + .setPositiveButton(R.string.removeButton, (dialog, whichButton) -> CollaboratorActions.deleteCollaborator(context, userNameMain, repository)) + .setNeutralButton(R.string.cancelButton, null).show(); } 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 67ac40af..05eae160 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java +++ b/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java @@ -1,5 +1,6 @@ package org.mian.gitnex.helpers; +import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.ClipData; import android.content.ClipboardManager; @@ -10,15 +11,27 @@ import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; import android.net.Uri; +import android.os.Build; import android.util.Base64; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.View; import androidx.annotation.ColorInt; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; import androidx.browser.customtabs.CustomTabColorSchemeParams; import androidx.browser.customtabs.CustomTabsIntent; import androidx.core.content.pm.PackageInfoCompat; +import androidx.lifecycle.Lifecycle; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.LiveData; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; +import org.mian.gitnex.activities.LoginActivity; +import org.mian.gitnex.activities.MainActivity; +import org.mian.gitnex.core.MainApplication; +import org.mian.gitnex.database.api.BaseApi; +import org.mian.gitnex.database.api.UserAccountsApi; import org.mian.gitnex.database.models.UserAccount; import java.io.IOException; import java.io.InputStream; @@ -41,6 +54,32 @@ import java.util.regex.Pattern; public class AppUtil { + public static void logout(Context ctx) { + TinyDB tinyDB = TinyDB.getInstance(ctx); + + UserAccountsApi api = BaseApi.getInstance(ctx, UserAccountsApi.class); + assert api != null; + + api.logout(tinyDB.getInt("currentActiveAccountId")); + if (api.getCount() >= 1) { + switchToAccount(ctx, api.loggedInUserAccounts().get(0)); + if(ctx instanceof MainActivity) { + ((Activity) ctx).recreate(); + } else { // if it's not a MainActivity, open MainActivity instead of current one + ((Activity) ctx).finish(); + Intent intent = new Intent(ctx, MainActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); + ctx.startActivity(intent); + } + } else { + tinyDB.putInt("currentActiveAccountId", -2); + ((Activity) ctx).finish(); + Intent intent = new Intent(ctx, LoginActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); + ctx.startActivity(intent); + } + } + public enum FileType { IMAGE, AUDIO, VIDEO, DOCUMENT, TEXT, EXECUTABLE, FONT, UNKNOWN } private static final HashMap extensions = new HashMap<>(); @@ -187,7 +226,11 @@ public class AppUtil { TinyDB tinyDB = TinyDB.getInstance(context); Locale locale = new Locale(tinyDB.getString("locale")); - return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", locale).format(date); + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", locale).format(date); + } else { + return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", locale).format(date); + } } @@ -330,23 +373,11 @@ public class AppUtil { } public static boolean switchToAccount(Context context, UserAccount userAccount) { + return ((MainApplication) context.getApplicationContext()).switchToAccount(userAccount, false); + } - TinyDB tinyDB = TinyDB.getInstance(context); - - if(tinyDB.getInt("currentActiveAccountId") != userAccount.getAccountId()) { - - tinyDB.putString("loginUid", userAccount.getUserName()); - tinyDB.putString("userLogin", userAccount.getUserName()); - tinyDB.putString(userAccount.getUserName() + "-token", userAccount.getToken()); - tinyDB.putString("instanceUrl", userAccount.getInstanceUrl()); - tinyDB.putInt("currentActiveAccountId", userAccount.getAccountId()); - - return true; - - } - - return false; - + public static boolean switchToAccount(Context context, UserAccount userAccount, boolean tmp) { + return ((MainApplication) context.getApplicationContext()).switchToAccount(userAccount, tmp); } public static void openUrlInBrowser(Context context, String url) { @@ -366,7 +397,7 @@ public class AppUtil { .build() .launchUrl(context, Uri.parse(url)); } else { - Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(tinyDB.getString("repoHtmlUrl"))); + Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); i.addCategory(Intent.CATEGORY_BROWSABLE); context.startActivity(i); } diff --git a/app/src/main/java/org/mian/gitnex/helpers/Authorization.java b/app/src/main/java/org/mian/gitnex/helpers/Authorization.java deleted file mode 100644 index 30cf1126..00000000 --- a/app/src/main/java/org/mian/gitnex/helpers/Authorization.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.mian.gitnex.helpers; - -import android.content.Context; -import org.mian.gitnex.database.models.UserAccount; -import okhttp3.Credentials; - -/** - * Author M M Arif - */ - -public class Authorization { - - public static String get(Context context) { - - TinyDB tinyDb = TinyDB.getInstance(context); - String loginUid = tinyDb.getString("loginUid"); - - if(tinyDb.getBoolean("basicAuthFlag") && - !tinyDb.getString("basicAuthPassword").isEmpty()) { - - return Credentials.basic(loginUid, tinyDb.getString("basicAuthPassword")); - } - - return "token " + tinyDb.getString(loginUid + "-token"); - - } - - public static String get(UserAccount userAccount) { - return "token " + userAccount.getToken(); - } - - public static String getWeb(Context context) { - - TinyDB tinyDb = TinyDB.getInstance(context); - return Credentials.basic("", tinyDb.getString(tinyDb.getString("loginUid") + "-token")); - } - -} diff --git a/app/src/main/java/org/mian/gitnex/helpers/Constants.java b/app/src/main/java/org/mian/gitnex/helpers/Constants.java index 8a4ffff9..f1d8bb2a 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/Constants.java +++ b/app/src/main/java/org/mian/gitnex/helpers/Constants.java @@ -1,6 +1,7 @@ package org.mian.gitnex.helpers; import android.content.Context; +import org.mian.gitnex.activities.BaseActivity; /** * Author M M Arif @@ -14,8 +15,7 @@ public class Constants { public static final String defaultOldestTimestamp = "1970-01-01T00:00:00+00:00"; public static int getCurrentResultLimit(Context context) { - Version version = new Version(TinyDB.getInstance(context).getString("giteaVersion")); - return version.higherOrEqual("1.12") ? resultLimitNewGiteaInstances : resultLimitOldGiteaInstances; + return ((BaseActivity) context).getAccount().requiresVersion("1.12") ? resultLimitNewGiteaInstances : resultLimitOldGiteaInstances; } // tags diff --git a/app/src/main/java/org/mian/gitnex/helpers/DeprecationDialog.java b/app/src/main/java/org/mian/gitnex/helpers/DeprecationDialog.java deleted file mode 100644 index a493498c..00000000 --- a/app/src/main/java/org/mian/gitnex/helpers/DeprecationDialog.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.mian.gitnex.helpers; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.TextView; -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; -import org.mian.gitnex.R; - -/** - * Author opyale - */ - -public class DeprecationDialog extends AlertDialog.Builder { - - private Context context; - - private String title; - private String message; - - public DeprecationDialog(@NonNull Context context) { - - super(context); - this.context = context; - setup(); - - } - - public DeprecationDialog(@NonNull Context context, int themeResId) { - - super(context, themeResId); - this.context = context; - setup(); - - } - - @NonNull - @SuppressLint("InflateParams") - @Override - public AlertDialog create() { - - setCancelable(false); - setPositiveButton(context.getResources().getString(R.string.okButton), (dialog, which) -> dialog.dismiss()); - - View view = LayoutInflater.from(context).inflate(R.layout.layout_deprecation_dialog, null); - - TextView customTitle = view.findViewById(R.id.customTitle); - TextView customMessage = view.findViewById(R.id.customMessage); - - customTitle.setText(title); - customMessage.setText(message); - - setView(view); - return super.create(); - - } - - private void setup() { - - this.message = ""; - this.title = context.getResources().getString(R.string.featureDeprecated); - - } - - public void setMessage(String message) { - - this.message = message; - } - - public void setTitle(String title) { - - this.title = title; - } - -} diff --git a/app/src/main/java/org/mian/gitnex/helpers/Markdown.java b/app/src/main/java/org/mian/gitnex/helpers/Markdown.java index f8efafd3..4220ce0b 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/Markdown.java +++ b/app/src/main/java/org/mian/gitnex/helpers/Markdown.java @@ -20,11 +20,14 @@ import org.commonmark.parser.InlineParserFactory; import org.commonmark.parser.Parser; import org.commonmark.parser.PostProcessor; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.activities.CommitDetailActivity; import org.mian.gitnex.activities.IssueDetailActivity; import org.mian.gitnex.activities.ProfileActivity; import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.core.MainGrammarLocator; +import org.mian.gitnex.helpers.contexts.IssueContext; +import org.mian.gitnex.helpers.contexts.RepositoryContext; import java.util.Objects; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; @@ -140,13 +143,13 @@ public class Markdown { } } - public static void render(Context context, String markdown, RecyclerView recyclerView) { + public static void render(Context context, String markdown, RecyclerView recyclerView, RepositoryContext repository) { try { RecyclerViewRenderer renderer = rvRendererPool.claim(OBJECT_POOL_CLAIM_TIMEOUT); if(renderer != null) { - renderer.setParameters(context, markdown, recyclerView); + renderer.setParameters(context, markdown, recyclerView, repository); executorService.execute(renderer); } } @@ -172,7 +175,7 @@ public class Markdown { private void setup() { Prism4jTheme prism4jTheme = - TinyDB.getInstance(context).getString("currentTheme").equals("dark") ? Prism4jThemeDarkula.create() : Prism4jThemeDefault.create(); + AppUtil.getColorFromAttribute(context, R.attr.isDark) == 1 ? Prism4jThemeDarkula.create() : Prism4jThemeDefault.create(); Markwon.Builder builder = Markwon.builder(context).usePlugin(CorePlugin.create()).usePlugin(HtmlPlugin.create()) .usePlugin(LinkifyPlugin.create(true)).usePlugin(SoftBreakAddsNewLinePlugin.create()).usePlugin(TablePlugin.create(context)) @@ -279,6 +282,9 @@ public class Markdown { private String markdown; private RecyclerView recyclerView; private MarkwonAdapter adapter; + private RepositoryContext repository; + + private LinkPostProcessor linkPostProcessor; public RecyclerViewRenderer(Slot slot) { @@ -288,9 +294,15 @@ public class Markdown { private void setup() { Objects.requireNonNull(context); + Objects.requireNonNull(repository); + + if(linkPostProcessor == null) { + linkPostProcessor = new LinkPostProcessor(context.getString(R.string.commentButtonText)); + linkPostProcessor.repository = repository; + } Prism4jTheme prism4jTheme = - TinyDB.getInstance(context).getString("currentTheme").equals("dark") ? Prism4jThemeDarkula.create() : Prism4jThemeDefault.create(); + AppUtil.getColorFromAttribute(context, R.attr.isDark) == 1 ? Prism4jThemeDarkula.create() : Prism4jThemeDefault.create(); final InlineParserFactory inlineParserFactory = MarkwonInlineParser.factoryBuilder().addInlineProcessor(new IssueInlineProcessor()) .addInlineProcessor(new UserInlineProcessor()).build(); @@ -336,7 +348,7 @@ public class Markdown { public void configureParser(@NonNull Parser.Builder builder) { builder.inlineParserFactory(inlineParserFactory); - builder.postProcessor(new LinkPostProcessor(TinyDB.getInstance(context), context.getString(R.string.commentButtonText))); + builder.postProcessor(linkPostProcessor); } @Override @@ -357,8 +369,8 @@ public class Markdown { @Override public void configureConfiguration(@NonNull MarkwonConfiguration.Builder builder) { - builder.linkResolver((view, link) -> { + RepositoryContext repoLocal = linkPostProcessor.repository; if(link.startsWith("gitnexuser://")) { Intent i = new Intent(view.getContext(), ProfileActivity.class); i.putExtra("username", link.substring(13)); @@ -366,30 +378,34 @@ public class Markdown { } else if(link.startsWith("gitnexissue://")) { link = link.substring(14); // remove gitnexissue:// - Intent i = new Intent(view.getContext(), IssueDetailActivity.class); String index; - TinyDB tinyDB = TinyDB.getInstance(context); if(link.contains("/")) { index = link.split("#")[1]; - tinyDB.putString("repoFullName", link.split("#")[0]); - i.putExtra("openedFromLink", "true"); } else { index = link.substring(1); } + String[] repo; + if(link.contains("/")) { + repo = link.split("#")[0].split("/"); + } else { + repo = new String[]{repoLocal.getOwner(), repoLocal.getName()}; + } + Intent i = new IssueContext(new RepositoryContext(repo[0], repo[1], context), Integer.parseInt(index), null) + .getIntent(context, IssueDetailActivity.class); + + if (link.contains("/")) { + i.putExtra("openedFromLink", "true"); + } - tinyDB.putString("issueNumber", index); - i.putExtra("issueNumber", index); view.getContext().startActivity(i); } else if(link.startsWith("gitnexcommit://")) { - TinyDB tinyDB = TinyDB.getInstance(context); link = link.substring(15); - Intent i = new Intent(view.getContext(), CommitDetailActivity.class); + Intent i = repoLocal.getIntent(view.getContext(), CommitDetailActivity.class); String sha; if(link.contains("/")) { sha = link.split("/")[2]; - tinyDB.putString("repoFullName", link.split("/")[0] + link.split("/")[1]); } else { sha = link.substring(1); @@ -417,11 +433,14 @@ public class Markdown { .include(FencedCodeBlock.class, SimpleEntry.create(R.layout.custom_markdown_code_block, R.id.textCodeBlock)).build(); } - public void setParameters(Context context, String markdown, RecyclerView recyclerView) { + public void setParameters(Context context, String markdown, RecyclerView recyclerView, RepositoryContext repository) { this.context = context; this.markdown = markdown; this.recyclerView = recyclerView; + this.repository = repository; + if(linkPostProcessor != null) + linkPostProcessor.repository = repository; } @Override @@ -430,6 +449,7 @@ public class Markdown { Objects.requireNonNull(context); Objects.requireNonNull(markdown); Objects.requireNonNull(recyclerView); + Objects.requireNonNull(repository); if(markwon == null) { setup(); @@ -466,6 +486,7 @@ public class Markdown { markdown = null; recyclerView = null; adapter = null; + repository = null; slot.release(this); @@ -476,224 +497,223 @@ public class Markdown { slot.expire(this); } - } + private static class IssueInlineProcessor extends InlineProcessor { - private static class IssueInlineProcessor extends InlineProcessor { - - private static final Pattern RE = Pattern.compile("(? i) { - lastNode = insertNode(new Text(literal.substring(foundAt, matcherCommit.start())), lastNode); - } - String shortSha = matcherCommit.group(2); - if(shortSha == null) { - return; - } - if(shortSha.length() > 10) { - shortSha = shortSha.substring(0, 10); - } - String text; - if(matcherCommit.group(1).equals(fullRepoName)) { - text = shortSha; - } - else { - text = matcherCommit.group(1) + "/" + shortSha; - } - Text contentNode = new Text(text); - Link linkNode = new Link("gitnexcommit://" + text, null); - linkNode.appendChild(contentNode); - lastNode = insertNode(linkNode, lastNode); - - i = matcherCommit.start(); - } - else if(issueStart < literal.length()) { - // next one is an issue/comment - if(matcherIssue.start() > i) { - lastNode = insertNode(new Text(literal.substring(i, matcherIssue.start())), lastNode); - } - - String text; - if(matcherIssue.group(1).equals(fullRepoName)) { - text = "#" + matcherIssue.group(2); - } - else { - text = matcherIssue.group(1) + "#" + matcherIssue.group(2); - } - Text contentNode = new Text(text); - Link linkNode = new Link("gitnexissue://" + text, null); - linkNode.appendChild(contentNode); - lastNode = insertNode(linkNode, lastNode); - - String anchor = matcherIssue.group(3); - if(anchor != null && anchor.startsWith("issuecomment-")) { - // comment - - // insert space - lastNode = insertNode(new Text(" "), lastNode); - - Text commentNode = new Text("(" + commentText + ")"); - Link linkCommentNode = new Link(matcherIssue.group(), null); - linkCommentNode.appendChild(commentNode); - lastNode = insertNode(linkCommentNode, lastNode); - } - - i = matcherIssue.end(); - } - - // reset every time to make it usable in a "pure" state - matcherCommit.reset(); - matcherIssue.reset(); - } - - if(foundAny) { - textNode.unlink(); - } - } - - private void linkifyImage(Image node) { - - final Matcher patternAttachments = Pattern.compile("(/attachments/\\S+)", Pattern.MULTILINE).matcher(node.getDestination()); - if(patternAttachments.matches()) { - node.setDestination(instanceUrl + fullRepoName + patternAttachments.group(1)); - } - } - - private class AutolinkVisitor extends AbstractVisitor { - - int inLink = 0; + private static final Pattern RE = Pattern.compile("(? i) { + lastNode = insertNode(new Text(literal.substring(foundAt, matcherCommit.start())), lastNode); + } + String shortSha = matcherCommit.group(2); + if(shortSha == null) { + return; + } + if(shortSha.length() > 10) { + shortSha = shortSha.substring(0, 10); + } + String text; + if(matcherCommit.group(1).equals(repository.getFullName())) { + text = shortSha; + } + else { + text = matcherCommit.group(1) + "/" + shortSha; + } + Text contentNode = new Text(text); + Link linkNode = new Link("gitnexcommit://" + text, null); + linkNode.appendChild(contentNode); + lastNode = insertNode(linkNode, lastNode); + + i = matcherCommit.start(); + } + else if(issueStart < literal.length()) { + // next one is an issue/comment + if(matcherIssue.start() > i) { + lastNode = insertNode(new Text(literal.substring(i, matcherIssue.start())), lastNode); + } + + String text; + if(matcherIssue.group(1).equals(repository.getFullName())) { + text = "#" + matcherIssue.group(2); + } + else { + text = matcherIssue.group(1) + "#" + matcherIssue.group(2); + } + Text contentNode = new Text(text); + Link linkNode = new Link("gitnexissue://" + text, null); + linkNode.appendChild(contentNode); + lastNode = insertNode(linkNode, lastNode); + + String anchor = matcherIssue.group(3); + if(anchor != null && anchor.startsWith("issuecomment-")) { + // comment + + // insert space + lastNode = insertNode(new Text(" "), lastNode); + + Text commentNode = new Text("(" + commentText + ")"); + Link linkCommentNode = new Link(matcherIssue.group(), null); + linkCommentNode.appendChild(commentNode); + lastNode = insertNode(linkCommentNode, lastNode); + } + + i = matcherIssue.end(); + } + + // reset every time to make it usable in a "pure" state + matcherCommit.reset(); + matcherIssue.reset(); + } + + if(foundAny) { + textNode.unlink(); + } + } + + private void linkifyImage(Image node) { + + final Matcher patternAttachments = Pattern.compile("(/attachments/\\S+)", Pattern.MULTILINE).matcher(node.getDestination()); + if(patternAttachments.matches()) { + node.setDestination(instanceUrl + repository.getFullName() + patternAttachments.group(1)); + } + } + + private class AutolinkVisitor extends AbstractVisitor { + + int inLink = 0; + + @Override + public void visit(Link link) { + + inLink++; + super.visit(link); + inLink--; + } + + @Override + public void visit(Image image) { + + super.visit(image); + linkifyImage(image); + } + + @Override + public void visit(Text text) { + + if(inLink == 0) { + link(text); + } + } + } } diff --git a/app/src/main/java/org/mian/gitnex/helpers/PicassoCache.java b/app/src/main/java/org/mian/gitnex/helpers/PicassoCache.java index 96143358..69d42c9e 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/PicassoCache.java +++ b/app/src/main/java/org/mian/gitnex/helpers/PicassoCache.java @@ -5,6 +5,7 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.Log; import com.squareup.picasso.Cache; +import org.mian.gitnex.R; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -37,7 +38,7 @@ public class PicassoCache implements Cache { TinyDB tinyDb = TinyDB.getInstance(ctx); - CACHE_SIZE = FilesData.returnOnlyNumber(tinyDb.getString("cacheSizeImagesStr")) * 1024 * 1024; + CACHE_SIZE = FilesData.returnOnlyNumber(tinyDb.getString("cacheSizeImagesStr", ctx.getString(R.string.cacheSizeImagesSelectionSelectedText))) * 1024 * 1024; this.cachePath = cachePath; cacheMap = new HashMap<>(); this.ctx = ctx; diff --git a/app/src/main/java/org/mian/gitnex/helpers/UserMentions.java b/app/src/main/java/org/mian/gitnex/helpers/UserMentions.java deleted file mode 100644 index d46a5a4e..00000000 --- a/app/src/main/java/org/mian/gitnex/helpers/UserMentions.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.mian.gitnex.helpers; - -import android.content.Context; -import android.text.Spannable; -import android.text.SpannableString; -import android.text.style.ForegroundColorSpan; -import androidx.core.content.res.ResourcesCompat; -import org.mian.gitnex.R; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Author M M Arif - */ - -public class UserMentions { - - public static Spannable UserMentionsFunc(Context mCtx, CharSequence bodyWithMD) { - - Spannable bodyWithMentions = new SpannableString(bodyWithMD); - Pattern pattern = Pattern.compile("@\\w+"); - Matcher matcher = pattern.matcher(bodyWithMD); - - while (matcher.find()) - { - - int indexStart = String.valueOf(bodyWithMD).indexOf(matcher.group()); - int indexEnd = indexStart + matcher.group().length(); - bodyWithMentions.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(mCtx.getResources(), R.color.colorDarkGreen, null)), indexStart, indexEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - - } - return bodyWithMentions; - - } - -} diff --git a/app/src/main/java/org/mian/gitnex/helpers/Version.java b/app/src/main/java/org/mian/gitnex/helpers/Version.java index a6b1da91..1c13957e 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/Version.java +++ b/app/src/main/java/org/mian/gitnex/helpers/Version.java @@ -221,4 +221,11 @@ public class Version { } + @NonNull + @Override + public String toString() { + + return raw; + } + } diff --git a/app/src/main/java/org/mian/gitnex/helpers/contexts/AccountContext.java b/app/src/main/java/org/mian/gitnex/helpers/contexts/AccountContext.java new file mode 100644 index 00000000..c9532cd9 --- /dev/null +++ b/app/src/main/java/org/mian/gitnex/helpers/contexts/AccountContext.java @@ -0,0 +1,66 @@ +package org.mian.gitnex.helpers.contexts; + +import android.content.Context; +import org.gitnex.tea4j.models.UserInfo; +import org.mian.gitnex.database.api.UserAccountsApi; +import org.mian.gitnex.database.models.UserAccount; +import org.mian.gitnex.helpers.Version; +import java.io.Serializable; +import java.util.Objects; +import okhttp3.Credentials; + +public class AccountContext implements Serializable { + + private UserAccount account; + private UserInfo userInfo; + + public static AccountContext fromId(int id, Context context) { + return new AccountContext(Objects.requireNonNull(UserAccountsApi.getInstance(context, UserAccountsApi.class)).getAccountById(id)); + } + + public AccountContext(UserAccount account) { + this.account = account; + } + + public UserAccount getAccount() { + + return account; + } + + public void setAccount(UserAccount account) { + + this.account = account; + } + + public String getAuthorization() { + return "token " + account.getToken(); + } + + public String getWebAuthorization() { + return Credentials.basic("", account.getUserName()); // FIXME this is not correct and will never work! + } + + public Version getServerVersion() { + return new Version(account.getServerVersion()); + } + + public boolean requiresVersion(String version) { + return getServerVersion().higherOrEqual(version); + } + + public UserInfo getUserInfo() { + + return userInfo; + } + + public void setUserInfo(UserInfo userInfo) { + + this.userInfo = userInfo; + } + + public String getFullName() { + return userInfo != null ? !userInfo.getFullname().equals("") ? + userInfo.getFullname() : userInfo.getLogin() : account.getUserName(); + } + +} diff --git a/app/src/main/java/org/mian/gitnex/helpers/contexts/IssueContext.java b/app/src/main/java/org/mian/gitnex/helpers/contexts/IssueContext.java new file mode 100644 index 00000000..48ea69cc --- /dev/null +++ b/app/src/main/java/org/mian/gitnex/helpers/contexts/IssueContext.java @@ -0,0 +1,153 @@ +package org.mian.gitnex.helpers.contexts; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import org.gitnex.tea4j.models.Issues; +import org.gitnex.tea4j.models.PullRequests; +import org.gitnex.tea4j.models.UserRepositories; +import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; +import java.io.Serializable; + +public class IssueContext implements Serializable { + + public static final String INTENT_EXTRA = "issue"; + + public static IssueContext fromIntent(Intent intent) { + return (IssueContext) intent.getSerializableExtra(INTENT_EXTRA); + } + + public static IssueContext fromBundle(Bundle bundle) { + return (IssueContext) bundle.getSerializable(INTENT_EXTRA); + } + + private Issues issue; + private PullRequests pullRequest; + private boolean isSubscribed; + private final RepositoryContext repository; + private int issueIndex = 0; + private String issueType; + + public IssueContext(RepositoryContext repository, int issueIndex, String issueType) { + this.repository = repository; + this.issueIndex = issueIndex; + this.issueType = issueType; + } + + public IssueContext(Issues issue, PullRequests pullRequest, RepositoryContext repository) { + this.issue = issue; + this.issueType = issue.getPull_request() == null ? + "Issue" : "Pull"; + this.pullRequest = pullRequest; + this.repository = repository; + } + + public IssueContext(PullRequests pullRequest, RepositoryContext repository) { + this.issueType = "Pull"; + this.pullRequest = pullRequest; + this.repository = repository; + } + + public IssueContext(Issues issue, RepositoryContext repository) { + this.issue = issue; + this.issueType = issue.getPull_request() == null ? + "Issue" : "Pull"; + + this.repository = repository; + } + + public IssueContext(Issues issue, PullRequests pullRequest, UserRepositories repository, Context context) { + this.issue = issue; + this.issueType = issue.getPull_request() == null ? + "Issue" : "Pull"; + this.pullRequest = pullRequest; + + this.repository = new RepositoryContext(repository, context); + } + + public IssueContext(Issues issue, UserRepositories repository, Context context) { + this.issue = issue; + this.issueType = issue.getPull_request() == null ? + "Issue" : "Pull"; + this.repository = new RepositoryContext(repository, context); + } + + public PullRequests getPullRequest() { + + return pullRequest; + } + + public Issues getIssue() { + + return issue; + } + + public void setPullRequest(PullRequests pullRequest) { + + this.pullRequest = pullRequest; + } + + public Intent getIntent(Context context, Class clazz) { + Intent intent = new Intent(context, clazz); + intent.putExtra(INTENT_EXTRA, this); + return intent; + } + + public Bundle getBundle() { + Bundle bundle = new Bundle(); + bundle.putSerializable(INTENT_EXTRA, this); + return bundle; + } + + public boolean hasIssue() { + + return issue != null; + } + + public RepositoryContext getRepository() { + + return repository; + } + + public int getIssueIndex() { + + return issueIndex != 0 ? + issueIndex : + issue != null ? + issue.getNumber() : pullRequest.getNumber(); + } + + public boolean isSubscribed() { + + return isSubscribed; + } + + public void setSubscribed(boolean subscribed) { + + isSubscribed = subscribed; + } + + public void setIssue(Issues issue) { + this.issue = issue; + if(issue != null) { + this.issueType = issue.getPull_request() == null ? "Issue" : "Pull"; + } + } + + public String getIssueType() { + + return issueType; + } + + public boolean prIsFork() { + if(pullRequest.getHead().getRepo() != null) { + return !pullRequest.getHead().getRepo().getFull_name().equals(getRepository().getFullName()); + } + else { + // PR was done from a deleted fork + return true; + } + } + +} diff --git a/app/src/main/java/org/mian/gitnex/helpers/contexts/RepositoryContext.java b/app/src/main/java/org/mian/gitnex/helpers/contexts/RepositoryContext.java new file mode 100644 index 00000000..322ee89e --- /dev/null +++ b/app/src/main/java/org/mian/gitnex/helpers/contexts/RepositoryContext.java @@ -0,0 +1,233 @@ +package org.mian.gitnex.helpers.contexts; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import androidx.annotation.NonNull; +import org.gitnex.tea4j.models.UserRepositories; +import org.mian.gitnex.activities.BaseActivity; +import org.mian.gitnex.database.api.BaseApi; +import org.mian.gitnex.database.api.RepositoriesApi; +import org.mian.gitnex.database.models.Repository; +import org.mian.gitnex.helpers.AppUtil; +import org.mian.gitnex.helpers.TinyDB; +import java.io.Serializable; +import java.util.Objects; + +public class RepositoryContext implements Serializable { + + public static final String INTENT_EXTRA = "repository"; + + public static RepositoryContext fromIntent(Intent intent) { + return (RepositoryContext) intent.getSerializableExtra(INTENT_EXTRA); + } + + public static RepositoryContext fromBundle(Bundle bundle) { + return (RepositoryContext) bundle.getSerializable(INTENT_EXTRA); + } + + public enum State { + OPEN, + CLOSED; + + + @NonNull + @Override + public String toString() { + if(this == OPEN) { + return "open"; + } + return "closed"; + } + } + + private final AccountContext account; + private UserRepositories repository; + private final String owner; + private final String name; + + private State issueState = State.OPEN; + private State prState = State.OPEN; + private State milestoneState = State.OPEN; + private boolean releasesViewTypeIsTag = false; + + private String branchRef; + private String issueMilestoneFilterName; + + private boolean starred = false; + private boolean watched = false; + + private int repositoryId = 0; + private Repository repositoryModel = null; + + public RepositoryContext(UserRepositories repository, Context context) { + this.account = ((BaseActivity) context).getAccount(); + this.repository = repository; + this.name = repository.getName(); + this.owner = repository.getFullName().split("/")[0]; + } + + public RepositoryContext(String owner, String name, Context context) { + this.account = ((BaseActivity) context).getAccount(); + this.owner = owner; + this.name = name; + } + + public State getIssueState() { + + return issueState; + } + + public State getMilestoneState() { + + return milestoneState; + } + + public State getPrState() { + + return prState; + } + + public UserRepositories getRepository() { + + return repository; + } + + public void setIssueState(State issueState) { + + this.issueState = issueState; + } + + public void setMilestoneState(State milestoneState) { + + this.milestoneState = milestoneState; + } + + public void setPrState(State prState) { + + this.prState = prState; + } + + public String getBranchRef() { + + return branchRef; + } + + public void setBranchRef(String branchRef) { + + this.branchRef = branchRef; + } + + public Intent getIntent(Context context, Class clazz) { + Intent intent = new Intent(context, clazz); + intent.putExtra(INTENT_EXTRA, this); + return intent; + } + + public Bundle getBundle() { + Bundle bundle = new Bundle(); + bundle.putSerializable(INTENT_EXTRA, this); + return bundle; + } + + public String getIssueMilestoneFilterName() { + + return issueMilestoneFilterName; + } + + public void setIssueMilestoneFilterName(String issueMilestoneFilterName) { + + this.issueMilestoneFilterName = issueMilestoneFilterName; + } + + public String getOwner() { + return owner; + } + + public String getFullName() { + return owner + "/" + name; + } + + public String getName() { + return name; + } + + public UserRepositories.permissionsObject getPermissions() { + return repository != null ? repository.getPermissions() : new UserRepositories.permissionsObject(); + } + + public void setRepository(UserRepositories repository) { + this.repository = repository; + if(!repository.getFullName().equals(getFullName())) { + throw new IllegalArgumentException("repo does not match owner and name"); + } + } + + public boolean hasRepository() { + return repository != null; + } + + public boolean isStarred() { + + return starred; + } + + public boolean isWatched() { + + return watched; + } + + public void setStarred(boolean starred) { + + this.starred = starred; + } + + public void setWatched(boolean watched) { + + this.watched = watched; + } + + public int getRepositoryId() { + + return repositoryId; + } + + public void setRepositoryId(int repositoryId) { + + this.repositoryId = repositoryId; + } + + public Repository getRepositoryModel() { + + return repositoryModel; + } + + public void setRepositoryModel(Repository repositoryModel) { + + this.repositoryModel = repositoryModel; + } + + public Repository loadRepositoryModel(Context context) { + repositoryModel = Objects.requireNonNull(BaseApi.getInstance(context, RepositoriesApi.class)).fetchRepositoryById(repositoryId); + return repositoryModel; + } + + public void checkAccountSwitch(Context context) { + if(((BaseActivity) context).getAccount().getAccount().getAccountId() != account.getAccount().getAccountId() && + account.getAccount().getAccountId() == TinyDB.getInstance(context).getInt("currentActiveAccountId")) { + // user changed account using a deep link or a submodule + AppUtil.switchToAccount(context, account.getAccount()); + } + } + + public boolean isReleasesViewTypeIsTag() { + + return releasesViewTypeIsTag; + } + + public void setReleasesViewTypeIsTag(boolean releasesViewTypeIsTag) { + + this.releasesViewTypeIsTag = releasesViewTypeIsTag; + } + +} diff --git a/app/src/main/java/org/mian/gitnex/helpers/views/SyntaxHighlightedArea.java b/app/src/main/java/org/mian/gitnex/helpers/views/SyntaxHighlightedArea.java index bab73022..3311df6a 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/views/SyntaxHighlightedArea.java +++ b/app/src/main/java/org/mian/gitnex/helpers/views/SyntaxHighlightedArea.java @@ -16,6 +16,7 @@ import android.widget.TextView; import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import org.mian.gitnex.R; import org.mian.gitnex.core.MainGrammarLocator; import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.TinyDB; @@ -53,7 +54,7 @@ public class SyntaxHighlightedArea extends LinearLayout { public void setup() { - prism4jTheme = TinyDB.getInstance(getContext()).getString("currentTheme").equals("dark") ? + prism4jTheme = AppUtil.getColorFromAttribute(getContext(), R.attr.isDark) == 1 ? Prism4jThemeDarkula.create() : Prism4jThemeDefault.create(); diff --git a/app/src/main/java/org/mian/gitnex/notifications/NotificationsWorker.java b/app/src/main/java/org/mian/gitnex/notifications/NotificationsWorker.java index f80a861e..01dd98dd 100644 --- a/app/src/main/java/org/mian/gitnex/notifications/NotificationsWorker.java +++ b/app/src/main/java/org/mian/gitnex/notifications/NotificationsWorker.java @@ -19,10 +19,10 @@ import org.mian.gitnex.database.api.BaseApi; import org.mian.gitnex.database.api.UserAccountsApi; import org.mian.gitnex.database.models.UserAccount; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Version; +import org.mian.gitnex.helpers.contexts.AccountContext; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -50,7 +50,7 @@ public class NotificationsWorker extends Worker { this.tinyDB = TinyDB.getInstance(context); this.userAccounts = new HashMap<>(userAccountsApi.getCount()); - for(UserAccount userAccount : userAccountsApi.usersAccounts()) { + for(UserAccount userAccount : userAccountsApi.loggedInUserAccounts()) { // We do also accept empty values, since the server version was not saved properly in the beginning. if(userAccount.getServerVersion() == null || userAccount.getServerVersion().isEmpty() || @@ -76,7 +76,7 @@ public class NotificationsWorker extends Worker { */ private void pollingLoops() { int notificationLoops = tinyDB.getInt("pollingDelayMinutes", Constants.defaultPollingDelay) < 15 ? - Math.min(15 - tinyDB.getInt("pollingDelayMinutes"), 10) : 1; + Math.min(15 - tinyDB.getInt("pollingDelayMinutes", Constants.defaultPollingDelay), 10) : 1; for(int i = 0; i < notificationLoops; i++) { long startPollingTime = System.currentTimeMillis(); @@ -96,9 +96,10 @@ public class NotificationsWorker extends Worker { Map userAccountParameters = userAccounts.get(userAccount); try { + assert userAccountParameters != null; Call> call = RetrofitClient .getApiInterface(context, userAccount.getInstanceUrl()) - .getNotificationThreads(Authorization.get(userAccount), false, new String[]{"unread"}, + .getNotificationThreads(new AccountContext(userAccount).getAuthorization(), false, new String[]{"unread"}, userAccountParameters.get("previousTimestamp"), null, 1, Integer.MAX_VALUE); Response> response = call.execute(); diff --git a/app/src/main/java/org/mian/gitnex/viewmodels/IssueCommentsViewModel.java b/app/src/main/java/org/mian/gitnex/viewmodels/IssueCommentsViewModel.java index 90a09e47..c0cd80f4 100644 --- a/app/src/main/java/org/mian/gitnex/viewmodels/IssueCommentsViewModel.java +++ b/app/src/main/java/org/mian/gitnex/viewmodels/IssueCommentsViewModel.java @@ -29,7 +29,11 @@ public class IssueCommentsViewModel extends ViewModel { return issueComments; } - public static void loadIssueComments(String token, String owner, String repo, int index, Context ctx) { + public static void loadIssueComments(String token, String owner, String repo, int index, Context ctx) { + loadIssueComments(token, owner, repo, index, ctx, null); + } + + public static void loadIssueComments(String token, String owner, String repo, int index, Context ctx, Runnable onLoadingFinished) { Call> call = RetrofitClient .getApiInterface(ctx) @@ -43,6 +47,9 @@ public class IssueCommentsViewModel extends ViewModel { if(response.isSuccessful()) { issueComments.postValue(response.body()); + if(onLoadingFinished != null) { + onLoadingFinished.run(); + } } else { diff --git a/app/src/main/java/org/mian/gitnex/viewmodels/ReleasesViewModel.java b/app/src/main/java/org/mian/gitnex/viewmodels/ReleasesViewModel.java index 5dbbbfff..4bd002da 100644 --- a/app/src/main/java/org/mian/gitnex/viewmodels/ReleasesViewModel.java +++ b/app/src/main/java/org/mian/gitnex/viewmodels/ReleasesViewModel.java @@ -8,12 +8,11 @@ import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; import org.gitnex.tea4j.models.GitTag; import org.gitnex.tea4j.models.Releases; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.adapters.ReleasesAdapter; import org.mian.gitnex.adapters.TagsAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.helpers.Constants; -import org.mian.gitnex.helpers.TinyDB; -import org.mian.gitnex.helpers.Version; import java.util.List; import retrofit2.Call; import retrofit2.Callback; @@ -33,7 +32,7 @@ public class ReleasesViewModel extends ViewModel { releasesList = new MutableLiveData<>(); // if gitea is 1.12 or higher use the new limit - if(new Version(TinyDB.getInstance(ctx).getString("giteaVersion")).higherOrEqual("1.12.0")) { + if(((BaseActivity) ctx).getAccount().requiresVersion("1.12.0")) { resultLimit = Constants.resultLimitNewGiteaInstances; } @@ -111,7 +110,7 @@ public class ReleasesViewModel extends ViewModel { tagsList = new MutableLiveData<>(); // if gitea is 1.12 or higher use the new limit - if(new Version(TinyDB.getInstance(ctx).getString("giteaVersion")).higherOrEqual("1.12.0")) { + if(((BaseActivity) ctx).getAccount().requiresVersion("1.12.0")) { resultLimit = Constants.resultLimitNewGiteaInstances; } diff --git a/app/src/main/java/org/mian/gitnex/views/ReactionList.java b/app/src/main/java/org/mian/gitnex/views/ReactionList.java index f06eeb0a..46610f9d 100644 --- a/app/src/main/java/org/mian/gitnex/views/ReactionList.java +++ b/app/src/main/java/org/mian/gitnex/views/ReactionList.java @@ -20,10 +20,9 @@ import org.gitnex.tea4j.models.IssueReaction; import org.gitnex.tea4j.models.UserInfo; import org.mian.gitnex.R; import org.mian.gitnex.adapters.ReactionAuthorsAdapter; +import org.mian.gitnex.activities.BaseActivity; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -58,9 +57,7 @@ public class ReactionList extends HorizontalScrollView { addView(root); setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); - TinyDB tinyDB = TinyDB.getInstance(context); - - String loginUid = tinyDB.getString("loginUid"); + String loginUid = ((BaseActivity) context).getAccount().getAccount().getUserName(); String repoOwner = bundle.getString("repoOwner"); String repoName = bundle.getString("repoName"); @@ -87,14 +84,14 @@ public class ReactionList extends HorizontalScrollView { case ISSUE: response = RetrofitClient .getApiInterface(context) - .getIssueReactions(Authorization.get(context), repoOwner, repoName, id) + .getIssueReactions(((BaseActivity) context).getAccount().getAuthorization(), repoOwner, repoName, id) .execute(); break; case COMMENT: response = RetrofitClient .getApiInterface(context) - .getIssueCommentReactions(Authorization.get(context), repoOwner, repoName, id) + .getIssueCommentReactions(((BaseActivity) context).getAccount().getAuthorization(), repoOwner, repoName, id) .execute(); break; } diff --git a/app/src/main/java/org/mian/gitnex/views/ReactionSpinner.java b/app/src/main/java/org/mian/gitnex/views/ReactionSpinner.java index 4077e4e3..d56b42ef 100644 --- a/app/src/main/java/org/mian/gitnex/views/ReactionSpinner.java +++ b/app/src/main/java/org/mian/gitnex/views/ReactionSpinner.java @@ -16,10 +16,10 @@ import com.vdurmont.emoji.EmojiManager; import org.gitnex.tea4j.models.IssueReaction; import org.gitnex.tea4j.models.UISettings; import org.mian.gitnex.R; +import org.mian.gitnex.activities.BaseActivity; +import org.mian.gitnex.activities.IssueDetailActivity; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.helpers.AppUtil; -import org.mian.gitnex.helpers.Authorization; -import org.mian.gitnex.helpers.TinyDB; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -56,9 +56,7 @@ public class ReactionSpinner extends HorizontalScrollView { root.setGravity(Gravity.START); root.setLayoutParams(layoutParams); - TinyDB tinyDB = TinyDB.getInstance(context); - - String loginUid = tinyDB.getString("loginUid"); + String loginUid = ((BaseActivity) context).getAccount().getAccount().getUserName(); String repoOwner = bundle.getString("repoOwner"); String repoName = bundle.getString("repoName"); @@ -105,7 +103,11 @@ public class ReactionSpinner extends HorizontalScrollView { try { if(react(repoOwner, repoName, reactionType, reactionAction, new IssueReaction(allowedReaction), id)) { - v.post(() -> onInteractedListener.run()); + v.post(() -> { + ((IssueDetailActivity) context).singleIssueUpdate = reactionType == ReactionType.ISSUE; + ((IssueDetailActivity) context).commentEdited = reactionType == ReactionType.COMMENT; + onInteractedListener.run(); + }); } } catch(IOException ignored) {} @@ -147,7 +149,7 @@ public class ReactionSpinner extends HorizontalScrollView { case ADD: response = RetrofitClient .getApiInterface(getContext()) - .setIssueReaction(Authorization.get(getContext()), repoOwner, repoName, id, issueReaction) + .setIssueReaction(((BaseActivity) getContext()).getAccount().getAuthorization(), repoOwner, repoName, id, issueReaction) .execute(); break; @@ -155,7 +157,7 @@ public class ReactionSpinner extends HorizontalScrollView { case REMOVE: response = RetrofitClient .getApiInterface(getContext()) - .removeIssueReaction(Authorization.get(getContext()), repoOwner, repoName, id, issueReaction) + .removeIssueReaction((((BaseActivity) getContext()).getAccount().getAuthorization()), repoOwner, repoName, id, issueReaction) .execute(); break; @@ -168,7 +170,7 @@ public class ReactionSpinner extends HorizontalScrollView { case ADD: response = RetrofitClient .getApiInterface(getContext()) - .setIssueCommentReaction(Authorization.get(getContext()), repoOwner, repoName, id, issueReaction) + .setIssueCommentReaction(((BaseActivity) getContext()).getAccount().getAuthorization(), repoOwner, repoName, id, issueReaction) .execute(); break; @@ -176,7 +178,7 @@ public class ReactionSpinner extends HorizontalScrollView { case REMOVE: response = RetrofitClient .getApiInterface(getContext()) - .removeIssueCommentReaction(Authorization.get(getContext()), repoOwner, repoName, id, issueReaction) + .removeIssueCommentReaction(((BaseActivity) getContext()).getAccount().getAuthorization(), repoOwner, repoName, id, issueReaction) .execute(); break; @@ -198,14 +200,14 @@ public class ReactionSpinner extends HorizontalScrollView { case ISSUE: response = RetrofitClient .getApiInterface(getContext()) - .getIssueReactions(Authorization.get(getContext()), repoOwner, repoName, id) + .getIssueReactions(((BaseActivity) getContext()).getAccount().getAuthorization(), repoOwner, repoName, id) .execute(); break; case COMMENT: response = RetrofitClient .getApiInterface(getContext()) - .getIssueCommentReactions(Authorization.get(getContext()), repoOwner, repoName, id) + .getIssueCommentReactions((((BaseActivity) getContext()).getAccount().getAuthorization()), repoOwner, repoName, id) .execute(); break; @@ -225,7 +227,7 @@ public class ReactionSpinner extends HorizontalScrollView { Response response = RetrofitClient .getApiInterface(getContext()) - .getUISettings(Authorization.get(getContext())) + .getUISettings(((BaseActivity) getContext()).getAccount().getAuthorization()) .execute(); if(response.isSuccessful() && response.body() != null) { diff --git a/app/src/main/res/layout/activity_issue_detail.xml b/app/src/main/res/layout/activity_issue_detail.xml index 153598f8..c82cbc6c 100644 --- a/app/src/main/res/layout/activity_issue_detail.xml +++ b/app/src/main/res/layout/activity_issue_detail.xml @@ -52,19 +52,19 @@ style="@style/Widget.MaterialComponents.LinearProgressIndicator" app:indicatorColor="?attr/progressIndicatorColor" /> - + + + diff --git a/app/src/main/res/layout/fragment_profile.xml b/app/src/main/res/layout/fragment_profile.xml index 40c5b5a8..75e37d69 100644 --- a/app/src/main/res/layout/fragment_profile.xml +++ b/app/src/main/res/layout/fragment_profile.xml @@ -8,6 +8,13 @@ android:background="?attr/primaryBackgroundColor" android:orientation="vertical"> + + - + - - diff --git a/app/src/main/res/menu/drawer_menu.xml b/app/src/main/res/menu/drawer_menu.xml index d0b66fd3..f5ca2453 100644 --- a/app/src/main/res/menu/drawer_menu.xml +++ b/app/src/main/res/menu/drawer_menu.xml @@ -27,8 +27,7 @@ android:id="@+id/nav_notifications" android:icon="@drawable/ic_notifications" android:title="@string/pageTitleNotifications" - app:actionLayout="@layout/badge_notification" - android:visible="false" /> + app:actionLayout="@layout/badge_notification" /> @color/lightThemeInputBackground @style/inputsMaterialComponentCorner @style/WindowAnimationTransition + 0 @@ -81,6 +82,7 @@ @color/retroThemeInputBackground @style/inputsMaterialComponentCorner @style/WindowAnimationTransition + 0 diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 9817fbe9..fe4c89eb 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -16,4 +16,5 @@ + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 69d1f5d8..9a98aecc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -118,7 +118,7 @@ 98324 Remove - Instance has returned an error. Code\u0020 + Instance has returned an error. Code %d Details Files Milestones @@ -285,7 +285,7 @@ Authorization Error It seems that the Access Token is revoked OR your are not allowed to see these contents.\n\nIn case of revoked Token, please logout and login again - Delete %s + Delete %s Do you really want to delete this label? @@ -766,4 +766,6 @@ Tag deleted Use Custom Tabs No application found to open this link. SSH URLs and URLs with another prefix the http:// or https:// are not supported by most browser + Log in again + %s \u25CF not logged in diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 96d33d6a..24125fc4 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -40,6 +40,7 @@ @style/inputsMaterialComponentCorner @style/WindowAnimationTransition @drawable/shape_list_divider + 1 @@ -81,6 +82,7 @@ @color/lightThemeInputBackground @style/inputsMaterialComponentCorner @style/WindowAnimationTransition + 0 @@ -122,6 +124,7 @@ @color/retroThemeInputBackground @style/inputsMaterialComponentCorner @style/WindowAnimationTransition + 0 @@ -163,6 +166,7 @@ @color/inputBackground @style/inputsMaterialComponentCorner @style/WindowAnimationTransition + 1