Use Gradle-native formatter (#1208)

Run `gradle :app:spotlessApply` to apply formatting.

# Changes from current code format

This does not match with the old intellij based code format because I can't apply some rules there.
- newlines after `else`, `catch` etc. (means there are `} else {` statements)
- no spaces around `if` braces (there are statements like `if (true) {` instead of `if(true) {`

Closes https://codeberg.org/gitnex/GitNex/issues/1187
Closes https://codeberg.org/gitnex/GitNex/issues/1202

Co-authored-by: qwerty287 <ndev@web.de>
Co-authored-by: 6543 <6543@obermui.de>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/1208
Reviewed-by: 6543 <6543@obermui.de>
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-authored-by: qwerty287 <qwerty287@noreply.codeberg.org>
Co-committed-by: qwerty287 <qwerty287@noreply.codeberg.org>
This commit is contained in:
qwerty287 2022-09-21 07:43:00 +02:00 committed by M M Arif
parent 3c65e95db3
commit 325560c08d
254 changed files with 20604 additions and 14474 deletions

View File

@ -31,17 +31,17 @@
<option name="BLANK_LINES_AROUND_FIELD_IN_INTERFACE" value="1"/>
<option name="BLANK_LINES_AFTER_CLASS_HEADER" value="1"/>
<option name="BLANK_LINES_BEFORE_CLASS_END" value="1"/>
<option name="ELSE_ON_NEW_LINE" value="true"/>
<option name="CATCH_ON_NEW_LINE" value="true"/>
<option name="FINALLY_ON_NEW_LINE" value="true"/>
<option name="ELSE_ON_NEW_LINE" value="false"/>
<option name="CATCH_ON_NEW_LINE" value="false"/>
<option name="FINALLY_ON_NEW_LINE" value="false"/>
<option name="ALIGN_MULTILINE_PARAMETERS" value="false"/>
<option name="SPACE_BEFORE_IF_PARENTHESES" value="false"/>
<option name="SPACE_BEFORE_WHILE_PARENTHESES" value="false"/>
<option name="SPACE_BEFORE_FOR_PARENTHESES" value="false"/>
<option name="SPACE_BEFORE_TRY_PARENTHESES" value="false"/>
<option name="SPACE_BEFORE_CATCH_PARENTHESES" value="false"/>
<option name="SPACE_BEFORE_SWITCH_PARENTHESES" value="false"/>
<option name="SPACE_BEFORE_SYNCHRONIZED_PARENTHESES" value="false"/>
<option name="SPACE_BEFORE_IF_PARENTHESES" value="true"/>
<option name="SPACE_BEFORE_WHILE_PARENTHESES" value="true"/>
<option name="SPACE_BEFORE_FOR_PARENTHESES" value="true"/>
<option name="SPACE_BEFORE_TRY_PARENTHESES" value="true"/>
<option name="SPACE_BEFORE_CATCH_PARENTHESES" value="true"/>
<option name="SPACE_BEFORE_SWITCH_PARENTHESES" value="true"/>
<option name="SPACE_BEFORE_SYNCHRONIZED_PARENTHESES" value="true"/>
<option name="CALL_PARAMETERS_WRAP" value="1"/>
<option name="METHOD_PARAMETERS_WRAP" value="1"/>
<option name="THROWS_LIST_WRAP" value="1"/>

View File

@ -7,12 +7,11 @@ pipeline:
regex: " \\\\* \\\\@author [\\\\S\\\\s]+"
must_contain: true
#style:
#image: qwerty287/woodpecker-intellij-formatter
#group: check
# settings:
#file_pattern: "*.java"
#path: "app/"
style:
image: alvrme/alpine-android:android-31-jdk11
group: check
commands:
- ./gradlew :app:spotlessCheck
test:
image: alvrme/alpine-android:android-31-jdk11

View File

@ -1,3 +1,6 @@
plugins {
id "com.diffplug.spotless" version "6.11.0"
}
apply plugin: 'com.android.application'
android {
@ -118,3 +121,18 @@ dependencies {
}
implementation 'io.github.amrdeveloper:codeview:1.3.5'
}
spotless {
java {
target 'src/**/*.java'
importOrder('android', 'androidx', 'com', 'junit', 'net', 'org', 'java', 'javax', '', '\\#')
removeUnusedImports()
googleJavaFormat().aosp()
indentWithTabs()
formatAnnotations()
}
}

View File

@ -18,5 +18,4 @@ public class MainActivityTest {
ActivityScenario<MainActivity> a = ActivityScenario.launch(MainActivity.class);
a.close();
}
}

View File

@ -1,5 +1,7 @@
package org.main.gitnex.helpers;
import static org.junit.Assert.*;
import android.content.Context;
import android.net.Uri;
import android.view.View;
@ -8,7 +10,6 @@ import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mian.gitnex.helpers.AppUtil;
import static org.junit.Assert.*;
/**
* @author qwerty287
@ -91,22 +92,43 @@ public class AppUtilTest {
@Test
public void getUriFromGitUrlTest() {
assertEquals("https://git@codeberg.org/gitnex/GitNex", AppUtil.getUriFromGitUrl("ssh://git@codeberg.org:gitnex/GitNex").toString());
assertEquals("https://codeberg.org/gitnex/GitNex", AppUtil.getUriFromGitUrl("codeberg.org:gitnex/GitNex").toString());
assertEquals("ssh://git@codeberg.org/gitnex/GitNex", AppUtil.getUriFromGitUrl("ssh://git@codeberg.org/gitnex/GitNex").toString());
assertEquals("https://git@codeberg.org/gitnex/GitNex.git", AppUtil.getUriFromGitUrl("ssh://git@codeberg.org:gitnex/GitNex.git").toString());
assertEquals("https://codeberg.org/gitnex/GitNex.git", AppUtil.getUriFromGitUrl("codeberg.org:gitnex/GitNex.git").toString());
assertEquals("https://codeberg.org/gitnex/GitNex.git", AppUtil.getUriFromGitUrl("https://codeberg.org/gitnex/GitNex.git").toString());
assertEquals("https://gitnex.com", AppUtil.getUriFromGitUrl("https://gitnex.com").toString());
assertEquals("https://gitnex.com:3000", AppUtil.getUriFromGitUrl("https://gitnex.com:3000").toString());
assertEquals(
"https://git@codeberg.org/gitnex/GitNex",
AppUtil.getUriFromGitUrl("ssh://git@codeberg.org:gitnex/GitNex").toString());
assertEquals(
"https://codeberg.org/gitnex/GitNex",
AppUtil.getUriFromGitUrl("codeberg.org:gitnex/GitNex").toString());
assertEquals(
"ssh://git@codeberg.org/gitnex/GitNex",
AppUtil.getUriFromGitUrl("ssh://git@codeberg.org/gitnex/GitNex").toString());
assertEquals(
"https://git@codeberg.org/gitnex/GitNex.git",
AppUtil.getUriFromGitUrl("ssh://git@codeberg.org:gitnex/GitNex.git").toString());
assertEquals(
"https://codeberg.org/gitnex/GitNex.git",
AppUtil.getUriFromGitUrl("codeberg.org:gitnex/GitNex.git").toString());
assertEquals(
"https://codeberg.org/gitnex/GitNex.git",
AppUtil.getUriFromGitUrl("https://codeberg.org/gitnex/GitNex.git").toString());
assertEquals(
"https://gitnex.com", AppUtil.getUriFromGitUrl("https://gitnex.com").toString());
assertEquals(
"https://gitnex.com:3000",
AppUtil.getUriFromGitUrl("https://gitnex.com:3000").toString());
}
@Test
public void changeSchemeTest() {
assertEquals("https://codeberg.org/gitnex/GitNex", AppUtil.changeScheme(Uri.parse("ssh://codeberg.org/gitnex/GitNex"), "https").toString());
assertEquals("https://gitnex.com", AppUtil.changeScheme(Uri.parse("http://gitnex.com"), "https").toString());
assertEquals("ssh://codeberg.org/gitnex/GitNex", AppUtil.changeScheme(Uri.parse("http://codeberg.org/gitnex/GitNex"), "ssh").toString());
assertEquals(
"https://codeberg.org/gitnex/GitNex",
AppUtil.changeScheme(Uri.parse("ssh://codeberg.org/gitnex/GitNex"), "https")
.toString());
assertEquals(
"https://gitnex.com",
AppUtil.changeScheme(Uri.parse("http://gitnex.com"), "https").toString());
assertEquals(
"ssh://codeberg.org/gitnex/GitNex",
AppUtil.changeScheme(Uri.parse("http://codeberg.org/gitnex/GitNex"), "ssh")
.toString());
}
}

View File

@ -45,5 +45,4 @@ public class ToastyTest {
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
Toasty.success(context, "GitNex success test");
}
}

View File

@ -11,7 +11,6 @@ import java.util.concurrent.TimeUnit;
/**
* @author opyale
*/
public class ActionResult<R> {
private final BlockingQueue<Boolean> blockingQueue;
@ -22,7 +21,6 @@ public class ActionResult<R> {
blockingQueue = new ArrayBlockingQueue<>(1);
onFinishedListeners = new ArrayList<>();
}
public void finish(@NonNull Status status) {
@ -33,54 +31,48 @@ public class ActionResult<R> {
public void finish(@NonNull Status status, R result) {
try {
if(blockingQueue.poll(5, TimeUnit.SECONDS)) {
if (blockingQueue.poll(5, TimeUnit.SECONDS)) {
for(OnFinishedListener<R> onFinishedListener : onFinishedListeners)
for (OnFinishedListener<R> onFinishedListener : onFinishedListeners)
onFinishedListener.onFinished(status, result);
}
} catch (InterruptedException ignored) {
}
catch(InterruptedException ignored) {
}
}
public void invalidate() {
if(invalidated) {
if (invalidated) {
throw new IllegalStateException("Already invalidated");
}
this.invalidated = true;
}
@SafeVarargs
public synchronized final void accept(@NonNull OnFinishedListener<R>... onFinishedListeners) {
public final synchronized void accept(@NonNull OnFinishedListener<R>... onFinishedListeners) {
invalidate();
this.blockingQueue.add(true);
this.onFinishedListeners.addAll(Arrays.asList(onFinishedListeners));
}
public synchronized final void discard() {
public final synchronized void discard() {
invalidate();
this.blockingQueue.add(false);
}
public enum Status {SUCCESS, FAILED}
public enum Status {
SUCCESS,
FAILED
}
public interface OnFinishedListener<R> {
void onFinished(Status status, R result);
}
public static class None {
}
public static class None {}
}

View File

@ -5,6 +5,7 @@ import android.view.View;
import android.widget.ProgressBar;
import androidx.annotation.NonNull;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.List;
import org.gitnex.tea4j.v2.models.Issue;
import org.gitnex.tea4j.v2.models.User;
import org.mian.gitnex.R;
@ -12,42 +13,55 @@ import org.mian.gitnex.adapters.AssigneesListAdapter;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.CustomAssigneesSelectionDialogBinding;
import org.mian.gitnex.helpers.Toasty;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
/**
* @author M M Arif
*/
public class AssigneesActions {
public static void getCurrentIssueAssignees(Context ctx, String repoOwner, String repoName, int issueIndex, List<String> currentAssignees) {
public static void getCurrentIssueAssignees(
Context ctx,
String repoOwner,
String repoName,
int issueIndex,
List<String> currentAssignees) {
Call<Issue> callSingleIssueLabels = RetrofitClient.getApiInterface(ctx).issueGetIssue(repoOwner, repoName, (long) issueIndex);
Call<Issue> callSingleIssueLabels =
RetrofitClient.getApiInterface(ctx)
.issueGetIssue(repoOwner, repoName, (long) issueIndex);
callSingleIssueLabels.enqueue(new Callback<>() {
callSingleIssueLabels.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Issue> call, @NonNull retrofit2.Response<Issue> response) {
public void onResponse(
@NonNull Call<Issue> call,
@NonNull retrofit2.Response<Issue> response) {
if(response.code() == 200) {
if (response.code() == 200) {
Issue issueAssigneesList = response.body();
assert issueAssigneesList != null;
if(issueAssigneesList.getAssignees() != null) {
if (issueAssigneesList.getAssignees() != null) {
if(issueAssigneesList.getAssignees().size() > 0) {
if (issueAssigneesList.getAssignees().size() > 0) {
for(int i = 0; i < issueAssigneesList.getAssignees().size(); i++) {
for (int i = 0;
i < issueAssigneesList.getAssignees().size();
i++) {
currentAssignees.add(issueAssigneesList.getAssignees().get(i).getLogin());
currentAssignees.add(
issueAssigneesList
.getAssignees()
.get(i)
.getLogin());
}
}
}
}
else {
} else {
Toasty.error(ctx, ctx.getResources().getString(R.string.genericError));
}
@ -56,46 +70,59 @@ public class AssigneesActions {
@Override
public void onFailure(@NonNull Call<Issue> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getResources().getString(R.string.genericServerResponseError));
Toasty.error(
ctx,
ctx.getResources().getString(R.string.genericServerResponseError));
}
});
}
public static void getRepositoryAssignees(Context ctx, String repoOwner, String repoName, List<User> assigneesList, MaterialAlertDialogBuilder materialAlertDialogBuilder, AssigneesListAdapter assigneesAdapter,
CustomAssigneesSelectionDialogBinding assigneesBinding, ProgressBar progressBar) {
public static void getRepositoryAssignees(
Context ctx,
String repoOwner,
String repoName,
List<User> assigneesList,
MaterialAlertDialogBuilder materialAlertDialogBuilder,
AssigneesListAdapter assigneesAdapter,
CustomAssigneesSelectionDialogBinding assigneesBinding,
ProgressBar progressBar) {
Call<List<User>> call = RetrofitClient.getApiInterface(ctx).repoGetAssignees(repoOwner, repoName);
Call<List<User>> call =
RetrofitClient.getApiInterface(ctx).repoGetAssignees(repoOwner, repoName);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<User>> call, @NonNull retrofit2.Response<List<User>> response) {
public void onResponse(
@NonNull Call<List<User>> call,
@NonNull retrofit2.Response<List<User>> response) {
assigneesList.clear();
List<User> assigneesList_ = response.body();
if(response.code() == 200) {
if (response.code() == 200) {
assert assigneesList_ != null;
if(assigneesList_.size() > 0) {
if (assigneesList_.size() > 0) {
assigneesList.addAll(assigneesList_);
materialAlertDialogBuilder.show();
}
else {
} else {
Toasty.warning(ctx, ctx.getResources().getString(R.string.noAssigneesFound));
Toasty.warning(
ctx,
ctx.getResources().getString(R.string.noAssigneesFound));
}
assigneesBinding.assigneesRecyclerView.setAdapter(assigneesAdapter);
}
else {
} else {
Toasty.error(ctx, ctx.getResources().getString(R.string.genericError));
}
if(progressBar != null) {
if (progressBar != null) {
progressBar.setVisibility(View.GONE);
}
}
@ -103,12 +130,13 @@ public class AssigneesActions {
@Override
public void onFailure(@NonNull Call<List<User>> call, @NonNull Throwable t) {
if(progressBar != null) {
if (progressBar != null) {
progressBar.setVisibility(View.GONE);
}
Toasty.error(ctx, ctx.getResources().getString(R.string.genericServerResponseError));
Toasty.error(
ctx,
ctx.getResources().getString(R.string.genericServerResponseError));
}
});
}
}

View File

@ -16,39 +16,42 @@ import retrofit2.Callback;
/**
* @author M M Arif
*/
public class CollaboratorActions {
public static void deleteCollaborator(final Context context, String userName, RepositoryContext repository) {
public static void deleteCollaborator(
final Context context, String userName, RepositoryContext repository) {
Call<Void> call = RetrofitClient.getApiInterface(context).repoDeleteCollaborator(repository.getOwner(), repository.getName(), userName);
Call<Void> call =
RetrofitClient.getApiInterface(context)
.repoDeleteCollaborator(
repository.getOwner(), repository.getName(), userName);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
if(response.isSuccessful()) {
if(response.code() == 204) {
if (response.isSuccessful()) {
if (response.code() == 204) {
CollaboratorsFragment.refreshCollaborators = true;
Toasty.success(context, context.getString(R.string.removeCollaboratorToastText));
Toasty.success(
context,
context.getString(R.string.removeCollaboratorToastText));
((AddCollaboratorToRepositoryActivity) context).finish();
}
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
} else if (response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
}
else {
} else {
Toasty.error(context, context.getString(R.string.genericError));
}
@ -57,45 +60,57 @@ public class CollaboratorActions {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(context, context.getResources().getString(R.string.genericServerResponseError));
Toasty.error(
context,
context.getResources()
.getString(R.string.genericServerResponseError));
}
});
}
public static void addCollaborator(final Context context, String permission, String userName, RepositoryContext repository) {
public static void addCollaborator(
final Context context,
String permission,
String userName,
RepositoryContext repository) {
AddCollaboratorOption permissionString = new AddCollaboratorOption();
permissionString.setPermission(permission);
Call<Void> call = RetrofitClient.getApiInterface(context).repoAddCollaborator(repository.getOwner(), repository.getName(), userName, permissionString);
Call<Void> call =
RetrofitClient.getApiInterface(context)
.repoAddCollaborator(
repository.getOwner(),
repository.getName(),
userName,
permissionString);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
if(response.isSuccessful()) {
if(response.code() == 204) {
if (response.isSuccessful()) {
if (response.code() == 204) {
CollaboratorsFragment.refreshCollaborators = true;
Toasty.success(context, context.getString(R.string.addCollaboratorToastText));
Toasty.success(
context,
context.getString(R.string.addCollaboratorToastText));
((AddCollaboratorToRepositoryActivity) context).finish();
}
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
} else if (response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
}
else {
} else {
Toasty.error(context, context.getString(R.string.genericError));
}
@ -104,9 +119,11 @@ public class CollaboratorActions {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(context, context.getResources().getString(R.string.genericServerResponseError));
Toasty.error(
context,
context.getResources()
.getString(R.string.genericServerResponseError));
}
});
}
}

View File

@ -25,25 +25,33 @@ import retrofit2.Response;
/**
* @author M M Arif
*/
public class IssueActions {
public static ActionResult<Response<?>> edit(Context context, String comment, int commentId, IssueContext issue) {
public static ActionResult<Response<?>> edit(
Context context, String comment, int commentId, IssueContext issue) {
ActionResult<Response<?>> actionResult = new ActionResult<>();
EditIssueCommentOption commentObj = new EditIssueCommentOption();
commentObj.setBody(comment);
Call<Comment> call = RetrofitClient.getApiInterface(context).issueEditComment(issue.getRepository().getOwner(), issue.getRepository().getName(), (long) commentId, commentObj);
Call<Comment> call =
RetrofitClient.getApiInterface(context)
.issueEditComment(
issue.getRepository().getOwner(),
issue.getRepository().getName(),
(long) commentId,
commentObj);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Comment> call, @NonNull retrofit2.Response<Comment> response) {
switch(response.code()) {
public void onResponse(
@NonNull Call<Comment> call,
@NonNull retrofit2.Response<Comment> response) {
switch (response.code()) {
case 200:
actionResult.finish(ActionResult.Status.SUCCESS);
break;
@ -56,7 +64,6 @@ public class IssueActions {
default:
actionResult.finish(ActionResult.Status.FAILED, response);
break;
}
}
@ -70,61 +77,73 @@ public class IssueActions {
return actionResult;
}
public static void closeReopenIssue(final Context ctx, final String issueState, IssueContext issue) {
public static void closeReopenIssue(
final Context ctx, final String issueState, IssueContext issue) {
EditIssueOption issueStatJson = new EditIssueOption();
issueStatJson.setState(issueState);
Call<Issue> call = RetrofitClient.getApiInterface(ctx).issueEditIssue(issue.getRepository().getOwner(), issue.getRepository().getName(), (long) issue.getIssueIndex(), issueStatJson);
Call<Issue> call =
RetrofitClient.getApiInterface(ctx)
.issueEditIssue(
issue.getRepository().getOwner(),
issue.getRepository().getName(),
(long) issue.getIssueIndex(),
issueStatJson);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Issue> call, @NonNull retrofit2.Response<Issue> response) {
public void onResponse(
@NonNull Call<Issue> call,
@NonNull retrofit2.Response<Issue> response) {
if(response.isSuccessful()) {
if(response.code() == 201) {
if (response.isSuccessful()) {
if (response.code() == 201) {
if(issue.hasIssue()) {
IssuesFragment.resumeIssues = issue.getIssue().getPullRequest() == null;
PullRequestsFragment.resumePullRequests = issue.getIssue().getPullRequest() != null;
if (issue.hasIssue()) {
IssuesFragment.resumeIssues =
issue.getIssue().getPullRequest() == null;
PullRequestsFragment.resumePullRequests =
issue.getIssue().getPullRequest() != null;
}
if(issue.getIssueType().equalsIgnoreCase("Pull")) {
if(issueState.equals("closed")) {
if (issue.getIssueType().equalsIgnoreCase("Pull")) {
if (issueState.equals("closed")) {
Toasty.success(ctx, ctx.getString(R.string.prClosed));
}
else if(issueState.equals("open")) {
} else if (issueState.equals("open")) {
Toasty.success(ctx, ctx.getString(R.string.prReopened));
}
}
else {
if(issueState.equals("closed")) {
Toasty.success(ctx, ctx.getString(R.string.issueStateClosed));
}
else if(issueState.equals("open")) {
Toasty.success(ctx, ctx.getString(R.string.issueStateReopened));
} else {
if (issueState.equals("closed")) {
Toasty.success(
ctx, ctx.getString(R.string.issueStateClosed));
} else if (issueState.equals("open")) {
Toasty.success(
ctx, ctx.getString(R.string.issueStateReopened));
}
}
IssueDetailActivity.singleIssueUpdate = true;
((IssueDetailActivity) ctx).onResume();
if(((Activity) ctx).getIntent().getStringExtra("openedFromLink") == null || !((Activity) ctx).getIntent().getStringExtra("openedFromLink").equals("true")) {
if (((Activity) ctx).getIntent().getStringExtra("openedFromLink")
== null
|| !((Activity) ctx)
.getIntent()
.getStringExtra("openedFromLink")
.equals("true")) {
RepoDetailActivity.updateRepo = true;
}
}
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else if(response.code() == 403) {
} else if (response.code() == 403) {
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
}
else {
} else {
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
@ -133,40 +152,45 @@ public class IssueActions {
@Override
public void onFailure(@NonNull Call<Issue> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getResources().getString(R.string.genericServerResponseError));
Toasty.error(
ctx,
ctx.getResources().getString(R.string.genericServerResponseError));
}
});
}
public static void subscribe(final Context ctx, IssueContext issue) {
Call<Void> call;
call = RetrofitClient.getApiInterface(ctx)
.issueAddSubscription(issue.getRepository().getOwner(), issue.getRepository().getName(), (long) issue.getIssueIndex(), ((BaseActivity) ctx).getAccount().getAccount().getUserName());
call =
RetrofitClient.getApiInterface(ctx)
.issueAddSubscription(
issue.getRepository().getOwner(),
issue.getRepository().getName(),
(long) issue.getIssueIndex(),
((BaseActivity) ctx).getAccount().getAccount().getUserName());
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
if(response.code() == 201) {
if (response.code() == 201) {
Toasty.success(ctx, ctx.getString(R.string.subscribedSuccessfully));
}
else if(response.code() == 200) {
} else if (response.code() == 200) {
Toasty.success(ctx, ctx.getString(R.string.alreadySubscribed));
}
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
} else {
Toasty.error(ctx, ctx.getString(R.string.subscriptionError));
}
@ -175,7 +199,9 @@ public class IssueActions {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getResources().getString(R.string.genericServerResponseError));
Toasty.error(
ctx,
ctx.getResources().getString(R.string.genericServerResponseError));
}
});
}
@ -184,30 +210,35 @@ public class IssueActions {
Call<Void> call;
call = RetrofitClient.getApiInterface(ctx)
.issueDeleteSubscription(issue.getRepository().getOwner(), issue.getRepository().getName(), (long) issue.getIssueIndex(), ((BaseActivity) ctx).getAccount().getAccount().getUserName());
call =
RetrofitClient.getApiInterface(ctx)
.issueDeleteSubscription(
issue.getRepository().getOwner(),
issue.getRepository().getName(),
(long) issue.getIssueIndex(),
((BaseActivity) ctx).getAccount().getAccount().getUserName());
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
if(response.code() == 201) {
if (response.code() == 201) {
Toasty.success(ctx, ctx.getString(R.string.unsubscribedSuccessfully));
}
else if(response.code() == 200) {
Toasty.success(
ctx, ctx.getString(R.string.unsubscribedSuccessfully));
} else if (response.code() == 200) {
Toasty.success(ctx, ctx.getString(R.string.alreadyUnsubscribed));
}
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
} else {
Toasty.error(ctx, ctx.getString(R.string.unSubscriptionError));
}
@ -216,39 +247,51 @@ public class IssueActions {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getResources().getString(R.string.genericServerResponseError));
Toasty.error(
ctx,
ctx.getResources().getString(R.string.genericServerResponseError));
}
});
}
public static ActionResult<ActionResult.None> reply(Context context, String comment, IssueContext issue) {
public static ActionResult<ActionResult.None> reply(
Context context, String comment, IssueContext issue) {
ActionResult<ActionResult.None> actionResult = new ActionResult<>();
CreateIssueCommentOption issueComment = new CreateIssueCommentOption();
issueComment.setBody(comment);
Call<Comment> call = RetrofitClient.getApiInterface(context).issueCreateComment(issue.getRepository().getOwner(), issue.getRepository().getName(), (long) issue.getIssueIndex(), issueComment);
Call<Comment> call =
RetrofitClient.getApiInterface(context)
.issueCreateComment(
issue.getRepository().getOwner(),
issue.getRepository().getName(),
(long) issue.getIssueIndex(),
issueComment);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Comment> call, @NonNull retrofit2.Response<Comment> response) {
public void onResponse(
@NonNull Call<Comment> call,
@NonNull retrofit2.Response<Comment> response) {
if(response.code() == 201) {
if (response.code() == 201) {
actionResult.finish(ActionResult.Status.SUCCESS);
if(issue.hasIssue()) {
IssuesFragment.resumeIssues = issue.getIssue().getPullRequest() == null;
PullRequestsFragment.resumePullRequests = issue.getIssue().getPullRequest() != null;
if (issue.hasIssue()) {
IssuesFragment.resumeIssues =
issue.getIssue().getPullRequest() == null;
PullRequestsFragment.resumePullRequests =
issue.getIssue().getPullRequest() != null;
}
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else {
} else {
actionResult.finish(ActionResult.Status.FAILED);
}
@ -257,11 +300,13 @@ public class IssueActions {
@Override
public void onFailure(@NonNull Call<Comment> call, @NonNull Throwable t) {
Toasty.error(context, context.getResources().getString(R.string.genericServerResponseError));
Toasty.error(
context,
context.getResources()
.getString(R.string.genericServerResponseError));
}
});
return actionResult;
}
}

View File

@ -5,46 +5,55 @@ import android.view.View;
import android.widget.ProgressBar;
import androidx.annotation.NonNull;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.List;
import org.gitnex.tea4j.v2.models.Label;
import org.mian.gitnex.R;
import org.mian.gitnex.adapters.LabelsListAdapter;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.CustomLabelsSelectionDialogBinding;
import org.mian.gitnex.helpers.Toasty;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
/**
* @author M M Arif
*/
public class LabelsActions {
public static void getCurrentIssueLabels(Context ctx, String repoOwner, String repoName, int issueIndex, List<Integer> currentLabelsIds) {
public static void getCurrentIssueLabels(
Context ctx,
String repoOwner,
String repoName,
int issueIndex,
List<Integer> currentLabelsIds) {
Call<List<Label>> callSingleIssueLabels = RetrofitClient.getApiInterface(ctx).issueGetLabels(repoOwner, repoName, (long) issueIndex);
Call<List<Label>> callSingleIssueLabels =
RetrofitClient.getApiInterface(ctx)
.issueGetLabels(repoOwner, repoName, (long) issueIndex);
callSingleIssueLabels.enqueue(new Callback<>() {
callSingleIssueLabels.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<Label>> call, @NonNull retrofit2.Response<List<Label>> response) {
public void onResponse(
@NonNull Call<List<Label>> call,
@NonNull retrofit2.Response<List<Label>> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
List<Label> issueLabelsList = response.body();
assert issueLabelsList != null;
if(issueLabelsList.size() > 0) {
if (issueLabelsList.size() > 0) {
for(int i = 0; i < issueLabelsList.size(); i++) {
for (int i = 0; i < issueLabelsList.size(); i++) {
currentLabelsIds.add(Math.toIntExact(issueLabelsList.get(i).getId()));
currentLabelsIds.add(
Math.toIntExact(issueLabelsList.get(i).getId()));
}
}
}
else {
} else {
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
@ -57,59 +66,85 @@ public class LabelsActions {
});
}
public static void getRepositoryLabels(Context ctx, String repoOwner, String repoName, List<Label> labelsList, MaterialAlertDialogBuilder materialAlertDialogBuilder, LabelsListAdapter labelsAdapter,
CustomLabelsSelectionDialogBinding labelsBinding, ProgressBar progressBar) {
public static void getRepositoryLabels(
Context ctx,
String repoOwner,
String repoName,
List<Label> labelsList,
MaterialAlertDialogBuilder materialAlertDialogBuilder,
LabelsListAdapter labelsAdapter,
CustomLabelsSelectionDialogBinding labelsBinding,
ProgressBar progressBar) {
Call<List<Label>> call = RetrofitClient.getApiInterface(ctx).issueListLabels(repoOwner, repoName, null, null);
Call<List<Label>> call =
RetrofitClient.getApiInterface(ctx)
.issueListLabels(repoOwner, repoName, null, null);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<Label>> call, @NonNull retrofit2.Response<List<Label>> response) {
public void onResponse(
@NonNull Call<List<Label>> call,
@NonNull retrofit2.Response<List<Label>> response) {
labelsList.clear();
if(response.isSuccessful()) {
if (response.isSuccessful()) {
if(response.body() != null) {
if (response.body() != null) {
labelsList.addAll(response.body());
}
// Load organization labels
Call<List<Label>> callOrgLabels = RetrofitClient.getApiInterface(ctx).orgListLabels(repoOwner, null, null);
Call<List<Label>> callOrgLabels =
RetrofitClient.getApiInterface(ctx)
.orgListLabels(repoOwner, null, null);
callOrgLabels.enqueue(new Callback<>() {
callOrgLabels.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<Label>> call, @NonNull retrofit2.Response<List<Label>> responseOrg) {
public void onResponse(
@NonNull Call<List<Label>> call,
@NonNull retrofit2.Response<List<Label>>
responseOrg) {
if(responseOrg.body() != null) {
if (responseOrg.body() != null) {
labelsList.addAll(responseOrg.body());
materialAlertDialogBuilder.show();
}
if(labelsList.isEmpty()) {
if (labelsList.isEmpty()) {
Toasty.warning(ctx, ctx.getResources().getString(R.string.noDataFound));
Toasty.warning(
ctx,
ctx.getResources()
.getString(R.string.noDataFound));
}
labelsBinding.labelsRecyclerView.setAdapter(labelsAdapter);
labelsBinding.labelsRecyclerView.setAdapter(
labelsAdapter);
}
@Override
public void onFailure(@NonNull Call<List<Label>> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<List<Label>> call,
@NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
Toasty.error(
ctx,
ctx.getString(
R.string.genericServerResponseError));
}
});
}
else {
} else {
Toasty.error(ctx, ctx.getResources().getString(R.string.genericError));
}
if(progressBar != null) {
if (progressBar != null) {
progressBar.setVisibility(View.GONE);
}
}
@ -117,12 +152,13 @@ public class LabelsActions {
@Override
public void onFailure(@NonNull Call<List<Label>> call, @NonNull Throwable t) {
if(progressBar != null) {
if (progressBar != null) {
progressBar.setVisibility(View.GONE);
}
Toasty.error(ctx, ctx.getResources().getString(R.string.genericServerResponseError));
Toasty.error(
ctx,
ctx.getResources().getString(R.string.genericServerResponseError));
}
});
}
}

View File

@ -15,58 +15,60 @@ import retrofit2.Callback;
/**
* @author M M Arif
*/
public class MilestoneActions {
static final private String TAG = "MilestoneActions : ";
private static final String TAG = "MilestoneActions : ";
public static void closeMilestone(final Context ctx, int milestoneId_, RepositoryContext repository) {
public static void closeMilestone(
final Context ctx, int milestoneId_, RepositoryContext repository) {
updateMilestoneState(ctx, milestoneId_, repository, "closed");
}
public static void openMilestone(final Context ctx, int milestoneId_, RepositoryContext repository) {
public static void openMilestone(
final Context ctx, int milestoneId_, RepositoryContext repository) {
updateMilestoneState(ctx, milestoneId_, repository, "open");
}
private static void updateMilestoneState(final Context ctx, int milestoneId_, RepositoryContext repository, String state) {
private static void updateMilestoneState(
final Context ctx, int milestoneId_, RepositoryContext repository, String state) {
EditMilestoneOption milestoneStateJson = new EditMilestoneOption();
milestoneStateJson.setState(state);
Call<Milestone> call = RetrofitClient.getApiInterface(ctx).issueEditMilestone(repository.getOwner(), repository.getName(), String.valueOf(milestoneId_), milestoneStateJson);
Call<Milestone> call =
RetrofitClient.getApiInterface(ctx)
.issueEditMilestone(
repository.getOwner(),
repository.getName(),
String.valueOf(milestoneId_),
milestoneStateJson);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Milestone> call, @NonNull retrofit2.Response<Milestone> response) {
public void onResponse(
@NonNull Call<Milestone> call,
@NonNull retrofit2.Response<Milestone> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
Toasty.success(ctx, ctx.getString(R.string.milestoneStatusUpdate));
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
} else {
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Milestone> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
});
}
}

View File

@ -13,42 +13,49 @@ import retrofit2.Response;
/**
* @author qwerty287
*/
public class PullRequestActions {
public static void deleteHeadBranch(Context context, String repoOwner, String repoName, String headBranch, boolean showToasts) {
Call<Void> call = RetrofitClient.getApiInterface(context).repoDeleteBranch(repoOwner, repoName, headBranch);
public static void deleteHeadBranch(
Context context,
String repoOwner,
String repoName,
String headBranch,
boolean showToasts) {
Call<Void> call =
RetrofitClient.getApiInterface(context)
.repoDeleteBranch(repoOwner, repoName, headBranch);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
if(response.code() == 204) {
if (response.code() == 204) {
if(showToasts) {
Toasty.success(context, context.getString(R.string.deleteBranchSuccess));
if (showToasts) {
Toasty.success(
context, context.getString(R.string.deleteBranchSuccess));
}
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
} else if (response.code() == 403) {
if(showToasts) {
if (showToasts) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
if(showToasts) {
Toasty.warning(context, context.getString(R.string.deleteBranchErrorNotFound));
if (showToasts) {
Toasty.warning(
context,
context.getString(R.string.deleteBranchErrorNotFound));
}
}
else {
} else {
if(showToasts) {
if (showToasts) {
Toasty.error(context, context.getString(R.string.genericError));
}
}
@ -57,43 +64,47 @@ public class PullRequestActions {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
if(showToasts) {
if (showToasts) {
Toasty.error(context, context.getString(R.string.deleteBranchError));
}
}
});
}
public static void updatePr(Context context, String repoOwner, String repoName, String index, Boolean rebase) {
public static void updatePr(
Context context, String repoOwner, String repoName, String index, Boolean rebase) {
String strategy;
if(rebase == null) {
if (rebase == null) {
strategy = null;
}
else if(!rebase) {
} else if (!rebase) {
strategy = "merge";
}
else {
} else {
strategy = "rebase";
}
RetrofitClient.getApiInterface(context).repoUpdatePullRequest(repoOwner, repoName, Long.valueOf(index), strategy).enqueue(new Callback<>() {
RetrofitClient.getApiInterface(context)
.repoUpdatePullRequest(repoOwner, repoName, Long.valueOf(index), strategy)
.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) {
if(response.isSuccessful()) {
Toasty.success(context, context.getString(R.string.updatePrSuccess));
}
else {
if(response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 409) {
Toasty.error(context, context.getString(R.string.updatePrConflict));
}
else {
Toasty.error(context, context.getString(R.string.genericError));
if (response.isSuccessful()) {
Toasty.success(
context, context.getString(R.string.updatePrSuccess));
} else {
if (response.code() == 403) {
Toasty.error(
context,
context.getString(R.string.authorizeError));
} else if (response.code() == 409) {
Toasty.error(
context,
context.getString(R.string.updatePrConflict));
} else {
Toasty.error(
context, context.getString(R.string.genericError));
}
}
}
@ -105,5 +116,4 @@ public class PullRequestActions {
}
});
}
}

View File

@ -15,38 +15,38 @@ import retrofit2.Callback;
/**
* @author M M Arif
*/
public class RepositoryActions {
public static void starRepository(final Context context, RepositoryContext repository) {
Call<Void> call = RetrofitClient.getApiInterface(context).userCurrentPutStar(repository.getOwner(), repository.getName());
Call<Void> call =
RetrofitClient.getApiInterface(context)
.userCurrentPutStar(repository.getOwner(), repository.getName());
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
if(response.isSuccessful()) {
if(response.code() == 204) {
if (response.isSuccessful()) {
if (response.code() == 204) {
MainActivity.reloadRepos = true;
Toasty.success(context, context.getString(R.string.starRepositorySuccess));
Toasty.success(
context, context.getString(R.string.starRepositorySuccess));
}
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
} else if (response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
}
else {
} else {
Toasty.error(context, context.getString(R.string.genericError));
}
@ -55,40 +55,43 @@ public class RepositoryActions {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(context, context.getString(R.string.genericServerResponseError));
Toasty.error(
context, context.getString(R.string.genericServerResponseError));
}
});
}
public static void unStarRepository(final Context context, RepositoryContext repository) {
Call<Void> call = RetrofitClient.getApiInterface(context).userCurrentDeleteStar(repository.getOwner(), repository.getName());
Call<Void> call =
RetrofitClient.getApiInterface(context)
.userCurrentDeleteStar(repository.getOwner(), repository.getName());
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
if(response.isSuccessful()) {
if(response.code() == 204) {
if (response.isSuccessful()) {
if (response.code() == 204) {
MainActivity.reloadRepos = true;
Toasty.success(context, context.getString(R.string.unStarRepositorySuccess));
Toasty.success(
context,
context.getString(R.string.unStarRepositorySuccess));
}
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
} else if (response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
}
else {
} else {
Toasty.error(context, context.getString(R.string.genericError));
}
@ -97,80 +100,84 @@ public class RepositoryActions {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(context, context.getString(R.string.genericServerResponseError));
Toasty.error(
context, context.getString(R.string.genericServerResponseError));
}
});
}
public static void watchRepository(final Context context, RepositoryContext repository) {
Call<WatchInfo> call = RetrofitClient.getApiInterface(context).userCurrentPutSubscription(repository.getOwner(), repository.getName());
Call<WatchInfo> call =
RetrofitClient.getApiInterface(context)
.userCurrentPutSubscription(repository.getOwner(), repository.getName());
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<WatchInfo> call, @NonNull retrofit2.Response<WatchInfo> response) {
public void onResponse(
@NonNull Call<WatchInfo> call,
@NonNull retrofit2.Response<WatchInfo> response) {
if(response.isSuccessful()) {
if(response.code() == 200) {
Toasty.success(context, context.getString(R.string.watchRepositorySuccess));
if (response.isSuccessful()) {
if (response.code() == 200) {
Toasty.success(
context,
context.getString(R.string.watchRepositorySuccess));
}
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
} else if (response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
}
else {
} else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<WatchInfo> call, @NonNull Throwable t) {
Toasty.error(context, context.getString(R.string.genericServerResponseError));
Toasty.error(
context, context.getString(R.string.genericServerResponseError));
}
});
}
public static void unWatchRepository(final Context context, RepositoryContext repository) {
Call<Void> call = RetrofitClient.getApiInterface(context).userCurrentDeleteStar(repository.getOwner(), repository.getName());
Call<Void> call =
RetrofitClient.getApiInterface(context)
.userCurrentDeleteStar(repository.getOwner(), repository.getName());
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
if(response.code() == 204) {
if (response.code() == 204) {
Toasty.success(context, context.getString(R.string.unWatchRepositorySuccess));
}
else if(response.code() == 401) {
Toasty.success(
context, context.getString(R.string.unWatchRepositorySuccess));
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
} else if (response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
}
else {
} else {
Toasty.error(context, context.getString(R.string.genericError));
}
@ -179,9 +186,9 @@ public class RepositoryActions {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(context, context.getString(R.string.genericServerResponseError));
Toasty.error(
context, context.getString(R.string.genericServerResponseError));
}
});
}
}

View File

@ -15,40 +15,40 @@ import retrofit2.Callback;
/**
* @author M M Arif
*/
public class TeamActions {
public static void removeTeamMember(final Context context, String userName, int teamId) {
Call<Void> call = RetrofitClient.getApiInterface(context).orgRemoveTeamMember((long) teamId, userName);
Call<Void> call =
RetrofitClient.getApiInterface(context)
.orgRemoveTeamMember((long) teamId, userName);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
if(response.code() == 204) {
if (response.code() == 204) {
Toasty.success(context, context.getString(R.string.memberRemovedMessage));
Toasty.success(
context, context.getString(R.string.memberRemovedMessage));
((AddNewTeamMemberActivity) context).finish();
}
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
} else if (response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
}
else {
} else {
Toasty.error(context, context.getString(R.string.genericError));
}
@ -57,41 +57,44 @@ public class TeamActions {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(context, context.getResources().getString(R.string.genericServerResponseError));
Toasty.error(
context,
context.getResources()
.getString(R.string.genericServerResponseError));
}
});
}
public static void addTeamMember(final Context context, String userName, int teamId) {
Call<Void> call = RetrofitClient.getApiInterface(context).orgAddTeamMember((long) teamId, userName);
Call<Void> call =
RetrofitClient.getApiInterface(context).orgAddTeamMember((long) teamId, userName);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
if(response.code() == 204) {
if (response.code() == 204) {
Toasty.success(context, context.getString(R.string.memberAddedMessage));
Toasty.success(
context, context.getString(R.string.memberAddedMessage));
((AddNewTeamMemberActivity) context).finish();
}
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
} else if (response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
}
else {
} else {
Toasty.error(context, context.getString(R.string.genericError));
}
@ -100,43 +103,48 @@ public class TeamActions {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(context, context.getResources().getString(R.string.genericServerResponseError));
Toasty.error(
context,
context.getResources()
.getString(R.string.genericServerResponseError));
}
});
}
public static void removeTeamRepo(final Context context, String orgName, int teamId, String repo) {
public static void removeTeamRepo(
final Context context, String orgName, int teamId, String repo) {
Call<Void> call = RetrofitClient.getApiInterface(context).orgRemoveTeamRepository((long) teamId, orgName, repo);
Call<Void> call =
RetrofitClient.getApiInterface(context)
.orgRemoveTeamRepository((long) teamId, orgName, repo);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
if(response.code() == 204) {
if (response.code() == 204) {
OrganizationTeamInfoReposFragment.repoAdded = true;
Toasty.success(context, context.getString(R.string.repoRemovedMessage));
Toasty.success(
context, context.getString(R.string.repoRemovedMessage));
((AddNewTeamRepoActivity) context).finish();
}
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
} else if (response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
}
else {
} else {
Toasty.error(context, context.getString(R.string.genericError));
}
@ -145,42 +153,46 @@ public class TeamActions {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(context, context.getResources().getString(R.string.genericServerResponseError));
Toasty.error(
context,
context.getResources()
.getString(R.string.genericServerResponseError));
}
});
}
public static void addTeamRepo(final Context context, String orgName, int teamId, String repo) {
Call<Void> call = RetrofitClient.getApiInterface(context).orgAddTeamRepository((long) teamId, orgName, repo);
Call<Void> call =
RetrofitClient.getApiInterface(context)
.orgAddTeamRepository((long) teamId, orgName, repo);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
if(response.code() == 204) {
if (response.code() == 204) {
OrganizationTeamInfoReposFragment.repoAdded = true;
Toasty.success(context, context.getString(R.string.repoAddedMessage));
Toasty.success(
context, context.getString(R.string.repoAddedMessage));
((AddNewTeamRepoActivity) context).finish();
}
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
} else if (response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
}
else {
} else {
Toasty.error(context, context.getString(R.string.genericError));
}
@ -189,9 +201,11 @@ public class TeamActions {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(context, context.getResources().getString(R.string.genericServerResponseError));
Toasty.error(
context,
context.getResources()
.getString(R.string.genericServerResponseError));
}
});
}
}

View File

@ -7,6 +7,8 @@ import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import java.util.List;
import java.util.Objects;
import org.gitnex.tea4j.v2.models.InlineResponse2001;
import org.gitnex.tea4j.v2.models.User;
import org.mian.gitnex.R;
@ -15,8 +17,6 @@ import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityAddCollaboratorToRepositoryBinding;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import java.util.List;
import java.util.Objects;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -24,7 +24,6 @@ import retrofit2.Response;
/**
* @author M M Arif
*/
public class AddCollaboratorToRepositoryActivity extends BaseActivity {
private ActivityAddCollaboratorToRepositoryBinding activityAddCollaboratorToRepositoryBinding;
@ -36,28 +35,41 @@ public class AddCollaboratorToRepositoryActivity extends BaseActivity {
super.onCreate(savedInstanceState);
activityAddCollaboratorToRepositoryBinding = ActivityAddCollaboratorToRepositoryBinding.inflate(getLayoutInflater());
activityAddCollaboratorToRepositoryBinding =
ActivityAddCollaboratorToRepositoryBinding.inflate(getLayoutInflater());
setContentView(activityAddCollaboratorToRepositoryBinding.getRoot());
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodManager imm =
(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
repository = RepositoryContext.fromIntent(getIntent());
activityAddCollaboratorToRepositoryBinding.addCollaboratorSearch.requestFocus();
assert imm != null;
imm.showSoftInput(activityAddCollaboratorToRepositoryBinding.addCollaboratorSearch, InputMethodManager.SHOW_IMPLICIT);
imm.showSoftInput(
activityAddCollaboratorToRepositoryBinding.addCollaboratorSearch,
InputMethodManager.SHOW_IMPLICIT);
initCloseListener();
activityAddCollaboratorToRepositoryBinding.close.setOnClickListener(onClickListener);
activityAddCollaboratorToRepositoryBinding.addCollaboratorSearch.setOnEditorActionListener((v, actionId, event) -> {
activityAddCollaboratorToRepositoryBinding.addCollaboratorSearch.setOnEditorActionListener(
(v, actionId, event) -> {
if (actionId == EditorInfo.IME_ACTION_SEND) {
if(actionId == EditorInfo.IME_ACTION_SEND) {
if (!Objects.requireNonNull(
activityAddCollaboratorToRepositoryBinding
.addCollaboratorSearch.getText())
.toString()
.equals("")) {
if(!Objects.requireNonNull(activityAddCollaboratorToRepositoryBinding.addCollaboratorSearch.getText()).toString().equals("")) {
activityAddCollaboratorToRepositoryBinding.progressBar.setVisibility(View.VISIBLE);
loadUserSearchList(activityAddCollaboratorToRepositoryBinding.addCollaboratorSearch.getText().toString());
activityAddCollaboratorToRepositoryBinding.progressBar.setVisibility(
View.VISIBLE);
loadUserSearchList(
activityAddCollaboratorToRepositoryBinding
.addCollaboratorSearch
.getText()
.toString());
}
}
@ -67,28 +79,33 @@ public class AddCollaboratorToRepositoryActivity extends BaseActivity {
public void loadUserSearchList(String searchKeyword) {
Call<InlineResponse2001> call = RetrofitClient.getApiInterface(ctx).userSearch(searchKeyword, null, 1, 10);
Call<InlineResponse2001> call =
RetrofitClient.getApiInterface(ctx).userSearch(searchKeyword, null, 1, 10);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<InlineResponse2001> call, @NonNull Response<InlineResponse2001> response) {
public void onResponse(
@NonNull Call<InlineResponse2001> call,
@NonNull Response<InlineResponse2001> response) {
activityAddCollaboratorToRepositoryBinding.progressBar.setVisibility(View.GONE);
activityAddCollaboratorToRepositoryBinding.progressBar.setVisibility(
View.GONE);
if(response.isSuccessful()) {
if (response.isSuccessful()) {
assert response.body() != null;
getUsersList(response.body().getData(), ctx);
}
else {
} else {
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<InlineResponse2001> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<InlineResponse2001> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
@ -96,19 +113,20 @@ public class AddCollaboratorToRepositoryActivity extends BaseActivity {
private void getUsersList(List<User> dataList, Context context) {
CollaboratorSearchAdapter adapter = new CollaboratorSearchAdapter(dataList, context, repository);
CollaboratorSearchAdapter adapter =
new CollaboratorSearchAdapter(dataList, context, repository);
activityAddCollaboratorToRepositoryBinding.recyclerViewUserSearch.setHasFixedSize(true);
activityAddCollaboratorToRepositoryBinding.recyclerViewUserSearch.setLayoutManager(new LinearLayoutManager(ctx));
activityAddCollaboratorToRepositoryBinding.recyclerViewUserSearch.setLayoutManager(
new LinearLayoutManager(ctx));
activityAddCollaboratorToRepositoryBinding.progressBar.setVisibility(View.VISIBLE);
if(adapter.getItemCount() > 0) {
if (adapter.getItemCount() > 0) {
activityAddCollaboratorToRepositoryBinding.recyclerViewUserSearch.setAdapter(adapter);
activityAddCollaboratorToRepositoryBinding.noData.setVisibility(View.GONE);
}
else {
} else {
activityAddCollaboratorToRepositoryBinding.noData.setVisibility(View.VISIBLE);
}
@ -125,5 +143,4 @@ public class AddCollaboratorToRepositoryActivity extends BaseActivity {
super.onResume();
repository.checkAccountSwitch(this);
}
}

View File

@ -8,6 +8,9 @@ import android.view.View;
import android.widget.ArrayAdapter;
import androidx.annotation.NonNull;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import io.mikael.urlbuilder.UrlBuilder;
import java.net.URI;
import java.util.Objects;
import org.gitnex.tea4j.v2.models.GeneralAPISettings;
import org.gitnex.tea4j.v2.models.ServerVersion;
import org.gitnex.tea4j.v2.models.User;
@ -23,16 +26,12 @@ import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.UrlHelper;
import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.structs.Protocol;
import java.net.URI;
import java.util.Objects;
import io.mikael.urlbuilder.UrlBuilder;
import retrofit2.Call;
import retrofit2.Callback;
/**
* @author M M Arif
*/
public class AddNewAccountActivity extends BaseActivity {
private View.OnClickListener onClickListener;
@ -58,122 +57,148 @@ public class AddNewAccountActivity extends BaseActivity {
viewBinding.instanceUrl.setText(getIntent().getStringExtra("instanceUrl"));
viewBinding.loginToken.setText(getIntent().getStringExtra("token"));
String scheme = getIntent().getStringExtra("scheme");
if(scheme != null && scheme.equals("http")) {
if (scheme != null && scheme.equals("http")) {
viewBinding.protocolSpinner.setText(Protocol.HTTP.toString());
spinnerSelectedValue = Protocol.HTTP.toString();
}
else { // default is https
} else { // default is https
viewBinding.protocolSpinner.setText(Protocol.HTTPS.toString());
spinnerSelectedValue = Protocol.HTTPS.toString();
}
ArrayAdapter<Protocol> adapterProtocols = new ArrayAdapter<>(ctx, R.layout.list_spinner_items, Protocol.values());
ArrayAdapter<Protocol> adapterProtocols =
new ArrayAdapter<>(ctx, R.layout.list_spinner_items, Protocol.values());
viewBinding.protocolSpinner.setAdapter(adapterProtocols);
viewBinding.protocolSpinner.setOnItemClickListener((parent, view1, position, id) -> spinnerSelectedValue = String.valueOf(parent.getItemAtPosition(position)));
viewBinding.addNewAccount.setOnClickListener(login -> {
viewBinding.protocolSpinner.setOnItemClickListener(
(parent, view1, position, id) ->
spinnerSelectedValue = String.valueOf(parent.getItemAtPosition(position)));
viewBinding.addNewAccount.setOnClickListener(
login -> {
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
if(!connToInternet) {
if (!connToInternet) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
}
else {
} else {
processLogin();
}
});
}
private void processLogin() {
try {
String instanceUrlET = String.valueOf(viewBinding.instanceUrl.getText()).replaceAll("[\\uFEFF|#]", "").trim();
String loginToken = String.valueOf(viewBinding.loginToken.getText()).replaceAll("[\\uFEFF|#]", "").trim();
String instanceUrlET =
String.valueOf(viewBinding.instanceUrl.getText())
.replaceAll("[\\uFEFF|#]", "")
.trim();
String loginToken =
String.valueOf(viewBinding.loginToken.getText())
.replaceAll("[\\uFEFF|#]", "")
.trim();
String protocol = spinnerSelectedValue;
if(protocol == null) {
if (protocol == null) {
Toasty.error(ctx, getResources().getString(R.string.protocolEmptyError));
return;
}
if(instanceUrlET.equals("")) {
if (instanceUrlET.equals("")) {
Toasty.error(ctx, getResources().getString(R.string.emptyFieldURL));
return;
}
if(loginToken.equals("")) {
if (loginToken.equals("")) {
Toasty.error(ctx, getResources().getString(R.string.loginTokenError));
return;
}
URI rawInstanceUrl = UrlBuilder.fromString(UrlHelper.fixScheme(instanceUrlET, "http")).toUri();
URI rawInstanceUrl =
UrlBuilder.fromString(UrlHelper.fixScheme(instanceUrlET, "http")).toUri();
URI instanceUrl = UrlBuilder.fromUri(rawInstanceUrl).withScheme(protocol.toLowerCase()).withPath(PathsHelper.join(rawInstanceUrl.getPath(), "/api/v1/")).toUri();
URI instanceUrl =
UrlBuilder.fromUri(rawInstanceUrl)
.withScheme(protocol.toLowerCase())
.withPath(PathsHelper.join(rawInstanceUrl.getPath(), "/api/v1/"))
.toUri();
versionCheck(instanceUrl.toString(), loginToken);
serverPageLimitSettings();
}
catch(Exception e) {
} catch (Exception e) {
Toasty.error(ctx, getResources().getString(R.string.malformedUrl));
}
}
private void versionCheck(final String instanceUrl, final String loginToken) {
Call<ServerVersion> callVersion = RetrofitClient.getApiInterface(ctx, instanceUrl, "token " + loginToken, null).getVersion();
callVersion.enqueue(new Callback<>() {
Call<ServerVersion> callVersion =
RetrofitClient.getApiInterface(ctx, instanceUrl, "token " + loginToken, null)
.getVersion();
callVersion.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull final Call<ServerVersion> callVersion, @NonNull retrofit2.Response<ServerVersion> responseVersion) {
public void onResponse(
@NonNull final Call<ServerVersion> callVersion,
@NonNull retrofit2.Response<ServerVersion> responseVersion) {
if(responseVersion.code() == 200) {
if (responseVersion.code() == 200) {
ServerVersion version = responseVersion.body();
assert version != null;
if(!Version.valid(version.getVersion())) {
if (!Version.valid(version.getVersion())) {
Toasty.error(ctx, getResources().getString(R.string.versionUnknown));
Toasty.error(
ctx, getResources().getString(R.string.versionUnknown));
return;
}
giteaVersion = new Version(version.getVersion());
if(giteaVersion.less(getString(R.string.versionLow))) {
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(getString(R.string.versionAlertDialogHeader))
.setMessage(getResources().getString(R.string.versionUnsupportedOld, version.getVersion())).setNeutralButton(getString(R.string.cancelButton), null)
.setPositiveButton(getString(R.string.textContinue), (dialog, which) -> {
if (giteaVersion.less(getString(R.string.versionLow))) {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(
getString(
R.string.versionAlertDialogHeader))
.setMessage(
getResources()
.getString(
R.string
.versionUnsupportedOld,
version.getVersion()))
.setNeutralButton(
getString(R.string.cancelButton), null)
.setPositiveButton(
getString(R.string.textContinue),
(dialog, which) -> {
dialog.dismiss();
login(instanceUrl, loginToken);
});
materialAlertDialogBuilder.create().show();
}
else if(giteaVersion.lessOrEqual(getString(R.string.versionHigh))) {
} else if (giteaVersion.lessOrEqual(getString(R.string.versionHigh))) {
login(instanceUrl, loginToken);
}
else {
} else {
Toasty.warning(ctx, getResources().getString(R.string.versionUnsupportedNew));
Toasty.warning(
ctx,
getResources().getString(R.string.versionUnsupportedNew));
login(instanceUrl, loginToken);
}
}
else if(responseVersion.code() == 403) {
} else if (responseVersion.code() == 403) {
login(instanceUrl, loginToken);
}
@ -185,94 +210,127 @@ public class AddNewAccountActivity extends BaseActivity {
}
@Override
public void onFailure(@NonNull Call<ServerVersion> callVersion, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<ServerVersion> callVersion, @NonNull Throwable t) {
Log.e("onFailure-versionCheck", t.toString());
Toasty.error(ctx, getResources().getString(R.string.genericServerResponseError));
Toasty.error(
ctx, getResources().getString(R.string.genericServerResponseError));
}
});
}
private void serverPageLimitSettings() {
Call<GeneralAPISettings> generalAPISettings = RetrofitClient.getApiInterface(ctx).getGeneralAPISettings();
generalAPISettings.enqueue(new Callback<>() {
Call<GeneralAPISettings> generalAPISettings =
RetrofitClient.getApiInterface(ctx).getGeneralAPISettings();
generalAPISettings.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull final Call<GeneralAPISettings> generalAPISettings, @NonNull retrofit2.Response<GeneralAPISettings> response) {
public void onResponse(
@NonNull final Call<GeneralAPISettings> generalAPISettings,
@NonNull retrofit2.Response<GeneralAPISettings> response) {
if(response.code() == 200 && response.body() != null) {
if (response.code() == 200 && response.body() != null) {
if(response.body().getMaxResponseItems() != null) {
maxResponseItems = Math.toIntExact(response.body().getMaxResponseItems());
if (response.body().getMaxResponseItems() != null) {
maxResponseItems =
Math.toIntExact(response.body().getMaxResponseItems());
}
if(response.body().getDefaultPagingNum() != null) {
defaultPagingNumber = Math.toIntExact(response.body().getDefaultPagingNum());
if (response.body().getDefaultPagingNum() != null) {
defaultPagingNumber =
Math.toIntExact(response.body().getDefaultPagingNum());
}
}
}
@Override
public void onFailure(@NonNull Call<GeneralAPISettings> generalAPISettings, @NonNull Throwable t) {
}
public void onFailure(
@NonNull Call<GeneralAPISettings> generalAPISettings,
@NonNull Throwable t) {}
});
}
private void setupNewAccountWithToken(String instanceUrl, final String loginToken) {
Call<User> call = RetrofitClient.getApiInterface(ctx, instanceUrl, "token " + loginToken, null).userGetCurrent();
Call<User> call =
RetrofitClient.getApiInterface(ctx, instanceUrl, "token " + loginToken, null)
.userGetCurrent();
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<User> call, @NonNull retrofit2.Response<User> response) {
public void onResponse(
@NonNull Call<User> call, @NonNull retrofit2.Response<User> response) {
User userDetails = response.body();
switch(response.code()) {
switch (response.code()) {
case 200:
assert userDetails != null;
// insert new account to db if does not exist
String accountName = userDetails.getLogin() + "@" + instanceUrl;
UserAccountsApi userAccountsApi = BaseApi.getInstance(ctx, UserAccountsApi.class);
boolean userAccountExists = Objects.requireNonNull(userAccountsApi).userAccountExists(accountName);
UserAccountsApi userAccountsApi =
BaseApi.getInstance(ctx, UserAccountsApi.class);
boolean userAccountExists =
Objects.requireNonNull(userAccountsApi)
.userAccountExists(accountName);
if(!userAccountExists) {
if (!userAccountExists) {
long id = userAccountsApi.createNewAccount(accountName, instanceUrl, userDetails.getLogin(), loginToken, giteaVersion.toString(), maxResponseItems, defaultPagingNumber);
long id =
userAccountsApi.createNewAccount(
accountName,
instanceUrl,
userDetails.getLogin(),
loginToken,
giteaVersion.toString(),
maxResponseItems,
defaultPagingNumber);
UserAccount account = userAccountsApi.getAccountById((int) id);
AppUtil.switchToAccount(AddNewAccountActivity.this, account);
Toasty.success(ctx, getResources().getString(R.string.accountAddedMessage));
Toasty.success(
ctx,
getResources().getString(R.string.accountAddedMessage));
MainActivity.refActivity = true;
finish();
}
else {
UserAccount account = userAccountsApi.getAccountByName(accountName);
if(account.isLoggedIn()) {
Toasty.warning(ctx, getResources().getString(R.string.accountAlreadyExistsError));
} else {
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);
} else {
userAccountsApi.updateTokenByAccountName(
accountName, loginToken);
userAccountsApi.login(account.getAccountId());
AppUtil.switchToAccount(AddNewAccountActivity.this, account);
AppUtil.switchToAccount(
AddNewAccountActivity.this, account);
}
}
finish();
break;
case 401:
Toasty.error(ctx, getResources().getString(R.string.unauthorizedApiError));
Toasty.error(
ctx,
getResources().getString(R.string.unauthorizedApiError));
break;
default:
Toasty.error(ctx, getResources().getString(R.string.genericApiError, response.code()));
Toasty.error(
ctx,
getResources()
.getString(
R.string.genericApiError, response.code()));
}
}
@Override
@ -281,12 +339,10 @@ public class AddNewAccountActivity extends BaseActivity {
Toasty.error(ctx, getResources().getString(R.string.genericError));
}
});
}
private void initCloseListener() {
onClickListener = view -> finish();
}
}

View File

@ -13,13 +13,13 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
import org.gitnex.tea4j.v2.models.InlineResponse2001;
import org.gitnex.tea4j.v2.models.User;
import org.mian.gitnex.adapters.OrganizationAddUserToTeamMemberAdapter;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityAddNewTeamMemberBinding;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -27,7 +27,6 @@ import retrofit2.Response;
/**
* @author M M Arif
*/
public class AddNewTeamMemberActivity extends BaseActivity {
private View.OnClickListener onClickListener;
@ -46,10 +45,12 @@ public class AddNewTeamMemberActivity extends BaseActivity {
super.onCreate(savedInstanceState);
ActivityAddNewTeamMemberBinding activityAddNewTeamMemberBinding = ActivityAddNewTeamMemberBinding.inflate(getLayoutInflater());
ActivityAddNewTeamMemberBinding activityAddNewTeamMemberBinding =
ActivityAddNewTeamMemberBinding.inflate(getLayoutInflater());
setContentView(activityAddNewTeamMemberBinding.getRoot());
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodManager imm =
(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
ImageView closeActivity = activityAddNewTeamMemberBinding.close;
addNewTeamMember = activityAddNewTeamMemberBinding.addNewTeamMember;
@ -71,72 +72,77 @@ public class AddNewTeamMemberActivity extends BaseActivity {
dataList = new ArrayList<>();
addNewTeamMember.addTextChangedListener(new TextWatcher() {
addNewTeamMember.addTextChangedListener(
new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(!addNewTeamMember.getText().toString().equals("") && addNewTeamMember.getText().toString().length() > 1) {
if (!addNewTeamMember.getText().toString().equals("")
&& addNewTeamMember.getText().toString().length() > 1) {
adapter = new OrganizationAddUserToTeamMemberAdapter(dataList, ctx, Math.toIntExact(teamId), getIntent().getStringExtra("orgName"));
adapter =
new OrganizationAddUserToTeamMemberAdapter(
dataList,
ctx,
Math.toIntExact(teamId),
getIntent().getStringExtra("orgName"));
loadUserSearchList(addNewTeamMember.getText().toString());
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void beforeTextChanged(
CharSequence s, int start, int count, int after) {}
@Override
public void afterTextChanged(Editable s) {
}
public void afterTextChanged(Editable s) {}
});
}
public void loadUserSearchList(String searchKeyword) {
Call<InlineResponse2001> call = RetrofitClient.getApiInterface(ctx).userSearch(searchKeyword, null, 1, 10);
Call<InlineResponse2001> call =
RetrofitClient.getApiInterface(ctx).userSearch(searchKeyword, null, 1, 10);
mProgressBar.setVisibility(View.VISIBLE);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<InlineResponse2001> call, @NonNull Response<InlineResponse2001> response) {
public void onResponse(
@NonNull Call<InlineResponse2001> call,
@NonNull Response<InlineResponse2001> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
assert response.body() != null;
if(response.body().getData().size() > 0) {
if (response.body().getData().size() > 0) {
dataList.clear();
dataList.addAll(response.body().getData());
mRecyclerView.setAdapter(adapter);
noData.setVisibility(View.GONE);
}
else {
} else {
noData.setVisibility(View.VISIBLE);
}
mProgressBar.setVisibility(View.GONE);
}
}
@Override
public void onFailure(@NonNull Call<InlineResponse2001> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<InlineResponse2001> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
}
});
}
private void initCloseListener() {
onClickListener = view -> finish();
}
}

View File

@ -4,6 +4,8 @@ import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import java.util.ArrayList;
import java.util.List;
import org.gitnex.tea4j.v2.models.Repository;
import org.mian.gitnex.R;
import org.mian.gitnex.adapters.OrganizationTeamRepositoriesAdapter;
@ -11,8 +13,6 @@ import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.AddNewTeamRepositoryBinding;
import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.Toasty;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -20,7 +20,6 @@ import retrofit2.Response;
/**
* @author M M Arif
*/
public class AddNewTeamRepoActivity extends BaseActivity {
private AddNewTeamRepositoryBinding addNewTeamRepositoryBinding;
@ -48,7 +47,8 @@ public class AddNewTeamRepoActivity extends BaseActivity {
teamName = getIntent().getStringExtra("teamName");
addNewTeamRepositoryBinding.recyclerViewTeamRepos.setHasFixedSize(true);
addNewTeamRepositoryBinding.recyclerViewTeamRepos.setLayoutManager(new LinearLayoutManager(ctx));
addNewTeamRepositoryBinding.recyclerViewTeamRepos.setLayoutManager(
new LinearLayoutManager(ctx));
dataList = new ArrayList<>();
@ -57,42 +57,53 @@ public class AddNewTeamRepoActivity extends BaseActivity {
public void loadRepos() {
Call<List<Repository>> call = RetrofitClient.getApiInterface(ctx).orgListRepos(getIntent().getStringExtra("orgName"), 1, resultLimit);
Call<List<Repository>> call =
RetrofitClient.getApiInterface(ctx)
.orgListRepos(getIntent().getStringExtra("orgName"), 1, resultLimit);
addNewTeamRepositoryBinding.progressBar.setVisibility(View.VISIBLE);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<Repository>> call, @NonNull Response<List<Repository>> response) {
public void onResponse(
@NonNull Call<List<Repository>> call,
@NonNull Response<List<Repository>> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
assert response.body() != null;
if(response.body().size() > 0) {
if (response.body().size() > 0) {
dataList.clear();
dataList.addAll(response.body());
adapter = new OrganizationTeamRepositoriesAdapter(dataList, ctx, Math.toIntExact(teamId), getIntent().getStringExtra("orgName"), teamName);
adapter =
new OrganizationTeamRepositoriesAdapter(
dataList,
ctx,
Math.toIntExact(teamId),
getIntent().getStringExtra("orgName"),
teamName);
addNewTeamRepositoryBinding.recyclerViewTeamRepos.setAdapter(adapter);
addNewTeamRepositoryBinding.recyclerViewTeamRepos.setAdapter(
adapter);
addNewTeamRepositoryBinding.noData.setVisibility(View.GONE);
}
else {
} else {
addNewTeamRepositoryBinding.noData.setVisibility(View.VISIBLE);
}
addNewTeamRepositoryBinding.progressBar.setVisibility(View.GONE);
}
else {
} else {
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<List<Repository>> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<List<Repository>> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
@ -101,5 +112,4 @@ public class AddNewTeamRepoActivity extends BaseActivity {
private void initCloseListener() {
onClickListener = view -> finish();
}
}

View File

@ -16,7 +16,6 @@ import org.mian.gitnex.viewmodels.AdminCronTasksViewModel;
/**
* @author M M Arif
*/
public class AdminCronTasksActivity extends BaseActivity {
private AdminCronTasksViewModel adminCronTasksViewModel;
@ -47,29 +46,37 @@ public class AdminCronTasksActivity extends BaseActivity {
activityAdminCronTasksBinding.recyclerView.setHasFixedSize(true);
activityAdminCronTasksBinding.recyclerView.setLayoutManager(new LinearLayoutManager(ctx));
activityAdminCronTasksBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
activityAdminCronTasksBinding.progressBar.setVisibility(View.VISIBLE);
activityAdminCronTasksBinding.pullToRefresh.setRefreshing(false);
adminCronTasksViewModel.loadCronTasksList(ctx, PAGE, resultLimit);
}, 500));
activityAdminCronTasksBinding.pullToRefresh.setOnRefreshListener(
() ->
new Handler(Looper.getMainLooper())
.postDelayed(
() -> {
activityAdminCronTasksBinding.progressBar.setVisibility(
View.VISIBLE);
activityAdminCronTasksBinding.pullToRefresh
.setRefreshing(false);
adminCronTasksViewModel.loadCronTasksList(
ctx, PAGE, resultLimit);
},
500));
fetchDataAsync(ctx);
}
private void fetchDataAsync(Context ctx) {
adminCronTasksViewModel.getCronTasksList(ctx, PAGE, resultLimit).observe(this, cronTasksListMain -> {
adminCronTasksViewModel
.getCronTasksList(ctx, PAGE, resultLimit)
.observe(
this,
cronTasksListMain -> {
adapter = new AdminCronTasksAdapter(cronTasksListMain);
if(adapter.getItemCount() > 0) {
if (adapter.getItemCount() > 0) {
activityAdminCronTasksBinding.recyclerView.setAdapter(adapter);
activityAdminCronTasksBinding.noData.setVisibility(View.GONE);
activityAdminCronTasksBinding.progressBar.setVisibility(View.GONE);
}
else {
} else {
activityAdminCronTasksBinding.noData.setVisibility(View.VISIBLE);
}
});
@ -78,5 +85,4 @@ public class AdminCronTasksActivity extends BaseActivity {
private void initCloseListener() {
onClickListener = view -> finish();
}
}

View File

@ -25,7 +25,6 @@ import org.mian.gitnex.viewmodels.AdminGetUsersViewModel;
/**
* @author M M Arif
*/
public class AdminGetUsersActivity extends BaseActivity implements BottomSheetListener {
private AdminGetUsersViewModel adminGetUsersViewModel;
@ -55,52 +54,65 @@ public class AdminGetUsersActivity extends BaseActivity implements BottomSheetLi
activityAdminGetUsersBinding.recyclerView.setHasFixedSize(true);
activityAdminGetUsersBinding.recyclerView.setLayoutManager(new LinearLayoutManager(ctx));
activityAdminGetUsersBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
activityAdminGetUsersBinding.pullToRefresh.setOnRefreshListener(
() ->
new Handler(Looper.getMainLooper())
.postDelayed(
() -> {
page = 1;
activityAdminGetUsersBinding.pullToRefresh.setRefreshing(false);
activityAdminGetUsersBinding.pullToRefresh
.setRefreshing(false);
fetchDataAsync();
activityAdminGetUsersBinding.progressBar.setVisibility(View.VISIBLE);
}, 50));
activityAdminGetUsersBinding.progressBar.setVisibility(
View.VISIBLE);
},
50));
fetchDataAsync();
}
;
private void fetchDataAsync() {
AdminGetUsersViewModel adminUsersModel = new ViewModelProvider(this).get(AdminGetUsersViewModel.class);
adminUsersModel.getUsersList(page, resultLimit, ctx).observe(this, adminUsersListMain -> {
AdminGetUsersViewModel adminUsersModel =
new ViewModelProvider(this).get(AdminGetUsersViewModel.class);
adminUsersModel
.getUsersList(page, resultLimit, ctx)
.observe(
this,
adminUsersListMain -> {
adapter = new AdminGetUsersAdapter(adminUsersListMain, ctx);
adapter.setLoadMoreListener(new AdminGetUsersAdapter.OnLoadMoreListener() {
adapter.setLoadMoreListener(
new AdminGetUsersAdapter.OnLoadMoreListener() {
@Override
public void onLoadMore() {
page += 1;
adminGetUsersViewModel.loadMoreUsersList(page, resultLimit, ctx, adapter);
activityAdminGetUsersBinding.progressBar.setVisibility(View.VISIBLE);
adminGetUsersViewModel.loadMoreUsersList(
page, resultLimit, ctx, adapter);
activityAdminGetUsersBinding.progressBar.setVisibility(
View.VISIBLE);
}
@Override
public void onLoadFinished() {
activityAdminGetUsersBinding.progressBar.setVisibility(View.GONE);
activityAdminGetUsersBinding.progressBar.setVisibility(
View.GONE);
}
});
if(adapter.getItemCount() > 0) {
if (adapter.getItemCount() > 0) {
activityAdminGetUsersBinding.recyclerView.setAdapter(adapter);
activityAdminGetUsersBinding.noDataUsers.setVisibility(View.GONE);
searchFilter = true;
}
else {
} else {
adapter.notifyDataChanged();
activityAdminGetUsersBinding.recyclerView.setAdapter(adapter);
activityAdminGetUsersBinding.noDataUsers.setVisibility(View.VISIBLE);
activityAdminGetUsersBinding.noDataUsers.setVisibility(
View.VISIBLE);
}
activityAdminGetUsersBinding.progressBar.setVisibility(View.GONE);
@ -113,9 +125,10 @@ public class AdminGetUsersActivity extends BaseActivity implements BottomSheetLi
final MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.generic_nav_dotted_menu, menu);
new Handler(Looper.getMainLooper()).postDelayed(() -> {
if(searchFilter) {
new Handler(Looper.getMainLooper())
.postDelayed(
() -> {
if (searchFilter) {
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
@ -125,11 +138,13 @@ public class AdminGetUsersActivity extends BaseActivity implements BottomSheetLi
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
if(!connToInternet) {
if (!connToInternet) {
return;
}
searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
searchView.setOnQueryTextListener(
new androidx.appcompat.widget.SearchView
.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
@ -144,7 +159,8 @@ public class AdminGetUsersActivity extends BaseActivity implements BottomSheetLi
}
});
}
}, 500);
},
500);
return true;
}
@ -154,18 +170,16 @@ public class AdminGetUsersActivity extends BaseActivity implements BottomSheetLi
int id = item.getItemId();
if(id == android.R.id.home) {
if (id == android.R.id.home) {
finish();
return true;
}
else if(id == R.id.genericMenu) {
} else if (id == R.id.genericMenu) {
BottomSheetAdminUsersFragment bottomSheet = new BottomSheetAdminUsersFragment();
bottomSheet.show(getSupportFragmentManager(), "usersBottomSheet");
return true;
}
else {
} else {
return super.onOptionsItemSelected(item);
}
@ -174,7 +188,7 @@ public class AdminGetUsersActivity extends BaseActivity implements BottomSheetLi
@Override
public void onButtonClicked(String text) {
if("newUser".equals(text)) {
if ("newUser".equals(text)) {
startActivity(new Intent(AdminGetUsersActivity.this, CreateNewUserActivity.class));
}
}
@ -182,5 +196,4 @@ public class AdminGetUsersActivity extends BaseActivity implements BottomSheetLi
private void initCloseListener() {
onClickListener = view -> finish();
}
}

View File

@ -8,19 +8,18 @@ import android.view.View;
import androidx.appcompat.widget.Toolbar;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicInteger;
import org.mian.gitnex.R;
import org.mian.gitnex.adapters.AdminUnadoptedReposAdapter;
import org.mian.gitnex.databinding.ActivityAdminCronTasksBinding;
import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.viewmodels.AdminUnadoptedReposViewModel;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author M M Arif
* @author qwerty287
*/
public class AdminUnadoptedReposActivity extends BaseActivity {
private AdminUnadoptedReposViewModel viewModel;
@ -54,26 +53,34 @@ public class AdminUnadoptedReposActivity extends BaseActivity {
binding.recyclerView.setHasFixedSize(true);
binding.recyclerView.setLayoutManager(new LinearLayoutManager(ctx));
binding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
binding.pullToRefresh.setOnRefreshListener(
() ->
new Handler(Looper.getMainLooper())
.postDelayed(
() -> {
binding.pullToRefresh.setRefreshing(false);
PAGE = 1;
binding.progressBar.setVisibility(View.VISIBLE);
reload = true;
viewModel.loadRepos(ctx, PAGE, resultLimit, null);
},
500));
}, 500));
adapter = new AdminUnadoptedReposAdapter(new ArrayList<>(), () -> {
adapter =
new AdminUnadoptedReposAdapter(
new ArrayList<>(),
() -> {
PAGE = 1;
binding.progressBar.setVisibility(View.VISIBLE);
reload = true;
viewModel.loadRepos(ctx, PAGE, resultLimit, null);
}, () -> {
},
() -> {
PAGE += 1;
binding.progressBar.setVisibility(View.VISIBLE);
viewModel.loadRepos(ctx, PAGE, resultLimit, null);
}, binding);
},
binding);
binding.recyclerView.setAdapter(adapter);
@ -84,8 +91,11 @@ public class AdminUnadoptedReposActivity extends BaseActivity {
AtomicInteger prevSize = new AtomicInteger();
viewModel.getUnadoptedRepos(ctx, PAGE, resultLimit, null).observe(this, list -> {
viewModel
.getUnadoptedRepos(ctx, PAGE, resultLimit, null)
.observe(
this,
list -> {
binding.progressBar.setVisibility(View.GONE);
boolean hasMore = reload || list.size() > prevSize.get();
@ -93,12 +103,11 @@ public class AdminUnadoptedReposActivity extends BaseActivity {
prevSize.set(list.size());
if(list.size() > 0) {
if (list.size() > 0) {
adapter.updateList(list);
adapter.setHasMore(hasMore);
binding.noData.setVisibility(View.GONE);
}
else {
} else {
binding.noData.setVisibility(View.VISIBLE);
}
});
@ -107,5 +116,4 @@ public class AdminUnadoptedReposActivity extends BaseActivity {
private void initCloseListener() {
onClickListener = view -> finish();
}
}

View File

@ -6,6 +6,8 @@ import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.biometric.BiometricPrompt;
import androidx.core.content.ContextCompat;
import java.util.Locale;
import java.util.concurrent.Executor;
import org.mian.gitnex.R;
import org.mian.gitnex.core.MainApplication;
import org.mian.gitnex.helpers.AppUtil;
@ -13,13 +15,10 @@ 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;
/**
* @author M M Arif
*/
public abstract class BaseActivity extends AppCompatActivity {
protected TinyDB tinyDB;
@ -35,41 +34,43 @@ public abstract class BaseActivity extends AppCompatActivity {
this.appCtx = getApplicationContext();
this.tinyDB = TinyDB.getInstance(appCtx);
switch(tinyDB.getInt("themeId", 6)) {
switch (tinyDB.getInt("themeId", 6)) {
case 0:
setTheme(R.style.AppTheme);
break;
case 1:
setTheme(R.style.AppThemeLight);
break;
case 2:
if(TimeHelper.timeBetweenHours(tinyDB.getInt("darkThemeTimeHour", 18), tinyDB.getInt("lightThemeTimeHour", 6), tinyDB.getInt("darkThemeTimeMinute", 0), tinyDB.getInt("lightThemeTimeMinute", 0))) {
if (TimeHelper.timeBetweenHours(
tinyDB.getInt("darkThemeTimeHour", 18),
tinyDB.getInt("lightThemeTimeHour", 6),
tinyDB.getInt("darkThemeTimeMinute", 0),
tinyDB.getInt("lightThemeTimeMinute", 0))) {
setTheme(R.style.AppTheme);
}
else {
} else {
setTheme(R.style.AppThemeLight);
}
break;
case 3:
setTheme(R.style.AppThemeRetro);
break;
case 4:
if(TimeHelper.timeBetweenHours(tinyDB.getInt("darkThemeTimeHour", 18), tinyDB.getInt("lightThemeTimeHour", 6), tinyDB.getInt("darkThemeTimeMinute", 0), tinyDB.getInt("lightThemeTimeMinute", 0))) {
if (TimeHelper.timeBetweenHours(
tinyDB.getInt("darkThemeTimeHour", 18),
tinyDB.getInt("lightThemeTimeHour", 6),
tinyDB.getInt("darkThemeTimeMinute", 0),
tinyDB.getInt("lightThemeTimeMinute", 0))) {
setTheme(R.style.AppTheme);
}
else {
} else {
setTheme(R.style.AppThemeRetro);
}
break;
case 5:
setTheme(R.style.AppThemePitchBlack);
break;
case 7:
@ -81,10 +82,9 @@ public abstract class BaseActivity extends AppCompatActivity {
}
String locale = tinyDB.getString("locale");
if(locale.isEmpty()) {
if (locale.isEmpty()) {
AppUtil.setAppLocale(getResources(), Locale.getDefault().getLanguage());
}
else {
} else {
AppUtil.setAppLocale(getResources(), locale);
}
@ -94,14 +94,20 @@ public abstract class BaseActivity extends AppCompatActivity {
public void onResume() {
super.onResume();
if(tinyDB.getBoolean("biometricStatus", false) && !tinyDB.getBoolean("biometricLifeCycle")) {
if (tinyDB.getBoolean("biometricStatus", false)
&& !tinyDB.getBoolean("biometricLifeCycle")) {
Executor executor = ContextCompat.getMainExecutor(this);
BiometricPrompt biometricPrompt = new BiometricPrompt(this, executor, new BiometricPrompt.AuthenticationCallback() {
BiometricPrompt biometricPrompt =
new BiometricPrompt(
this,
executor,
new BiometricPrompt.AuthenticationCallback() {
@Override
public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) {
public void onAuthenticationError(
int errorCode, @NonNull CharSequence errString) {
super.onAuthenticationError(errorCode, errString);
@ -111,7 +117,8 @@ public abstract class BaseActivity extends AppCompatActivity {
// Authentication succeeded, continue to app
@Override
public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) {
public void onAuthenticationSucceeded(
@NonNull BiometricPrompt.AuthenticationResult result) {
super.onAuthenticationSucceeded(result);
tinyDB.putBoolean("biometricLifeCycle", true);
}
@ -121,21 +128,20 @@ public abstract class BaseActivity extends AppCompatActivity {
public void onAuthenticationFailed() {
super.onAuthenticationFailed();
}
});
BiometricPrompt.PromptInfo biometricPromptBuilder = new BiometricPrompt.PromptInfo.Builder().setTitle(getString(R.string.biometricAuthTitle)).setSubtitle(getString(R.string.biometricAuthSubTitle))
.setNegativeButtonText(getString(R.string.cancelButton)).build();
BiometricPrompt.PromptInfo biometricPromptBuilder =
new BiometricPrompt.PromptInfo.Builder()
.setTitle(getString(R.string.biometricAuthTitle))
.setSubtitle(getString(R.string.biometricAuthSubTitle))
.setNegativeButtonText(getString(R.string.cancelButton))
.build();
biometricPrompt.authenticate(biometricPromptBuilder);
}
}
public AccountContext getAccount() {
return ((MainApplication) getApplication()).currentAccount;
}
}

View File

@ -7,6 +7,9 @@ import android.graphics.Typeface;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import com.amrdeveloper.codeview.Code;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.EnumUtils;
import org.mian.gitnex.R;
import org.mian.gitnex.databinding.ActivityCodeEditorBinding;
@ -15,15 +18,11 @@ import org.mian.gitnex.helpers.codeeditor.LanguageManager;
import org.mian.gitnex.helpers.codeeditor.LanguageName;
import org.mian.gitnex.helpers.codeeditor.SourcePositionListener;
import org.mian.gitnex.helpers.codeeditor.ThemeName;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author AmrDeveloper
* @author M M Arif
*/
public class CodeEditorActivity extends BaseActivity {
private final ThemeName currentTheme = ThemeName.FIVE_COLOR;
@ -37,7 +36,8 @@ public class CodeEditorActivity extends BaseActivity {
binding = ActivityCodeEditorBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
binding.close.setOnClickListener(view -> {
binding.close.setOnClickListener(
view -> {
sendResults();
finish();
});
@ -45,13 +45,12 @@ public class CodeEditorActivity extends BaseActivity {
String fileContent = getIntent().getStringExtra("fileContent");
String fileExtension;
if(getIntent().getStringExtra("fileExtension") != null) {
if (getIntent().getStringExtra("fileExtension") != null) {
fileExtension = getIntent().getStringExtra("fileExtension").toUpperCase();
if(EnumUtils.isValidEnum(LanguageName.class, fileExtension)) {
if (EnumUtils.isValidEnum(LanguageName.class, fileExtension)) {
currentLanguage = LanguageName.valueOf(fileExtension);
}
else {
} else {
currentLanguage = LanguageName.UNKNOWN;
}
}
@ -68,7 +67,8 @@ public class CodeEditorActivity extends BaseActivity {
private void configCodeView(LanguageName currentLanguage, String fileContent) {
binding.codeView.setTypeface(Typeface.createFromAsset(ctx.getAssets(), "fonts/sourcecodeproregular.ttf"));
binding.codeView.setTypeface(
Typeface.createFromAsset(ctx.getAssets(), "fonts/sourcecodeproregular.ttf"));
// Setup Line number feature
binding.codeView.setEnableLineNumber(true);
@ -105,28 +105,30 @@ public class CodeEditorActivity extends BaseActivity {
private void configLanguageAutoComplete() {
boolean useModernAutoCompleteAdapter = true;
if(useModernAutoCompleteAdapter) {
if (useModernAutoCompleteAdapter) {
List<Code> codeList = languageManager.getLanguageCodeList(currentLanguage);
CustomCodeViewAdapter adapter = new CustomCodeViewAdapter(this, codeList);
binding.codeView.setAdapter(adapter);
}
else {
} else {
String[] languageKeywords = languageManager.getLanguageKeywords(currentLanguage);
final int layoutId = R.layout.list_item_suggestion;
final int viewId = R.id.suggestItemTextView;
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, layoutId, viewId, languageKeywords);
ArrayAdapter<String> adapter =
new ArrayAdapter<>(this, layoutId, viewId, languageKeywords);
binding.codeView.setAdapter(adapter);
}
}
private void configLanguageAutoIndentation() {
binding.codeView.setIndentationStarts(languageManager.getLanguageIndentationStarts(currentLanguage));
binding.codeView.setIndentationEnds(languageManager.getLanguageIndentationEnds(currentLanguage));
binding.codeView.setIndentationStarts(
languageManager.getLanguageIndentationStarts(currentLanguage));
binding.codeView.setIndentationEnds(
languageManager.getLanguageIndentationEnds(currentLanguage));
}
private void configCodeViewPlugins() {
@ -141,10 +143,12 @@ public class CodeEditorActivity extends BaseActivity {
}
private void configSourcePositionListener() {
SourcePositionListener sourcePositionListener = new SourcePositionListener(binding.codeView);
sourcePositionListener.setOnPositionChanged((line, column) -> {
binding.sourcePosition.setText(getString(R.string.sourcePosition, line, column));
SourcePositionListener sourcePositionListener =
new SourcePositionListener(binding.codeView);
sourcePositionListener.setOnPositionChanged(
(line, column) -> {
binding.sourcePosition.setText(
getString(R.string.sourcePosition, line, column));
});
}
}

View File

@ -10,7 +10,6 @@ import org.mian.gitnex.fragments.DiffFragment;
/**
* @author qwerty287
*/
public class CommitDetailActivity extends BaseActivity {
@Override
@ -18,27 +17,35 @@ public class CommitDetailActivity extends BaseActivity {
super.onCreate(savedInstanceState);
ActivityCommitDetailsBinding binding = ActivityCommitDetailsBinding.inflate(getLayoutInflater());
ActivityCommitDetailsBinding binding =
ActivityCommitDetailsBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
CommitDetailFragment fragment = CommitDetailFragment.newInstance();
getOnBackPressedDispatcher().addCallback(new OnBackPressedCallback(true) {
getOnBackPressedDispatcher()
.addCallback(
new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
if(getSupportFragmentManager().findFragmentById(R.id.fragment_container) instanceof DiffFragment) {
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
}
else {
if (getSupportFragmentManager()
.findFragmentById(R.id.fragment_container)
instanceof DiffFragment) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, fragment)
.commit();
} else {
finish();
}
}
});
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, fragment)
.commit();
}
}

View File

@ -18,6 +18,8 @@ import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import java.util.ArrayList;
import java.util.List;
import org.gitnex.tea4j.v2.models.Commit;
import org.mian.gitnex.R;
import org.mian.gitnex.adapters.CommitsAdapter;
@ -26,8 +28,6 @@ import org.mian.gitnex.databinding.ActivityCommitsBinding;
import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -35,7 +35,6 @@ import retrofit2.Response;
/**
* @author M M Arif
*/
public class CommitsActivity extends BaseActivity {
private final String TAG = "CommitsActivity";
@ -55,7 +54,8 @@ public class CommitsActivity extends BaseActivity {
super.onCreate(savedInstanceState);
this.getClass().getName();
ActivityCommitsBinding activityCommitsBinding = ActivityCommitsBinding.inflate(getLayoutInflater());
ActivityCommitsBinding activityCommitsBinding =
ActivityCommitsBinding.inflate(getLayoutInflater());
setContentView(activityCommitsBinding.getRoot());
Toolbar toolbar = activityCommitsBinding.toolbar;
@ -81,20 +81,36 @@ public class CommitsActivity extends BaseActivity {
recyclerView = activityCommitsBinding.recyclerView;
commitsList = new ArrayList<>();
swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
swipeRefresh.setOnRefreshListener(
() ->
new Handler(Looper.getMainLooper())
.postDelayed(
() -> {
swipeRefresh.setRefreshing(false);
loadInitial(repository.getOwner(), repository.getName(), branchName, resultLimit);
loadInitial(
repository.getOwner(),
repository.getName(),
branchName,
resultLimit);
adapter.notifyDataChanged();
}, 200));
},
200));
adapter = new CommitsAdapter(ctx, commitsList);
adapter.setLoadMoreListener(() -> recyclerView.post(() -> {
if(commitsList.size() == resultLimit || pageSize == resultLimit) {
adapter.setLoadMoreListener(
() ->
recyclerView.post(
() -> {
if (commitsList.size() == resultLimit
|| pageSize == resultLimit) {
int page = (commitsList.size() + resultLimit) / resultLimit;
loadMore(repository.getOwner(), repository.getName(), page, branchName, resultLimit);
loadMore(
repository.getOwner(),
repository.getName(),
page,
branchName,
resultLimit);
}
}));
@ -105,37 +121,41 @@ public class CommitsActivity extends BaseActivity {
loadInitial(repository.getOwner(), repository.getName(), branchName, resultLimit);
}
private void loadInitial(String repoOwner, String repoName, String branchName, int resultLimit) {
private void loadInitial(
String repoOwner, String repoName, String branchName, int resultLimit) {
Call<List<Commit>> call = RetrofitClient.getApiInterface(ctx).repoGetAllCommits(repoOwner, repoName, branchName, null, 1, resultLimit);
Call<List<Commit>> call =
RetrofitClient.getApiInterface(ctx)
.repoGetAllCommits(repoOwner, repoName, branchName, null, 1, resultLimit);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<Commit>> call, @NonNull Response<List<Commit>> response) {
public void onResponse(
@NonNull Call<List<Commit>> call,
@NonNull Response<List<Commit>> response) {
if(response.code() == 200) {
if (response.code() == 200) {
assert response.body() != null;
if(response.body().size() > 0) {
if (response.body().size() > 0) {
commitsList.clear();
commitsList.addAll(response.body());
adapter.notifyDataChanged();
noData.setVisibility(View.GONE);
}
else {
} else {
commitsList.clear();
adapter.notifyDataChanged();
noData.setVisibility(View.VISIBLE);
}
}
if(response.code() == 409) {
if (response.code() == 409) {
noData.setVisibility(View.VISIBLE);
}
else {
} else {
Log.e(TAG, String.valueOf(response.code()));
}
@ -146,42 +166,46 @@ public class CommitsActivity extends BaseActivity {
@Override
public void onFailure(@NonNull Call<List<Commit>> call, @NonNull Throwable t) {
Toasty.error(ctx, getResources().getString(R.string.genericServerResponseError));
Toasty.error(
ctx, getResources().getString(R.string.genericServerResponseError));
}
});
}
private void loadMore(String repoOwner, String repoName, final int page, String branchName, int resultLimit) {
private void loadMore(
String repoOwner, String repoName, final int page, String branchName, int resultLimit) {
progressBar.setVisibility(View.VISIBLE);
Call<List<Commit>> call = RetrofitClient.getApiInterface(ctx).repoGetAllCommits(repoOwner, repoName, branchName, null, page, resultLimit);
Call<List<Commit>> call =
RetrofitClient.getApiInterface(ctx)
.repoGetAllCommits(
repoOwner, repoName, branchName, null, page, resultLimit);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<Commit>> call, @NonNull Response<List<Commit>> response) {
public void onResponse(
@NonNull Call<List<Commit>> call,
@NonNull Response<List<Commit>> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
List<Commit> result = response.body();
assert result != null;
if(result.size() > 0) {
if (result.size() > 0) {
pageSize = result.size();
commitsList.addAll(result);
}
else {
} else {
adapter.setMoreDataAvailable(false);
}
adapter.notifyDataChanged();
}
else {
} else {
Log.e(TAG, String.valueOf(response.code()));
}
@ -192,11 +216,10 @@ public class CommitsActivity extends BaseActivity {
@Override
public void onFailure(@NonNull Call<List<Commit>> call, @NonNull Throwable t) {
Toasty.error(ctx, getResources().getString(R.string.genericServerResponseError));
Toasty.error(
ctx, getResources().getString(R.string.genericServerResponseError));
}
});
}
@Override
@ -206,10 +229,12 @@ public class CommitsActivity extends BaseActivity {
inflater.inflate(R.menu.search_menu, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) searchItem.getActionView();
androidx.appcompat.widget.SearchView searchView =
(androidx.appcompat.widget.SearchView) searchItem.getActionView();
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
searchView.setOnQueryTextListener(
new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
@ -223,7 +248,6 @@ public class CommitsActivity extends BaseActivity {
filter(newText);
return true;
}
});
return super.onCreateOptionsMenu(menu);
@ -233,9 +257,10 @@ public class CommitsActivity extends BaseActivity {
List<Commit> arr = new ArrayList<>();
for(Commit d : commitsList) {
for (Commit d : commitsList) {
if(d.getCommit().getMessage().toLowerCase().contains(text) || d.getSha().toLowerCase().contains(text)) {
if (d.getCommit().getMessage().toLowerCase().contains(text)
|| d.getSha().toLowerCase().contains(text)) {
arr.add(d);
}
@ -254,7 +279,4 @@ public class CommitsActivity extends BaseActivity {
super.onResume();
repository.checkAccountSwitch(this);
}
}

View File

@ -14,6 +14,9 @@ import android.widget.TextView;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import org.apache.commons.io.FilenameUtils;
import org.gitnex.tea4j.v2.models.Branch;
import org.gitnex.tea4j.v2.models.CreateFileOptions;
@ -29,16 +32,12 @@ import org.mian.gitnex.helpers.AppUtil;
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 java.util.Objects;
import retrofit2.Call;
import retrofit2.Callback;
/**
* @author M M Arif
*/
public class CreateFileActivity extends BaseActivity {
public static final int FILE_ACTION_CREATE = 0;
@ -46,11 +45,15 @@ public class CreateFileActivity extends BaseActivity {
public static final int FILE_ACTION_EDIT = 2;
private final List<String> branches = new ArrayList<>();
private ActivityCreateFileBinding binding;
ActivityResultLauncher<Intent> codeEditorActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if(result.getResultCode() == Activity.RESULT_OK) {
ActivityResultLauncher<Intent> codeEditorActivityResultLauncher =
registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == Activity.RESULT_OK) {
Intent data = result.getData();
assert data != null;
binding.newFileContent.setText(data.getStringExtra("fileContentFromActivity"));
binding.newFileContent.setText(
data.getStringExtra("fileContentFromActivity"));
}
});
private int fileAction = FILE_ACTION_CREATE;
@ -73,25 +76,28 @@ public class CreateFileActivity extends BaseActivity {
binding.newFileName.requestFocus();
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodManager inputMethodManager =
(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
assert inputMethodManager != null;
inputMethodManager.showSoftInput(binding.newFileName, InputMethodManager.SHOW_IMPLICIT);
binding.close.setOnClickListener(view -> finish());
binding.newFileContent.setOnTouchListener((touchView, motionEvent) -> {
binding.newFileContent.setOnTouchListener(
(touchView, motionEvent) -> {
touchView.getParent().requestDisallowInterceptTouchEvent(true);
if((motionEvent.getAction() & MotionEvent.ACTION_UP) != 0 && (motionEvent.getActionMasked() & MotionEvent.ACTION_UP) != 0) {
if ((motionEvent.getAction() & MotionEvent.ACTION_UP) != 0
&& (motionEvent.getActionMasked() & MotionEvent.ACTION_UP) != 0) {
touchView.getParent().requestDisallowInterceptTouchEvent(false);
}
return false;
});
if(getIntent().getStringExtra("filePath") != null && getIntent().getIntExtra("fileAction", FILE_ACTION_DELETE) == FILE_ACTION_DELETE) {
if (getIntent().getStringExtra("filePath") != null
&& getIntent().getIntExtra("fileAction", FILE_ACTION_DELETE)
== FILE_ACTION_DELETE) {
fileAction = getIntent().getIntExtra("fileAction", FILE_ACTION_DELETE);
filePath = getIntent().getStringExtra("filePath");
@ -105,7 +111,8 @@ public class CreateFileActivity extends BaseActivity {
binding.newFileContentLayout.setVisibility(View.GONE);
}
if(getIntent().getStringExtra("filePath") != null && getIntent().getIntExtra("fileAction", FILE_ACTION_EDIT) == FILE_ACTION_EDIT) {
if (getIntent().getStringExtra("filePath") != null
&& getIntent().getIntExtra("fileAction", FILE_ACTION_EDIT) == FILE_ACTION_EDIT) {
fileAction = getIntent().getIntExtra("fileAction", FILE_ACTION_EDIT);
filePath = getIntent().getStringExtra("filePath");
@ -126,10 +133,17 @@ public class CreateFileActivity extends BaseActivity {
disableProcessButton();
binding.openCodeEditor.setOnClickListener(
v -> launchCodeEditorActivityForResult(Objects.requireNonNull(binding.newFileContent.getText()).toString(), FilenameUtils.getExtension(String.valueOf(binding.newFileName.getText()))));
v ->
launchCodeEditorActivityForResult(
Objects.requireNonNull(binding.newFileContent.getText()).toString(),
FilenameUtils.getExtension(
String.valueOf(binding.newFileName.getText()))));
NetworkStatusObserver networkStatusObserver = NetworkStatusObserver.getInstance(ctx);
networkStatusObserver.registerNetworkStatusListener(hasNetworkConnection -> runOnUiThread(() -> binding.newFileCreate.setEnabled(hasNetworkConnection)));
networkStatusObserver.registerNetworkStatusListener(
hasNetworkConnection ->
runOnUiThread(
() -> binding.newFileCreate.setEnabled(hasNetworkConnection)));
binding.newFileCreate.setOnClickListener(v -> processNewFile());
}
@ -143,71 +157,112 @@ public class CreateFileActivity extends BaseActivity {
private void processNewFile() {
String newFileName = binding.newFileName.getText() != null ? binding.newFileName.getText().toString() : "";
String newFileContent = binding.newFileContent.getText() != null ? binding.newFileContent.getText().toString() : "";
String newFileBranchName = binding.newFileBranches.getText() != null ? binding.newFileBranches.getText().toString() : "";
String newFileCommitMessage = binding.newFileCommitMessage.getText() != null ? binding.newFileCommitMessage.getText().toString() : "";
String newFileName =
binding.newFileName.getText() != null
? binding.newFileName.getText().toString()
: "";
String newFileContent =
binding.newFileContent.getText() != null
? binding.newFileContent.getText().toString()
: "";
String newFileBranchName =
binding.newFileBranches.getText() != null
? binding.newFileBranches.getText().toString()
: "";
String newFileCommitMessage =
binding.newFileCommitMessage.getText() != null
? binding.newFileCommitMessage.getText().toString()
: "";
if(!AppUtil.hasNetworkConnection(appCtx)) {
if (!AppUtil.hasNetworkConnection(appCtx)) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
return;
}
if(((newFileName.isEmpty() || newFileContent.isEmpty()) && fileAction != FILE_ACTION_DELETE) || newFileCommitMessage.isEmpty()) {
if (((newFileName.isEmpty() || newFileContent.isEmpty())
&& fileAction != FILE_ACTION_DELETE)
|| newFileCommitMessage.isEmpty()) {
Toasty.error(ctx, getString(R.string.newFileRequiredFields));
return;
}
if(!AppUtil.checkStringsWithDash(newFileBranchName)) {
if (!AppUtil.checkStringsWithDash(newFileBranchName)) {
Toasty.error(ctx, getString(R.string.newFileInvalidBranchName));
return;
}
if(newFileCommitMessage.length() > 255) {
if (newFileCommitMessage.length() > 255) {
Toasty.warning(ctx, getString(R.string.newFileCommitMessageError));
return;
}
disableProcessButton();
switch(fileAction) {
switch (fileAction) {
case FILE_ACTION_CREATE:
createNewFile(repository.getOwner(), repository.getName(), newFileName, AppUtil.encodeBase64(newFileContent), newFileCommitMessage, newFileBranchName);
createNewFile(
repository.getOwner(),
repository.getName(),
newFileName,
AppUtil.encodeBase64(newFileContent),
newFileCommitMessage,
newFileBranchName);
break;
case FILE_ACTION_DELETE:
deleteFile(repository.getOwner(), repository.getName(), filePath, newFileCommitMessage, newFileBranchName, fileSha);
deleteFile(
repository.getOwner(),
repository.getName(),
filePath,
newFileCommitMessage,
newFileBranchName,
fileSha);
break;
case FILE_ACTION_EDIT:
editFile(repository.getOwner(), repository.getName(), filePath, AppUtil.encodeBase64(newFileContent), newFileCommitMessage, newFileBranchName, fileSha);
editFile(
repository.getOwner(),
repository.getName(),
filePath,
AppUtil.encodeBase64(newFileContent),
newFileCommitMessage,
newFileBranchName,
fileSha);
break;
}
}
private void createNewFile(String repoOwner, String repoName, String fileName, String fileContent, String fileCommitMessage, String branchName) {
private void createNewFile(
String repoOwner,
String repoName,
String fileName,
String fileContent,
String fileCommitMessage,
String branchName) {
CreateFileOptions createNewFileJsonStr = new CreateFileOptions();
createNewFileJsonStr.setContent(fileContent);
createNewFileJsonStr.setMessage(fileCommitMessage);
if(branches.contains(branchName)) {
if (branches.contains(branchName)) {
createNewFileJsonStr.setBranch(branchName);
}
else {
} else {
createNewFileJsonStr.setNewBranch(branchName);
}
Call<FileResponse> call = RetrofitClient.getApiInterface(ctx).repoCreateFile(createNewFileJsonStr, repoOwner, repoName, fileName);
Call<FileResponse> call =
RetrofitClient.getApiInterface(ctx)
.repoCreateFile(createNewFileJsonStr, repoOwner, repoName, fileName);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<FileResponse> call, @NonNull retrofit2.Response<FileResponse> response) {
switch(response.code()) {
public void onResponse(
@NonNull Call<FileResponse> call,
@NonNull retrofit2.Response<FileResponse> response) {
switch (response.code()) {
case 201:
enableProcessButton();
Toasty.success(ctx, getString(R.string.newFileSuccessMessage));
@ -244,31 +299,44 @@ public class CreateFileActivity extends BaseActivity {
});
}
private void deleteFile(String repoOwner, String repoName, String fileName, String fileCommitMessage, String branchName, String fileSha) {
private void deleteFile(
String repoOwner,
String repoName,
String fileName,
String fileCommitMessage,
String branchName,
String fileSha) {
DeleteFileOptions deleteFileJsonStr = new DeleteFileOptions();
deleteFileJsonStr.setMessage(fileCommitMessage);
deleteFileJsonStr.setSha(fileSha);
if(branches.contains(branchName)) {
if (branches.contains(branchName)) {
deleteFileJsonStr.setBranch(branchName);
}
else {
} else {
deleteFileJsonStr.setNewBranch(branchName);
}
Call<FileDeleteResponse> call = RetrofitClient.getApiInterface(ctx).repoDeleteFileWithBody(repoOwner, repoName, fileName, deleteFileJsonStr);
Call<FileDeleteResponse> call =
RetrofitClient.getApiInterface(ctx)
.repoDeleteFileWithBody(repoOwner, repoName, fileName, deleteFileJsonStr);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<FileDeleteResponse> call, @NonNull retrofit2.Response<FileDeleteResponse> response) {
switch(response.code()) {
public void onResponse(
@NonNull Call<FileDeleteResponse> call,
@NonNull retrofit2.Response<FileDeleteResponse> response) {
switch (response.code()) {
case 200:
enableProcessButton();
Toasty.info(ctx, getString(R.string.deleteFileMessage, repository.getBranchRef()));
Toasty.info(
ctx,
getString(
R.string.deleteFileMessage,
repository.getBranchRef()));
Intent result = new Intent();
result.putExtra("fileModified", true);
result.putExtra("fileAction", fileAction);
@ -294,7 +362,8 @@ public class CreateFileActivity extends BaseActivity {
}
@Override
public void onFailure(@NonNull Call<FileDeleteResponse> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<FileDeleteResponse> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
enableProcessButton();
@ -302,29 +371,39 @@ public class CreateFileActivity extends BaseActivity {
});
}
private void editFile(String repoOwner, String repoName, String fileName, String fileContent, String fileCommitMessage, String branchName, String fileSha) {
private void editFile(
String repoOwner,
String repoName,
String fileName,
String fileContent,
String fileCommitMessage,
String branchName,
String fileSha) {
UpdateFileOptions editFileJsonStr = new UpdateFileOptions();
editFileJsonStr.setContent(fileContent);
editFileJsonStr.setMessage(fileCommitMessage);
editFileJsonStr.setSha(fileSha);
if(branches.contains(branchName)) {
if (branches.contains(branchName)) {
editFileJsonStr.setBranch(branchName);
}
else {
} else {
editFileJsonStr.setNewBranch(branchName);
}
Call<FileResponse> call = RetrofitClient.getApiInterface(ctx).repoUpdateFile(editFileJsonStr, repoOwner, repoName, fileName);
Call<FileResponse> call =
RetrofitClient.getApiInterface(ctx)
.repoUpdateFile(editFileJsonStr, repoOwner, repoName, fileName);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<FileResponse> call, @NonNull retrofit2.Response<FileResponse> response) {
switch(response.code()) {
public void onResponse(
@NonNull Call<FileResponse> call,
@NonNull retrofit2.Response<FileResponse> response) {
switch (response.code()) {
case 200:
enableProcessButton();
Toasty.info(ctx, getString(R.string.editFileMessage, branchName));
@ -363,20 +442,28 @@ public class CreateFileActivity extends BaseActivity {
private void getBranches(String repoOwner, String repoName) {
Call<List<Branch>> call = RetrofitClient.getApiInterface(ctx).repoListBranches(repoOwner, repoName, null, null);
Call<List<Branch>> call =
RetrofitClient.getApiInterface(ctx)
.repoListBranches(repoOwner, repoName, null, null);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<Branch>> call, @NonNull retrofit2.Response<List<Branch>> response) {
public void onResponse(
@NonNull Call<List<Branch>> call,
@NonNull retrofit2.Response<List<Branch>> response) {
if(response.code() == 200) {
if (response.code() == 200) {
assert response.body() != null;
for(Branch branch : response.body())
branches.add(branch.getName());
for (Branch branch : response.body()) branches.add(branch.getName());
ArrayAdapter<String> adapter = new ArrayAdapter<>(CreateFileActivity.this, R.layout.list_spinner_items, branches);
ArrayAdapter<String> adapter =
new ArrayAdapter<>(
CreateFileActivity.this,
R.layout.list_spinner_items,
branches);
binding.newFileBranches.setAdapter(adapter);
binding.newFileBranches.setText(repository.getBranchRef(), false);
@ -406,5 +493,4 @@ public class CreateFileActivity extends BaseActivity {
super.onResume();
repository.checkAccountSwitch(this);
}
}

View File

@ -12,6 +12,12 @@ import android.widget.ArrayAdapter;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Objects;
import org.gitnex.tea4j.v2.models.CreateIssueOption;
import org.gitnex.tea4j.v2.models.Issue;
import org.gitnex.tea4j.v2.models.Label;
@ -32,20 +38,16 @@ import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Objects;
import retrofit2.Call;
import retrofit2.Callback;
/**
* @author M M Arif
*/
public class CreateIssueActivity extends BaseActivity implements View.OnClickListener, LabelsListAdapter.LabelsListAdapterListener, AssigneesListAdapter.AssigneesListAdapterListener {
public class CreateIssueActivity extends BaseActivity
implements View.OnClickListener,
LabelsListAdapter.LabelsListAdapterListener,
AssigneesListAdapter.AssigneesListAdapterListener {
private final List<Label> labelsList = new ArrayList<>();
private final LinkedHashMap<String, Milestone> milestonesList = new LinkedHashMap<>();
@ -72,9 +74,11 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodManager imm =
(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx, R.style.ThemeOverlay_Material3_Dialog_Alert);
materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx, R.style.ThemeOverlay_Material3_Dialog_Alert);
repository = RepositoryContext.fromIntent(getIntent());
@ -84,11 +88,12 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
assert imm != null;
imm.showSoftInput(viewBinding.newIssueTitle, InputMethodManager.SHOW_IMPLICIT);
viewBinding.newIssueDescription.setOnTouchListener((touchView, motionEvent) -> {
viewBinding.newIssueDescription.setOnTouchListener(
(touchView, motionEvent) -> {
touchView.getParent().requestDisallowInterceptTouchEvent(true);
if((motionEvent.getAction() & MotionEvent.ACTION_UP) != 0 && (motionEvent.getActionMasked() & MotionEvent.ACTION_UP) != 0) {
if ((motionEvent.getAction() & MotionEvent.ACTION_UP) != 0
&& (motionEvent.getActionMasked() & MotionEvent.ACTION_UP) != 0) {
touchView.getParent().requestDisallowInterceptTouchEvent(false);
}
@ -96,7 +101,9 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
});
labelsAdapter = new LabelsListAdapter(labelsList, CreateIssueActivity.this, labelsIds);
assigneesAdapter = new AssigneesListAdapter(ctx, assigneesList, CreateIssueActivity.this, assigneesListData);
assigneesAdapter =
new AssigneesListAdapter(
ctx, assigneesList, CreateIssueActivity.this, assigneesListData);
initCloseListener();
viewBinding.close.setOnClickListener(onClickListener);
@ -111,31 +118,31 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
viewBinding.newIssueLabels.setOnClickListener(newIssueLabels -> showLabels());
viewBinding.newIssueAssigneesList.setOnClickListener(newIssueAssigneesList -> showAssignees());
viewBinding.newIssueAssigneesList.setOnClickListener(
newIssueAssigneesList -> showAssignees());
if(!connToInternet) {
if (!connToInternet) {
viewBinding.createNewIssueButton.setEnabled(false);
}
else {
} else {
viewBinding.createNewIssueButton.setOnClickListener(this);
}
if(!repository.getPermissions().isPush()) {
if (!repository.getPermissions().isPush()) {
viewBinding.newIssueAssigneesListLayout.setVisibility(View.GONE);
viewBinding.newIssueMilestoneSpinnerLayout.setVisibility(View.GONE);
viewBinding.newIssueLabelsLayout.setVisibility(View.GONE);
viewBinding.newIssueDueDateLayout.setVisibility(View.GONE);
}
}
@Override
public void assigneesInterface(List<String> data) {
String assigneesSetter = String.valueOf(data);
viewBinding.newIssueAssigneesList.setText(assigneesSetter.replace("]", "").replace("[", ""));
viewBinding.newIssueAssigneesList.setText(
assigneesSetter.replace("]", "").replace("[", ""));
assigneesListData = data;
}
@ -156,56 +163,87 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
viewBinding.progressBar.setVisibility(View.VISIBLE);
CustomAssigneesSelectionDialogBinding assigneesBinding = CustomAssigneesSelectionDialogBinding.inflate(LayoutInflater.from(ctx));
CustomAssigneesSelectionDialogBinding assigneesBinding =
CustomAssigneesSelectionDialogBinding.inflate(LayoutInflater.from(ctx));
View view = assigneesBinding.getRoot();
materialAlertDialogBuilder.setView(view);
materialAlertDialogBuilder.setNeutralButton(R.string.close, null);
AssigneesActions.getRepositoryAssignees(ctx, repository.getOwner(), repository.getName(), assigneesList, materialAlertDialogBuilder, assigneesAdapter, assigneesBinding, viewBinding.progressBar);
AssigneesActions.getRepositoryAssignees(
ctx,
repository.getOwner(),
repository.getName(),
assigneesList,
materialAlertDialogBuilder,
assigneesAdapter,
assigneesBinding,
viewBinding.progressBar);
}
private void showLabels() {
viewBinding.progressBar.setVisibility(View.VISIBLE);
CustomLabelsSelectionDialogBinding labelsBinding = CustomLabelsSelectionDialogBinding.inflate(LayoutInflater.from(ctx));
CustomLabelsSelectionDialogBinding labelsBinding =
CustomLabelsSelectionDialogBinding.inflate(LayoutInflater.from(ctx));
View view = labelsBinding.getRoot();
materialAlertDialogBuilder.setView(view);
materialAlertDialogBuilder.setNeutralButton(R.string.close, null);
LabelsActions.getRepositoryLabels(ctx, repository.getOwner(), repository.getName(), labelsList, materialAlertDialogBuilder, labelsAdapter, labelsBinding, viewBinding.progressBar);
LabelsActions.getRepositoryLabels(
ctx,
repository.getOwner(),
repository.getName(),
labelsList,
materialAlertDialogBuilder,
labelsAdapter,
labelsBinding,
viewBinding.progressBar);
}
private void processNewIssue() {
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
String newIssueTitleForm = Objects.requireNonNull(viewBinding.newIssueTitle.getText()).toString();
String newIssueDescriptionForm = Objects.requireNonNull(viewBinding.newIssueDescription.getText()).toString();
String newIssueDueDateForm = Objects.requireNonNull(viewBinding.newIssueDueDate.getText()).toString();
String newIssueTitleForm =
Objects.requireNonNull(viewBinding.newIssueTitle.getText()).toString();
String newIssueDescriptionForm =
Objects.requireNonNull(viewBinding.newIssueDescription.getText()).toString();
String newIssueDueDateForm =
Objects.requireNonNull(viewBinding.newIssueDueDate.getText()).toString();
if(!connToInternet) {
if (!connToInternet) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
return;
}
if(newIssueTitleForm.equals("")) {
if (newIssueTitleForm.equals("")) {
Toasty.error(ctx, getString(R.string.issueTitleEmpty));
return;
}
disableProcessButton();
createNewIssueFunc(repository.getOwner(), repository.getName(), newIssueDescriptionForm, milestoneId, newIssueTitleForm);
createNewIssueFunc(
repository.getOwner(),
repository.getName(),
newIssueDescriptionForm,
milestoneId,
newIssueTitleForm);
}
private void createNewIssueFunc(String repoOwner, String repoName, String newIssueDescriptionForm, int newIssueMilestoneIdForm, String newIssueTitleForm) {
private void createNewIssueFunc(
String repoOwner,
String repoName,
String newIssueDescriptionForm,
int newIssueMilestoneIdForm,
String newIssueTitleForm) {
ArrayList<Long> labelIds = new ArrayList<>();
for(Integer i : labelsIds) {
for (Integer i : labelsIds) {
labelIds.add((long) i);
}
@ -217,14 +255,19 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
createNewIssueJson.setAssignees(assigneesListData);
createNewIssueJson.setLabels(labelIds);
Call<Issue> call3 = RetrofitClient.getApiInterface(ctx).issueCreateIssue(repoOwner, repoName, createNewIssueJson);
Call<Issue> call3 =
RetrofitClient.getApiInterface(ctx)
.issueCreateIssue(repoOwner, repoName, createNewIssueJson);
call3.enqueue(new Callback<>() {
call3.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Issue> call, @NonNull retrofit2.Response<Issue> response2) {
public void onResponse(
@NonNull Call<Issue> call,
@NonNull retrofit2.Response<Issue> response2) {
if(response2.code() == 201) {
if (response2.code() == 201) {
IssuesFragment.resumeIssues = true;
@ -233,18 +276,15 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
RepoDetailActivity.updateRepo = true;
MainActivity.reloadRepos = true;
finish();
}
else if(response2.code() == 401) {
} else if (response2.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
} else {
Toasty.error(ctx, getString(R.string.genericError));
enableProcessButton();
}
}
@Override
@ -264,16 +304,21 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
private void getMilestones(String repoOwner, String repoName, int resultLimit) {
String msState = "open";
Call<List<Milestone>> call = RetrofitClient.getApiInterface(ctx).issueGetMilestonesList(repoOwner, repoName, msState, null, 1, resultLimit);
Call<List<Milestone>> call =
RetrofitClient.getApiInterface(ctx)
.issueGetMilestonesList(repoOwner, repoName, msState, null, 1, resultLimit);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<Milestone>> call, @NonNull retrofit2.Response<List<Milestone>> response) {
public void onResponse(
@NonNull Call<List<Milestone>> call,
@NonNull retrofit2.Response<List<Milestone>> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
if(response.code() == 200) {
if (response.code() == 200) {
List<Milestone> milestonesList_ = response.body();
@ -283,38 +328,49 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
milestonesList.put(ms.getTitle(), ms);
assert milestonesList_ != null;
if(milestonesList_.size() > 0) {
if (milestonesList_.size() > 0) {
for(Milestone milestone : milestonesList_) {
for (Milestone milestone : milestonesList_) {
//Don't translate "open" is a enum
if(milestone.getState().equals("open")) {
// Don't translate "open" is a enum
if (milestone.getState().equals("open")) {
milestonesList.put(milestone.getTitle(), milestone);
}
}
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(CreateIssueActivity.this, R.layout.list_spinner_items, new ArrayList<>(milestonesList.keySet()));
ArrayAdapter<String> adapter =
new ArrayAdapter<>(
CreateIssueActivity.this,
R.layout.list_spinner_items,
new ArrayList<>(milestonesList.keySet()));
viewBinding.newIssueMilestoneSpinner.setAdapter(adapter);
enableProcessButton();
viewBinding.newIssueMilestoneSpinner.setOnItemClickListener((parent, view, position, id) -> {
if(position == 0) {
viewBinding.newIssueMilestoneSpinner.setOnItemClickListener(
(parent, view, position, id) -> {
if (position == 0) {
milestoneId = 0;
}
else if(view instanceof TextView) {
milestoneId = Math.toIntExact(Objects.requireNonNull(milestonesList.get(((TextView) view).getText().toString())).getId());
} else if (view instanceof TextView) {
milestoneId =
Math.toIntExact(
Objects.requireNonNull(
milestonesList.get(
((TextView)
view)
.getText()
.toString()))
.getId());
}
});
}
}
}
@Override
public void onFailure(@NonNull Call<List<Milestone>> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<List<Milestone>> call, @NonNull Throwable t) {
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
@ -324,20 +380,30 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
@Override
public void onClick(View v) {
if(v == viewBinding.newIssueDueDate) {
if (v == viewBinding.newIssueDueDate) {
final Calendar c = Calendar.getInstance();
int mYear = c.get(Calendar.YEAR);
final int mMonth = c.get(Calendar.MONTH);
final int mDay = c.get(Calendar.DAY_OF_MONTH);
DatePickerDialog datePickerDialog = new DatePickerDialog(this, (view, year, monthOfYear, dayOfMonth) -> {
viewBinding.newIssueDueDate.setText(getString(R.string.setDueDate, year, (monthOfYear + 1), dayOfMonth));
DatePickerDialog datePickerDialog =
new DatePickerDialog(
this,
(view, year, monthOfYear, dayOfMonth) -> {
viewBinding.newIssueDueDate.setText(
getString(
R.string.setDueDate,
year,
(monthOfYear + 1),
dayOfMonth));
currentDate = new Date(year - 1900, monthOfYear, dayOfMonth);
}, mYear, mMonth, mDay);
},
mYear,
mMonth,
mDay);
datePickerDialog.show();
}
else if(v == viewBinding.createNewIssueButton) {
} else if (v == viewBinding.createNewIssueButton) {
processNewIssue();
}
@ -358,5 +424,4 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
super.onResume();
repository.checkAccountSwitch(this);
}
}

View File

@ -10,6 +10,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import com.pes.androidmaterialcolorpickerdialog.ColorPicker;
import java.util.Objects;
import org.gitnex.tea4j.v2.models.CreateLabelOption;
import org.gitnex.tea4j.v2.models.EditLabelOption;
import org.gitnex.tea4j.v2.models.Label;
@ -22,14 +23,12 @@ 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;
import retrofit2.Call;
import retrofit2.Callback;
/**
* @author M M Arif
*/
public class CreateLabelActivity extends BaseActivity {
public static boolean refreshLabels = false;
@ -51,13 +50,18 @@ public class CreateLabelActivity extends BaseActivity {
activityCreateLabelBinding = ActivityCreateLabelBinding.inflate(getLayoutInflater());
setContentView(activityCreateLabelBinding.getRoot());
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodManager imm =
(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
repository = RepositoryContext.fromIntent(getIntent());
if(getIntent().getStringExtra("labelAction") != null && Objects.requireNonNull(getIntent().getStringExtra("labelAction")).equals("delete")) {
if (getIntent().getStringExtra("labelAction") != null
&& Objects.requireNonNull(getIntent().getStringExtra("labelAction"))
.equals("delete")) {
deleteLabel(Integer.parseInt(Objects.requireNonNull(getIntent().getStringExtra("labelId"))));
deleteLabel(
Integer.parseInt(
Objects.requireNonNull(getIntent().getStringExtra("labelId"))));
finish();
return;
}
@ -74,15 +78,18 @@ public class CreateLabelActivity extends BaseActivity {
activityCreateLabelBinding.close.setOnClickListener(onClickListener);
activityCreateLabelBinding.colorPicker.setOnClickListener(v -> cp.show());
cp.setCallback(color -> {
cp.setCallback(
color -> {
//Log.i("#Hex no alpha", String.format("#%06X", (0xFFFFFF & color)));
// Log.i("#Hex no alpha", String.format("#%06X", (0xFFFFFF & color)));
activityCreateLabelBinding.colorPicker.setBackgroundColor(color);
labelColor = String.format("#%06X", (0xFFFFFF & color));
cp.dismiss();
});
if(getIntent().getStringExtra("labelAction") != null && Objects.requireNonNull(getIntent().getStringExtra("labelAction")).equals("edit")) {
if (getIntent().getStringExtra("labelAction") != null
&& Objects.requireNonNull(getIntent().getStringExtra("labelAction"))
.equals("edit")) {
activityCreateLabelBinding.labelName.setText(getIntent().getStringExtra("labelTitle"));
int labelColor_ = Color.parseColor("#" + getIntent().getStringExtra("labelColor"));
@ -91,17 +98,17 @@ public class CreateLabelActivity extends BaseActivity {
TextView toolbar_title = activityCreateLabelBinding.toolbarTitle;
toolbar_title.setText(getResources().getString(R.string.pageTitleLabelUpdate));
activityCreateLabelBinding.createLabelButton.setText(getResources().getString(R.string.newUpdateButtonCopy));
activityCreateLabelBinding.createLabelButton.setText(
getResources().getString(R.string.newUpdateButtonCopy));
activityCreateLabelBinding.createLabelButton.setOnClickListener(updateLabelListener);
return;
}
if(!connToInternet) {
if (!connToInternet) {
activityCreateLabelBinding.createLabelButton.setEnabled(false);
}
else {
} else {
activityCreateLabelBinding.createLabelButton.setOnClickListener(createLabelListener);
}
@ -111,69 +118,75 @@ public class CreateLabelActivity extends BaseActivity {
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
String updateLabelName = Objects.requireNonNull(activityCreateLabelBinding.labelName.getText()).toString();
String updateLabelName =
Objects.requireNonNull(activityCreateLabelBinding.labelName.getText()).toString();
String updateLabelColor;
if(labelColor.isEmpty()) {
if (labelColor.isEmpty()) {
updateLabelColor = labelColorDefault;
}
else {
} else {
updateLabelColor = labelColor;
}
if(!connToInternet) {
if (!connToInternet) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
return;
}
if(updateLabelName.equals("")) {
if (updateLabelName.equals("")) {
Toasty.error(ctx, getString(R.string.labelEmptyError));
return;
}
if(!AppUtil.checkStrings(updateLabelName)) {
if (!AppUtil.checkStrings(updateLabelName)) {
Toasty.error(ctx, getString(R.string.labelNameError));
return;
}
disableProcessButton();
patchLabel(repository, updateLabelName, updateLabelColor, Integer.parseInt(Objects.requireNonNull(getIntent().getStringExtra("labelId"))));
patchLabel(
repository,
updateLabelName,
updateLabelColor,
Integer.parseInt(Objects.requireNonNull(getIntent().getStringExtra("labelId"))));
}
private void processCreateLabel() {
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
String newLabelName = Objects.requireNonNull(activityCreateLabelBinding.labelName.getText()).toString();
String newLabelName =
Objects.requireNonNull(activityCreateLabelBinding.labelName.getText()).toString();
String newLabelColor;
if(labelColor.isEmpty()) {
if (labelColor.isEmpty()) {
newLabelColor = String.format("#%06X", (0xFFFFFF & ContextCompat.getColor(ctx, R.color.releasePre)));
}
else {
newLabelColor =
String.format(
"#%06X", (0xFFFFFF & ContextCompat.getColor(ctx, R.color.releasePre)));
} else {
newLabelColor = labelColor;
}
if(!connToInternet) {
if (!connToInternet) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
return;
}
if(newLabelName.equals("")) {
if (newLabelName.equals("")) {
Toasty.error(ctx, getString(R.string.labelEmptyError));
return;
}
if(!AppUtil.checkStrings(newLabelName)) {
if (!AppUtil.checkStrings(newLabelName)) {
Toasty.error(ctx, getString(R.string.labelNameError));
return;
@ -191,35 +204,40 @@ public class CreateLabelActivity extends BaseActivity {
Call<Label> call;
if(getIntent().getStringExtra("type") != null && Objects.requireNonNull(getIntent().getStringExtra("type")).equals("org")) {
if (getIntent().getStringExtra("type") != null
&& Objects.requireNonNull(getIntent().getStringExtra("type")).equals("org")) {
call = RetrofitClient.getApiInterface(ctx).orgCreateLabel(getIntent().getStringExtra("orgName"), createLabelFunc);
}
else if(repository != null) {
call =
RetrofitClient.getApiInterface(ctx)
.orgCreateLabel(getIntent().getStringExtra("orgName"), createLabelFunc);
} else if (repository != null) {
call = RetrofitClient.getApiInterface(ctx).issueCreateLabel(repository.getOwner(), repository.getName(), createLabelFunc);
}
else {
call =
RetrofitClient.getApiInterface(ctx)
.issueCreateLabel(
repository.getOwner(), repository.getName(), createLabelFunc);
} else {
return;
}
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Label> call, @NonNull retrofit2.Response<Label> response) {
public void onResponse(
@NonNull Call<Label> call,
@NonNull retrofit2.Response<Label> response) {
if(response.code() == 201) {
if (response.code() == 201) {
Toasty.success(ctx, getString(R.string.labelCreated));
refreshLabels = true;
finish();
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
} else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
@ -236,7 +254,11 @@ public class CreateLabelActivity extends BaseActivity {
});
}
private void patchLabel(RepositoryContext repository, String updateLabelName, String updateLabelColor, int labelId) {
private void patchLabel(
RepositoryContext repository,
String updateLabelName,
String updateLabelColor,
int labelId) {
EditLabelOption createLabelFunc = new EditLabelOption();
createLabelFunc.setColor(updateLabelColor);
@ -244,35 +266,47 @@ public class CreateLabelActivity extends BaseActivity {
Call<Label> call;
if(getIntent().getStringExtra("type") != null && Objects.requireNonNull(getIntent().getStringExtra("type")).equals("org")) {
if (getIntent().getStringExtra("type") != null
&& Objects.requireNonNull(getIntent().getStringExtra("type")).equals("org")) {
call = RetrofitClient.getApiInterface(ctx).orgEditLabel(getIntent().getStringExtra("orgName"), (long) labelId, createLabelFunc);
}
else {
call =
RetrofitClient.getApiInterface(ctx)
.orgEditLabel(
getIntent().getStringExtra("orgName"),
(long) labelId,
createLabelFunc);
} else {
call = RetrofitClient.getApiInterface(ctx).issueEditLabel(repository.getOwner(), repository.getName(), (long) labelId, createLabelFunc);
call =
RetrofitClient.getApiInterface(ctx)
.issueEditLabel(
repository.getOwner(),
repository.getName(),
(long) labelId,
createLabelFunc);
}
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Label> call, @NonNull retrofit2.Response<Label> response) {
public void onResponse(
@NonNull Call<Label> call,
@NonNull retrofit2.Response<Label> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
if(response.code() == 200) {
if (response.code() == 200) {
Toasty.success(ctx, getString(R.string.labelUpdated));
refreshLabels = true;
finish();
}
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
} else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
@ -299,40 +333,49 @@ public class CreateLabelActivity extends BaseActivity {
Call<Void> call;
if(getIntent().getStringExtra("type") != null && Objects.requireNonNull(getIntent().getStringExtra("type")).equals("org")) {
if (getIntent().getStringExtra("type") != null
&& Objects.requireNonNull(getIntent().getStringExtra("type")).equals("org")) {
call = RetrofitClient.getApiInterface(ctx).orgDeleteLabel(getIntent().getStringExtra("orgName"), (long) labelId);
}
else {
call =
RetrofitClient.getApiInterface(ctx)
.orgDeleteLabel(getIntent().getStringExtra("orgName"), (long) labelId);
} else {
call = RetrofitClient.getApiInterface(ctx).issueDeleteLabel(repository.getOwner(), repository.getName(), (long) labelId);
call =
RetrofitClient.getApiInterface(ctx)
.issueDeleteLabel(
repository.getOwner(), repository.getName(), (long) labelId);
}
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
if(response.code() == 204) {
if (response.code() == 204) {
Toasty.success(ctx, getString(R.string.labelDeleteText));
if(getIntent().getStringExtra("type") != null && Objects.requireNonNull(getIntent().getStringExtra("type")).equals("org")) {
if (getIntent().getStringExtra("type") != null
&& Objects.requireNonNull(
getIntent().getStringExtra("type"))
.equals("org")) {
OrganizationLabelsViewModel.loadOrgLabelsList(getIntent().getStringExtra("orgName"), ctx, null, null);
}
else {
OrganizationLabelsViewModel.loadOrgLabelsList(
getIntent().getStringExtra("orgName"), ctx, null, null);
} else {
LabelsViewModel.loadLabelsList(repository.getOwner(), repository.getName(), ctx);
LabelsViewModel.loadLabelsList(
repository.getOwner(), repository.getName(), ctx);
}
}
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
} else {
Toasty.error(ctx, getString(R.string.genericError));
}
@ -343,7 +386,6 @@ public class CreateLabelActivity extends BaseActivity {
Log.e("onFailure", t.toString());
}
});
}
private void disableProcessButton() {
@ -359,10 +401,9 @@ public class CreateLabelActivity extends BaseActivity {
@Override
public void onResume() {
super.onResume();
if(repository == null) {
if (repository == null) {
return;
}
repository.checkAccountSwitch(this);
}
}

View File

@ -13,6 +13,8 @@ import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import java.util.Calendar;
import java.util.Date;
import org.gitnex.tea4j.v2.models.CreateMilestoneOption;
import org.gitnex.tea4j.v2.models.Milestone;
import org.mian.gitnex.R;
@ -22,15 +24,12 @@ import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import java.util.Calendar;
import java.util.Date;
import retrofit2.Call;
import retrofit2.Callback;
/**
* @author M M Arif
*/
public class CreateMilestoneActivity extends BaseActivity implements View.OnClickListener {
private EditText milestoneDueDate;
@ -49,12 +48,14 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic
super.onCreate(savedInstanceState);
ActivityCreateMilestoneBinding activityCreateMilestoneBinding = ActivityCreateMilestoneBinding.inflate(getLayoutInflater());
ActivityCreateMilestoneBinding activityCreateMilestoneBinding =
ActivityCreateMilestoneBinding.inflate(getLayoutInflater());
setContentView(activityCreateMilestoneBinding.getRoot());
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodManager imm =
(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
milestoneDueDate = activityCreateMilestoneBinding.milestoneDueDate;
ImageView closeActivity = activityCreateMilestoneBinding.close;
@ -67,11 +68,12 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic
assert imm != null;
imm.showSoftInput(milestoneTitle, InputMethodManager.SHOW_IMPLICIT);
milestoneDescription.setOnTouchListener((touchView, motionEvent) -> {
milestoneDescription.setOnTouchListener(
(touchView, motionEvent) -> {
touchView.getParent().requestDisallowInterceptTouchEvent(true);
if((motionEvent.getAction() & MotionEvent.ACTION_UP) != 0 && (motionEvent.getActionMasked() & MotionEvent.ACTION_UP) != 0) {
if ((motionEvent.getAction() & MotionEvent.ACTION_UP) != 0
&& (motionEvent.getActionMasked() & MotionEvent.ACTION_UP) != 0) {
touchView.getParent().requestDisallowInterceptTouchEvent(false);
}
@ -82,15 +84,13 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic
closeActivity.setOnClickListener(onClickListener);
milestoneDueDate.setOnClickListener(this);
if(!connToInternet) {
if (!connToInternet) {
createNewMilestoneButton.setEnabled(false);
}
else {
} else {
createNewMilestoneButton.setOnClickListener(createMilestoneListener);
}
}
private void processNewMilestone() {
@ -100,21 +100,21 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic
String newMilestoneTitle = milestoneTitle.getText().toString();
String newMilestoneDescription = milestoneDescription.getText().toString();
if(!connToInternet) {
if (!connToInternet) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
return;
}
if(newMilestoneTitle.equals("")) {
if (newMilestoneTitle.equals("")) {
Toasty.error(ctx, getString(R.string.milestoneNameErrorEmpty));
return;
}
if(!newMilestoneDescription.equals("")) {
if (!newMilestoneDescription.equals("")) {
if(newMilestoneDescription.length() > 255) {
if (newMilestoneDescription.length() > 255) {
Toasty.warning(ctx, getString(R.string.milestoneDescError));
return;
@ -122,10 +122,18 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic
}
disableProcessButton();
createNewMilestone(repository.getOwner(), repository.getName(), newMilestoneTitle, newMilestoneDescription);
createNewMilestone(
repository.getOwner(),
repository.getName(),
newMilestoneTitle,
newMilestoneDescription);
}
private void createNewMilestone(String repoOwner, String repoName, String newMilestoneTitle, String newMilestoneDescription) {
private void createNewMilestone(
String repoOwner,
String repoName,
String newMilestoneTitle,
String newMilestoneDescription) {
CreateMilestoneOption createMilestone = new CreateMilestoneOption();
createMilestone.setDescription(newMilestoneDescription);
@ -134,16 +142,21 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic
Call<Milestone> call;
call = RetrofitClient.getApiInterface(ctx).issueCreateMilestone(repoOwner, repoName, createMilestone);
call =
RetrofitClient.getApiInterface(ctx)
.issueCreateMilestone(repoOwner, repoName, createMilestone);
call.enqueue(new Callback<Milestone>() {
call.enqueue(
new Callback<Milestone>() {
@Override
public void onResponse(@NonNull Call<Milestone> call, @NonNull retrofit2.Response<Milestone> response) {
public void onResponse(
@NonNull Call<Milestone> call,
@NonNull retrofit2.Response<Milestone> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
if(response.code() == 201) {
if (response.code() == 201) {
Intent result = new Intent();
result.putExtra("milestoneCreated", true);
@ -152,13 +165,11 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic
enableProcessButton();
finish();
}
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
} else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
@ -172,26 +183,35 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic
enableProcessButton();
}
});
}
@Override
public void onClick(View v) {
if(v == milestoneDueDate) {
if (v == milestoneDueDate) {
final Calendar c = Calendar.getInstance();
int mYear = c.get(Calendar.YEAR);
final int mMonth = c.get(Calendar.MONTH);
final int mDay = c.get(Calendar.DAY_OF_MONTH);
DatePickerDialog datePickerDialog = new DatePickerDialog(this, (view, year, monthOfYear, dayOfMonth) -> {
milestoneDueDate.setText(getString(R.string.setDueDate, year, (monthOfYear + 1), dayOfMonth));
DatePickerDialog datePickerDialog =
new DatePickerDialog(
this,
(view, year, monthOfYear, dayOfMonth) -> {
milestoneDueDate.setText(
getString(
R.string.setDueDate,
year,
(monthOfYear + 1),
dayOfMonth));
currentDate = new Date(year - 1900, monthOfYear, dayOfMonth);
}, mYear, mMonth, mDay);
},
mYear,
mMonth,
mDay);
datePickerDialog.show();
}
}
private void initCloseListener() {
@ -214,5 +234,4 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic
super.onResume();
repository.checkAccountSwitch(this);
}
}

View File

@ -24,7 +24,6 @@ import retrofit2.Callback;
/**
* @author M M Arif
*/
public class CreateNewUserActivity extends BaseActivity {
private View.OnClickListener onClickListener;
@ -40,12 +39,14 @@ public class CreateNewUserActivity extends BaseActivity {
super.onCreate(savedInstanceState);
ActivityCreateNewUserBinding activityCreateNewUserBinding = ActivityCreateNewUserBinding.inflate(getLayoutInflater());
ActivityCreateNewUserBinding activityCreateNewUserBinding =
ActivityCreateNewUserBinding.inflate(getLayoutInflater());
setContentView(activityCreateNewUserBinding.getRoot());
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodManager imm =
(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
ImageView closeActivity = activityCreateNewUserBinding.close;
createUserButton = activityCreateNewUserBinding.createUserButton;
@ -61,11 +62,10 @@ public class CreateNewUserActivity extends BaseActivity {
initCloseListener();
closeActivity.setOnClickListener(onClickListener);
if(!connToInternet) {
if (!connToInternet) {
disableProcessButton();
}
else {
} else {
createUserButton.setOnClickListener(createNewUserListener);
}
@ -80,31 +80,33 @@ public class CreateNewUserActivity extends BaseActivity {
String newUserEmail = userEmail.getText().toString().trim();
String newUserPassword = userPassword.getText().toString();
if(!connToInternet) {
if (!connToInternet) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
return;
}
if(newFullName.equals("") || newUserName.equals("") | newUserEmail.equals("") || newUserPassword.equals("")) {
if (newFullName.equals("")
|| newUserName.equals("") | newUserEmail.equals("")
|| newUserPassword.equals("")) {
Toasty.error(ctx, getString(R.string.emptyFields));
return;
}
if(!AppUtil.checkStrings(newFullName)) {
if (!AppUtil.checkStrings(newFullName)) {
Toasty.error(ctx, getString(R.string.userInvalidFullName));
return;
}
if(!AppUtil.checkStringsWithAlphaNumeric(newUserName)) {
if (!AppUtil.checkStringsWithAlphaNumeric(newUserName)) {
Toasty.error(ctx, getString(R.string.userInvalidUserName));
return;
}
if(!Patterns.EMAIL_ADDRESS.matcher(newUserEmail).matches()) {
if (!Patterns.EMAIL_ADDRESS.matcher(newUserEmail).matches()) {
Toasty.error(ctx, getString(R.string.userInvalidEmail));
return;
@ -114,7 +116,8 @@ public class CreateNewUserActivity extends BaseActivity {
createNewUser(newFullName, newUserName, newUserEmail, newUserPassword);
}
private void createNewUser(String newFullName, String newUserName, String newUserEmail, String newUserPassword) {
private void createNewUser(
String newFullName, String newUserName, String newUserEmail, String newUserPassword) {
CreateUserOption createUser = new CreateUserOption();
createUser.setEmail(newUserEmail);
@ -125,38 +128,35 @@ public class CreateNewUserActivity extends BaseActivity {
Call<User> call = RetrofitClient.getApiInterface(ctx).adminCreateUser(createUser);
call.enqueue(new Callback<User>() {
call.enqueue(
new Callback<User>() {
@Override
public void onResponse(@NonNull Call<User> call, @NonNull retrofit2.Response<User> response) {
public void onResponse(
@NonNull Call<User> call, @NonNull retrofit2.Response<User> response) {
if(response.code() == 201) {
if (response.code() == 201) {
Toasty.success(ctx, getString(R.string.userCreatedText));
enableProcessButton();
finish();
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else if(response.code() == 403) {
} else if (response.code() == 403) {
enableProcessButton();
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
enableProcessButton();
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
}
else if(response.code() == 422) {
} else if (response.code() == 422) {
enableProcessButton();
Toasty.warning(ctx, ctx.getString(R.string.userExistsError));
}
else {
} else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
@ -170,7 +170,6 @@ public class CreateNewUserActivity extends BaseActivity {
enableProcessButton();
}
});
}
private void initCloseListener() {
@ -187,5 +186,4 @@ public class CreateNewUserActivity extends BaseActivity {
createUserButton.setEnabled(true);
}
}

View File

@ -26,7 +26,6 @@ import retrofit2.Callback;
/**
* @author M M Arif
*/
public class CreateOrganizationActivity extends BaseActivity {
public ImageView closeActivity;
@ -43,12 +42,14 @@ public class CreateOrganizationActivity extends BaseActivity {
super.onCreate(savedInstanceState);
ActivityCreateOrganizationBinding activityCreateOrganizationBinding = ActivityCreateOrganizationBinding.inflate(getLayoutInflater());
ActivityCreateOrganizationBinding activityCreateOrganizationBinding =
ActivityCreateOrganizationBinding.inflate(getLayoutInflater());
setContentView(activityCreateOrganizationBinding.getRoot());
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodManager imm =
(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
closeActivity = activityCreateOrganizationBinding.close;
orgName = activityCreateOrganizationBinding.newOrganizationName;
@ -58,11 +59,12 @@ public class CreateOrganizationActivity extends BaseActivity {
assert imm != null;
imm.showSoftInput(orgName, InputMethodManager.SHOW_IMPLICIT);
orgDesc.setOnTouchListener((touchView, motionEvent) -> {
orgDesc.setOnTouchListener(
(touchView, motionEvent) -> {
touchView.getParent().requestDisallowInterceptTouchEvent(true);
if((motionEvent.getAction() & MotionEvent.ACTION_UP) != 0 && (motionEvent.getActionMasked() & MotionEvent.ACTION_UP) != 0) {
if ((motionEvent.getAction() & MotionEvent.ACTION_UP) != 0
&& (motionEvent.getActionMasked() & MotionEvent.ACTION_UP) != 0) {
touchView.getParent().requestDisallowInterceptTouchEvent(false);
}
@ -74,15 +76,13 @@ public class CreateOrganizationActivity extends BaseActivity {
createOrganizationButton = activityCreateOrganizationBinding.createNewOrganizationButton;
if(!connToInternet) {
if (!connToInternet) {
createOrganizationButton.setEnabled(false);
}
else {
} else {
createOrganizationButton.setOnClickListener(createOrgListener);
}
}
private void initCloseListener() {
@ -97,35 +97,32 @@ public class CreateOrganizationActivity extends BaseActivity {
String newOrgName = orgName.getText().toString();
String newOrgDesc = orgDesc.getText().toString();
if(!connToInternet) {
if (!connToInternet) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
return;
}
if(!newOrgDesc.equals("")) {
if (!newOrgDesc.equals("")) {
if(newOrgDesc.length() > 255) {
if (newOrgDesc.length() > 255) {
Toasty.warning(ctx, getString(R.string.orgDescError));
return;
}
}
if(newOrgName.equals("")) {
if (newOrgName.equals("")) {
Toasty.error(ctx, getString(R.string.orgNameErrorEmpty));
}
else if(!AppUtil.checkStrings(newOrgName)) {
} else if (!AppUtil.checkStrings(newOrgName)) {
Toasty.warning(ctx, getString(R.string.orgNameErrorInvalid));
}
else {
} else {
disableProcessButton();
createNewOrganization(newOrgName, newOrgDesc);
}
}
private void createNewOrganization(String orgName, String orgDesc) {
@ -136,40 +133,38 @@ public class CreateOrganizationActivity extends BaseActivity {
Call<Organization> call = RetrofitClient.getApiInterface(ctx).orgCreate(createOrganization);
call.enqueue(new Callback<Organization>() {
call.enqueue(
new Callback<Organization>() {
@Override
public void onResponse(@NonNull Call<Organization> call, @NonNull retrofit2.Response<Organization> response) {
public void onResponse(
@NonNull Call<Organization> call,
@NonNull retrofit2.Response<Organization> response) {
if(response.code() == 201) {
if (response.code() == 201) {
OrganizationsFragment.orgCreated = true;
enableProcessButton();
Toasty.success(ctx, getString(R.string.orgCreated));
finish();
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else if(response.code() == 409) {
} else if (response.code() == 409) {
enableProcessButton();
Toasty.warning(ctx, getString(R.string.orgExistsError));
}
else if(response.code() == 422) {
} else if (response.code() == 422) {
enableProcessButton();
Toasty.warning(ctx, getString(R.string.orgExistsError));
}
else {
} else {
if(response.code() == 404) {
if (response.code() == 404) {
enableProcessButton();
Toasty.warning(ctx, getString(R.string.apiNotFound));
}
else {
} else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
@ -184,7 +179,6 @@ public class CreateOrganizationActivity extends BaseActivity {
enableProcessButton();
}
});
}
private void disableProcessButton() {
@ -196,5 +190,4 @@ public class CreateOrganizationActivity extends BaseActivity {
createOrganizationButton.setEnabled(true);
}
}

View File

@ -11,6 +11,12 @@ import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Objects;
import org.gitnex.tea4j.v2.models.Branch;
import org.gitnex.tea4j.v2.models.CreatePullRequestOption;
import org.gitnex.tea4j.v2.models.Label;
@ -26,20 +32,14 @@ import org.mian.gitnex.fragments.PullRequestsFragment;
import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Objects;
import retrofit2.Call;
import retrofit2.Callback;
/**
* @author M M Arif
*/
public class CreatePullRequestActivity extends BaseActivity implements LabelsListAdapter.LabelsListAdapterListener {
public class CreatePullRequestActivity extends BaseActivity
implements LabelsListAdapter.LabelsListAdapterListener {
private final List<String> assignees = new ArrayList<>();
LinkedHashMap<String, Milestone> milestonesList = new LinkedHashMap<>();
@ -63,24 +63,27 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis
viewBinding = ActivityCreatePrBinding.inflate(getLayoutInflater());
setContentView(viewBinding.getRoot());
materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx, R.style.ThemeOverlay_Material3_Dialog_Alert);
materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx, R.style.ThemeOverlay_Material3_Dialog_Alert);
repository = RepositoryContext.fromIntent(getIntent());
int resultLimit = Constants.getCurrentResultLimit(ctx);
viewBinding.prBody.setOnTouchListener((touchView, motionEvent) -> {
viewBinding.prBody.setOnTouchListener(
(touchView, motionEvent) -> {
touchView.getParent().requestDisallowInterceptTouchEvent(true);
if((motionEvent.getAction() & MotionEvent.ACTION_UP) != 0 && (motionEvent.getActionMasked() & MotionEvent.ACTION_UP) != 0) {
if ((motionEvent.getAction() & MotionEvent.ACTION_UP) != 0
&& (motionEvent.getActionMasked() & MotionEvent.ACTION_UP) != 0) {
touchView.getParent().requestDisallowInterceptTouchEvent(false);
}
return false;
});
labelsAdapter = new LabelsListAdapter(labelsList, CreatePullRequestActivity.this, labelsIds);
labelsAdapter =
new LabelsListAdapter(labelsList, CreatePullRequestActivity.this, labelsIds);
ImageView closeActivity = findViewById(R.id.close);
@ -98,7 +101,7 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis
viewBinding.createPr.setOnClickListener(createPr -> processPullRequest());
if(!repository.getPermissions().isPush()) {
if (!repository.getPermissions().isPush()) {
viewBinding.prDueDateLayout.setVisibility(View.GONE);
viewBinding.prLabelsLayout.setVisibility(View.GONE);
viewBinding.milestonesSpinnerLayout.setVisibility(View.GONE);
@ -114,37 +117,39 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis
assignees.add("");
if(labelsIds.size() == 0) {
if (labelsIds.size() == 0) {
labelsIds.add(0);
}
if(prTitle.matches("")) {
if (prTitle.matches("")) {
Toasty.error(ctx, getString(R.string.titleError));
}
else if(mergeInto.matches("")) {
} else if (mergeInto.matches("")) {
Toasty.error(ctx, getString(R.string.mergeIntoError));
}
else if(pullFrom.matches("")) {
} else if (pullFrom.matches("")) {
Toasty.error(ctx, getString(R.string.pullFromError));
}
else if(pullFrom.equals(mergeInto)) {
} else if (pullFrom.equals(mergeInto)) {
Toasty.error(ctx, getString(R.string.sameBranchesError));
}
else {
} else {
createPullRequest(prTitle, prDescription, mergeInto, pullFrom, milestoneId, assignees);
}
}
private void createPullRequest(String prTitle, String prDescription, String mergeInto, String pullFrom, int milestoneId, List<String> assignees) {
private void createPullRequest(
String prTitle,
String prDescription,
String mergeInto,
String pullFrom,
int milestoneId,
List<String> assignees) {
ArrayList<Long> labelIds = new ArrayList<>();
for(Integer i : labelsIds) {
for (Integer i : labelsIds) {
labelIds.add((long) i);
}
@ -158,34 +163,38 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis
createPullRequest.setLabels(labelIds);
createPullRequest.setDueDate(currentDate);
Call<PullRequest> transferCall = RetrofitClient.getApiInterface(ctx).repoCreatePullRequest(repository.getOwner(), repository.getName(), createPullRequest);
Call<PullRequest> transferCall =
RetrofitClient.getApiInterface(ctx)
.repoCreatePullRequest(
repository.getOwner(), repository.getName(), createPullRequest);
transferCall.enqueue(new Callback<>() {
transferCall.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<PullRequest> call, @NonNull retrofit2.Response<PullRequest> response) {
public void onResponse(
@NonNull Call<PullRequest> call,
@NonNull retrofit2.Response<PullRequest> response) {
disableProcessButton();
if(response.code() == 201) {
if (response.code() == 201) {
Toasty.success(ctx, getString(R.string.prCreateSuccess));
RepoDetailActivity.updateRepo = true;
PullRequestsFragment.resumePullRequests = true;
MainActivity.reloadRepos = true;
finish();
}
else if(response.code() == 409 || response.message().equals("Conflict")) {
} else if (response.code() == 409
|| response.message().equals("Conflict")) {
enableProcessButton();
Toasty.error(ctx, getString(R.string.prAlreadyExists));
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
enableProcessButton();
Toasty.error(ctx, getString(R.string.apiNotFound));
}
else {
} else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
@ -217,43 +226,59 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis
private void showLabels() {
viewBinding.progressBar.setVisibility(View.VISIBLE);
CustomLabelsSelectionDialogBinding labelsBinding = CustomLabelsSelectionDialogBinding.inflate(LayoutInflater.from(ctx));
CustomLabelsSelectionDialogBinding labelsBinding =
CustomLabelsSelectionDialogBinding.inflate(LayoutInflater.from(ctx));
View view = labelsBinding.getRoot();
materialAlertDialogBuilder.setView(view);
materialAlertDialogBuilder.setNeutralButton(R.string.close, null);
LabelsActions.getRepositoryLabels(ctx, repository.getOwner(), repository.getName(), labelsList, materialAlertDialogBuilder, labelsAdapter, labelsBinding, viewBinding.progressBar);
LabelsActions.getRepositoryLabels(
ctx,
repository.getOwner(),
repository.getName(),
labelsList,
materialAlertDialogBuilder,
labelsAdapter,
labelsBinding,
viewBinding.progressBar);
}
private void getBranches(String repoOwner, String repoName) {
Call<List<Branch>> call = RetrofitClient.getApiInterface(ctx).repoListBranches(repoOwner, repoName, null, null);
Call<List<Branch>> call =
RetrofitClient.getApiInterface(ctx)
.repoListBranches(repoOwner, repoName, null, null);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<Branch>> call, @NonNull retrofit2.Response<List<Branch>> response) {
public void onResponse(
@NonNull Call<List<Branch>> call,
@NonNull retrofit2.Response<List<Branch>> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
if(response.code() == 200) {
if (response.code() == 200) {
List<Branch> branchesList_ = response.body();
assert branchesList_ != null;
for(Branch i : branchesList_) {
for (Branch i : branchesList_) {
branchesList.add(i.getName());
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(CreatePullRequestActivity.this, R.layout.list_spinner_items, branchesList);
ArrayAdapter<String> adapter =
new ArrayAdapter<>(
CreatePullRequestActivity.this,
R.layout.list_spinner_items,
branchesList);
viewBinding.mergeIntoBranchSpinner.setAdapter(adapter);
viewBinding.pullFromBranchSpinner.setAdapter(adapter);
enableProcessButton();
}
}
}
@Override
@ -267,50 +292,71 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis
private void getMilestones(String repoOwner, String repoName, int resultLimit) {
String msState = "open";
Call<List<Milestone>> call = RetrofitClient.getApiInterface(ctx).issueGetMilestonesList(repoOwner, repoName, msState, null, 1, resultLimit);
Call<List<Milestone>> call =
RetrofitClient.getApiInterface(ctx)
.issueGetMilestonesList(repoOwner, repoName, msState, null, 1, resultLimit);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<Milestone>> call, @NonNull retrofit2.Response<List<Milestone>> response) {
public void onResponse(
@NonNull Call<List<Milestone>> call,
@NonNull retrofit2.Response<List<Milestone>> response) {
if(response.code() == 200) {
if (response.code() == 200) {
List<Milestone> milestonesList_ = response.body();
milestonesList.put(getString(R.string.issueCreatedNoMilestone), new Milestone().id(0L).title(getString(R.string.issueCreatedNoMilestone)));
milestonesList.put(
getString(R.string.issueCreatedNoMilestone),
new Milestone()
.id(0L)
.title(getString(R.string.issueCreatedNoMilestone)));
assert milestonesList_ != null;
if(milestonesList_.size() > 0) {
if (milestonesList_.size() > 0) {
for(Milestone milestone : milestonesList_) {
for (Milestone milestone : milestonesList_) {
//Don't translate "open" is a enum
if(milestone.getState().equals("open")) {
// Don't translate "open" is a enum
if (milestone.getState().equals("open")) {
milestonesList.put(milestone.getTitle(), milestone);
}
}
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(CreatePullRequestActivity.this, R.layout.list_spinner_items, new ArrayList<>(milestonesList.keySet()));
ArrayAdapter<String> adapter =
new ArrayAdapter<>(
CreatePullRequestActivity.this,
R.layout.list_spinner_items,
new ArrayList<>(milestonesList.keySet()));
viewBinding.milestonesSpinner.setAdapter(adapter);
enableProcessButton();
viewBinding.milestonesSpinner.setOnItemClickListener((parent, view, position, id) -> {
if(position == 0) {
viewBinding.milestonesSpinner.setOnItemClickListener(
(parent, view, position, id) -> {
if (position == 0) {
milestoneId = 0;
}
else if(view instanceof TextView) {
milestoneId = Math.toIntExact(Objects.requireNonNull(milestonesList.get(((TextView) view).getText().toString())).getId());
} else if (view instanceof TextView) {
milestoneId =
Math.toIntExact(
Objects.requireNonNull(
milestonesList.get(
((TextView)
view)
.getText()
.toString()))
.getId());
}
});
}
}
@Override
public void onFailure(@NonNull Call<List<Milestone>> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<List<Milestone>> call, @NonNull Throwable t) {
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
@ -324,10 +370,21 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis
final int mMonth = c.get(Calendar.MONTH);
final int mDay = c.get(Calendar.DAY_OF_MONTH);
DatePickerDialog datePickerDialog = new DatePickerDialog(this, (view, year, monthOfYear, dayOfMonth) -> {
viewBinding.prDueDate.setText(getString(R.string.setDueDate, year, (monthOfYear + 1), dayOfMonth));
DatePickerDialog datePickerDialog =
new DatePickerDialog(
this,
(view, year, monthOfYear, dayOfMonth) -> {
viewBinding.prDueDate.setText(
getString(
R.string.setDueDate,
year,
(monthOfYear + 1),
dayOfMonth));
currentDate = new Date(year - 1900, monthOfYear, dayOfMonth);
}, mYear, mMonth, mDay);
},
mYear,
mMonth,
mDay);
datePickerDialog.show();
}
@ -351,5 +408,4 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis
super.onResume();
repository.checkAccountSwitch(this);
}
}

View File

@ -15,6 +15,8 @@ import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.List;
import org.gitnex.tea4j.v2.models.Branch;
import org.gitnex.tea4j.v2.models.CreateReleaseOption;
import org.gitnex.tea4j.v2.models.CreateTagOption;
@ -27,15 +29,12 @@ import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
/**
* @author M M Arif
*/
public class CreateReleaseActivity extends BaseActivity {
public ImageView closeActivity;
@ -59,12 +58,14 @@ public class CreateReleaseActivity extends BaseActivity {
super.onCreate(savedInstanceState);
ActivityCreateReleaseBinding activityCreateReleaseBinding = ActivityCreateReleaseBinding.inflate(getLayoutInflater());
ActivityCreateReleaseBinding activityCreateReleaseBinding =
ActivityCreateReleaseBinding.inflate(getLayoutInflater());
setContentView(activityCreateReleaseBinding.getRoot());
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodManager imm =
(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
repository = RepositoryContext.fromIntent(getIntent());
@ -79,11 +80,12 @@ public class CreateReleaseActivity extends BaseActivity {
assert imm != null;
imm.showSoftInput(releaseTitle, InputMethodManager.SHOW_IMPLICIT);
releaseContent.setOnTouchListener((touchView, motionEvent) -> {
releaseContent.setOnTouchListener(
(touchView, motionEvent) -> {
touchView.getParent().requestDisallowInterceptTouchEvent(true);
if((motionEvent.getAction() & MotionEvent.ACTION_UP) != 0 && (motionEvent.getActionMasked() & MotionEvent.ACTION_UP) != 0) {
if ((motionEvent.getAction() & MotionEvent.ACTION_UP) != 0
&& (motionEvent.getActionMasked() & MotionEvent.ACTION_UP) != 0) {
touchView.getParent().requestDisallowInterceptTouchEvent(false);
}
@ -100,11 +102,10 @@ public class CreateReleaseActivity extends BaseActivity {
createNewTag = activityCreateReleaseBinding.createNewTag;
disableProcessButton();
if(!connToInternet) {
if (!connToInternet) {
disableProcessButton();
}
else {
} else {
createNewRelease.setOnClickListener(createReleaseListener);
}
@ -116,19 +117,20 @@ public class CreateReleaseActivity extends BaseActivity {
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
String tagName = releaseTagName.getText().toString();
String message = releaseTitle.getText().toString() + "\n\n" + releaseContent.getText().toString();
String message =
releaseTitle.getText().toString() + "\n\n" + releaseContent.getText().toString();
if(!connToInternet) {
if (!connToInternet) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
return;
}
if(tagName.equals("")) {
if (tagName.equals("")) {
Toasty.error(ctx, getString(R.string.tagNameErrorEmpty));
return;
}
if(selectedBranch == null) {
if (selectedBranch == null) {
Toasty.error(ctx, getString(R.string.selectBranchError));
return;
}
@ -140,34 +142,35 @@ public class CreateReleaseActivity extends BaseActivity {
createReleaseJson.setTagName(tagName);
createReleaseJson.setTarget(selectedBranch);
Call<Tag> call = RetrofitClient.getApiInterface(ctx).repoCreateTag(repository.getOwner(), repository.getName(), createReleaseJson);
Call<Tag> call =
RetrofitClient.getApiInterface(ctx)
.repoCreateTag(
repository.getOwner(), repository.getName(), createReleaseJson);
call.enqueue(new Callback<Tag>() {
call.enqueue(
new Callback<Tag>() {
@Override
public void onResponse(@NonNull Call<Tag> call, @NonNull retrofit2.Response<Tag> response) {
public void onResponse(
@NonNull Call<Tag> call, @NonNull retrofit2.Response<Tag> response) {
if(response.code() == 201) {
if (response.code() == 201) {
Intent result = new Intent();
result.putExtra("updateReleases", true);
setResult(201, result);
Toasty.success(ctx, getString(R.string.tagCreated));
finish();
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else if(response.code() == 403) {
} else if (response.code() == 403) {
enableProcessButton();
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
enableProcessButton();
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
}
else {
} else {
enableProcessButton();
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
@ -192,35 +195,50 @@ public class CreateReleaseActivity extends BaseActivity {
boolean newReleaseType = releaseType.isChecked();
boolean newReleaseDraft = releaseDraft.isChecked();
if(!connToInternet) {
if (!connToInternet) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
return;
}
if(newReleaseTitle.equals("")) {
if (newReleaseTitle.equals("")) {
Toasty.error(ctx, getString(R.string.titleErrorEmpty));
return;
}
if(newReleaseTagName.equals("")) {
if (newReleaseTagName.equals("")) {
Toasty.error(ctx, getString(R.string.tagNameErrorEmpty));
return;
}
if(checkBranch == null) {
if (checkBranch == null) {
Toasty.error(ctx, getString(R.string.selectBranchError));
return;
}
disableProcessButton();
createNewReleaseFunc(repository.getOwner(), repository.getName(), newReleaseTagName, newReleaseTitle, newReleaseContent, selectedBranch, newReleaseType, newReleaseDraft);
createNewReleaseFunc(
repository.getOwner(),
repository.getName(),
newReleaseTagName,
newReleaseTitle,
newReleaseContent,
selectedBranch,
newReleaseType,
newReleaseDraft);
}
private void createNewReleaseFunc(String repoOwner, String repoName, String newReleaseTagName, String newReleaseTitle, String newReleaseContent, String selectedBranch, boolean newReleaseType,
private void createNewReleaseFunc(
String repoOwner,
String repoName,
String newReleaseTagName,
String newReleaseTitle,
String newReleaseContent,
String selectedBranch,
boolean newReleaseType,
boolean newReleaseDraft) {
CreateReleaseOption createReleaseJson = new CreateReleaseOption();
@ -231,37 +249,38 @@ public class CreateReleaseActivity extends BaseActivity {
createReleaseJson.setPrerelease(newReleaseType);
createReleaseJson.setTargetCommitish(selectedBranch);
Call<Release> call = RetrofitClient.getApiInterface(ctx).repoCreateRelease(repoOwner, repoName, createReleaseJson);
Call<Release> call =
RetrofitClient.getApiInterface(ctx)
.repoCreateRelease(repoOwner, repoName, createReleaseJson);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Release> call, @NonNull retrofit2.Response<Release> response) {
public void onResponse(
@NonNull Call<Release> call,
@NonNull retrofit2.Response<Release> response) {
if(response.code() == 201) {
if (response.code() == 201) {
Intent result = new Intent();
result.putExtra("updateReleases", true);
setResult(201, result);
Toasty.success(ctx, getString(R.string.releaseCreatedText));
finish();
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else if(response.code() == 403) {
} else if (response.code() == 403) {
enableProcessButton();
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
enableProcessButton();
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
}
else {
} else {
enableProcessButton();
Toasty.error(ctx, ctx.getString(R.string.genericError));
@ -273,49 +292,55 @@ public class CreateReleaseActivity extends BaseActivity {
enableProcessButton();
}
});
}
private void getBranches(final String repoOwner, final String repoName) {
Call<List<Branch>> call = RetrofitClient.getApiInterface(ctx).repoListBranches(repoOwner, repoName, null, null);
Call<List<Branch>> call =
RetrofitClient.getApiInterface(ctx)
.repoListBranches(repoOwner, repoName, null, null);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<Branch>> call, @NonNull retrofit2.Response<List<Branch>> response) {
public void onResponse(
@NonNull Call<List<Branch>> call,
@NonNull retrofit2.Response<List<Branch>> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
if(response.code() == 200) {
if (response.code() == 200) {
List<Branch> branchesList_ = response.body();
assert branchesList_ != null;
for(Branch i : branchesList_) {
for (Branch i : branchesList_) {
branchesList.add(i.getName());
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(CreateReleaseActivity.this, R.layout.list_spinner_items, branchesList);
ArrayAdapter<String> adapter =
new ArrayAdapter<>(
CreateReleaseActivity.this,
R.layout.list_spinner_items,
branchesList);
releaseBranch.setAdapter(adapter);
enableProcessButton();
releaseBranch.setOnItemClickListener((parent, view, position, id) -> selectedBranch = branchesList.get(position));
releaseBranch.setOnItemClickListener(
(parent, view, position, id) ->
selectedBranch = branchesList.get(position));
}
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
}
@Override
public void onFailure(@NonNull Call<List<Branch>> call, @NonNull Throwable t) {
}
public void onFailure(@NonNull Call<List<Branch>> call, @NonNull Throwable t) {}
});
}
private void initCloseListener() {
@ -338,5 +363,4 @@ public class CreateReleaseActivity extends BaseActivity {
super.onResume();
repository.checkAccountSwitch(this);
}
}

View File

@ -14,6 +14,10 @@ import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
import org.gitnex.tea4j.v2.models.CreateRepoOption;
import org.gitnex.tea4j.v2.models.Organization;
import org.gitnex.tea4j.v2.models.Repository;
@ -23,20 +27,15 @@ import org.mian.gitnex.databinding.ActivityCreateRepoBinding;
import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Toasty;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
import retrofit2.Call;
import retrofit2.Callback;
/**
* @author M M Arif
*/
public class CreateRepoActivity extends BaseActivity {
//https://github.com/go-gitea/gitea/blob/52cfd2743c0e85b36081cf80a850e6a5901f1865/models/repo.go#L964-L967
// https://github.com/go-gitea/gitea/blob/52cfd2743c0e85b36081cf80a850e6a5901f1865/models/repo.go#L964-L967
final List<String> reservedRepoNames = Arrays.asList(".", "..");
final Pattern reservedRepoPatterns = Pattern.compile("\\.(git|wiki)$");
public ImageView closeActivity;
@ -56,14 +55,16 @@ public class CreateRepoActivity extends BaseActivity {
super.onCreate(savedInstanceState);
ActivityCreateRepoBinding activityCreateRepoBinding = ActivityCreateRepoBinding.inflate(getLayoutInflater());
ActivityCreateRepoBinding activityCreateRepoBinding =
ActivityCreateRepoBinding.inflate(getLayoutInflater());
setContentView(activityCreateRepoBinding.getRoot());
boolean connToInternet = AppUtil.hasNetworkConnection(ctx);
loginUid = getAccount().getAccount().getUserName();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodManager imm =
(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
closeActivity = activityCreateRepoBinding.close;
repoName = activityCreateRepoBinding.newRepoName;
@ -83,11 +84,10 @@ public class CreateRepoActivity extends BaseActivity {
createRepo = activityCreateRepoBinding.createNewRepoButton;
disableProcessButton();
if(!connToInternet) {
if (!connToInternet) {
disableProcessButton();
}
else {
} else {
createRepo.setOnClickListener(createRepoListener);
}
@ -101,49 +101,49 @@ public class CreateRepoActivity extends BaseActivity {
String newRepoDesc = repoDesc.getText().toString();
boolean newRepoAccess = repoAccess.isChecked();
if(!connToInternet) {
if (!connToInternet) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
return;
}
if(!newRepoDesc.equals("")) {
if (!newRepoDesc.equals("")) {
if(newRepoDesc.length() > 255) {
if (newRepoDesc.length() > 255) {
Toasty.warning(ctx, getString(R.string.repoDescError));
return;
}
}
if(newRepoName.equals("")) {
if (newRepoName.equals("")) {
Toasty.error(ctx, getString(R.string.repoNameErrorEmpty));
}
else if(!AppUtil.checkStrings(newRepoName)) {
} else if (!AppUtil.checkStrings(newRepoName)) {
Toasty.warning(ctx, getString(R.string.repoNameErrorInvalid));
}
else if(reservedRepoNames.contains(newRepoName)) {
} else if (reservedRepoNames.contains(newRepoName)) {
Toasty.warning(ctx, getString(R.string.repoNameErrorReservedName));
}
else if(reservedRepoPatterns.matcher(newRepoName).find()) {
} else if (reservedRepoPatterns.matcher(newRepoName).find()) {
Toasty.warning(ctx, getString(R.string.repoNameErrorReservedPatterns));
}
else if(selectedOwner == null) {
} else if (selectedOwner == null) {
Toasty.error(ctx, getString(R.string.repoOwnerError));
}
else {
} else {
disableProcessButton();
createNewRepository(loginUid, newRepoName, newRepoDesc, selectedOwner, newRepoAccess);
}
}
private void createNewRepository(String loginUid, String repoName, String repoDesc, String selectedOwner, boolean isPrivate) {
private void createNewRepository(
String loginUid,
String repoName,
String repoDesc,
String selectedOwner,
boolean isPrivate) {
CreateRepoOption createRepository = new CreateRepoOption();
createRepository.setAutoInit(true);
@ -153,38 +153,39 @@ public class CreateRepoActivity extends BaseActivity {
createRepository.setName(repoName);
Call<Repository> call;
if(selectedOwner.equals(loginUid)) {
if (selectedOwner.equals(loginUid)) {
call = RetrofitClient.getApiInterface(ctx).createCurrentUserRepo(createRepository);
}
else {
} else {
call = RetrofitClient.getApiInterface(ctx).createOrgRepo(selectedOwner, createRepository);
call =
RetrofitClient.getApiInterface(ctx)
.createOrgRepo(selectedOwner, createRepository);
}
call.enqueue(new Callback<Repository>() {
call.enqueue(
new Callback<Repository>() {
@Override
public void onResponse(@NonNull Call<Repository> call, @NonNull retrofit2.Response<Repository> response) {
public void onResponse(
@NonNull Call<Repository> call,
@NonNull retrofit2.Response<Repository> response) {
if(response.code() == 201) {
if (response.code() == 201) {
MainActivity.reloadRepos = true;
Toasty.success(ctx, getString(R.string.repoCreated));
enableProcessButton();
finish();
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else if(response.code() == 409) {
} else if (response.code() == 409) {
enableProcessButton();
Toasty.warning(ctx, getString(R.string.repoExistsError));
}
else {
} else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
@ -202,14 +203,18 @@ public class CreateRepoActivity extends BaseActivity {
private void getOrganizations(final String userLogin) {
Call<List<Organization>> call = RetrofitClient.getApiInterface(ctx).orgListCurrentUserOrgs(1, 50);
Call<List<Organization>> call =
RetrofitClient.getApiInterface(ctx).orgListCurrentUserOrgs(1, 50);
call.enqueue(new Callback<List<Organization>>() {
call.enqueue(
new Callback<List<Organization>>() {
@Override
public void onResponse(@NonNull Call<List<Organization>> call, @NonNull retrofit2.Response<List<Organization>> response) {
public void onResponse(
@NonNull Call<List<Organization>> call,
@NonNull retrofit2.Response<List<Organization>> response) {
if(response.code() == 200) {
if (response.code() == 200) {
int organizationId = 0;
@ -218,12 +223,15 @@ public class CreateRepoActivity extends BaseActivity {
organizationsList.add(userLogin);
assert organizationsList_ != null;
if(organizationsList_.size() > 0) {
if (organizationsList_.size() > 0) {
for(int i = 0; i < organizationsList_.size(); i++) {
for (int i = 0; i < organizationsList_.size(); i++) {
if(getIntent().getStringExtra("orgName") != null && !"".equals(getIntent().getStringExtra("orgName"))) {
if(getIntent().getStringExtra("orgName").equals(organizationsList_.get(i).getUsername())) {
if (getIntent().getStringExtra("orgName") != null
&& !"".equals(getIntent().getStringExtra("orgName"))) {
if (getIntent()
.getStringExtra("orgName")
.equals(organizationsList_.get(i).getUsername())) {
organizationId = i + 1;
}
}
@ -232,27 +240,37 @@ public class CreateRepoActivity extends BaseActivity {
}
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(CreateRepoActivity.this, R.layout.list_spinner_items, organizationsList);
ArrayAdapter<String> adapter =
new ArrayAdapter<>(
CreateRepoActivity.this,
R.layout.list_spinner_items,
organizationsList);
spinner.setAdapter(adapter);
spinner.setOnItemClickListener((parent, view, position, id) -> selectedOwner = organizationsList.get(position));
spinner.setOnItemClickListener(
(parent, view, position, id) ->
selectedOwner = organizationsList.get(position));
if(getIntent().getBooleanExtra("organizationAction", false) && organizationId != 0) {
if (getIntent().getBooleanExtra("organizationAction", false)
&& organizationId != 0) {
int selectOwnerById = organizationId;
new Handler(Looper.getMainLooper()).postDelayed(() -> {
spinner.setText(organizationsList.get(selectOwnerById), false);
selectedOwner = organizationsList.get(selectOwnerById);
}, 500);
new Handler(Looper.getMainLooper())
.postDelayed(
() -> {
spinner.setText(
organizationsList.get(selectOwnerById),
false);
selectedOwner =
organizationsList.get(selectOwnerById);
},
500);
getIntent().removeExtra("organizationAction");
}
enableProcessButton();
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
@ -260,7 +278,8 @@ public class CreateRepoActivity extends BaseActivity {
}
@Override
public void onFailure(@NonNull Call<List<Organization>> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<List<Organization>> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
enableProcessButton();
@ -282,5 +301,4 @@ public class CreateRepoActivity extends BaseActivity {
createRepo.setEnabled(true);
}
}

View File

@ -12,6 +12,9 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.core.content.res.ResourcesCompat;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.gitnex.tea4j.v2.models.CreateTeamOption;
import org.gitnex.tea4j.v2.models.Team;
import org.mian.gitnex.R;
@ -21,16 +24,12 @@ import org.mian.gitnex.fragments.OrganizationTeamsFragment;
import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Toasty;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
/**
* @author M M Arif
*/
public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClickListener {
private View.OnClickListener onClickListener;
@ -44,23 +43,35 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic
private final String[] permissionList = {"Read", "Write", "Admin"};
public int permissionSelectedChoice = -1;
private final String[] accessControlsList = new String[]{"Code", "Issues", "Pull Request", "Releases", "Wiki", "External Wiki", "External Issues"};
private final String[] accessControlsList =
new String[] {
"Code",
"Issues",
"Pull Request",
"Releases",
"Wiki",
"External Wiki",
"External Issues"
};
private List<String> pushAccessList;
private final boolean[] selectedAccessControlsTrueFalse = new boolean[]{false, false, false, false, false, false, false};
private final boolean[] selectedAccessControlsTrueFalse =
new boolean[] {false, false, false, false, false, false, false};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCreateTeamByOrgBinding activityCreateTeamByOrgBinding = ActivityCreateTeamByOrgBinding.inflate(getLayoutInflater());
ActivityCreateTeamByOrgBinding activityCreateTeamByOrgBinding =
ActivityCreateTeamByOrgBinding.inflate(getLayoutInflater());
setContentView(activityCreateTeamByOrgBinding.getRoot());
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodManager imm =
(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
ImageView closeActivity = activityCreateTeamByOrgBinding.close;
teamName = activityCreateTeamByOrgBinding.teamName;
@ -78,34 +89,41 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic
initCloseListener();
closeActivity.setOnClickListener(onClickListener);
teamPermission.setOnClickListener(view -> {
MaterialAlertDialogBuilder materialAlertDialogBuilderPerm = new MaterialAlertDialogBuilder(ctx).setTitle(R.string.newTeamPermission).setCancelable(permissionSelectedChoice != -1)
.setSingleChoiceItems(permissionList, permissionSelectedChoice, (dialogInterface, i) -> {
teamPermission.setOnClickListener(
view -> {
MaterialAlertDialogBuilder materialAlertDialogBuilderPerm =
new MaterialAlertDialogBuilder(ctx)
.setTitle(R.string.newTeamPermission)
.setCancelable(permissionSelectedChoice != -1)
.setSingleChoiceItems(
permissionList,
permissionSelectedChoice,
(dialogInterface, i) -> {
permissionSelectedChoice = i;
teamPermission.setText(permissionList[i]);
switch(permissionList[i]) {
switch (permissionList[i]) {
case "Read":
teamPermissionDetail.setVisibility(View.VISIBLE);
teamPermissionDetail.setText(R.string.newTeamPermissionRead);
teamPermissionDetail.setVisibility(
View.VISIBLE);
teamPermissionDetail.setText(
R.string.newTeamPermissionRead);
break;
case "Write":
teamPermissionDetail.setVisibility(View.VISIBLE);
teamPermissionDetail.setText(R.string.newTeamPermissionWrite);
teamPermissionDetail.setVisibility(
View.VISIBLE);
teamPermissionDetail.setText(
R.string.newTeamPermissionWrite);
break;
case "Admin":
teamPermissionDetail.setVisibility(View.VISIBLE);
teamPermissionDetail.setText(R.string.newTeamPermissionAdmin);
teamPermissionDetail.setVisibility(
View.VISIBLE);
teamPermissionDetail.setText(
R.string.newTeamPermissionAdmin);
break;
default:
teamPermissionDetail.setVisibility(View.GONE);
teamPermissionDetail.setVisibility(
View.GONE);
break;
}
@ -115,62 +133,92 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic
materialAlertDialogBuilderPerm.create().show();
});
teamAccessControls.setOnClickListener(v -> {
teamAccessControls.setOnClickListener(
v -> {
teamAccessControls.setText("");
teamAccessControlsArray.setText("");
pushAccessList = Arrays.asList(accessControlsList);
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setMultiChoiceItems(accessControlsList, selectedAccessControlsTrueFalse, (dialog, which, isChecked) -> {
}).setTitle(R.string.newTeamAccessControls).setPositiveButton(R.string.okButton, (dialog, which) -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setMultiChoiceItems(
accessControlsList,
selectedAccessControlsTrueFalse,
(dialog, which, isChecked) -> {})
.setTitle(R.string.newTeamAccessControls)
.setPositiveButton(
R.string.okButton,
(dialog, which) -> {
int selectedVal = 0;
while(selectedVal < selectedAccessControlsTrueFalse.length) {
boolean value = selectedAccessControlsTrueFalse[selectedVal];
while (selectedVal
< selectedAccessControlsTrueFalse.length) {
boolean value =
selectedAccessControlsTrueFalse[
selectedVal];
String repoCode = "";
if(selectedVal == 0) {
if (selectedVal == 0) {
repoCode = "repo.code";
}
if(selectedVal == 1) {
if (selectedVal == 1) {
repoCode = "repo.issues";
}
if(selectedVal == 2) {
if (selectedVal == 2) {
repoCode = "repo.pulls";
}
if(selectedVal == 3) {
if (selectedVal == 3) {
repoCode = "repo.releases";
}
if(selectedVal == 4) {
if (selectedVal == 4) {
repoCode = "repo.wiki";
}
if(selectedVal == 5) {
if (selectedVal == 5) {
repoCode = "repo.ext_wiki";
}
if(selectedVal == 6) {
if (selectedVal == 6) {
repoCode = "repo.ext_issues";
}
if(value) {
if (value) {
teamAccessControls.setText(getString(R.string.newTeamPermissionValues, teamAccessControls.getText(), pushAccessList.get(selectedVal)));
teamAccessControlsArray.setText(getString(R.string.newTeamPermissionValuesFinal, teamAccessControlsArray.getText(), repoCode));
teamAccessControls.setText(
getString(
R.string
.newTeamPermissionValues,
teamAccessControls
.getText(),
pushAccessList.get(
selectedVal)));
teamAccessControlsArray.setText(
getString(
R.string
.newTeamPermissionValuesFinal,
teamAccessControlsArray
.getText(),
repoCode));
}
selectedVal++;
}
String data = String.valueOf(teamAccessControls.getText());
if(!data.equals("")) {
String data =
String.valueOf(
teamAccessControls.getText());
if (!data.equals("")) {
teamAccessControls.setText(data.substring(0, data.length() - 2));
teamAccessControls.setText(
data.substring(0, data.length() - 2));
}
String dataArray = String.valueOf(teamAccessControlsArray.getText());
String dataArray =
String.valueOf(
teamAccessControlsArray.getText());
if(!dataArray.equals("")) {
if (!dataArray.equals("")) {
teamAccessControlsArray.setText(dataArray.substring(0, dataArray.length() - 2));
teamAccessControlsArray.setText(
dataArray.substring(
0, dataArray.length() - 2));
}
});
@ -179,15 +227,14 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic
createTeamButton.setEnabled(false);
if(!connToInternet) {
if (!connToInternet) {
createTeamButton.setEnabled(false);
GradientDrawable shape = new GradientDrawable();
shape.setCornerRadius(8);
shape.setColor(ResourcesCompat.getColor(getResources(), R.color.hintColor, null));
createTeamButton.setBackground(shape);
}
else {
} else {
createTeamButton.setEnabled(true);
createTeamButton.setOnClickListener(this);
@ -204,61 +251,68 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic
String newTeamPermission = teamPermission.getText().toString().toLowerCase();
String newTeamAccessControls = teamAccessControlsArray.getText().toString();
if(!connToInternet) {
if (!connToInternet) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
return;
}
if(newTeamName.equals("")) {
if (newTeamName.equals("")) {
Toasty.error(ctx, getString(R.string.teamNameEmpty));
return;
}
if(!AppUtil.checkStringsWithAlphaNumericDashDotUnderscore(newTeamName)) {
if (!AppUtil.checkStringsWithAlphaNumericDashDotUnderscore(newTeamName)) {
Toasty.warning(ctx, getString(R.string.teamNameError));
return;
}
if(!newTeamDesc.equals("")) {
if (!newTeamDesc.equals("")) {
if(!AppUtil.checkStrings(newTeamDesc)) {
if (!AppUtil.checkStrings(newTeamDesc)) {
Toasty.warning(ctx, getString(R.string.teamDescError));
return;
}
if(newTeamDesc.length() > 100) {
if (newTeamDesc.length() > 100) {
Toasty.warning(ctx, getString(R.string.teamDescLimit));
return;
}
}
if(newTeamPermission.equals("")) {
if (newTeamPermission.equals("")) {
Toasty.error(ctx, getString(R.string.teamPermissionEmpty));
return;
}
List<String> newTeamAccessControls_ = new ArrayList<>(Arrays.asList(newTeamAccessControls.split(",")));
List<String> newTeamAccessControls_ =
new ArrayList<>(Arrays.asList(newTeamAccessControls.split(",")));
for(int i = 0; i < newTeamAccessControls_.size(); i++) {
for (int i = 0; i < newTeamAccessControls_.size(); i++) {
newTeamAccessControls_.set(i, newTeamAccessControls_.get(i).trim());
}
createNewTeamCall(orgName, newTeamName, newTeamDesc, newTeamPermission, newTeamAccessControls_);
createNewTeamCall(
orgName, newTeamName, newTeamDesc, newTeamPermission, newTeamAccessControls_);
}
private void createNewTeamCall(String orgName, String newTeamName, String newTeamDesc, String newTeamPermission, List<String> newTeamAccessControls) {
private void createNewTeamCall(
String orgName,
String newTeamName,
String newTeamDesc,
String newTeamPermission,
List<String> newTeamAccessControls) {
CreateTeamOption createNewTeamJson = new CreateTeamOption();
createNewTeamJson.setName(newTeamName);
createNewTeamJson.setDescription(newTeamDesc);
switch(newTeamPermission) {
switch (newTeamPermission) {
case "Read":
createNewTeamJson.setPermission(CreateTeamOption.PermissionEnum.READ);
break;
@ -271,32 +325,32 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic
}
createNewTeamJson.setUnits(newTeamAccessControls);
Call<Team> call3 = RetrofitClient.getApiInterface(ctx).orgCreateTeam(orgName, createNewTeamJson);
Call<Team> call3 =
RetrofitClient.getApiInterface(ctx).orgCreateTeam(orgName, createNewTeamJson);
call3.enqueue(new Callback<Team>() {
call3.enqueue(
new Callback<Team>() {
@Override
public void onResponse(@NonNull Call<Team> call, @NonNull retrofit2.Response<Team> response2) {
public void onResponse(
@NonNull Call<Team> call, @NonNull retrofit2.Response<Team> response2) {
if(response2.isSuccessful()) {
if (response2.isSuccessful()) {
if(response2.code() == 201) {
if (response2.code() == 201) {
OrganizationTeamsFragment.resumeTeams = true;
Toasty.success(ctx, getString(R.string.teamCreated));
finish();
}
}
else if(response2.code() == 404) {
} else if (response2.code() == 404) {
Toasty.warning(ctx, getString(R.string.apiNotFound));
}
else if(response2.code() == 401) {
} else if (response2.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
} else {
Toasty.error(ctx, getString(R.string.genericError));
}
@ -307,13 +361,12 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic
Log.e("onFailure", t.toString());
}
});
}
@Override
public void onClick(View v) {
if(v == createTeamButton) {
if (v == createTeamButton) {
processCreateTeam();
}
@ -323,5 +376,4 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic
onClickListener = view -> finish();
}
}

View File

@ -8,6 +8,11 @@ import android.os.Looper;
import android.util.Log;
import android.view.View;
import androidx.annotation.NonNull;
import io.mikael.urlbuilder.UrlBuilder;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import org.apache.commons.lang3.StringUtils;
import org.gitnex.tea4j.v2.models.ContentsResponse;
import org.gitnex.tea4j.v2.models.Organization;
@ -24,11 +29,6 @@ import org.mian.gitnex.helpers.AppUtil;
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;
import java.util.Objects;
import io.mikael.urlbuilder.UrlBuilder;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -36,7 +36,6 @@ import retrofit2.Response;
/**
* @author M M Arif
*/
public class DeepLinksActivity extends BaseActivity {
private ActivityDeeplinksBinding viewBinding;
@ -67,7 +66,7 @@ public class DeepLinksActivity extends BaseActivity {
assert data != null;
// check for login
if(tinyDB.getInt("currentActiveAccountId", -1) <= -1) {
if (tinyDB.getInt("currentActiveAccountId", -1) <= -1) {
Intent loginIntent = new Intent(ctx, LoginActivity.class);
loginIntent.putExtra("instanceUrl", data.getHost());
ctx.startActivity(loginIntent);
@ -80,7 +79,7 @@ public class DeepLinksActivity extends BaseActivity {
assert userAccountsApi != null;
List<UserAccount> userAccounts = userAccountsApi.loggedInUserAccounts();
for(UserAccount userAccount : userAccounts) {
for (UserAccount userAccount : userAccounts) {
String hostUri = userAccount.getInstanceUrl();
@ -88,18 +87,17 @@ public class DeepLinksActivity extends BaseActivity {
int portExternal = data.getPort();
String hostUrlExternal;
if(portExternal > 0) {
if (portExternal > 0) {
hostUrlExternal = hostExternal + ":" + portExternal;
}
else {
} else {
hostUrlExternal = hostExternal;
}
if(hostUrlExternal == null) {
if (hostUrlExternal == null) {
hostUrlExternal = "";
}
if(hostUri.toLowerCase().contains(hostUrlExternal.toLowerCase())) {
if (hostUri.toLowerCase().contains(hostUrlExternal.toLowerCase())) {
accountFound = true;
@ -108,82 +106,92 @@ public class DeepLinksActivity extends BaseActivity {
}
}
if(accountFound) {
if (accountFound) {
// redirect to proper fragment/activity, if no action is there, show options where user to want to go like repos, profile, notifications etc
if(data.getPathSegments().size() == 1) {
if(data.getLastPathSegment().equals("notifications")) { // notifications
// redirect to proper fragment/activity, if no action is there, show options where user
// to want to go like repos, profile, notifications etc
if (data.getPathSegments().size() == 1) {
if (data.getLastPathSegment().equals("notifications")) { // notifications
mainIntent.putExtra("launchFragmentByLinkHandler", "notification");
ctx.startActivity(mainIntent);
finish();
}
else if(data.getLastPathSegment().equals("explore")) { // explore
} else if (data.getLastPathSegment().equals("explore")) { // explore
mainIntent.putExtra("launchFragmentByLinkHandler", "explore");
ctx.startActivity(mainIntent);
finish();
}
else if(data.getLastPathSegment().equals(getAccount().getAccount().getUserName())) { // your user profile
} else if (data.getLastPathSegment()
.equals(getAccount().getAccount().getUserName())) { // your user profile
mainIntent.putExtra("launchFragmentByLinkHandler", "profile");
ctx.startActivity(mainIntent);
finish();
}
else if(data.getLastPathSegment().equals("admin")) {
} else if (data.getLastPathSegment().equals("admin")) {
mainIntent.putExtra("launchFragmentByLinkHandler", "admin");
ctx.startActivity(mainIntent);
finish();
} else {
new Handler(Looper.getMainLooper())
.postDelayed(() -> getUserOrOrg(data.getLastPathSegment()), 500);
}
else {
new Handler(Looper.getMainLooper()).postDelayed(() -> getUserOrOrg(data.getLastPathSegment()), 500);
}
}
else if(data.getPathSegments().size() == 2) {
if(data.getPathSegments().get(0).equals("explore")) { // specific explore tab
if(data.getPathSegments().get(1).equals("organizations")) { // orgs
} else if (data.getPathSegments().size() == 2) {
if (data.getPathSegments().get(0).equals("explore")) { // specific explore tab
if (data.getPathSegments().get(1).equals("organizations")) { // orgs
mainIntent.putExtra("exploreOrgs", true);
}
mainIntent.putExtra("launchFragmentByLinkHandler", "explore");
ctx.startActivity(mainIntent);
finish();
}
else if(data.getPathSegments().get(0).equals("user") && data.getPathSegments().get(1).equals("login")) { // open login
} else if (data.getPathSegments().get(0).equals("user")
&& data.getPathSegments().get(1).equals("login")) { // open login
Intent loginIntent = new Intent(ctx, AddNewAccountActivity.class);
loginIntent.putExtra("instanceUrl", data.getHost());
loginIntent.putExtra("instanceProtocol", data.getScheme());
ctx.startActivity(loginIntent);
finish();
}
else if(data.getPathSegments().get(0).equals("admin")) {
} else if (data.getPathSegments().get(0).equals("admin")) {
mainIntent.putExtra("launchFragmentByLinkHandler", "admin");
mainIntent.putExtra("giteaAdminAction", data.getLastPathSegment());
ctx.startActivity(mainIntent);
finish();
}
else if(!data.getPathSegments().get(0).equals("") & !data.getLastPathSegment().equals("")) { // go to repo
} else if (!data.getPathSegments().get(0).equals("")
& !data.getLastPathSegment().equals("")) { // go to repo
String repo = data.getLastPathSegment();
if(repo.endsWith(".git")) { // Git clone URL
if (repo.endsWith(".git")) { // Git clone URL
repo = repo.substring(0, repo.length() - 4);
}
String finalRepo = repo;
new Handler(Looper.getMainLooper()).postDelayed(() -> goToRepoSection(data.getPathSegments().get(0), finalRepo, "repo"), 500);
}
else { // no action, show options
new Handler(Looper.getMainLooper())
.postDelayed(
() ->
goToRepoSection(
data.getPathSegments().get(0),
finalRepo,
"repo"),
500);
} else { // no action, show options
showNoActionButtons();
}
}
else if(data.getPathSegments().size() >= 3) {
if(data.getPathSegments().get(2).equals("issues")) { // issue
} else if (data.getPathSegments().size() >= 3) {
if (data.getPathSegments().get(2).equals("issues")) { // issue
if(!Objects.requireNonNull(data.getLastPathSegment()).contains("issues") & StringUtils.isNumeric(data.getLastPathSegment())) {
if (!Objects.requireNonNull(data.getLastPathSegment()).contains("issues")
& StringUtils.isNumeric(data.getLastPathSegment())) {
issueIntent.putExtra("issueNumber", data.getLastPathSegment());
issueIntent.putExtra("openedFromLink", "true");
String[] urlSplitted = data.toString().split("#");
if(urlSplitted.length == 2) {
if (urlSplitted.length == 2) {
issueIntent.putExtra("issueComment", urlSplitted[1]);
}
IssueContext issue = new IssueContext(new RepositoryContext(data.getPathSegments().get(0), data.getPathSegments().get(1), ctx), Integer.parseInt(data.getLastPathSegment()), "Issue");
IssueContext issue =
new IssueContext(
new RepositoryContext(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
ctx),
Integer.parseInt(data.getLastPathSegment()),
"Issue");
issue.getRepository().saveToDB(ctx);
@ -191,152 +199,281 @@ public class DeepLinksActivity extends BaseActivity {
ctx.startActivity(issueIntent);
finish();
}
else if(Objects.requireNonNull(data.getLastPathSegment()).contains("issues")) {
new Handler(Looper.getMainLooper()).postDelayed(() -> goToRepoSection(data.getPathSegments().get(0), data.getPathSegments().get(1), "issue"), 500);
}
else if(data.getLastPathSegment().equals("new")) {
new Handler(Looper.getMainLooper()).postDelayed(() -> goToRepoSection(data.getPathSegments().get(0), data.getPathSegments().get(1), "issueNew"), 500);
}
else {
} else if (Objects.requireNonNull(data.getLastPathSegment())
.contains("issues")) {
new Handler(Looper.getMainLooper())
.postDelayed(
() ->
goToRepoSection(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
"issue"),
500);
} else if (data.getLastPathSegment().equals("new")) {
new Handler(Looper.getMainLooper())
.postDelayed(
() ->
goToRepoSection(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
"issueNew"),
500);
} else {
ctx.startActivity(mainIntent);
finish();
}
}
else if(data.getPathSegments().get(2).equals("pulls")) { // pr
} else if (data.getPathSegments().get(2).equals("pulls")) { // pr
if(!Objects.requireNonNull(data.getLastPathSegment()).contains("pulls") & StringUtils.isNumeric(data.getLastPathSegment())) {
new Handler(Looper.getMainLooper()).postDelayed(() -> {
if (!Objects.requireNonNull(data.getLastPathSegment()).contains("pulls")
& StringUtils.isNumeric(data.getLastPathSegment())) {
new Handler(Looper.getMainLooper())
.postDelayed(
() -> {
String[] urlSplitted = data.toString().split("#");
if(urlSplitted.length == 2) {
issueIntent.putExtra("issueComment", urlSplitted[1]);
if (urlSplitted.length == 2) {
issueIntent.putExtra(
"issueComment", urlSplitted[1]);
}
getPullRequest(data.getPathSegments().get(0), data.getPathSegments().get(1), Integer.parseInt(data.getLastPathSegment()));
}, 500);
getPullRequest(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
Integer.parseInt(data.getLastPathSegment()));
},
500);
}
else if(Objects.requireNonNull(data.getLastPathSegment()).contains("pulls")) {
new Handler(Looper.getMainLooper()).postDelayed(() -> goToRepoSection(data.getPathSegments().get(0), data.getPathSegments().get(1), "pull"), 500);
}
else if(data.getLastPathSegment().equals("files")) { // pr diff
new Handler(Looper.getMainLooper()).postDelayed(() -> {
} else if (Objects.requireNonNull(data.getLastPathSegment())
.contains("pulls")) {
new Handler(Looper.getMainLooper())
.postDelayed(
() ->
goToRepoSection(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
"pull"),
500);
} else if (data.getLastPathSegment().equals("files")) { // pr diff
new Handler(Looper.getMainLooper())
.postDelayed(
() -> {
issueIntent.putExtra("openPrDiff", "true");
getPullRequest(data.getPathSegments().get(0), data.getPathSegments().get(1), Integer.parseInt(data.getPathSegments().get(3)));
}, 500);
}
else {
getPullRequest(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
Integer.parseInt(
data.getPathSegments().get(3)));
},
500);
} else {
ctx.startActivity(mainIntent);
finish();
}
}
else if(data.getPathSegments().get(2).equals("compare")) { // new pull request
new Handler(Looper.getMainLooper()).postDelayed(() -> goToRepoSection(data.getPathSegments().get(0), data.getPathSegments().get(1), "pullNew"), 500);
}
else if(data.getPathSegments().get(2).equals("commit")) {
} else if (data.getPathSegments().get(2).equals("compare")) { // new pull request
new Handler(Looper.getMainLooper())
.postDelayed(
() ->
goToRepoSection(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
"pullNew"),
500);
} else if (data.getPathSegments().get(2).equals("commit")) {
repoIntent.putExtra("sha", data.getLastPathSegment());
new Handler(Looper.getMainLooper()).postDelayed(() -> goToRepoSection(data.getPathSegments().get(0), data.getPathSegments().get(1), "commit"), 500);
}
else if(data.getPathSegments().get(2).equals("commits")) { // commits list
new Handler(Looper.getMainLooper())
.postDelayed(
() ->
goToRepoSection(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
"commit"),
500);
} else if (data.getPathSegments().get(2).equals("commits")) { // commits list
String branch = data.getLastPathSegment();
repoIntent.putExtra("branchName", branch);
new Handler(Looper.getMainLooper()).postDelayed(() -> goToRepoSection(data.getPathSegments().get(0), data.getPathSegments().get(1), "commitsList"), 500);
}
else if(data.getPathSegments().get(2).equals("milestones") && data.getLastPathSegment().equals("new")) { // new milestone
new Handler(Looper.getMainLooper()).postDelayed(() -> goToRepoSection(data.getPathSegments().get(0), data.getPathSegments().get(1), "milestonesNew"), 500);
}
else if(data.getPathSegments().get(2).equals("milestones")) { // milestones
new Handler(Looper.getMainLooper()).postDelayed(() -> goToRepoSection(data.getPathSegments().get(0), data.getPathSegments().get(1), "milestones"), 500);
}
else if(data.getPathSegments().get(2).equals("milestone")) { // milestone
new Handler(Looper.getMainLooper())
.postDelayed(
() ->
goToRepoSection(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
"commitsList"),
500);
} else if (data.getPathSegments().get(2).equals("milestones")
&& data.getLastPathSegment().equals("new")) { // new milestone
new Handler(Looper.getMainLooper())
.postDelayed(
() ->
goToRepoSection(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
"milestonesNew"),
500);
} else if (data.getPathSegments().get(2).equals("milestones")) { // milestones
new Handler(Looper.getMainLooper())
.postDelayed(
() ->
goToRepoSection(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
"milestones"),
500);
} else if (data.getPathSegments().get(2).equals("milestone")) { // milestone
repoIntent.putExtra("milestoneId", data.getLastPathSegment());
new Handler(Looper.getMainLooper()).postDelayed(() -> goToRepoSection(data.getPathSegments().get(0), data.getPathSegments().get(1), "milestones"), 500);
}
else if(data.getPathSegments().get(2).equals("releases") && data.getLastPathSegment().equals("new")) { // new release
new Handler(Looper.getMainLooper()).postDelayed(() -> goToRepoSection(data.getPathSegments().get(0), data.getPathSegments().get(1), "newRelease"), 500);
}
else if(data.getPathSegments().get(2).equals("releases")) { // releases
if(data.getPathSegments().size() == 5) {
if(data.getPathSegments().get(2).equals("releases") && data.getPathSegments().get(3).equals("tag")) {
new Handler(Looper.getMainLooper())
.postDelayed(
() ->
goToRepoSection(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
"milestones"),
500);
} else if (data.getPathSegments().get(2).equals("releases")
&& data.getLastPathSegment().equals("new")) { // new release
new Handler(Looper.getMainLooper())
.postDelayed(
() ->
goToRepoSection(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
"newRelease"),
500);
} else if (data.getPathSegments().get(2).equals("releases")) { // releases
if (data.getPathSegments().size() == 5) {
if (data.getPathSegments().get(2).equals("releases")
&& data.getPathSegments().get(3).equals("tag")) {
repoIntent.putExtra("releaseTagName", data.getLastPathSegment());
}
}
new Handler(Looper.getMainLooper()).postDelayed(() -> goToRepoSection(data.getPathSegments().get(0), data.getPathSegments().get(1), "releases"), 500);
}
else if(data.getPathSegments().get(2).equals("labels")) { // labels
new Handler(Looper.getMainLooper()).postDelayed(() -> goToRepoSection(data.getPathSegments().get(0), data.getPathSegments().get(1), "labels"), 500);
}
else if(data.getPathSegments().get(2).equals("settings")) { // repo settings
new Handler(Looper.getMainLooper()).postDelayed(() -> goToRepoSection(data.getPathSegments().get(0), data.getPathSegments().get(1), "settings"), 500);
}
else if(data.getLastPathSegment().equals("branches")) { // branches list
new Handler(Looper.getMainLooper()).postDelayed(() -> goToRepoSection(data.getPathSegments().get(0), data.getPathSegments().get(1), "branchesList"), 500);
}
else if(data.getPathSegments().size() == 5 && data.getPathSegments().get(2).equals("src") && data.getPathSegments().get(3).equals("branch")) { // branch
new Handler(Looper.getMainLooper())
.postDelayed(
() ->
goToRepoSection(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
"releases"),
500);
} else if (data.getPathSegments().get(2).equals("labels")) { // labels
new Handler(Looper.getMainLooper())
.postDelayed(
() ->
goToRepoSection(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
"labels"),
500);
} else if (data.getPathSegments().get(2).equals("settings")) { // repo settings
new Handler(Looper.getMainLooper())
.postDelayed(
() ->
goToRepoSection(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
"settings"),
500);
} else if (data.getLastPathSegment().equals("branches")) { // branches list
new Handler(Looper.getMainLooper())
.postDelayed(
() ->
goToRepoSection(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
"branchesList"),
500);
} else if (data.getPathSegments().size() == 5
&& data.getPathSegments().get(2).equals("src")
&& data.getPathSegments().get(3).equals("branch")) { // branch
repoIntent.putExtra("selectedBranch", data.getLastPathSegment());
new Handler(Looper.getMainLooper()).postDelayed(() -> goToRepoSection(data.getPathSegments().get(0), data.getPathSegments().get(1), "branch"), 500);
}
else if(data.getPathSegments().get(2).equals("src") && data.getPathSegments().get(3).equals("branch")) { // file/dir
new Handler(Looper.getMainLooper())
.postDelayed(
() ->
goToRepoSection(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
"branch"),
500);
} else if (data.getPathSegments().get(2).equals("src")
&& data.getPathSegments().get(3).equals("branch")) { // file/dir
StringBuilder filePath = new StringBuilder();
ArrayList<String> segments = new ArrayList<>(data.getPathSegments());
segments.subList(0, 5).clear();
for(String item : segments) {
for (String item : segments) {
filePath.append(item);
filePath.append("/");
}
filePath.deleteCharAt(filePath.toString().length() - 1);
new Handler(Looper.getMainLooper()).postDelayed(() -> getFile(data.getPathSegments().get(0), data.getPathSegments().get(1), filePath.toString(), data.getPathSegments().get(4)), 500);
}
else if(data.getPathSegments().get(2).equals("wiki")) { // wiki
new Handler(Looper.getMainLooper())
.postDelayed(
() ->
getFile(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
filePath.toString(),
data.getPathSegments().get(4)),
500);
} else if (data.getPathSegments().get(2).equals("wiki")) { // wiki
if(data.getQueryParameter("action") != null && data.getQueryParameter("action").equalsIgnoreCase("_new")) {
new Handler(Looper.getMainLooper()).postDelayed(() -> goToRepoSection(data.getPathSegments().get(0), data.getPathSegments().get(1), "wikiNew"), 500);
if (data.getQueryParameter("action") != null
&& data.getQueryParameter("action").equalsIgnoreCase("_new")) {
new Handler(Looper.getMainLooper())
.postDelayed(
() ->
goToRepoSection(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
"wikiNew"),
500);
} else {
new Handler(Looper.getMainLooper())
.postDelayed(
() ->
goToRepoSection(
data.getPathSegments().get(0),
data.getPathSegments().get(1),
"wiki"),
500);
}
else {
new Handler(Looper.getMainLooper()).postDelayed(() -> goToRepoSection(data.getPathSegments().get(0), data.getPathSegments().get(1), "wiki"), 500);
}
}
else { // no action, show options
} else { // no action, show options
showNoActionButtons();
}
}
else {
} else {
startActivity(mainIntent);
finish();
}
}
else {
} else {
viewBinding.progressBar.setVisibility(View.GONE);
viewBinding.addNewAccountFrame.setVisibility(View.VISIBLE);
viewBinding.noActionFrame.setVisibility(View.GONE);
viewBinding.addAccountText.setText(String.format(getResources().getString(R.string.accountDoesNotExist), data.getHost()));
viewBinding.addNewAccount.setOnClickListener(addNewAccount -> {
viewBinding.addAccountText.setText(
String.format(
getResources().getString(R.string.accountDoesNotExist),
data.getHost()));
viewBinding.addNewAccount.setOnClickListener(
addNewAccount -> {
Intent accountIntent = new Intent(ctx, AddNewAccountActivity.class);
accountIntent.putExtra("instanceUrl", data.getHost());
startActivity(accountIntent);
finish();
});
viewBinding.openInBrowser.setOnClickListener(addNewAccount -> {
viewBinding.openInBrowser.setOnClickListener(
addNewAccount -> {
Integer port = data.getPort() >= 0 ? data.getPort() : null;
URI host = UrlBuilder.fromString(UrlHelper.fixScheme(data.getHost(), "https")).withPort(port).toUri();
URI host =
UrlBuilder.fromString(UrlHelper.fixScheme(data.getHost(), "https"))
.withPort(port)
.toUri();
AppUtil.openUrlInBrowser(this, String.valueOf(host));
finish();
});
viewBinding.launchApp.setOnClickListener(launchApp -> {
viewBinding.launchApp.setOnClickListener(
launchApp -> {
startActivity(mainIntent);
finish();
});
@ -345,31 +482,37 @@ public class DeepLinksActivity extends BaseActivity {
private void getPullRequest(String repoOwner, String repoName, int index) {
Call<PullRequest> call = RetrofitClient.getApiInterface(ctx).repoGetPullRequest(repoOwner, repoName, (long) index);
Call<PullRequest> call =
RetrofitClient.getApiInterface(ctx)
.repoGetPullRequest(repoOwner, repoName, (long) index);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<PullRequest> call, @NonNull retrofit2.Response<PullRequest> response) {
public void onResponse(
@NonNull Call<PullRequest> call,
@NonNull retrofit2.Response<PullRequest> response) {
PullRequest prInfo = response.body();
if(response.code() == 200) {
if (response.code() == 200) {
assert prInfo != null;
issueIntent.putExtra("openedFromLink", "true");
IssueContext issue = new IssueContext(prInfo, new RepositoryContext(repoOwner, repoName, ctx));
IssueContext issue =
new IssueContext(
prInfo,
new RepositoryContext(repoOwner, repoName, ctx));
issue.getRepository().saveToDB(ctx);
issueIntent.putExtra(IssueContext.INTENT_EXTRA, issue);
ctx.startActivity(issueIntent);
finish();
}
else {
} else {
ctx.startActivity(mainIntent);
finish();
@ -391,13 +534,16 @@ public class DeepLinksActivity extends BaseActivity {
Call<Repository> call = RetrofitClient.getApiInterface(ctx).repoGet(repoOwner, repoName);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Repository> call, @NonNull retrofit2.Response<Repository> response) {
public void onResponse(
@NonNull Call<Repository> call,
@NonNull retrofit2.Response<Repository> response) {
Repository repoInfo = response.body();
if(response.code() == 200) {
if (response.code() == 200) {
assert repoInfo != null;
RepositoryContext repo = new RepositoryContext(repoInfo, ctx);
@ -410,13 +556,11 @@ public class DeepLinksActivity extends BaseActivity {
ctx.startActivity(repoIntent);
finish();
}
else {
} else {
ctx.startActivity(mainIntent);
finish();
Log.e("error-goToRepo", response.message());
}
}
@Override
@ -432,23 +576,24 @@ public class DeepLinksActivity extends BaseActivity {
private void getUserOrOrg(String userOrgName) {
Call<Organization> call = RetrofitClient.getApiInterface(ctx).orgGet(userOrgName);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Organization> call, @NonNull Response<Organization> response) {
if(response.code() == 404) { // org doesn't exist or it's a user user
public void onResponse(
@NonNull Call<Organization> call,
@NonNull Response<Organization> response) {
if (response.code() == 404) { // org doesn't exist or it's a user user
Log.d("getUserOrOrg-404", String.valueOf(response.code()));
getUser(userOrgName);
}
else if(response.code() == 200) { // org
} else if (response.code() == 200) { // org
assert response.body() != null;
orgIntent.putExtra("orgName", response.body().getUsername());
orgIntent.putExtra("organizationId", response.body().getId());
orgIntent.putExtra("organizationAction", true);
ctx.startActivity(orgIntent);
finish();
}
else {
} else {
Log.e("getUserOrOrg-code", String.valueOf(response.code()));
ctx.startActivity(mainIntent);
finish();
@ -465,16 +610,17 @@ public class DeepLinksActivity extends BaseActivity {
private void getUser(String userName) {
Call<User> call = RetrofitClient.getApiInterface(ctx).userGet(userName);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<User> call, @NonNull Response<User> response) {
if(response.code() == 200) {
public void onResponse(
@NonNull Call<User> call, @NonNull Response<User> response) {
if (response.code() == 200) {
assert response.body() != null;
userIntent.putExtra("username", response.body().getLogin());
ctx.startActivity(userIntent);
}
else {
} else {
Log.e("getUser-code", String.valueOf(response.code()));
ctx.startActivity(mainIntent);
}
@ -491,23 +637,26 @@ public class DeepLinksActivity extends BaseActivity {
}
private void getFile(String owner, String repo, String filePath, String branch) {
Call<ContentsResponse> call = RetrofitClient.getApiInterface(ctx).repoGetContents(owner, repo, filePath, branch);
Call<ContentsResponse> call =
RetrofitClient.getApiInterface(ctx).repoGetContents(owner, repo, filePath, branch);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<ContentsResponse> call, @NonNull Response<ContentsResponse> response) {
if(response.code() == 200) {
public void onResponse(
@NonNull Call<ContentsResponse> call,
@NonNull Response<ContentsResponse> response) {
if (response.code() == 200) {
// check if file and open file/dir
ContentsResponse file = response.body();
assert file != null;
if(file.getType().equals("file")) {
if (file.getType().equals("file")) {
repoIntent.putExtra("file", file);
repoIntent.putExtra("branch", branch);
goToRepoSection(owner, repo, "file");
}
}
else {
} else {
Log.e("getFile-onFailure", String.valueOf(response.code()));
ctx.startActivity(mainIntent);
finish();
@ -515,7 +664,8 @@ public class DeepLinksActivity extends BaseActivity {
}
@Override
public void onFailure(@NonNull Call<ContentsResponse> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<ContentsResponse> call, @NonNull Throwable t) {
Log.e("getFile-onFailure", t.toString());
// maybe it's a directory
getDir(owner, repo, filePath, branch);
@ -532,7 +682,7 @@ public class DeepLinksActivity extends BaseActivity {
private void showNoActionButtons() {
viewBinding.progressBar.setVisibility(View.GONE);
switch(tinyDB.getInt("defaultScreenId")) {
switch (tinyDB.getInt("defaultScreenId")) {
case 1: // repos
mainIntent.putExtra("launchFragmentByLinkHandler", "repos");
ctx.startActivity(mainIntent);
@ -557,45 +707,44 @@ public class DeepLinksActivity extends BaseActivity {
viewBinding.noActionFrame.setVisibility(View.VISIBLE);
viewBinding.addNewAccountFrame.setVisibility(View.GONE);
viewBinding.repository.setOnClickListener(repository -> {
viewBinding.repository.setOnClickListener(
repository -> {
tinyDB.putInt("defaultScreenId", 1);
mainIntent.putExtra("launchFragmentByLinkHandler", "repos");
ctx.startActivity(mainIntent);
finish();
});
viewBinding.organization.setOnClickListener(organization -> {
viewBinding.organization.setOnClickListener(
organization -> {
tinyDB.putInt("defaultScreenId", 2);
mainIntent.putExtra("launchFragmentByLinkHandler", "org");
ctx.startActivity(mainIntent);
finish();
});
viewBinding.notification.setOnClickListener(notification -> {
viewBinding.notification.setOnClickListener(
notification -> {
tinyDB.putInt("defaultScreenId", 3);
mainIntent.putExtra("launchFragmentByLinkHandler", "notification");
ctx.startActivity(mainIntent);
finish();
});
viewBinding.explore.setOnClickListener(explore -> {
viewBinding.explore.setOnClickListener(
explore -> {
tinyDB.putInt("defaultScreenId", 4);
mainIntent.putExtra("launchFragmentByLinkHandler", "explore");
ctx.startActivity(mainIntent);
finish();
});
viewBinding.launchApp2.setOnClickListener(launchApp2 -> {
viewBinding.launchApp2.setOnClickListener(
launchApp2 -> {
tinyDB.putInt("defaultScreenId", 0);
ctx.startActivity(mainIntent);
finish();
});
}
}
}

View File

@ -10,7 +10,6 @@ import org.mian.gitnex.fragments.PullRequestChangesFragment;
/**
* @author opyale
*/
public class DiffActivity extends BaseActivity {
public PullRequestChangesFragment fragment = PullRequestChangesFragment.newInstance();
@ -24,21 +23,28 @@ public class DiffActivity extends BaseActivity {
setContentView(binding.getRoot());
getOnBackPressedDispatcher().addCallback(new OnBackPressedCallback(true) {
getOnBackPressedDispatcher()
.addCallback(
new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
if(getSupportFragmentManager().findFragmentById(R.id.fragment_container) instanceof DiffFragment) {
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
}
else {
if (getSupportFragmentManager()
.findFragmentById(R.id.fragment_container)
instanceof DiffFragment) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, fragment)
.commit();
} else {
finish();
}
}
});
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, fragment)
.commit();
}
}

View File

@ -18,6 +18,14 @@ import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Objects;
import org.gitnex.tea4j.v2.models.EditIssueOption;
import org.gitnex.tea4j.v2.models.Issue;
import org.gitnex.tea4j.v2.models.Milestone;
@ -31,21 +39,12 @@ import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.contexts.IssueContext;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Objects;
import retrofit2.Call;
import retrofit2.Callback;
/**
* @author M M Arif
*/
public class EditIssueActivity extends BaseActivity implements View.OnClickListener {
private final String msState = "open";
@ -67,10 +66,12 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe
super.onCreate(savedInstanceState);
ActivityEditIssueBinding activityEditIssueBinding = ActivityEditIssueBinding.inflate(getLayoutInflater());
ActivityEditIssueBinding activityEditIssueBinding =
ActivityEditIssueBinding.inflate(getLayoutInflater());
setContentView(activityEditIssueBinding.getRoot());
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodManager imm =
(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
resultLimit = Constants.getCurrentResultLimit(ctx);
issue = IssueContext.fromIntent(getIntent());
@ -86,11 +87,12 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe
assert imm != null;
imm.showSoftInput(editIssueTitle, InputMethodManager.SHOW_IMPLICIT);
editIssueDescription.setOnTouchListener((touchView, motionEvent) -> {
editIssueDescription.setOnTouchListener(
(touchView, motionEvent) -> {
touchView.getParent().requestDisallowInterceptTouchEvent(true);
if((motionEvent.getAction() & MotionEvent.ACTION_UP) != 0 && (motionEvent.getActionMasked() & MotionEvent.ACTION_UP) != 0) {
if ((motionEvent.getAction() & MotionEvent.ACTION_UP) != 0
&& (motionEvent.getActionMasked() & MotionEvent.ACTION_UP) != 0) {
touchView.getParent().requestDisallowInterceptTouchEvent(false);
}
@ -105,19 +107,24 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe
editIssueDueDate.setOnClickListener(this);
editIssueButton.setOnClickListener(this);
if(issue.getIssueType().equalsIgnoreCase("Pull")) {
if (issue.getIssueType().equalsIgnoreCase("Pull")) {
toolbar_title.setText(getString(R.string.editPrNavHeader, String.valueOf(issue.getIssueIndex())));
}
else {
toolbar_title.setText(
getString(R.string.editPrNavHeader, String.valueOf(issue.getIssueIndex())));
} else {
toolbar_title.setText(getString(R.string.editIssueNavHeader, String.valueOf(issue.getIssueIndex())));
toolbar_title.setText(
getString(R.string.editIssueNavHeader, String.valueOf(issue.getIssueIndex())));
}
disableProcessButton();
getIssue(issue.getRepository().getOwner(), issue.getRepository().getName(), issue.getIssueIndex(), resultLimit);
getIssue(
issue.getRepository().getOwner(),
issue.getRepository().getName(),
issue.getIssueIndex(),
resultLimit);
if(!issue.getRepository().getPermissions().isPush()) {
if (!issue.getRepository().getPermissions().isPush()) {
findViewById(R.id.editIssueMilestoneSpinnerLayout).setVisibility(View.GONE);
findViewById(R.id.editIssueDueDateLayout).setVisibility(View.GONE);
}
@ -135,23 +142,35 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe
String editIssueTitleForm = editIssueTitle.getText().toString();
String editIssueDescriptionForm = editIssueDescription.getText().toString();
if(!connToInternet) {
if (!connToInternet) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
return;
}
if(editIssueTitleForm.equals("")) {
if (editIssueTitleForm.equals("")) {
Toasty.error(ctx, getString(R.string.issueTitleEmpty));
return;
}
disableProcessButton();
editIssue(issue.getRepository().getOwner(), issue.getRepository().getName(), issue.getIssueIndex(), editIssueTitleForm, editIssueDescriptionForm, milestoneId);
editIssue(
issue.getRepository().getOwner(),
issue.getRepository().getName(),
issue.getIssueIndex(),
editIssueTitleForm,
editIssueDescriptionForm,
milestoneId);
}
private void editIssue(String repoOwner, String repoName, int issueIndex, String title, String description, int milestoneId) {
private void editIssue(
String repoOwner,
String repoName,
int issueIndex,
String title,
String description,
int milestoneId) {
EditIssueOption issueData = new EditIssueOption();
issueData.setTitle(title);
@ -159,20 +178,24 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe
issueData.setDueDate(currentDate);
issueData.setMilestone((long) milestoneId);
Call<Issue> call = RetrofitClient.getApiInterface(ctx).issueEditIssue(repoOwner, repoName, (long) issueIndex, issueData);
Call<Issue> call =
RetrofitClient.getApiInterface(ctx)
.issueEditIssue(repoOwner, repoName, (long) issueIndex, issueData);
call.enqueue(new Callback<Issue>() {
call.enqueue(
new Callback<Issue>() {
@Override
public void onResponse(@NonNull Call<Issue> call, @NonNull retrofit2.Response<Issue> response) {
public void onResponse(
@NonNull Call<Issue> call,
@NonNull retrofit2.Response<Issue> response) {
if(response.code() == 201) {
if (response.code() == 201) {
if(issue.getIssueType().equalsIgnoreCase("Pull")) {
if (issue.getIssueType().equalsIgnoreCase("Pull")) {
Toasty.success(ctx, getString(R.string.editPrSuccessMessage));
}
else {
} else {
Toasty.success(ctx, getString(R.string.editIssueSuccessMessage));
}
@ -180,16 +203,15 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe
Intent result = new Intent();
result.putExtra("issueEdited", true);
IssuesFragment.resumeIssues = issue.getIssue().getPullRequest() == null;
PullRequestsFragment.resumePullRequests = issue.getIssue().getPullRequest() != null;
PullRequestsFragment.resumePullRequests =
issue.getIssue().getPullRequest() != null;
setResult(200, result);
finish();
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
} else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
@ -203,42 +225,56 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe
enableProcessButton();
}
});
}
@Override
public void onClick(View v) {
if(v == editIssueDueDate) {
if (v == editIssueDueDate) {
final Calendar c = Calendar.getInstance();
int mYear = c.get(Calendar.YEAR);
final int mMonth = c.get(Calendar.MONTH);
final int mDay = c.get(Calendar.DAY_OF_MONTH);
DatePickerDialog datePickerDialog = new DatePickerDialog(this, (view, year, monthOfYear, dayOfMonth) -> {
editIssueDueDate.setText(getString(R.string.setDueDate, year, (monthOfYear + 1), dayOfMonth));
DatePickerDialog datePickerDialog =
new DatePickerDialog(
this,
(view, year, monthOfYear, dayOfMonth) -> {
editIssueDueDate.setText(
getString(
R.string.setDueDate,
year,
(monthOfYear + 1),
dayOfMonth));
currentDate = new Date(year - 1900, monthOfYear, dayOfMonth);
}, mYear, mMonth, mDay);
},
mYear,
mMonth,
mDay);
datePickerDialog.show();
}
else if(v == editIssueButton) {
} else if (v == editIssueButton) {
processEditIssue();
}
}
private void getIssue(final String repoOwner, final String repoName, int issueIndex, int resultLimit) {
private void getIssue(
final String repoOwner, final String repoName, int issueIndex, int resultLimit) {
Call<Issue> call = RetrofitClient.getApiInterface(ctx).issueGetIssue(repoOwner, repoName, (long) issueIndex);
Call<Issue> call =
RetrofitClient.getApiInterface(ctx)
.issueGetIssue(repoOwner, repoName, (long) issueIndex);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Issue> call, @NonNull retrofit2.Response<Issue> response) {
public void onResponse(
@NonNull Call<Issue> call,
@NonNull retrofit2.Response<Issue> response) {
if(response.code() == 200) {
if (response.code() == 200) {
assert response.body() != null;
editIssueTitle.setText(response.body().getTitle());
@ -247,89 +283,148 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe
Milestone currentMilestone = response.body().getMilestone();
// get milestones list
if(response.body().getId() > 0) {
if (response.body().getId() > 0) {
Call<List<Milestone>> call_ = RetrofitClient.getApiInterface(ctx).issueGetMilestonesList(repoOwner, repoName, msState, null, 1, resultLimit);
Call<List<Milestone>> call_ =
RetrofitClient.getApiInterface(ctx)
.issueGetMilestonesList(
repoOwner,
repoName,
msState,
null,
1,
resultLimit);
call_.enqueue(new Callback<>() {
call_.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<Milestone>> call, @NonNull retrofit2.Response<List<Milestone>> response_) {
public void onResponse(
@NonNull Call<List<Milestone>> call,
@NonNull retrofit2.Response<List<Milestone>>
response_) {
if(response_.code() == 200) {
if (response_.code() == 200) {
List<Milestone> milestonesList_ = response_.body();
List<Milestone> milestonesList_ =
response_.body();
assert milestonesList_ != null;
Milestone ms = new Milestone();
ms.setId(0L);
ms.setTitle(getString(R.string.issueCreatedNoMilestone));
ms.setTitle(
getString(
R.string
.issueCreatedNoMilestone));
milestonesList.put(ms.getTitle(), ms);
if(milestonesList_.size() > 0) {
if (milestonesList_.size() > 0) {
for(Milestone milestone : milestonesList_) {
for (Milestone milestone :
milestonesList_) {
//Don't translate "open" is a enum
if(milestone.getState().equals("open")) {
milestonesList.put(milestone.getTitle(), milestone);
// Don't translate "open" is a enum
if (milestone
.getState()
.equals("open")) {
milestonesList.put(
milestone.getTitle(),
milestone);
}
}
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(EditIssueActivity.this, R.layout.list_spinner_items, new ArrayList<>(milestonesList.keySet()));
ArrayAdapter<String> adapter =
new ArrayAdapter<>(
EditIssueActivity.this,
R.layout.list_spinner_items,
new ArrayList<>(
milestonesList
.keySet()));
editIssueMilestoneSpinner.setAdapter(adapter);
editIssueMilestoneSpinner.setOnItemClickListener((parent, view, position, id) -> {
if(position == 0) {
editIssueMilestoneSpinner
.setOnItemClickListener(
(parent,
view,
position,
id) -> {
if (position == 0) {
milestoneId = 0;
}
else if(view instanceof TextView) {
milestoneId = Math.toIntExact(Objects.requireNonNull(milestonesList.get(((TextView) view).getText().toString())).getId());
} else if (view
instanceof
TextView) {
milestoneId =
Math.toIntExact(
Objects
.requireNonNull(
milestonesList
.get(
((TextView)
view)
.getText()
.toString()))
.getId());
}
});
new Handler(Looper.getMainLooper()).postDelayed(() -> {
if(currentMilestone != null) {
milestoneId = Math.toIntExact(currentMilestone.getId());
editIssueMilestoneSpinner.setText(currentMilestone.getTitle(), false);
}
else {
new Handler(Looper.getMainLooper())
.postDelayed(
() -> {
if (currentMilestone
!= null) {
milestoneId =
Math.toIntExact(
currentMilestone
.getId());
editIssueMilestoneSpinner
.setText(
currentMilestone
.getTitle(),
false);
} else {
milestoneId = 0;
editIssueMilestoneSpinner.setText(getString(R.string.issueCreatedNoMilestone), false);
editIssueMilestoneSpinner
.setText(
getString(
R
.string
.issueCreatedNoMilestone),
false);
}
}, 500);
},
500);
enableProcessButton();
}
}
@Override
public void onFailure(@NonNull Call<List<Milestone>> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<List<Milestone>> call,
@NonNull Throwable t) {
Log.e("onFailure", t.toString());
}
});
}
// get milestones list
if(response.body().getDueDate() != null) {
if (response.body().getDueDate() != null) {
@SuppressLint("SimpleDateFormat") DateFormat formatter = new SimpleDateFormat("yyyy-M-dd");
@SuppressLint("SimpleDateFormat")
DateFormat formatter = new SimpleDateFormat("yyyy-M-dd");
String dueDate = formatter.format(response.body().getDueDate());
editIssueDueDate.setText(dueDate);
}
//enableProcessButton();
// enableProcessButton();
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
} else {
Toasty.error(ctx, getString(R.string.genericError));
}
@ -341,7 +436,6 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe
Log.e("onFailure", t.toString());
}
});
}
private void disableProcessButton() {
@ -359,5 +453,4 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe
super.onResume();
issue.getRepository().checkAccountSwitch(this);
}
}

View File

@ -18,6 +18,10 @@ import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.core.app.NotificationCompat;
import com.vdurmont.emoji.EmojiParser;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import okhttp3.ResponseBody;
import org.apache.commons.io.FilenameUtils;
import org.gitnex.tea4j.v2.models.ContentsResponse;
import org.mian.gitnex.R;
@ -33,91 +37,147 @@ 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;
import java.io.OutputStream;
import java.util.Arrays;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Response;
/**
* @author M M Arif
*/
public class FileViewActivity extends BaseActivity implements BottomSheetListener {
private ActivityFileViewBinding binding;
private ContentsResponse file;
private RepositoryContext repository;
ActivityResultLauncher<Intent> activityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if(result.getResultCode() == Activity.RESULT_OK) {
ActivityResultLauncher<Intent> activityResultLauncher =
registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == Activity.RESULT_OK) {
assert result.getData() != null;
try {
OutputStream outputStream = getContentResolver().openOutputStream(result.getData().getData());
OutputStream outputStream =
getContentResolver()
.openOutputStream(result.getData().getData());
NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx, ctx.getPackageName()).setContentTitle(getString(R.string.fileViewerNotificationTitleStarted))
.setContentText(getString(R.string.fileViewerNotificationDescriptionStarted, file.getName())).setSmallIcon(R.drawable.gitnex_transparent).setPriority(NotificationCompat.PRIORITY_LOW)
.setChannelId(Constants.downloadNotificationChannelId).setProgress(100, 0, false).setOngoing(true);
NotificationCompat.Builder builder =
new NotificationCompat.Builder(ctx, ctx.getPackageName())
.setContentTitle(
getString(
R.string
.fileViewerNotificationTitleStarted))
.setContentText(
getString(
R.string
.fileViewerNotificationDescriptionStarted,
file.getName()))
.setSmallIcon(R.drawable.gitnex_transparent)
.setPriority(NotificationCompat.PRIORITY_LOW)
.setChannelId(
Constants.downloadNotificationChannelId)
.setProgress(100, 0, false)
.setOngoing(true);
int notificationId = Notifications.uniqueNotificationId(ctx);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
NotificationManager notificationManager =
(NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(notificationId, builder.build());
Thread thread = new Thread(() -> {
Thread thread =
new Thread(
() -> {
try {
Call<ResponseBody> call = RetrofitClient.getWebInterface(ctx).getFileContents(repository.getOwner(), repository.getName(), repository.getBranchRef(), file.getPath());
Call<ResponseBody> call =
RetrofitClient.getWebInterface(ctx)
.getFileContents(
repository
.getOwner(),
repository
.getName(),
repository
.getBranchRef(),
file.getPath());
Response<ResponseBody> response = call.execute();
Response<ResponseBody> response =
call.execute();
assert response.body() != null;
AppUtil.copyProgress(response.body().byteStream(), outputStream, file.getSize(), progress -> {
builder.setProgress(100, progress, false);
notificationManager.notify(notificationId, builder.build());
AppUtil.copyProgress(
response.body().byteStream(),
outputStream,
file.getSize(),
progress -> {
builder.setProgress(
100, progress, false);
notificationManager.notify(
notificationId,
builder.build());
});
builder.setContentTitle(getString(R.string.fileViewerNotificationTitleFinished)).setContentText(getString(R.string.fileViewerNotificationDescriptionFinished, file.getName()));
builder.setContentTitle(
getString(
R.string
.fileViewerNotificationTitleFinished))
.setContentText(
getString(
R.string
.fileViewerNotificationDescriptionFinished,
file.getName()));
}
catch(IOException ignored) {
} catch (IOException ignored) {
builder.setContentTitle(getString(R.string.fileViewerNotificationTitleFailed)).setContentText(getString(R.string.fileViewerNotificationDescriptionFailed, file.getName()));
builder.setContentTitle(
getString(
R.string
.fileViewerNotificationTitleFailed))
.setContentText(
getString(
R.string
.fileViewerNotificationDescriptionFailed,
file.getName()));
}
finally {
} finally {
builder.setProgress(0, 0, false).setOngoing(false);
notificationManager.notify(notificationId, builder.build());
builder.setProgress(0, 0, false)
.setOngoing(false);
notificationManager.notify(
notificationId, builder.build());
}
});
thread.start();
}
catch(IOException ignored) {
} catch (IOException ignored) {
}
}
});
private boolean renderMd = false;
private boolean processable = false;
public ActivityResultLauncher<Intent> editFileLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if(result.getResultCode() == 200) {
public ActivityResultLauncher<Intent> editFileLauncher =
registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == 200) {
assert result.getData() != null;
if(result.getData().getBooleanExtra("fileModified", false)) {
switch(result.getData().getIntExtra("fileAction", CreateFileActivity.FILE_ACTION_EDIT)) {
if (result.getData().getBooleanExtra("fileModified", false)) {
switch (result.getData()
.getIntExtra(
"fileAction",
CreateFileActivity.FILE_ACTION_EDIT)) {
case CreateFileActivity.FILE_ACTION_CREATE:
case CreateFileActivity.FILE_ACTION_EDIT:
getSingleFileContents(repository.getOwner(), repository.getName(), file.getPath(), repository.getBranchRef());
getSingleFileContents(
repository.getOwner(),
repository.getName(),
file.getPath(),
repository.getBranchRef());
break;
default:
finish();
@ -144,46 +204,65 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene
binding.toolbarTitle.setMovementMethod(new ScrollingMovementMethod());
binding.toolbarTitle.setText(file.getPath());
getSingleFileContents(repository.getOwner(), repository.getName(), file.getPath(), repository.getBranchRef());
getSingleFileContents(
repository.getOwner(),
repository.getName(),
file.getPath(),
repository.getBranchRef());
}
private void getSingleFileContents(final String owner, String repo, final String filename, String ref) {
private void getSingleFileContents(
final String owner, String repo, final String filename, String ref) {
Thread thread = new Thread(() -> {
Call<ResponseBody> call = RetrofitClient.getWebInterface(ctx).getFileContents(owner, repo, ref, filename);
Thread thread =
new Thread(
() -> {
Call<ResponseBody> call =
RetrofitClient.getWebInterface(ctx)
.getFileContents(owner, repo, ref, filename);
try {
Response<ResponseBody> response = call.execute();
if(response.code() == 200) {
if (response.code() == 200) {
ResponseBody responseBody = response.body();
if(responseBody != null) {
if (responseBody != null) {
runOnUiThread(() -> binding.progressBar.setVisibility(View.GONE));
runOnUiThread(
() -> binding.progressBar.setVisibility(View.GONE));
String fileExtension = FilenameUtils.getExtension(filename);
switch(AppUtil.getFileType(fileExtension)) {
switch (AppUtil.getFileType(fileExtension)) {
case IMAGE:
// See https://developer.android.com/guide/topics/media/media-formats#core
if(Arrays.asList("bmp", "gif", "jpg", "jpeg", "png", "webp", "heic", "heif").contains(fileExtension.toLowerCase())) {
// See
// https://developer.android.com/guide/topics/media/media-formats#core
if (Arrays.asList(
"bmp", "gif", "jpg", "jpeg", "png",
"webp", "heic", "heif")
.contains(fileExtension.toLowerCase())) {
byte[] pictureBytes = responseBody.bytes();
Bitmap image = Images.scaleImage(pictureBytes, 1920);
Bitmap image =
Images.scaleImage(pictureBytes, 1920);
processable = image != null;
if(processable) {
runOnUiThread(() -> {
binding.contents.setVisibility(View.GONE);
binding.markdownFrame.setVisibility(View.GONE);
if (processable) {
runOnUiThread(
() -> {
binding.contents.setVisibility(
View.GONE);
binding.markdownFrame
.setVisibility(
View.GONE);
binding.photoView.setVisibility(View.VISIBLE);
binding.photoView.setImageBitmap(image);
binding.photoView.setVisibility(
View.VISIBLE);
binding.photoView
.setImageBitmap(image);
});
}
}
@ -191,88 +270,124 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene
case UNKNOWN:
case TEXT:
if(file.getSize() > Constants.maximumFileViewerSize) {
if (file.getSize()
> Constants.maximumFileViewerSize) {
break;
}
processable = true;
String text = responseBody.string();
runOnUiThread(() -> {
binding.photoView.setVisibility(View.GONE);
runOnUiThread(
() -> {
binding.photoView.setVisibility(
View.GONE);
binding.contents.setContent(text, fileExtension);
binding.contents.setContent(
text, fileExtension);
if(renderMd) {
Markdown.render(ctx, EmojiParser.parseToUnicode(text), binding.markdown, repository);
if (renderMd) {
Markdown.render(
ctx,
EmojiParser.parseToUnicode(
text),
binding.markdown,
repository);
binding.contents.setVisibility(View.GONE);
binding.markdownFrame.setVisibility(View.VISIBLE);
}
else {
binding.markdownFrame.setVisibility(View.GONE);
binding.contents.setVisibility(View.VISIBLE);
binding.contents.setVisibility(
View.GONE);
binding.markdownFrame.setVisibility(
View.VISIBLE);
} else {
binding.markdownFrame.setVisibility(
View.GONE);
binding.contents.setVisibility(
View.VISIBLE);
}
});
break;
}
if(!processable) { // While the file could still be non-binary,
// it's better we don't show it (to prevent any crashes and/or unwanted behavior) and let the user download it instead.
if (!processable) { // While the file could still be
// non-binary,
// it's better we don't show it (to prevent any crashes
// and/or unwanted behavior) and let the user download
// it instead.
responseBody.close();
runOnUiThread(() -> {
runOnUiThread(
() -> {
binding.photoView.setVisibility(View.GONE);
binding.contents.setVisibility(View.GONE);
binding.markdownFrame.setVisibility(View.VISIBLE);
binding.markdownFrame.setVisibility(
View.VISIBLE);
binding.markdown.setVisibility(View.GONE);
binding.markdownTv.setVisibility(View.VISIBLE);
binding.markdownTv.setText(getString(R.string.excludeFilesInFileViewer));
binding.markdownTv.setGravity(Gravity.CENTER);
binding.markdownTv.setTypeface(null, Typeface.BOLD);
binding.markdownTv.setVisibility(
View.VISIBLE);
binding.markdownTv.setText(
getString(
R.string
.excludeFilesInFileViewer));
binding.markdownTv.setGravity(
Gravity.CENTER);
binding.markdownTv.setTypeface(
null, Typeface.BOLD);
});
}
}
else {
} else {
runOnUiThread(() -> {
runOnUiThread(
() -> {
binding.markdownTv.setText("");
binding.progressBar.setVisibility(View.GONE);
});
}
}
else {
switch(response.code()) {
} else {
switch (response.code()) {
case 401:
runOnUiThread(() -> AlertDialogs.authorizationTokenRevokedDialog(ctx));
runOnUiThread(
() ->
AlertDialogs
.authorizationTokenRevokedDialog(
ctx));
break;
case 403:
runOnUiThread(() -> Toasty.error(ctx, ctx.getString(R.string.authorizeError)));
runOnUiThread(
() ->
Toasty.error(
ctx,
ctx.getString(
R.string
.authorizeError)));
break;
case 404:
runOnUiThread(() -> Toasty.warning(ctx, ctx.getString(R.string.apiNotFound)));
runOnUiThread(
() ->
Toasty.warning(
ctx,
ctx.getString(
R.string.apiNotFound)));
break;
default:
runOnUiThread(() -> Toasty.error(ctx, getString(R.string.genericError)));
runOnUiThread(
() ->
Toasty.error(
ctx,
getString(
R.string
.genericError)));
}
}
} catch (IOException ignored) {
}
catch(IOException ignored) {
}
});
thread.start();
}
@Override
@ -282,7 +397,7 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene
inflater.inflate(R.menu.generic_nav_dotted_menu, menu);
inflater.inflate(R.menu.markdown_switcher, menu);
if(!FilenameUtils.getExtension(file.getName()).equalsIgnoreCase("md")) {
if (!FilenameUtils.getExtension(file.getName()).equalsIgnoreCase("md")) {
menu.getItem(0).setVisible(false);
}
@ -295,13 +410,12 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene
int id = item.getItemId();
if(id == android.R.id.home) {
if (id == android.R.id.home) {
finish();
return true;
}
else if(id == R.id.genericMenu) {
} else if (id == R.id.genericMenu) {
BottomSheetFileViewerFragment bottomSheet = new BottomSheetFileViewerFragment();
Bundle opts = repository.getBundle();
@ -310,20 +424,22 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene
bottomSheet.show(getSupportFragmentManager(), "fileViewerBottomSheet");
return true;
}
else if(id == R.id.markdown) {
} else if (id == R.id.markdown) {
if(!renderMd) {
if(binding.markdown.getAdapter() == null) {
Markdown.render(ctx, EmojiParser.parseToUnicode(binding.contents.getContent()), binding.markdown, repository);
if (!renderMd) {
if (binding.markdown.getAdapter() == null) {
Markdown.render(
ctx,
EmojiParser.parseToUnicode(binding.contents.getContent()),
binding.markdown,
repository);
}
binding.contents.setVisibility(View.GONE);
binding.markdownFrame.setVisibility(View.VISIBLE);
renderMd = true;
}
else {
} else {
binding.markdownFrame.setVisibility(View.GONE);
binding.contents.setVisibility(View.VISIBLE);
@ -332,8 +448,7 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene
return true;
}
else {
} else {
return super.onOptionsItemSelected(item);
}
}
@ -341,11 +456,11 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene
@Override
public void onButtonClicked(String text) {
if("downloadFile".equals(text)) {
if ("downloadFile".equals(text)) {
requestFileDownload();
}
if("deleteFile".equals(text)) {
if ("deleteFile".equals(text)) {
Intent intent = repository.getIntent(ctx, CreateFileActivity.class);
intent.putExtra("fileAction", CreateFileActivity.FILE_ACTION_DELETE);
intent.putExtra("filePath", file.getPath());
@ -354,9 +469,9 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene
editFileLauncher.launch(intent);
}
if("editFile".equals(text)) {
if ("editFile".equals(text)) {
if(binding.contents.getContent() != null && !binding.contents.getContent().isEmpty()) {
if (binding.contents.getContent() != null && !binding.contents.getContent().isEmpty()) {
Intent intent = repository.getIntent(ctx, CreateFileActivity.class);
@ -367,21 +482,21 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene
editFileLauncher.launch(intent);
}
else {
} else {
Toasty.error(ctx, getString(R.string.fileTypeCannotBeEdited));
}
}
if("copyUrl".equals(text)) {
AppUtil.copyToClipboard(this, file.getHtmlUrl(), ctx.getString(R.string.copyIssueUrlToastMsg));
if ("copyUrl".equals(text)) {
AppUtil.copyToClipboard(
this, file.getHtmlUrl(), ctx.getString(R.string.copyIssueUrlToastMsg));
}
if("share".equals(text)) {
if ("share".equals(text)) {
AppUtil.sharingIntent(this, file.getHtmlUrl());
}
if("open".equals(text)) {
if ("open".equals(text)) {
AppUtil.openUrlInBrowser(this, file.getHtmlUrl());
}
}
@ -395,7 +510,6 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene
intent.setType("*/*");
activityResultLauncher.launch(intent);
}
@Override
@ -403,5 +517,4 @@ public class FileViewActivity extends BaseActivity implements BottomSheetListene
super.onResume();
repository.checkAccountSwitch(this);
}
}

View File

@ -10,6 +10,12 @@ import android.widget.EditText;
import android.widget.RadioGroup;
import androidx.annotation.NonNull;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import io.mikael.urlbuilder.UrlBuilder;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.UUID;
import okhttp3.Credentials;
import org.gitnex.tea4j.v2.models.AccessToken;
import org.gitnex.tea4j.v2.models.CreateAccessTokenOption;
import org.gitnex.tea4j.v2.models.GeneralAPISettings;
@ -28,19 +34,12 @@ import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.UrlHelper;
import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.structs.Protocol;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.UUID;
import io.mikael.urlbuilder.UrlBuilder;
import okhttp3.Credentials;
import retrofit2.Call;
import retrofit2.Callback;
/**
* @author M M Arif
*/
public class LoginActivity extends BaseActivity {
private Button loginButton;
@ -59,7 +58,8 @@ public class LoginActivity extends BaseActivity {
super.onCreate(savedInstanceState);
ActivityLoginBinding activityLoginBinding = ActivityLoginBinding.inflate(getLayoutInflater());
ActivityLoginBinding activityLoginBinding =
ActivityLoginBinding.inflate(getLayoutInflater());
setContentView(activityLoginBinding.getRoot());
NetworkStatusObserver networkStatusObserver = NetworkStatusObserver.getInstance(ctx);
@ -75,55 +75,79 @@ public class LoginActivity extends BaseActivity {
activityLoginBinding.appVersion.setText(AppUtil.getAppVersion(appCtx));
ArrayAdapter<Protocol> adapterProtocols = new ArrayAdapter<>(LoginActivity.this, R.layout.list_spinner_items, Protocol.values());
ArrayAdapter<Protocol> adapterProtocols =
new ArrayAdapter<>(
LoginActivity.this, R.layout.list_spinner_items, Protocol.values());
instanceUrlET.setText(getIntent().getStringExtra("instanceUrl"));
protocolSpinner.setAdapter(adapterProtocols);
protocolSpinner.setSelection(0);
protocolSpinner.setOnItemClickListener((parent, view, position, id) -> {
protocolSpinner.setOnItemClickListener(
(parent, view, position, id) -> {
selectedProtocol = String.valueOf(parent.getItemAtPosition(position));
if(selectedProtocol.equals(String.valueOf(Protocol.HTTP))) {
if (selectedProtocol.equals(String.valueOf(Protocol.HTTP))) {
Toasty.warning(ctx, getResources().getString(R.string.protocolError));
}
});
if(R.id.loginToken == loginMethod.getCheckedRadioButtonId()) {
AppUtil.setMultiVisibility(View.GONE, findViewById(R.id.login_uidLayout), findViewById(R.id.login_passwdLayout), findViewById(R.id.otpCodeLayout));
if (R.id.loginToken == loginMethod.getCheckedRadioButtonId()) {
AppUtil.setMultiVisibility(
View.GONE,
findViewById(R.id.login_uidLayout),
findViewById(R.id.login_passwdLayout),
findViewById(R.id.otpCodeLayout));
findViewById(R.id.loginTokenCodeLayout).setVisibility(View.VISIBLE);
}
else {
AppUtil.setMultiVisibility(View.VISIBLE, findViewById(R.id.login_uidLayout), findViewById(R.id.login_passwdLayout), findViewById(R.id.otpCodeLayout));
} else {
AppUtil.setMultiVisibility(
View.VISIBLE,
findViewById(R.id.login_uidLayout),
findViewById(R.id.login_passwdLayout),
findViewById(R.id.otpCodeLayout));
findViewById(R.id.loginTokenCodeLayout).setVisibility(View.GONE);
}
loginMethod.setOnCheckedChangeListener((group, checkedId) -> {
if(checkedId == R.id.loginToken) {
AppUtil.setMultiVisibility(View.GONE, findViewById(R.id.login_uidLayout), findViewById(R.id.login_passwdLayout), findViewById(R.id.otpCodeLayout));
loginMethod.setOnCheckedChangeListener(
(group, checkedId) -> {
if (checkedId == R.id.loginToken) {
AppUtil.setMultiVisibility(
View.GONE,
findViewById(R.id.login_uidLayout),
findViewById(R.id.login_passwdLayout),
findViewById(R.id.otpCodeLayout));
findViewById(R.id.loginTokenCodeLayout).setVisibility(View.VISIBLE);
}
else {
AppUtil.setMultiVisibility(View.VISIBLE, findViewById(R.id.login_uidLayout), findViewById(R.id.login_passwdLayout), findViewById(R.id.otpCodeLayout));
} else {
AppUtil.setMultiVisibility(
View.VISIBLE,
findViewById(R.id.login_uidLayout),
findViewById(R.id.login_passwdLayout),
findViewById(R.id.otpCodeLayout));
findViewById(R.id.loginTokenCodeLayout).setVisibility(View.GONE);
}
});
networkStatusObserver.registerNetworkStatusListener(hasNetworkConnection -> runOnUiThread(() -> {
if(hasNetworkConnection) {
networkStatusObserver.registerNetworkStatusListener(
hasNetworkConnection ->
runOnUiThread(
() -> {
if (hasNetworkConnection) {
enableProcessButton();
}
else {
} else {
disableProcessButton();
loginButton.setText(getResources().getString(R.string.btnLogin));
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
loginButton.setText(
getResources().getString(R.string.btnLogin));
Toasty.error(
ctx,
getResources()
.getString(R.string.checkNetConnection));
}
}));
loadDefaults();
loginButton.setOnClickListener(view -> {
loginButton.setOnClickListener(
view -> {
disableProcessButton();
login();
});
@ -133,7 +157,7 @@ public class LoginActivity extends BaseActivity {
try {
if(selectedProtocol == null) {
if (selectedProtocol == null) {
Toasty.error(ctx, getResources().getString(R.string.protocolEmptyError));
enableProcessButton();
@ -142,54 +166,73 @@ public class LoginActivity extends BaseActivity {
String loginUid = loginUidET.getText().toString().replaceAll("[\\uFEFF]", "").trim();
String loginPass = loginPassword.getText().toString().trim();
String loginToken = loginTokenCode.getText().toString().replaceAll("[\\uFEFF|#]", "").trim();
String loginToken =
loginTokenCode.getText().toString().replaceAll("[\\uFEFF|#]", "").trim();
LoginType loginType = (loginMethod.getCheckedRadioButtonId() == R.id.loginUsernamePassword) ? LoginType.BASIC : LoginType.TOKEN;
LoginType loginType =
(loginMethod.getCheckedRadioButtonId() == R.id.loginUsernamePassword)
? LoginType.BASIC
: LoginType.TOKEN;
URI rawInstanceUrl = UrlBuilder.fromString(UrlHelper.fixScheme(instanceUrlET.getText().toString().replaceAll("[\\uFEFF|#]", "").trim(), "http")).toUri();
URI rawInstanceUrl =
UrlBuilder.fromString(
UrlHelper.fixScheme(
instanceUrlET
.getText()
.toString()
.replaceAll("[\\uFEFF|#]", "")
.trim(),
"http"))
.toUri();
instanceUrl = UrlBuilder.fromUri(rawInstanceUrl).withScheme(selectedProtocol.toLowerCase()).withPath(PathsHelper.join(rawInstanceUrl.getPath(), "/api/v1/")).toUri();
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());
if(instanceUrlET.getText().toString().equals("")) {
if (instanceUrlET.getText().toString().equals("")) {
Toasty.error(ctx, getResources().getString(R.string.emptyFieldURL));
enableProcessButton();
return;
}
if(loginType == LoginType.BASIC) {
if (loginType == LoginType.BASIC) {
if(otpCode.length() != 0 && otpCode.length() != 6) {
if (otpCode.length() != 0 && otpCode.length() != 6) {
Toasty.warning(ctx, getResources().getString(R.string.loginOTPTypeError));
enableProcessButton();
return;
}
if(loginUid.equals("")) {
if (loginUid.equals("")) {
Toasty.error(ctx, getResources().getString(R.string.emptyFieldUsername));
enableProcessButton();
return;
}
if(loginPass.equals("")) {
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;
int loginOTP =
(otpCode.length() > 0)
? Integer.parseInt(otpCode.getText().toString().trim())
: 0;
versionCheck(loginUid, loginPass, loginOTP, loginToken, loginType);
}
else {
} else {
if(loginToken.equals("")) {
if (loginToken.equals("")) {
Toasty.error(ctx, getResources().getString(R.string.loginTokenError));
enableProcessButton();
@ -200,8 +243,7 @@ public class LoginActivity extends BaseActivity {
serverPageLimitSettings();
}
}
catch(Exception e) {
} catch (Exception e) {
Toasty.error(ctx, getResources().getString(R.string.malformedUrl));
enableProcessButton();
@ -210,122 +252,168 @@ public class LoginActivity extends BaseActivity {
private void serverPageLimitSettings() {
Call<GeneralAPISettings> generalAPISettings = RetrofitClient.getApiInterface(ctx).getGeneralAPISettings();
generalAPISettings.enqueue(new Callback<>() {
Call<GeneralAPISettings> generalAPISettings =
RetrofitClient.getApiInterface(ctx).getGeneralAPISettings();
generalAPISettings.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull final Call<GeneralAPISettings> generalAPISettings, @NonNull retrofit2.Response<GeneralAPISettings> response) {
public void onResponse(
@NonNull final Call<GeneralAPISettings> generalAPISettings,
@NonNull retrofit2.Response<GeneralAPISettings> response) {
if(response.code() == 200 && response.body() != null) {
if (response.code() == 200 && response.body() != null) {
if(response.body().getMaxResponseItems() != null) {
maxResponseItems = Math.toIntExact(response.body().getMaxResponseItems());
if (response.body().getMaxResponseItems() != null) {
maxResponseItems =
Math.toIntExact(response.body().getMaxResponseItems());
}
if(response.body().getDefaultPagingNum() != null) {
defaultPagingNumber = Math.toIntExact(response.body().getDefaultPagingNum());
if (response.body().getDefaultPagingNum() != null) {
defaultPagingNumber =
Math.toIntExact(response.body().getDefaultPagingNum());
}
}
}
@Override
public void onFailure(@NonNull Call<GeneralAPISettings> generalAPISettings, @NonNull Throwable t) {
}
public void onFailure(
@NonNull Call<GeneralAPISettings> generalAPISettings,
@NonNull Throwable t) {}
});
}
private void versionCheck(final String loginUid, final String loginPass, final int loginOTP, final String loginToken, final LoginType loginType) {
private void versionCheck(
final String loginUid,
final String loginPass,
final int loginOTP,
final String loginToken,
final LoginType loginType) {
Call<ServerVersion> callVersion;
if(!loginToken.equals("")) {
if (!loginToken.equals("")) {
callVersion = RetrofitClient.getApiInterface(ctx, instanceUrl.toString(), "token " + loginToken, null).getVersion();
}
else {
callVersion =
RetrofitClient.getApiInterface(
ctx, instanceUrl.toString(), "token " + loginToken, null)
.getVersion();
} else {
String credential = Credentials.basic(loginUid, loginPass, StandardCharsets.UTF_8);
if(loginOTP != 0) {
if (loginOTP != 0) {
callVersion = RetrofitClient.getApiInterface(ctx, instanceUrl.toString(), credential, null).getVersion(loginOTP);
}
else {
callVersion =
RetrofitClient.getApiInterface(
ctx, instanceUrl.toString(), credential, null)
.getVersion(loginOTP);
} else {
callVersion = RetrofitClient.getApiInterface(ctx, instanceUrl.toString(), credential, null).getVersion();
callVersion =
RetrofitClient.getApiInterface(
ctx, instanceUrl.toString(), credential, null)
.getVersion();
}
}
callVersion.enqueue(new Callback<>() {
callVersion.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull final Call<ServerVersion> callVersion, @NonNull retrofit2.Response<ServerVersion> responseVersion) {
public void onResponse(
@NonNull final Call<ServerVersion> callVersion,
@NonNull retrofit2.Response<ServerVersion> responseVersion) {
if(responseVersion.code() == 200) {
if (responseVersion.code() == 200) {
ServerVersion version = responseVersion.body();
assert version != null;
if(!Version.valid(version.getVersion())) {
if (!Version.valid(version.getVersion())) {
Toasty.error(ctx, getResources().getString(R.string.versionUnknown));
Toasty.error(
ctx, getResources().getString(R.string.versionUnknown));
enableProcessButton();
return;
}
giteaVersion = new Version(version.getVersion());
if(giteaVersion.less(getString(R.string.versionLow))) {
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(getString(R.string.versionAlertDialogHeader))
.setMessage(getResources().getString(R.string.versionUnsupportedOld, version.getVersion())).setNeutralButton(getString(R.string.cancelButton), (dialog, which) -> {
if (giteaVersion.less(getString(R.string.versionLow))) {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(
getString(
R.string.versionAlertDialogHeader))
.setMessage(
getResources()
.getString(
R.string
.versionUnsupportedOld,
version.getVersion()))
.setNeutralButton(
getString(R.string.cancelButton),
(dialog, which) -> {
dialog.dismiss();
enableProcessButton();
}).setPositiveButton(getString(R.string.textContinue), (dialog, which) -> {
})
.setPositiveButton(
getString(R.string.textContinue),
(dialog, which) -> {
dialog.dismiss();
login(loginType, loginUid, loginPass, loginOTP, loginToken);
login(
loginType,
loginUid,
loginPass,
loginOTP,
loginToken);
});
materialAlertDialogBuilder.create().show();
}
else if(giteaVersion.lessOrEqual(getString(R.string.versionHigh))) {
} else if (giteaVersion.lessOrEqual(getString(R.string.versionHigh))) {
login(loginType, loginUid, loginPass, loginOTP, loginToken);
}
else {
} else {
Toasty.warning(ctx, getResources().getString(R.string.versionUnsupportedNew));
Toasty.warning(
ctx,
getResources().getString(R.string.versionUnsupportedNew));
login(loginType, loginUid, loginPass, loginOTP, loginToken);
}
}
else if(responseVersion.code() == 403) {
} else if (responseVersion.code() == 403) {
login(loginType, loginUid, loginPass, loginOTP, loginToken);
}
}
private void login(LoginType loginType, String loginUid, String loginPass, int loginOTP, String loginToken) {
private void login(
LoginType loginType,
String loginUid,
String loginPass,
int loginOTP,
String loginToken) {
// ToDo: before store/create token: get UserInfo to check DB/AccountManager if there already exist a token
// ToDo: before store/create token: get UserInfo to check DB/AccountManager
// if there already exist a token
// the setup methods then can better handle all different cases
if(loginType == LoginType.BASIC) {
if (loginType == LoginType.BASIC) {
setup(loginUid, loginPass, loginOTP);
}
else if(loginType == LoginType.TOKEN) { // Token
} else if (loginType == LoginType.TOKEN) { // Token
setupUsingExistingToken(loginToken);
}
}
@Override
public void onFailure(@NonNull Call<ServerVersion> callVersion, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<ServerVersion> callVersion, @NonNull Throwable t) {
Toasty.error(ctx, getResources().getString(R.string.genericServerResponseError));
Toasty.error(
ctx, getResources().getString(R.string.genericServerResponseError));
enableProcessButton();
}
});
@ -333,34 +421,50 @@ public class LoginActivity extends BaseActivity {
private void setupUsingExistingToken(final String loginToken) {
Call<User> call = RetrofitClient.getApiInterface(ctx, instanceUrl.toString(), "token " + loginToken, null).userGetCurrent();
Call<User> call =
RetrofitClient.getApiInterface(
ctx, instanceUrl.toString(), "token " + loginToken, null)
.userGetCurrent();
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<User> call, @NonNull retrofit2.Response<User> response) {
public void onResponse(
@NonNull Call<User> call, @NonNull retrofit2.Response<User> response) {
User userDetails = response.body();
switch(response.code()) {
switch (response.code()) {
case 200:
assert userDetails != null;
// insert new account to db if does not exist
String accountName = userDetails.getLogin() + "@" + instanceUrl;
UserAccountsApi userAccountsApi = BaseApi.getInstance(ctx, UserAccountsApi.class);
UserAccountsApi userAccountsApi =
BaseApi.getInstance(ctx, UserAccountsApi.class);
assert userAccountsApi != null;
boolean userAccountExists = userAccountsApi.userAccountExists(accountName);
boolean userAccountExists =
userAccountsApi.userAccountExists(accountName);
UserAccount account;
if(!userAccountExists) {
long accountId = userAccountsApi.createNewAccount(accountName, instanceUrl.toString(), userDetails.getLogin(), loginToken, giteaVersion.toString(), maxResponseItems, defaultPagingNumber);
if (!userAccountExists) {
long accountId =
userAccountsApi.createNewAccount(
accountName,
instanceUrl.toString(),
userDetails.getLogin(),
loginToken,
giteaVersion.toString(),
maxResponseItems,
defaultPagingNumber);
account = userAccountsApi.getAccountById((int) accountId);
}
else {
userAccountsApi.updateTokenByAccountName(accountName, loginToken);
userAccountsApi.login(userAccountsApi.getAccountByName(accountName).getAccountId());
} else {
userAccountsApi.updateTokenByAccountName(
accountName, loginToken);
userAccountsApi.login(
userAccountsApi
.getAccountByName(accountName)
.getAccountId());
account = userAccountsApi.getAccountByName(accountName);
}
@ -371,13 +475,17 @@ public class LoginActivity extends BaseActivity {
finish();
break;
case 401:
Toasty.error(ctx, getResources().getString(R.string.unauthorizedApiError));
Toasty.error(
ctx,
getResources().getString(R.string.unauthorizedApiError));
enableProcessButton();
break;
default:
Toasty.error(ctx, getResources().getString(R.string.genericApiError, response.code()));
Toasty.error(
ctx,
getResources()
.getString(
R.string.genericApiError, response.code()));
enableProcessButton();
}
}
@ -389,7 +497,6 @@ public class LoginActivity extends BaseActivity {
enableProcessButton();
}
});
}
private void setup(final String loginUid, final String loginPass, final int loginOTP) {
@ -398,63 +505,103 @@ public class LoginActivity extends BaseActivity {
final String tokenName = "gitnex-app-" + device_id;
Call<List<AccessToken>> call;
if(loginOTP != 0) {
if (loginOTP != 0) {
call = RetrofitClient.getApiInterface(ctx, instanceUrl.toString(), credential, null).userGetTokens(loginOTP, loginUid, null, null);
}
else {
call =
RetrofitClient.getApiInterface(ctx, instanceUrl.toString(), credential, null)
.userGetTokens(loginOTP, loginUid, null, null);
} else {
call = RetrofitClient.getApiInterface(ctx, instanceUrl.toString(), credential, null).userGetTokens(loginUid, null, null);
call =
RetrofitClient.getApiInterface(ctx, instanceUrl.toString(), credential, null)
.userGetTokens(loginUid, null, null);
}
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<AccessToken>> call, @NonNull retrofit2.Response<List<AccessToken>> response) {
public void onResponse(
@NonNull Call<List<AccessToken>> call,
@NonNull retrofit2.Response<List<AccessToken>> response) {
List<AccessToken> userTokens = response.body();
if(response.code() == 200) {
if (response.code() == 200) {
assert userTokens != null;
for(AccessToken t : userTokens) {
for (AccessToken t : userTokens) {
if(t.getName().equals(tokenName)) {
if (t.getName().equals(tokenName)) {
// this app had created an token on this instance before
// -> since it looks like GitNex forgot the secret we have to delete it first
// -> since it looks like GitNex forgot the secret we have to
// delete it first
Call<Void> delToken;
if(loginOTP != 0) {
if (loginOTP != 0) {
delToken = RetrofitClient.getApiInterface(ctx, instanceUrl.toString(), credential, null).userDeleteAccessToken(loginOTP, loginUid, String.valueOf(t.getId()));
}
else {
delToken =
RetrofitClient.getApiInterface(
ctx,
instanceUrl.toString(),
credential,
null)
.userDeleteAccessToken(
loginOTP,
loginUid,
String.valueOf(t.getId()));
} else {
delToken = RetrofitClient.getApiInterface(ctx, instanceUrl.toString(), credential, null).userDeleteAccessToken(loginUid, String.valueOf(t.getId()));
delToken =
RetrofitClient.getApiInterface(
ctx,
instanceUrl.toString(),
credential,
null)
.userDeleteAccessToken(
loginUid,
String.valueOf(t.getId()));
}
delToken.enqueue(new Callback<>() {
delToken.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> delToken, @NonNull retrofit2.Response<Void> response) {
public void onResponse(
@NonNull Call<Void> delToken,
@NonNull retrofit2.Response<Void> response) {
if(response.code() == 204) {
if (response.code() == 204) {
setupToken(loginUid, loginPass, loginOTP, tokenName);
}
else {
setupToken(
loginUid, loginPass, loginOTP,
tokenName);
} else {
Toasty.error(ctx, getResources().getString(R.string.genericApiError, response.code()));
Toasty.error(
ctx,
getResources()
.getString(
R.string
.genericApiError,
response.code()));
enableProcessButton();
}
}
@Override
public void onFailure(@NonNull Call<Void> delToken, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<Void> delToken,
@NonNull Throwable t) {
Toasty.error(ctx, getResources().getString(R.string.malformedJson));
Toasty.error(
ctx,
getResources()
.getString(
R.string
.malformedJson));
enableProcessButton();
}
});
@ -463,119 +610,188 @@ public class LoginActivity extends BaseActivity {
}
setupToken(loginUid, loginPass, loginOTP, tokenName);
}
else {
} else {
Toasty.error(ctx, getResources().getString(R.string.genericApiError, response.code()));
Toasty.error(
ctx,
getResources()
.getString(R.string.genericApiError, response.code()));
enableProcessButton();
}
}
@Override
public void onFailure(@NonNull Call<List<AccessToken>> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<List<AccessToken>> call, @NonNull Throwable t) {
Toasty.error(ctx, getResources().getString(R.string.malformedJson));
enableProcessButton();
}
});
}
private void setupToken(final String loginUid, final String loginPass, final int loginOTP, final String tokenName) {
private void setupToken(
final String loginUid,
final String loginPass,
final int loginOTP,
final String tokenName) {
final String credential = Credentials.basic(loginUid, loginPass, StandardCharsets.UTF_8);
CreateAccessTokenOption createUserToken = new CreateAccessTokenOption().name(tokenName);
Call<AccessToken> callCreateToken;
if(loginOTP != 0) {
if (loginOTP != 0) {
callCreateToken = RetrofitClient.getApiInterface(ctx, instanceUrl.toString(), credential, null).userCreateToken(loginOTP, loginUid, createUserToken);
}
else {
callCreateToken =
RetrofitClient.getApiInterface(ctx, instanceUrl.toString(), credential, null)
.userCreateToken(loginOTP, loginUid, createUserToken);
} else {
callCreateToken = RetrofitClient.getApiInterface(ctx, instanceUrl.toString(), credential, null).userCreateToken(loginUid, createUserToken);
callCreateToken =
RetrofitClient.getApiInterface(ctx, instanceUrl.toString(), credential, null)
.userCreateToken(loginUid, createUserToken);
}
callCreateToken.enqueue(new Callback<>() {
callCreateToken.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<AccessToken> callCreateToken, @NonNull retrofit2.Response<AccessToken> responseCreate) {
public void onResponse(
@NonNull Call<AccessToken> callCreateToken,
@NonNull retrofit2.Response<AccessToken> responseCreate) {
if(responseCreate.code() == 201) {
if (responseCreate.code() == 201) {
AccessToken newToken = responseCreate.body();
assert newToken != null;
if(!newToken.getSha1().equals("")) {
if (!newToken.getSha1().equals("")) {
Call<User> call = RetrofitClient.getApiInterface(ctx, instanceUrl.toString(), "token " + newToken.getSha1(), null).userGetCurrent();
Call<User> call =
RetrofitClient.getApiInterface(
ctx,
instanceUrl.toString(),
"token " + newToken.getSha1(),
null)
.userGetCurrent();
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<User> call, @NonNull retrofit2.Response<User> response) {
public void onResponse(
@NonNull Call<User> call,
@NonNull retrofit2.Response<User> response) {
User userDetails = response.body();
switch(response.code()) {
switch (response.code()) {
case 200:
assert userDetails != null;
// insert new account to db if does not exist
String accountName = userDetails.getLogin() + "@" + instanceUrl;
UserAccountsApi userAccountsApi = BaseApi.getInstance(ctx, UserAccountsApi.class);
// insert new account to db if does not
// exist
String accountName =
userDetails.getLogin()
+ "@"
+ instanceUrl;
UserAccountsApi userAccountsApi =
BaseApi.getInstance(
ctx, UserAccountsApi.class);
assert userAccountsApi != null;
boolean userAccountExists = userAccountsApi.userAccountExists(accountName);
boolean userAccountExists =
userAccountsApi.userAccountExists(
accountName);
UserAccount account;
if(!userAccountExists) {
long accountId = userAccountsApi.createNewAccount(accountName, instanceUrl.toString(), userDetails.getLogin(), newToken.getSha1(), giteaVersion.toString(), maxResponseItems,
if (!userAccountExists) {
long accountId =
userAccountsApi
.createNewAccount(
accountName,
instanceUrl
.toString(),
userDetails
.getLogin(),
newToken
.getSha1(),
giteaVersion
.toString(),
maxResponseItems,
defaultPagingNumber);
account = userAccountsApi.getAccountById((int) accountId);
}
else {
userAccountsApi.updateTokenByAccountName(accountName, newToken.getSha1());
account = userAccountsApi.getAccountByName(accountName);
account =
userAccountsApi.getAccountById(
(int) accountId);
} else {
userAccountsApi
.updateTokenByAccountName(
accountName,
newToken.getSha1());
account =
userAccountsApi
.getAccountByName(
accountName);
}
AppUtil.switchToAccount(LoginActivity.this, account);
AppUtil.switchToAccount(
LoginActivity.this, account);
startActivity(new Intent(LoginActivity.this, MainActivity.class));
startActivity(
new Intent(
LoginActivity.this,
MainActivity.class));
finish();
break;
case 401:
Toasty.error(ctx, getResources().getString(R.string.unauthorizedApiError));
Toasty.error(
ctx,
getResources()
.getString(
R.string
.unauthorizedApiError));
enableProcessButton();
break;
default:
Toasty.error(ctx, getResources().getString(R.string.genericApiError, response.code()));
Toasty.error(
ctx,
getResources()
.getString(
R.string
.genericApiError,
response.code()));
enableProcessButton();
}
}
@Override
public void onFailure(@NonNull Call<User> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<User> call,
@NonNull Throwable t) {
Toasty.error(ctx, getResources().getString(R.string.genericError));
Toasty.error(
ctx,
getResources()
.getString(R.string.genericError));
enableProcessButton();
}
});
}
}
else if(responseCreate.code() == 500) {
} else if (responseCreate.code() == 500) {
Toasty.error(ctx, getResources().getString(R.string.genericApiError, responseCreate.code()));
Toasty.error(
ctx,
getResources()
.getString(
R.string.genericApiError,
responseCreate.code()));
enableProcessButton();
}
}
@Override
public void onFailure(@NonNull Call<AccessToken> createUserToken, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<AccessToken> createUserToken, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
@ -584,29 +800,27 @@ public class LoginActivity extends BaseActivity {
private void loadDefaults() {
if(tinyDB.getString("loginType").equals(LoginType.BASIC.name().toLowerCase())) {
if (tinyDB.getString("loginType").equals(LoginType.BASIC.name().toLowerCase())) {
loginMethod.check(R.id.loginUsernamePassword);
}
else {
} else {
loginMethod.check(R.id.loginToken);
}
if(!tinyDB.getString("instanceUrlRaw").equals("")) {
if (!tinyDB.getString("instanceUrlRaw").equals("")) {
instanceUrlET.setText(tinyDB.getString("instanceUrlRaw"));
}
if(getAccount() != null && getAccount().getAccount() != null) {
if (getAccount() != null && getAccount().getAccount() != null) {
loginUidET.setText(getAccount().getAccount().getUserName());
}
if(!tinyDB.getString("uniqueAppId").isEmpty()) {
if (!tinyDB.getString("uniqueAppId").isEmpty()) {
device_id = tinyDB.getString("uniqueAppId");
}
else {
} else {
device_id = UUID.randomUUID().toString();
tinyDB.putString("uniqueAppId", device_id);
@ -625,6 +839,8 @@ public class LoginActivity extends BaseActivity {
loginButton.setEnabled(true);
}
private enum LoginType {BASIC, TOKEN}
private enum LoginType {
BASIC,
TOKEN
}
}

View File

@ -22,6 +22,9 @@ import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.card.MaterialCardView;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.navigation.NavigationView;
import java.util.ArrayList;
import java.util.List;
import jp.wasabeef.picasso.transformations.BlurTransformation;
import org.gitnex.tea4j.v2.models.GeneralAPISettings;
import org.gitnex.tea4j.v2.models.NotificationCount;
import org.gitnex.tea4j.v2.models.ServerVersion;
@ -56,18 +59,15 @@ import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.structs.BottomSheetListener;
import org.mian.gitnex.structs.FragmentRefreshListener;
import java.util.ArrayList;
import java.util.List;
import jp.wasabeef.picasso.transformations.BlurTransformation;
import retrofit2.Call;
import retrofit2.Callback;
/**
* @author M M Arif
*/
@SuppressWarnings("ConstantConditions")
public class MainActivity extends BaseActivity implements NavigationView.OnNavigationItemSelectedListener, BottomSheetListener {
public class MainActivity extends BaseActivity
implements NavigationView.OnNavigationItemSelectedListener, BottomSheetListener {
public static boolean refActivity = false;
public static boolean reloadRepos = false;
@ -98,7 +98,11 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
Handler handler = new Handler();
// DO NOT MOVE
if(mainIntent.hasExtra("switchAccountId") && AppUtil.switchToAccount(ctx, BaseApi.getInstance(ctx, UserAccountsApi.class).getAccountById(mainIntent.getIntExtra("switchAccountId", 0)))) {
if (mainIntent.hasExtra("switchAccountId")
&& AppUtil.switchToAccount(
ctx,
BaseApi.getInstance(ctx, UserAccountsApi.class)
.getAccountById(mainIntent.getIntExtra("switchAccountId", 0)))) {
mainIntent.removeExtra("switchAccountId");
recreate();
@ -106,7 +110,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
}
// DO NOT MOVE
if(tinyDB.getInt("currentActiveAccountId", -1) <= 0) {
if (tinyDB.getInt("currentActiveAccountId", -1) <= 0) {
AppUtil.logout(ctx);
return;
}
@ -123,37 +127,27 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
FragmentManager fm = getSupportFragmentManager();
Fragment fragmentById = fm.findFragmentById(R.id.fragment_container);
if(fragmentById instanceof SettingsFragment) {
if (fragmentById instanceof SettingsFragment) {
toolbarTitle.setText(getResources().getString(R.string.navSettings));
}
else if(fragmentById instanceof MyRepositoriesFragment) {
} else if (fragmentById instanceof MyRepositoriesFragment) {
toolbarTitle.setText(getResources().getString(R.string.navMyRepos));
}
else if(fragmentById instanceof StarredRepositoriesFragment) {
} else if (fragmentById instanceof StarredRepositoriesFragment) {
toolbarTitle.setText(getResources().getString(R.string.pageTitleStarredRepos));
}
else if(fragmentById instanceof OrganizationsFragment) {
} else if (fragmentById instanceof OrganizationsFragment) {
toolbarTitle.setText(getResources().getString(R.string.navOrg));
}
else if(fragmentById instanceof ExploreFragment) {
} else if (fragmentById instanceof ExploreFragment) {
toolbarTitle.setText(getResources().getString(R.string.pageTitleExplore));
}
else if(fragmentById instanceof NotificationsFragment) {
} else if (fragmentById instanceof NotificationsFragment) {
toolbarTitle.setText(R.string.pageTitleNotifications);
}
else if(fragmentById instanceof MyProfileFragment) {
} else if (fragmentById instanceof MyProfileFragment) {
toolbarTitle.setText(getResources().getString(R.string.navProfile));
}
else if(fragmentById instanceof MostVisitedReposFragment) {
} else if (fragmentById instanceof MostVisitedReposFragment) {
toolbarTitle.setText(getResources().getString(R.string.navMostVisited));
}
else if(fragmentById instanceof DraftsFragment) {
} else if (fragmentById instanceof DraftsFragment) {
toolbarTitle.setText(getResources().getString(R.string.titleDrafts));
}
else if(fragmentById instanceof AdministrationFragment) {
} else if (fragmentById instanceof AdministrationFragment) {
toolbarTitle.setText(getResources().getString(R.string.pageTitleAdministration));
}
else if(fragmentById instanceof MyIssuesFragment) {
} else if (fragmentById instanceof MyIssuesFragment) {
toolbarTitle.setText(getResources().getString(R.string.navMyIssues));
}
@ -167,38 +161,55 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
Menu menu = navigationView.getMenu();
navNotifications = menu.findItem(R.id.nav_notifications);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigationDrawerOpen, R.string.navigationDrawerClose);
ActionBarDrawerToggle toggle =
new ActionBarDrawerToggle(
this,
drawer,
toolbar,
R.string.navigationDrawerOpen,
R.string.navigationDrawerClose);
drawer.addDrawerListener(toggle);
drawer.addDrawerListener(new DrawerLayout.DrawerListener() {
drawer.addDrawerListener(
new DrawerLayout.DrawerListener() {
@Override
public void onDrawerOpened(@NonNull View drawerView) {
if(noConnection) {
if (noConnection) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
Toasty.error(
ctx, getResources().getString(R.string.checkNetConnection));
noConnection = false;
}
TextView userEmail = hView.findViewById(R.id.userEmail);
TextView userFullName = hView.findViewById(R.id.userFullname);
ImageView userAvatar = hView.findViewById(R.id.userAvatar);
ImageView userAvatarBackground = hView.findViewById(R.id.userAvatarBackground);
MaterialCardView navRecyclerViewFrame = hView.findViewById(R.id.userAccountsFrame);
ImageView userAvatarBackground =
hView.findViewById(R.id.userAvatarBackground);
MaterialCardView navRecyclerViewFrame =
hView.findViewById(R.id.userAccountsFrame);
List<UserAccount> userAccountsList = new ArrayList<>();
UserAccountsApi userAccountsApi;
userAccountsApi = BaseApi.getInstance(ctx, UserAccountsApi.class);
RecyclerView navRecyclerViewUserAccounts = hView.findViewById(R.id.userAccounts);
UserAccountsNavAdapter adapterUserAccounts = new UserAccountsNavAdapter(ctx, userAccountsList, drawer);
RecyclerView navRecyclerViewUserAccounts =
hView.findViewById(R.id.userAccounts);
UserAccountsNavAdapter adapterUserAccounts =
new UserAccountsNavAdapter(ctx, userAccountsList, drawer);
userAccountsApi.getAllAccounts().observe((AppCompatActivity) ctx, userAccounts -> {
if(userAccounts.size() > 0) {
userAccountsApi
.getAllAccounts()
.observe(
(AppCompatActivity) ctx,
userAccounts -> {
if (userAccounts.size() > 0) {
userAccountsList.clear();
userAccountsList.addAll(userAccounts);
navRecyclerViewUserAccounts.setAdapter(adapterUserAccounts);
navRecyclerViewUserAccounts.setAdapter(
adapterUserAccounts);
navRecyclerViewFrame.setVisibility(View.VISIBLE);
}
});
@ -206,52 +217,70 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
userEmail.setTypeface(myTypeface);
userFullName.setTypeface(myTypeface);
if(getAccount().getUserInfo() != null) {
if (getAccount().getUserInfo() != null) {
String userEmailNav = getAccount().getUserInfo().getEmail();
String userFullNameNav = getAccount().getFullName();
String userAvatarNav = getAccount().getUserInfo().getAvatarUrl();
if(!userEmailNav.equals("")) {
if (!userEmailNav.equals("")) {
userEmail.setText(userEmailNav);
}
if(!userFullNameNav.equals("")) {
if (!userFullNameNav.equals("")) {
userFullName.setText(Html.fromHtml(userFullNameNav));
}
if(!userAvatarNav.equals("")) {
if (!userAvatarNav.equals("")) {
int avatarRadius = AppUtil.getPixelsFromDensity(ctx, 60);
PicassoService.getInstance(ctx).get().load(userAvatarNav).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(avatarRadius, 0)).resize(160, 160).centerCrop()
PicassoService.getInstance(ctx)
.get()
.load(userAvatarNav)
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(avatarRadius, 0))
.resize(160, 160)
.centerCrop()
.into(userAvatar);
PicassoService.getInstance(ctx).get().load(userAvatarNav).transform(new BlurTransformation(ctx)).into(userAvatarBackground, new com.squareup.picasso.Callback() {
PicassoService.getInstance(ctx)
.get()
.load(userAvatarNav)
.transform(new BlurTransformation(ctx))
.into(
userAvatarBackground,
new com.squareup.picasso.Callback() {
@Override
public void onSuccess() {
int textColor = new ColorInverter().getImageViewContrastColor(userAvatarBackground);
int textColor =
new ColorInverter()
.getImageViewContrastColor(
userAvatarBackground);
userFullName.setTextColor(textColor);
userEmail.setTextColor(textColor);
}
@Override
public void onError(Exception e) {
}
public void onError(Exception e) {}
});
}
}
userAvatar.setOnClickListener(v -> {
toolbarTitle.setText(getResources().getString(R.string.navProfile));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyProfileFragment()).commit();
userAvatar.setOnClickListener(
v -> {
toolbarTitle.setText(
getResources().getString(R.string.navProfile));
getSupportFragmentManager()
.beginTransaction()
.replace(
R.id.fragment_container,
new MyProfileFragment())
.commit();
navigationView.setCheckedItem(R.id.nav_profile);
drawer.closeDrawers();
});
getNotificationsCount();
@ -260,27 +289,29 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
@Override
public void onDrawerSlide(@NonNull View drawerView, float slideOffset) {
if(getAccount().getUserInfo() != null) {
navigationView.getMenu().findItem(R.id.nav_administration).setVisible(getAccount().getUserInfo().isIsAdmin());
}
else {
if (getAccount().getUserInfo() != null) {
navigationView
.getMenu()
.findItem(R.id.nav_administration)
.setVisible(getAccount().getUserInfo().isIsAdmin());
} else {
// hide first
navigationView.getMenu().findItem(R.id.nav_administration).setVisible(false);
navigationView
.getMenu()
.findItem(R.id.nav_administration)
.setVisible(false);
}
if(getAccount().requiresVersion("1.14.0")) {
if (getAccount().requiresVersion("1.14.0")) {
navigationView.getMenu().findItem(R.id.nav_my_issues).setVisible(true);
}
}
@Override
public void onDrawerClosed(@NonNull View drawerView) {
}
public void onDrawerClosed(@NonNull View drawerView) {}
@Override
public void onDrawerStateChanged(int newState) {
}
public void onDrawerStateChanged(int newState) {}
});
toggle.syncState();
@ -288,21 +319,26 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
String launchFragment = mainIntent.getStringExtra("launchFragment");
if(launchFragment != null) {
if (launchFragment != null) {
mainIntent.removeExtra("launchFragment");
switch(launchFragment) {
switch (launchFragment) {
case "drafts":
toolbarTitle.setText(getResources().getString(R.string.titleDrafts));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new DraftsFragment()).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new DraftsFragment())
.commit();
navigationView.setCheckedItem(R.id.nav_comments_draft);
return;
case "notifications":
toolbarTitle.setText(getResources().getString(R.string.pageTitleNotifications));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new NotificationsFragment()).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new NotificationsFragment())
.commit();
navigationView.setCheckedItem(R.id.nav_notifications);
return;
}
@ -310,139 +346,185 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
String launchFragmentByHandler = mainIntent.getStringExtra("launchFragmentByLinkHandler");
if(launchFragmentByHandler != null) {
if (launchFragmentByHandler != null) {
mainIntent.removeExtra("launchFragmentByLinkHandler");
switch(launchFragmentByHandler) {
switch (launchFragmentByHandler) {
case "repos":
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new RepositoriesFragment()).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new RepositoriesFragment())
.commit();
navigationView.setCheckedItem(R.id.nav_repositories);
return;
case "org":
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new OrganizationsFragment()).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new OrganizationsFragment())
.commit();
navigationView.setCheckedItem(R.id.nav_organizations);
return;
case "notification":
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new NotificationsFragment()).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new NotificationsFragment())
.commit();
navigationView.setCheckedItem(R.id.nav_notifications);
setActionBarTitle(getResources().getString(R.string.pageTitleNotifications));
return;
case "explore":
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ExploreFragment()).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new ExploreFragment())
.commit();
navigationView.setCheckedItem(R.id.nav_explore);
return;
case "profile":
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyProfileFragment()).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new MyProfileFragment())
.commit();
navigationView.setCheckedItem(R.id.nav_profile);
return;
case "admin":
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new AdministrationFragment()).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new AdministrationFragment())
.commit();
navigationView.setCheckedItem(R.id.nav_administration);
return;
}
}
if(savedInstanceState == null) {
if (savedInstanceState == null) {
if(!getAccount().requiresVersion("1.12.3")) {
if(tinyDB.getInt("homeScreenId", 0) == 7) {
if (!getAccount().requiresVersion("1.12.3")) {
if (tinyDB.getInt("homeScreenId", 0) == 7) {
tinyDB.putInt("homeScreenId", 0);
}
}
switch(tinyDB.getInt("homeScreenId", 0)) {
switch (tinyDB.getInt("homeScreenId", 0)) {
case 1:
toolbarTitle.setText(getResources().getString(R.string.pageTitleStarredRepos));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new StarredRepositoriesFragment()).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new StarredRepositoriesFragment())
.commit();
navigationView.setCheckedItem(R.id.nav_starred_repos);
break;
case 2:
toolbarTitle.setText(getResources().getString(R.string.navOrg));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new OrganizationsFragment()).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new OrganizationsFragment())
.commit();
navigationView.setCheckedItem(R.id.nav_organizations);
break;
case 3:
toolbarTitle.setText(getResources().getString(R.string.navRepos));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new RepositoriesFragment()).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new RepositoriesFragment())
.commit();
navigationView.setCheckedItem(R.id.nav_repositories);
break;
case 4:
toolbarTitle.setText(getResources().getString(R.string.navProfile));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyProfileFragment()).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new MyProfileFragment())
.commit();
navigationView.setCheckedItem(R.id.nav_profile);
break;
case 5:
toolbarTitle.setText(getResources().getString(R.string.pageTitleExplore));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ExploreFragment()).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new ExploreFragment())
.commit();
navigationView.setCheckedItem(R.id.nav_explore);
break;
case 6:
toolbarTitle.setText(getResources().getString(R.string.titleDrafts));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new DraftsFragment()).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new DraftsFragment())
.commit();
navigationView.setCheckedItem(R.id.nav_comments_draft);
break;
case 7:
toolbarTitle.setText(getResources().getString(R.string.pageTitleNotifications));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new NotificationsFragment()).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new NotificationsFragment())
.commit();
navigationView.setCheckedItem(R.id.nav_notifications);
break;
case 8:
toolbarTitle.setText(getResources().getString(R.string.navMyIssues));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyIssuesFragment()).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new MyIssuesFragment())
.commit();
navigationView.setCheckedItem(R.id.nav_my_issues);
break;
case 9:
toolbarTitle.setText(getResources().getString(R.string.navMostVisited));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MostVisitedReposFragment()).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new MostVisitedReposFragment())
.commit();
navigationView.setCheckedItem(R.id.nav_most_visited);
break;
default:
toolbarTitle.setText(getResources().getString(R.string.navMyRepos));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyRepositoriesFragment()).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new MyRepositoriesFragment())
.commit();
navigationView.setCheckedItem(R.id.nav_home);
break;
}
}
handler.postDelayed(() -> {
handler.postDelayed(
() -> {
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
if(!connToInternet) {
if (!connToInternet) {
if(!noConnection) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
if (!noConnection) {
Toasty.error(
ctx, getResources().getString(R.string.checkNetConnection));
}
noConnection = true;
}
else {
} else {
loadUserInfo();
giteaVersion();
serverPageLimitSettings();
noConnection = false;
}
}, 1500);
},
1500);
// Changelog popup
int versionCode = AppUtil.getAppBuildNo(appCtx);
if(versionCode > tinyDB.getInt("versionCode")) {
if (versionCode > tinyDB.getInt("versionCode")) {
tinyDB.putInt("versionCode", versionCode);
@ -455,7 +537,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
public void onResume() {
super.onResume();
if(refActivity) {
if (refActivity) {
this.recreate();
this.overridePendingTransition(0, 0);
refActivity = false;
@ -471,63 +553,64 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
public void onButtonClicked(String text) {
int currentActiveAccountId = tinyDB.getInt("currentActiveAccountId");
switch(text) {
switch (text) {
case "deleteDrafts":
if(currentActiveAccountId > 0) {
if (currentActiveAccountId > 0) {
FragmentManager fm = getSupportFragmentManager();
DraftsFragment frag = (DraftsFragment) fm.findFragmentById(R.id.fragment_container);
DraftsFragment frag =
(DraftsFragment) fm.findFragmentById(R.id.fragment_container);
if(frag != null) {
new MaterialAlertDialogBuilder(ctx).setTitle(R.string.deleteAllDrafts).setCancelable(false).setMessage(R.string.deleteAllDraftsDialogMessage)
.setPositiveButton(R.string.menuDeleteText, (dialog, which) -> {
if (frag != null) {
new MaterialAlertDialogBuilder(ctx)
.setTitle(R.string.deleteAllDrafts)
.setCancelable(false)
.setMessage(R.string.deleteAllDraftsDialogMessage)
.setPositiveButton(
R.string.menuDeleteText,
(dialog, which) -> {
frag.deleteAllDrafts(currentActiveAccountId);
dialog.dismiss();
}).setNeutralButton(R.string.cancelButton, null).show();
}
else {
})
.setNeutralButton(R.string.cancelButton, null)
.show();
} else {
Toasty.error(ctx, getResources().getString(R.string.genericError));
}
}
else {
} else {
Toasty.error(ctx, getResources().getString(R.string.genericError));
}
break;
case "openMyIssues":
if(getFragmentRefreshListener() != null) {
if (getFragmentRefreshListener() != null) {
getFragmentRefreshListener().onRefresh("open");
}
break;
case "closedMyIssues":
if(getFragmentRefreshListener() != null) {
if (getFragmentRefreshListener() != null) {
getFragmentRefreshListener().onRefresh("closed");
}
break;
case "assignedToMe":
if(getFragmentRefreshListener() != null) {
if (getFragmentRefreshListener() != null) {
getFragmentRefreshListener().onRefresh("assignedToMe");
}
break;
}
}
@Override
public void onBackPressed() {
if(drawer.isDrawerOpen(GravityCompat.START)) {
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
}
else {
} else {
super.onBackPressed();
}
@ -538,69 +621,93 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
int id = menuItem.getItemId();
if(id == R.id.nav_home) {
if (id == R.id.nav_home) {
toolbarTitle.setText(getResources().getString(R.string.navMyRepos));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyRepositoriesFragment()).commit();
}
else if(id == R.id.nav_organizations) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new MyRepositoriesFragment())
.commit();
} else if (id == R.id.nav_organizations) {
toolbarTitle.setText(getResources().getString(R.string.navOrg));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new OrganizationsFragment()).commit();
}
else if(id == R.id.nav_profile) {
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();
}
else if(id == R.id.nav_repositories) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new MyProfileFragment())
.commit();
} else if (id == R.id.nav_repositories) {
toolbarTitle.setText(getResources().getString(R.string.navRepos));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new RepositoriesFragment()).commit();
}
else if(id == R.id.nav_settings) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new RepositoriesFragment())
.commit();
} else if (id == R.id.nav_settings) {
toolbarTitle.setText(getResources().getString(R.string.navSettings));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new SettingsFragment()).commit();
}
else if(id == R.id.nav_logout) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new SettingsFragment())
.commit();
} else if (id == R.id.nav_logout) {
AppUtil.logout(ctx);
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
else if(id == R.id.nav_starred_repos) {
} else if (id == R.id.nav_starred_repos) {
toolbarTitle.setText(getResources().getString(R.string.pageTitleStarredRepos));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new StarredRepositoriesFragment()).commit();
}
else if(id == R.id.nav_explore) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new StarredRepositoriesFragment())
.commit();
} else if (id == R.id.nav_explore) {
toolbarTitle.setText(getResources().getString(R.string.pageTitleExplore));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ExploreFragment()).commit();
}
else if(id == R.id.nav_notifications) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new ExploreFragment())
.commit();
} else if (id == R.id.nav_notifications) {
toolbarTitle.setText(R.string.pageTitleNotifications);
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new NotificationsFragment()).commit();
}
else if(id == R.id.nav_comments_draft) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new NotificationsFragment())
.commit();
} else if (id == R.id.nav_comments_draft) {
toolbarTitle.setText(getResources().getString(R.string.titleDrafts));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new DraftsFragment()).commit();
}
else if(id == R.id.nav_administration) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new DraftsFragment())
.commit();
} else if (id == R.id.nav_administration) {
toolbarTitle.setText(getResources().getString(R.string.pageTitleAdministration));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new AdministrationFragment()).commit();
}
else if(id == R.id.nav_my_issues) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new AdministrationFragment())
.commit();
} else if (id == R.id.nav_my_issues) {
toolbarTitle.setText(getResources().getString(R.string.navMyIssues));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyIssuesFragment()).commit();
}
else if(id == R.id.nav_most_visited) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new MyIssuesFragment())
.commit();
} else if (id == R.id.nav_most_visited) {
toolbarTitle.setText(getResources().getString(R.string.navMostVisited));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MostVisitedReposFragment()).commit();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new MostVisitedReposFragment())
.commit();
}
drawer.closeDrawer(GravityCompat.START);
@ -612,15 +719,15 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
int id = item.getItemId();
if(id == R.id.genericMenu) {
if (id == R.id.genericMenu) {
BottomSheetDraftsFragment bottomSheet = new BottomSheetDraftsFragment();
bottomSheet.show(getSupportFragmentManager(), "draftsBottomSheet");
return true;
}
else if(id == R.id.filter) {
} else if (id == R.id.filter) {
BottomSheetMyIssuesFilterFragment filterBottomSheet = new BottomSheetMyIssuesFilterFragment();
BottomSheetMyIssuesFilterFragment filterBottomSheet =
new BottomSheetMyIssuesFilterFragment();
filterBottomSheet.show(getSupportFragmentManager(), "myIssuesFilterMenuBottomSheet");
return true;
}
@ -630,125 +737,164 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
private void serverPageLimitSettings() {
Call<GeneralAPISettings> generalAPISettings = RetrofitClient.getApiInterface(ctx).getGeneralAPISettings();
generalAPISettings.enqueue(new Callback<>() {
Call<GeneralAPISettings> generalAPISettings =
RetrofitClient.getApiInterface(ctx).getGeneralAPISettings();
generalAPISettings.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull final Call<GeneralAPISettings> generalAPISettings, @NonNull retrofit2.Response<GeneralAPISettings> response) {
public void onResponse(
@NonNull final Call<GeneralAPISettings> generalAPISettings,
@NonNull retrofit2.Response<GeneralAPISettings> response) {
if(response.code() == 200 && response.body() != null) {
if (response.code() == 200 && response.body() != null) {
int maxResponseItems = 50;
int defaultPagingNumber = 25;
if(response.body().getMaxResponseItems() != null) {
maxResponseItems = Math.toIntExact(response.body().getMaxResponseItems());
if (response.body().getMaxResponseItems() != null) {
maxResponseItems =
Math.toIntExact(response.body().getMaxResponseItems());
}
if(response.body().getDefaultPagingNum() != null) {
defaultPagingNumber = Math.toIntExact(response.body().getDefaultPagingNum());
if (response.body().getDefaultPagingNum() != null) {
defaultPagingNumber =
Math.toIntExact(response.body().getDefaultPagingNum());
}
BaseApi.getInstance(ctx, UserAccountsApi.class).updateServerPagingLimit(maxResponseItems, defaultPagingNumber, tinyDB.getInt("currentActiveAccountId"));
BaseApi.getInstance(ctx, UserAccountsApi.class)
.updateServerPagingLimit(
maxResponseItems,
defaultPagingNumber,
tinyDB.getInt("currentActiveAccountId"));
}
}
@Override
public void onFailure(@NonNull Call<GeneralAPISettings> generalAPISettings, @NonNull Throwable t) {
}
public void onFailure(
@NonNull Call<GeneralAPISettings> generalAPISettings,
@NonNull Throwable t) {}
});
}
private void giteaVersion() {
Call<ServerVersion> callVersion = RetrofitClient.getApiInterface(ctx).getVersion();
callVersion.enqueue(new Callback<>() {
callVersion.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull final Call<ServerVersion> callVersion, @NonNull retrofit2.Response<ServerVersion> responseVersion) {
public void onResponse(
@NonNull final Call<ServerVersion> callVersion,
@NonNull retrofit2.Response<ServerVersion> responseVersion) {
if(responseVersion.code() == 200 && responseVersion.body() != null) {
if (responseVersion.code() == 200 && responseVersion.body() != null) {
String version = responseVersion.body().getVersion();
BaseApi.getInstance(ctx, UserAccountsApi.class).updateServerVersion(version, tinyDB.getInt("currentActiveAccountId"));
getAccount().setAccount(BaseApi.getInstance(ctx, UserAccountsApi.class).getAccountById(tinyDB.getInt("currentActiveAccountId")));
BaseApi.getInstance(ctx, UserAccountsApi.class)
.updateServerVersion(
version, tinyDB.getInt("currentActiveAccountId"));
getAccount()
.setAccount(
BaseApi.getInstance(ctx, UserAccountsApi.class)
.getAccountById(
tinyDB.getInt(
"currentActiveAccountId")));
}
}
@Override
public void onFailure(@NonNull Call<ServerVersion> callVersion, @NonNull Throwable t) {
}
public void onFailure(
@NonNull Call<ServerVersion> callVersion, @NonNull Throwable t) {}
});
}
private void loadUserInfo() {
Call<User> call = RetrofitClient.getApiInterface(ctx).userGetCurrent();
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<User> call, @NonNull retrofit2.Response<User> response) {
public void onResponse(
@NonNull Call<User> call, @NonNull retrofit2.Response<User> response) {
User userDetails = response.body();
if(response.isSuccessful()) {
if (response.isSuccessful()) {
if(response.code() == 200) {
if (response.code() == 200) {
assert userDetails != null;
getAccount().setUserInfo(userDetails);
navigationView.getMenu().findItem(R.id.nav_administration).setVisible(userDetails.isIsAdmin());
if(!getAccount().getAccount().getUserName().equals(userDetails.getLogin())) {
navigationView
.getMenu()
.findItem(R.id.nav_administration)
.setVisible(userDetails.isIsAdmin());
if (!getAccount()
.getAccount()
.getUserName()
.equals(userDetails.getLogin())) {
// user changed it's name -> update database
int accountId = getAccount().getAccount().getAccountId();
BaseApi.getInstance(MainActivity.this, UserAccountsApi.class).updateUsername(accountId, userDetails.getLogin());
getAccount().setAccount(BaseApi.getInstance(MainActivity.this, UserAccountsApi.class).getAccountById(accountId));
BaseApi.getInstance(MainActivity.this, UserAccountsApi.class)
.updateUsername(accountId, userDetails.getLogin());
getAccount()
.setAccount(
BaseApi.getInstance(
MainActivity.this,
UserAccountsApi.class)
.getAccountById(accountId));
}
if(profileInitListener != null) {
if (profileInitListener != null) {
profileInitListener.onButtonClicked(null);
}
}
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
} else {
String toastError = getResources().getString(R.string.genericApiError, response.code());
String toastError =
getResources()
.getString(R.string.genericApiError, response.code());
Toasty.error(ctx, toastError);
}
}
@Override
public void onFailure(@NonNull Call<User> call, @NonNull Throwable t) {
}
public void onFailure(@NonNull Call<User> call, @NonNull Throwable t) {}
});
}
private void getNotificationsCount() {
Call<NotificationCount> call = RetrofitClient.getApiInterface(ctx).notifyNewAvailable();
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<NotificationCount> call, @NonNull retrofit2.Response<NotificationCount> response) {
public void onResponse(
@NonNull Call<NotificationCount> call,
@NonNull retrofit2.Response<NotificationCount> response) {
NotificationCount notificationCount = response.body();
if(response.code() == 200) {
if (response.code() == 200) {
assert notificationCount != null;
notificationCounter = navNotifications.getActionView().findViewById(R.id.counterBadgeNotification);
notificationCounter =
navNotifications
.getActionView()
.findViewById(R.id.counterBadgeNotification);
notificationCounter.setText(String.valueOf(notificationCount.getNew()));
}
}
@Override
public void onFailure(@NonNull Call<NotificationCount> call, @NonNull Throwable t) {
}
public void onFailure(
@NonNull Call<NotificationCount> call, @NonNull Throwable t) {}
});
}
@ -762,8 +908,8 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
return fragmentRefreshListenerMyIssues;
}
public void setFragmentRefreshListenerMyIssues(FragmentRefreshListener fragmentRefreshListener) {
public void setFragmentRefreshListenerMyIssues(
FragmentRefreshListener fragmentRefreshListener) {
this.fragmentRefreshListenerMyIssues = fragmentRefreshListener;
}
}

View File

@ -8,6 +8,8 @@ import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.ArrayAdapter;
import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.Objects;
import org.gitnex.tea4j.v2.models.MergePullRequestOption;
import org.mian.gitnex.R;
import org.mian.gitnex.actions.PullRequestActions;
@ -19,15 +21,12 @@ import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.MergePullRequestSpinner;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.contexts.IssueContext;
import java.util.ArrayList;
import java.util.Objects;
import retrofit2.Call;
import retrofit2.Callback;
/**
* @author M M Arif
*/
public class MergePullRequestActivity extends BaseActivity {
private View.OnClickListener onClickListener;
@ -49,7 +48,8 @@ public class MergePullRequestActivity extends BaseActivity {
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodManager imm =
(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
viewBinding.mergeTitle.requestFocus();
assert imm != null;
@ -57,50 +57,51 @@ public class MergePullRequestActivity extends BaseActivity {
setMergeAdapter();
if(!issue.getPullRequest().getTitle().isEmpty()) {
if (!issue.getPullRequest().getTitle().isEmpty()) {
viewBinding.toolbarTitle.setText(issue.getPullRequest().getTitle());
viewBinding.mergeTitle.setText(issue.getPullRequest().getTitle() + " (#" + issue.getIssueIndex() + ")");
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(getAccount().requiresVersion("1.12.0")) {
// if gitea version is greater/equal(1.12.0) than user installed version
// (installed.higherOrEqual(compareVer))
if (getAccount().requiresVersion("1.12.0")) {
viewBinding.deleteBranch.setVisibility(View.VISIBLE);
}
if(!issue.getPullRequest().isMergeable()) {
if (!issue.getPullRequest().isMergeable()) {
disableProcessButton();
viewBinding.mergeInfoDisabledMessage.setVisibility(View.VISIBLE);
}
else {
} else {
viewBinding.mergeInfoDisabledMessage.setVisibility(View.GONE);
}
if(issue.prIsFork()) {
if (issue.prIsFork()) {
viewBinding.deleteBranchForkInfo.setVisibility(View.VISIBLE);
}
else {
} else {
viewBinding.deleteBranchForkInfo.setVisibility(View.GONE);
}
if(!connToInternet) {
if (!connToInternet) {
disableProcessButton();
}
else {
} else {
viewBinding.mergeButton.setOnClickListener(mergePullRequest);
}
if(!(issue.getPullRequest().getHead().getRepo() != null ? issue.getPullRequest().getHead().getRepo().getPermissions().isPush() : false)) {
if (!(issue.getPullRequest().getHead().getRepo() != null
? issue.getPullRequest().getHead().getRepo().getPermissions().isPush()
: false)) {
viewBinding.deleteBranch.setVisibility(View.GONE);
viewBinding.deleteBranchForkInfo.setVisibility(View.GONE);
}
@ -110,20 +111,31 @@ public class MergePullRequestActivity extends BaseActivity {
ArrayList<MergePullRequestSpinner> mergeList = new ArrayList<>();
mergeList.add(new MergePullRequestSpinner("merge", getResources().getString(R.string.mergeOptionMerge)));
mergeList.add(new MergePullRequestSpinner("rebase", getResources().getString(R.string.mergeOptionRebase)));
mergeList.add(new MergePullRequestSpinner("rebase-merge", getResources().getString(R.string.mergeOptionRebaseCommit)));
mergeList.add(
new MergePullRequestSpinner(
"merge", getResources().getString(R.string.mergeOptionMerge)));
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(getAccount().requiresVersion("1.12.0")) {
if (getAccount().requiresVersion("1.12.0")) {
mergeList.add(new MergePullRequestSpinner("squash", getResources().getString(R.string.mergeOptionSquash)));
mergeList.add(
new MergePullRequestSpinner(
"squash", getResources().getString(R.string.mergeOptionSquash)));
}
ArrayAdapter<MergePullRequestSpinner> adapter = new ArrayAdapter<>(MergePullRequestActivity.this, R.layout.list_spinner_items, mergeList);
ArrayAdapter<MergePullRequestSpinner> adapter =
new ArrayAdapter<>(
MergePullRequestActivity.this, R.layout.list_spinner_items, mergeList);
viewBinding.mergeSpinner.setAdapter(adapter);
viewBinding.mergeSpinner.setOnItemClickListener((parent, view, position, id) -> {
viewBinding.mergeSpinner.setOnItemClickListener(
(parent, view, position, id) -> {
Do = mergeList.get(position).getId();
});
}
@ -135,36 +147,37 @@ public class MergePullRequestActivity extends BaseActivity {
private void processMergePullRequest() {
String mergePRDesc = Objects.requireNonNull(viewBinding.mergeDescription.getText()).toString();
String mergePRDesc =
Objects.requireNonNull(viewBinding.mergeDescription.getText()).toString();
String mergePRTitle = Objects.requireNonNull(viewBinding.mergeTitle.getText()).toString();
boolean deleteBranch = viewBinding.deleteBranch.isChecked();
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
if(!connToInternet) {
if (!connToInternet) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
return;
}
if(Do == null) {
if (Do == null) {
Toasty.error(ctx, getResources().getString(R.string.selectMergeStrategy));
}
else {
} else {
disableProcessButton();
mergeFunction(Do, mergePRDesc, mergePRTitle, deleteBranch);
}
}
private void mergeFunction(String Do, String mergePRDT, String mergeTitle, boolean deleteBranch) {
private void mergeFunction(
String Do, String mergePRDT, String mergeTitle, boolean deleteBranch) {
MergePullRequestOption mergePR = new MergePullRequestOption();
mergePR.setDeleteBranchAfterMerge(deleteBranch);
mergePR.setMergeTitleField(mergeTitle);
mergePR.setMergeMessageField(mergePRDT);
switch(Do) {
switch (Do) {
case "merge":
mergePR.setDo(MergePullRequestOption.DoEnum.MERGE);
break;
@ -179,29 +192,49 @@ public class MergePullRequestActivity extends BaseActivity {
break;
}
Call<Void> call = RetrofitClient.getApiInterface(ctx).repoMergePullRequest(issue.getRepository().getOwner(), issue.getRepository().getName(), (long) issue.getIssueIndex(), mergePR);
Call<Void> call =
RetrofitClient.getApiInterface(ctx)
.repoMergePullRequest(
issue.getRepository().getOwner(),
issue.getRepository().getName(),
(long) issue.getIssueIndex(),
mergePR);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
if(response.code() == 200) {
if (response.code() == 200) {
if(deleteBranch) {
if (deleteBranch) {
if(issue.prIsFork()) {
String repoFullName = issue.getPullRequest().getHead().getRepo().getFullName();
if (issue.prIsFork()) {
String repoFullName =
issue.getPullRequest()
.getHead()
.getRepo()
.getFullName();
String[] parts = repoFullName.split("/");
final String repoOwner = parts[0];
final String repoName = parts[1];
PullRequestActions.deleteHeadBranch(ctx, repoOwner, repoName, issue.getPullRequest().getHead().getRef(), false);
PullRequestActions.deleteHeadBranch(
ctx,
repoOwner,
repoName,
issue.getPullRequest().getHead().getRef(),
false);
} else {
PullRequestActions.deleteHeadBranch(
ctx,
issue.getRepository().getOwner(),
issue.getRepository().getName(),
issue.getPullRequest().getHead().getRef(),
false);
}
else {
PullRequestActions.deleteHeadBranch(ctx, issue.getRepository().getOwner(), issue.getRepository().getName(), issue.getPullRequest().getHead().getRef(), false);
}
}
Toasty.success(ctx, getString(R.string.mergePRSuccessMsg));
@ -211,28 +244,23 @@ public class MergePullRequestActivity extends BaseActivity {
RepoDetailActivity.updateRepo = true;
setResult(200, result);
finish();
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
enableProcessButton();
Toasty.warning(ctx, getString(R.string.mergePR404ErrorMsg));
}
else if(response.code() == 405) {
} else if (response.code() == 405) {
enableProcessButton();
Toasty.warning(ctx, getString(R.string.mergeNotAllowed));
}
else {
} else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
@ -257,5 +285,4 @@ public class MergePullRequestActivity extends BaseActivity {
super.onResume();
issue.getRepository().checkAccountSwitch(this);
}
}

View File

@ -10,6 +10,9 @@ import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.gitnex.tea4j.v2.models.CreateEmailOption;
import org.gitnex.tea4j.v2.models.Email;
import org.mian.gitnex.R;
@ -19,16 +22,12 @@ import org.mian.gitnex.fragments.MyProfileEmailsFragment;
import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Toasty;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
/**
* @author M M Arif
*/
public class MyProfileEmailActivity extends BaseActivity {
private View.OnClickListener onClickListener;
@ -41,12 +40,14 @@ public class MyProfileEmailActivity extends BaseActivity {
super.onCreate(savedInstanceState);
ActivityProfileEmailBinding activityProfileEmailBinding = ActivityProfileEmailBinding.inflate(getLayoutInflater());
ActivityProfileEmailBinding activityProfileEmailBinding =
ActivityProfileEmailBinding.inflate(getLayoutInflater());
setContentView(activityProfileEmailBinding.getRoot());
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
InputMethodManager imm =
(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
ImageView closeActivity = activityProfileEmailBinding.close;
userEmail = activityProfileEmailBinding.userEmail;
@ -59,15 +60,13 @@ public class MyProfileEmailActivity extends BaseActivity {
initCloseListener();
closeActivity.setOnClickListener(onClickListener);
if(!connToInternet) {
if (!connToInternet) {
disableProcessButton();
}
else {
} else {
addEmailButton.setOnClickListener(addEmailListener);
}
}
private void processAddNewEmail() {
@ -76,18 +75,17 @@ public class MyProfileEmailActivity extends BaseActivity {
String newUserEmail = userEmail.getText().toString().trim();
if(!connToInternet) {
if (!connToInternet) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
return;
}
if(newUserEmail.equals("")) {
if (newUserEmail.equals("")) {
Toasty.error(ctx, getString(R.string.emailErrorEmpty));
return;
}
else if(!Patterns.EMAIL_ADDRESS.matcher(newUserEmail).matches()) {
} else if (!Patterns.EMAIL_ADDRESS.matcher(newUserEmail).matches()) {
Toasty.warning(ctx, getString(R.string.emailErrorInvalid));
return;
@ -106,39 +104,37 @@ public class MyProfileEmailActivity extends BaseActivity {
Call<List<Email>> call = RetrofitClient.getApiInterface(ctx).userAddEmail(addEmailFunc);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<Email>> call, @NonNull retrofit2.Response<List<Email>> response) {
public void onResponse(
@NonNull Call<List<Email>> call,
@NonNull retrofit2.Response<List<Email>> response) {
if(response.code() == 201) {
if (response.code() == 201) {
Toasty.success(ctx, getString(R.string.emailAddedText));
MyProfileEmailsFragment.refreshEmails = true;
enableProcessButton();
finish();
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else if(response.code() == 403) {
} else if (response.code() == 403) {
enableProcessButton();
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
enableProcessButton();
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
}
else if(response.code() == 422) {
} else if (response.code() == 422) {
enableProcessButton();
Toasty.warning(ctx, ctx.getString(R.string.emailErrorInUse));
}
else {
} else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
@ -152,7 +148,6 @@ public class MyProfileEmailActivity extends BaseActivity {
enableProcessButton();
}
});
}
private void initCloseListener() {
@ -169,5 +164,4 @@ public class MyProfileEmailActivity extends BaseActivity {
addEmailButton.setEnabled(true);
}
}

View File

@ -16,6 +16,8 @@ import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.viewpager.widget.ViewPager;
import com.google.android.material.tabs.TabLayout;
import io.mikael.urlbuilder.UrlBuilder;
import java.util.Objects;
import org.gitnex.tea4j.v2.models.OrganizationPermissions;
import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient;
@ -27,8 +29,6 @@ import org.mian.gitnex.fragments.OrganizationRepositoriesFragment;
import org.mian.gitnex.fragments.OrganizationTeamsFragment;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.structs.BottomSheetListener;
import java.util.Objects;
import io.mikael.urlbuilder.UrlBuilder;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -36,7 +36,6 @@ import retrofit2.Response;
/**
* @author M M Arif
*/
public class OrganizationDetailActivity extends BaseActivity implements BottomSheetListener {
public OrganizationPermissions permissions;
@ -60,37 +59,46 @@ public class OrganizationDetailActivity extends BaseActivity implements BottomSh
checkIsMember();
if(getAccount().requiresVersion("1.16.0")) {
RetrofitClient.getApiInterface(this).orgGetUserPermissions(getAccount().getAccount().getUserName(), orgName).enqueue(new Callback<>() {
if (getAccount().requiresVersion("1.16.0")) {
RetrofitClient.getApiInterface(this)
.orgGetUserPermissions(getAccount().getAccount().getUserName(), orgName)
.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<OrganizationPermissions> call, @NonNull Response<OrganizationPermissions> response) {
public void onResponse(
@NonNull Call<OrganizationPermissions> call,
@NonNull Response<OrganizationPermissions> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
permissions = response.body();
}
else {
} else {
permissions = null;
}
}
@Override
public void onFailure(@NonNull Call<OrganizationPermissions> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<OrganizationPermissions> call,
@NonNull Throwable t) {
permissions = null;
}
});
}
else {
} else {
permissions = null;
}
}
public void checkIsMember() {
RetrofitClient.getApiInterface(this).orgIsMember(orgName, getAccount().getAccount().getUserName()).enqueue(new Callback<>() {
RetrofitClient.getApiInterface(this)
.orgIsMember(orgName, getAccount().getAccount().getUserName())
.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call, @NonNull Response<Void> response) {
isMember = response.code() != 404;
init();
}
@ -104,7 +112,8 @@ public class OrganizationDetailActivity extends BaseActivity implements BottomSh
}
public void init() {
OrganizationDetailActivity.SectionsPagerAdapter mSectionsPagerAdapter = new OrganizationDetailActivity.SectionsPagerAdapter(getSupportFragmentManager());
OrganizationDetailActivity.SectionsPagerAdapter mSectionsPagerAdapter =
new OrganizationDetailActivity.SectionsPagerAdapter(getSupportFragmentManager());
ViewPager mViewPager = findViewById(R.id.container);
mViewPager.setVisibility(View.VISIBLE);
@ -113,7 +122,7 @@ public class OrganizationDetailActivity extends BaseActivity implements BottomSh
TabLayout tabLayout = findViewById(R.id.tabs);
tabLayout.setVisibility(View.VISIBLE);
if(!isMember) {
if (!isMember) {
tabLayout.removeTabAt(3);
}
@ -126,16 +135,16 @@ public class OrganizationDetailActivity extends BaseActivity implements BottomSh
ViewGroup vg = (ViewGroup) tabLayout.getChildAt(0);
int tabsCount = vg.getChildCount();
for(int j = 0; j < tabsCount; j++) {
for (int j = 0; j < tabsCount; j++) {
ViewGroup vgTab = (ViewGroup) vg.getChildAt(j);
int tabChildCount = vgTab.getChildCount();
for(int i = 0; i < tabChildCount; i++) {
for (int i = 0; i < tabChildCount; i++) {
View tabViewChild = vgTab.getChildAt(i);
if(tabViewChild instanceof TextView) {
if (tabViewChild instanceof TextView) {
((TextView) tabViewChild).setTypeface(myTypeface);
}
@ -143,7 +152,8 @@ public class OrganizationDetailActivity extends BaseActivity implements BottomSh
}
mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
tabLayout.addOnTabSelectedListener(
new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
}
@Override
@ -159,18 +169,17 @@ public class OrganizationDetailActivity extends BaseActivity implements BottomSh
int id = item.getItemId();
if(id == android.R.id.home) {
if (id == android.R.id.home) {
finish();
return true;
}
else if(id == R.id.repoMenu) {
} else if (id == R.id.repoMenu) {
BottomSheetOrganizationFragment bottomSheet = new BottomSheetOrganizationFragment(permissions);
BottomSheetOrganizationFragment bottomSheet =
new BottomSheetOrganizationFragment(permissions);
bottomSheet.show(getSupportFragmentManager(), "orgBottomSheet");
return true;
}
else {
} else {
return super.onOptionsItemSelected(item);
}
@ -179,10 +188,13 @@ public class OrganizationDetailActivity extends BaseActivity implements BottomSh
@Override
public void onButtonClicked(String text) {
String url = UrlBuilder.fromString(getAccount().getAccount().getInstanceUrl()).withPath("/").toString();
String url =
UrlBuilder.fromString(getAccount().getAccount().getInstanceUrl())
.withPath("/")
.toString();
url = url + getIntent().getStringExtra("orgName");
switch(text) {
switch (text) {
case "repository":
Intent intentRepo = new Intent(this, CreateRepoActivity.class);
intentRepo.putExtra("organizationAction", true);
@ -191,14 +203,14 @@ public class OrganizationDetailActivity extends BaseActivity implements BottomSh
startActivity(intentRepo);
break;
case "label":
Intent intent = new Intent(ctx, CreateLabelActivity.class);
intent.putExtra("orgName", getIntent().getStringExtra("orgName"));
intent.putExtra("type", "org");
ctx.startActivity(intent);
break;
case "team":
Intent intentTeam = new Intent(OrganizationDetailActivity.this, CreateTeamByOrgActivity.class);
Intent intentTeam =
new Intent(OrganizationDetailActivity.this, CreateTeamByOrgActivity.class);
intentTeam.putExtras(getIntent().getExtras());
startActivity(intentTeam);
break;
@ -220,35 +232,27 @@ public class OrganizationDetailActivity extends BaseActivity implements BottomSh
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
}
@NonNull
@Override
@NonNull @Override
public Fragment getItem(int position) {
String orgName = getIntent().getStringExtra("orgName");
Fragment fragment = null;
switch(position) {
switch (position) {
case 0: // info
return OrganizationInfoFragment.newInstance(orgName);
case 1: // repos
return OrganizationRepositoriesFragment.newInstance(orgName);
case 2: // labels
return OrganizationLabelsFragment.newInstance(orgName);
case 3: // teams / members
if(isMember) {
if (isMember) {
return OrganizationTeamsFragment.newInstance(orgName, permissions);
}
else {
} else {
return OrganizationMembersFragment.newInstance(orgName);
}
case 4: // members
if(isMember) {
if (isMember) {
return OrganizationMembersFragment.newInstance(orgName);
}
}
@ -257,14 +261,11 @@ public class OrganizationDetailActivity extends BaseActivity implements BottomSh
@Override
public int getCount() {
if(isMember) {
if (isMember) {
return 5;
}
else {
} else {
return 4;
}
}
}
}

View File

@ -25,7 +25,6 @@ import org.mian.gitnex.structs.BottomSheetListener;
/**
* @author M M Arif
*/
public class OrganizationTeamInfoActivity extends BaseActivity implements BottomSheetListener {
private Team team;
@ -36,28 +35,28 @@ public class OrganizationTeamInfoActivity extends BaseActivity implements Bottom
super.onCreate(savedInstanceState);
org.mian.gitnex.databinding.ActivityOrgTeamInfoBinding binding = ActivityOrgTeamInfoBinding.inflate(getLayoutInflater());
org.mian.gitnex.databinding.ActivityOrgTeamInfoBinding binding =
ActivityOrgTeamInfoBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbar);
team = (Team) getIntent().getSerializableExtra("team");
if(team.getName() != null && !team.getName().isEmpty()) {
if (team.getName() != null && !team.getName().isEmpty()) {
binding.toolbarTitle.setText(team.getName());
}
else {
} else {
binding.toolbarTitle.setText(R.string.orgTeamMembers);
}
binding.close.setOnClickListener(view -> finish());
binding.pager.setOffscreenPageLimit(1);
binding.pager.setAdapter(new FragmentStateAdapter(getSupportFragmentManager(), getLifecycle()) {
binding.pager.setAdapter(
new FragmentStateAdapter(getSupportFragmentManager(), getLifecycle()) {
@NonNull
@Override
@NonNull @Override
public Fragment createFragment(int position) {
switch(position) {
switch (position) {
case 0:
return OrganizationTeamInfoReposFragment.newInstance(team);
case 1:
@ -74,10 +73,19 @@ public class OrganizationTeamInfoActivity extends BaseActivity implements Bottom
}
});
new TabLayoutMediator(binding.tabs, binding.pager, (tab, position) -> {
TextView textView = (TextView) LayoutInflater.from(ctx).inflate(R.layout.layout_tab_text, findViewById(android.R.id.content), false);
new TabLayoutMediator(
binding.tabs,
binding.pager,
(tab, position) -> {
TextView textView =
(TextView)
LayoutInflater.from(ctx)
.inflate(
R.layout.layout_tab_text,
findViewById(android.R.id.content),
false);
switch(position) {
switch (position) {
case 0:
textView.setText(R.string.navRepos);
break;
@ -90,13 +98,15 @@ public class OrganizationTeamInfoActivity extends BaseActivity implements Bottom
}
tab.setCustomView(textView);
}).attach();
})
.attach();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
OrganizationPermissions permissions = (OrganizationPermissions) getIntent().getSerializableExtra("permissions");
if(permissions == null || permissions.isIsOwner()) {
OrganizationPermissions permissions =
(OrganizationPermissions) getIntent().getSerializableExtra("permissions");
if (permissions == null || permissions.isIsOwner()) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.generic_nav_dotted_menu, menu);
}
@ -107,37 +117,36 @@ public class OrganizationTeamInfoActivity extends BaseActivity implements Bottom
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if(id == android.R.id.home) {
if (id == android.R.id.home) {
finish();
return true;
}
else if(id == R.id.genericMenu) {
BottomSheetOrganizationTeamsFragment bottomSheet = new BottomSheetOrganizationTeamsFragment();
} else if (id == R.id.genericMenu) {
BottomSheetOrganizationTeamsFragment bottomSheet =
new BottomSheetOrganizationTeamsFragment();
Bundle args = new Bundle();
args.putBoolean("showRepo", !team.isIncludesAllRepositories());
bottomSheet.setArguments(args);
bottomSheet.show(getSupportFragmentManager(), "orgTeamsBottomSheet");
return true;
}
else {
} else {
return super.onOptionsItemSelected(item);
}
}
@Override
public void onButtonClicked(String text) {
if("newMember".equals(text)) {
Intent intent = new Intent(OrganizationTeamInfoActivity.this, AddNewTeamMemberActivity.class);
if ("newMember".equals(text)) {
Intent intent =
new Intent(OrganizationTeamInfoActivity.this, AddNewTeamMemberActivity.class);
intent.putExtra("teamId", team.getId());
startActivity(intent);
}
else if("newRepo".equals(text)) {
Intent intent = new Intent(OrganizationTeamInfoActivity.this, AddNewTeamRepoActivity.class);
} else if ("newRepo".equals(text)) {
Intent intent =
new Intent(OrganizationTeamInfoActivity.this, AddNewTeamRepoActivity.class);
intent.putExtra("teamId", team.getId());
intent.putExtra("teamName", team.getName());
intent.putExtra("orgName", getIntent().getStringExtra("orgName"));
startActivity(intent);
}
}
}

View File

@ -16,6 +16,7 @@ import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import java.util.Objects;
import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.fragments.BottomSheetUserProfileFragment;
@ -28,7 +29,6 @@ import org.mian.gitnex.fragments.profile.StarredRepositoriesFragment;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.structs.BottomSheetListener;
import java.util.Objects;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -36,7 +36,6 @@ import retrofit2.Response;
/**
* @author M M Arif
*/
public class ProfileActivity extends BaseActivity implements BottomSheetListener {
private String username;
@ -52,10 +51,10 @@ public class ProfileActivity extends BaseActivity implements BottomSheetListener
Toolbar toolbar = findViewById(R.id.toolbar);
TextView toolbarTitle = findViewById(R.id.toolbarTitle);
if(profileIntent.getStringExtra("username") != null && !Objects.equals(profileIntent.getStringExtra("username"), "")) {
if (profileIntent.getStringExtra("username") != null
&& !Objects.equals(profileIntent.getStringExtra("username"), "")) {
username = profileIntent.getStringExtra("username");
}
else {
} else {
Toasty.warning(ctx, ctx.getResources().getString(R.string.userInvalidUserName));
finish();
}
@ -74,26 +73,34 @@ public class ProfileActivity extends BaseActivity implements BottomSheetListener
viewPager.setAdapter(new ViewPagerAdapter(this));
String[] tabTitles = {ctx.getResources().getString(R.string.tabTextInfo), ctx.getResources().getString(R.string.navRepos), ctx.getResources().getString(R.string.navStarredRepos),
ctx.getResources().getString(R.string.navOrg), ctx.getResources().getString(R.string.profileTabFollowers), ctx.getResources().getString(R.string.profileTabFollowing)};
new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> tab.setText(tabTitles[position])).attach();
String[] tabTitles = {
ctx.getResources().getString(R.string.tabTextInfo),
ctx.getResources().getString(R.string.navRepos),
ctx.getResources().getString(R.string.navStarredRepos),
ctx.getResources().getString(R.string.navOrg),
ctx.getResources().getString(R.string.profileTabFollowers),
ctx.getResources().getString(R.string.profileTabFollowing)
};
new TabLayoutMediator(
tabLayout, viewPager, (tab, position) -> tab.setText(tabTitles[position]))
.attach();
ViewGroup vg = (ViewGroup) tabLayout.getChildAt(0);
int tabsCount = vg.getChildCount();
for(int j = 0; j < tabsCount; j++) {
for (int j = 0; j < tabsCount; j++) {
ViewGroup vgTab = (ViewGroup) vg.getChildAt(j);
int tabChildCount = vgTab.getChildCount();
for(int i = 0; i < tabChildCount; i++) {
for (int i = 0; i < tabChildCount; i++) {
View tabViewChild = vgTab.getChildAt(i);
if(tabViewChild instanceof TextView) {
if (tabViewChild instanceof TextView) {
((TextView) tabViewChild).setTypeface(myTypeface);
}
}
if(!username.equals(getAccount().getAccount().getUserName())) {
if (!username.equals(getAccount().getAccount().getUserName())) {
checkFollowStatus();
}
}
@ -101,23 +108,25 @@ public class ProfileActivity extends BaseActivity implements BottomSheetListener
@Override
public void onButtonClicked(String text) {
if(text.equals("follow")) {
if (text.equals("follow")) {
followUnfollow();
}
}
private void checkFollowStatus() {
RetrofitClient.getApiInterface(this).userCurrentCheckFollowing(username).enqueue(new Callback<Void>() {
RetrofitClient.getApiInterface(this)
.userCurrentCheckFollowing(username)
.enqueue(
new Callback<Void>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
if(response.code() == 204) {
public void onResponse(
@NonNull Call<Void> call, @NonNull Response<Void> response) {
if (response.code() == 204) {
following = true;
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
following = false;
}
else {
} else {
following = false;
}
}
@ -131,42 +140,48 @@ public class ProfileActivity extends BaseActivity implements BottomSheetListener
private void followUnfollow() {
Call<Void> call;
if(following) {
if (following) {
call = RetrofitClient.getApiInterface(this).userCurrentDeleteFollow(username);
}
else {
} else {
call = RetrofitClient.getApiInterface(this).userCurrentPutFollow(username);
}
call.enqueue(new Callback<Void>() {
call.enqueue(
new Callback<Void>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
if(response.isSuccessful()) {
public void onResponse(
@NonNull Call<Void> call, @NonNull Response<Void> response) {
if (response.isSuccessful()) {
following = !following;
if(following) {
Toasty.success(ProfileActivity.this, String.format(getString(R.string.nowFollowUser), username));
if (following) {
Toasty.success(
ProfileActivity.this,
String.format(getString(R.string.nowFollowUser), username));
} else {
Toasty.success(
ProfileActivity.this,
String.format(
getString(R.string.unfollowedUser), username));
}
else {
Toasty.success(ProfileActivity.this, String.format(getString(R.string.unfollowedUser), username));
}
}
else {
if(following) {
Toasty.error(ProfileActivity.this, getString(R.string.unfollowingFailed));
}
else {
Toasty.error(ProfileActivity.this, getString(R.string.followingFailed));
} else {
if (following) {
Toasty.error(
ProfileActivity.this,
getString(R.string.unfollowingFailed));
} else {
Toasty.error(
ProfileActivity.this, getString(R.string.followingFailed));
}
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
if(following) {
Toasty.error(ProfileActivity.this, getString(R.string.unfollowingFailed));
}
else {
if (following) {
Toasty.error(
ProfileActivity.this, getString(R.string.unfollowingFailed));
} else {
Toasty.error(ProfileActivity.this, getString(R.string.followingFailed));
}
}
@ -178,22 +193,21 @@ public class ProfileActivity extends BaseActivity implements BottomSheetListener
int id = item.getItemId();
if(id == android.R.id.home) {
if (id == android.R.id.home) {
finish();
return true;
}
else if(id == R.id.genericMenu) {
new BottomSheetUserProfileFragment(following).show(getSupportFragmentManager(), "userProfileBottomSheet");
} else if (id == R.id.genericMenu) {
new BottomSheetUserProfileFragment(following)
.show(getSupportFragmentManager(), "userProfileBottomSheet");
return true;
}
else {
} else {
return super.onOptionsItemSelected(item);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if(!username.equals(getAccount().getAccount().getUserName())) {
if (!username.equals(getAccount().getAccount().getUserName())) {
getMenuInflater().inflate(R.menu.generic_nav_dotted_menu, menu);
}
return super.onCreateOptionsMenu(menu);
@ -205,10 +219,9 @@ public class ProfileActivity extends BaseActivity implements BottomSheetListener
super(fa);
}
@NonNull
@Override
@NonNull @Override
public Fragment createFragment(int position) {
switch(position) {
switch (position) {
case 0: // detail
return DetailFragment.newInstance(username);
case 1: // repos
@ -229,7 +242,5 @@ public class ProfileActivity extends BaseActivity implements BottomSheetListener
public int getItemCount() {
return 6;
}
}
}

View File

@ -26,6 +26,9 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.progressindicator.LinearProgressIndicator;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import org.gitnex.tea4j.v2.models.Branch;
import org.gitnex.tea4j.v2.models.Milestone;
import org.gitnex.tea4j.v2.models.Organization;
@ -52,9 +55,6 @@ import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import org.mian.gitnex.structs.BottomSheetListener;
import org.mian.gitnex.structs.FragmentRefreshListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -62,14 +62,16 @@ import retrofit2.Response;
/**
* @author M M Arif
*/
public class RepoDetailActivity extends BaseActivity implements BottomSheetListener {
public static boolean updateRepo = false;
private final ActivityResultLauncher<Intent> settingsLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if(result.getResultCode() == 200) {
private final ActivityResultLauncher<Intent> settingsLauncher =
registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == 200) {
assert result.getData() != null;
if(result.getData().getBooleanExtra("nameChanged", false)) {
if (result.getData().getBooleanExtra("nameChanged", false)) {
recreate();
}
}
@ -83,23 +85,31 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
private FragmentRefreshListener fragmentRefreshListener;
private FragmentRefreshListener fragmentRefreshListenerPr;
private FragmentRefreshListener fragmentRefreshListenerMilestone;
private final ActivityResultLauncher<Intent> createMilestoneLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if(result.getResultCode() == 201) {
private final ActivityResultLauncher<Intent> 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());
if (result.getData().getBooleanExtra("milestoneCreated", false)) {
if (fragmentRefreshListenerMilestone != null) {
fragmentRefreshListenerMilestone.onRefresh(
repository.getMilestoneState().toString());
}
}
}
});
private FragmentRefreshListener fragmentRefreshListenerFiles;
private final ActivityResultLauncher<Intent> editFileLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if(result.getResultCode() == 200) {
private final ActivityResultLauncher<Intent> 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());
if (result.getData().getBooleanExtra("fileModified", false)) {
if (fragmentRefreshListenerFiles != null) {
fragmentRefreshListenerFiles.onRefresh(
repository.getBranchRef());
}
}
}
@ -109,11 +119,14 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
private Dialog progressDialog;
private MaterialAlertDialogBuilder materialAlertDialogBuilder;
private Intent intentWiki;
private final ActivityResultLauncher<Intent> createReleaseLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
if(result.getResultCode() == 201) {
private final ActivityResultLauncher<Intent> createReleaseLauncher =
registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == 201) {
assert result.getData() != null;
if(result.getData().getBooleanExtra("updateReleases", false)) {
if(fragmentRefreshListenerReleases != null) {
if (result.getData().getBooleanExtra("updateReleases", false)) {
if (fragmentRefreshListenerReleases != null) {
fragmentRefreshListenerReleases.onRefresh(null);
}
repository.removeRepository();
@ -133,7 +146,8 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
Toolbar toolbar = findViewById(R.id.toolbar);
materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx, R.style.ThemeOverlay_Material3_Dialog_Alert);
materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx, R.style.ThemeOverlay_Material3_Dialog_Alert);
intentWiki = new Intent(ctx, WikiActivity.class);
@ -157,7 +171,7 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
public void onResume() {
super.onResume();
repository.checkAccountSwitch(this);
if(updateRepo) {
if (updateRepo) {
updateRepo = false;
repository.removeRepository();
getRepoInfo(repository.getOwner(), repository.getName());
@ -177,107 +191,113 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
int id = item.getItemId();
if(id == android.R.id.home) {
if (id == android.R.id.home) {
if(!getIntent().getBooleanExtra("openedFromUserOrg", false)) {
RetrofitClient.getApiInterface(ctx).orgGet(repository.getOwner()).enqueue(new Callback<>() {
if (!getIntent().getBooleanExtra("openedFromUserOrg", false)) {
RetrofitClient.getApiInterface(ctx)
.orgGet(repository.getOwner())
.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Organization> call, @NonNull Response<Organization> response) {
Intent intent = new Intent(ctx, response.isSuccessful() ? OrganizationDetailActivity.class : ProfileActivity.class);
intent.putExtra(response.isSuccessful() ? "orgName" : "username", repository.getOwner());
public void onResponse(
@NonNull Call<Organization> call,
@NonNull Response<Organization> response) {
Intent intent =
new Intent(
ctx,
response.isSuccessful()
? OrganizationDetailActivity.class
: ProfileActivity.class);
intent.putExtra(
response.isSuccessful() ? "orgName" : "username",
repository.getOwner());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
}
@Override
public void onFailure(@NonNull Call<Organization> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<Organization> call,
@NonNull Throwable t) {
finish();
}
});
}
else {
} else {
finish();
}
return true;
}
else if(id == R.id.repoMenu) {
} else if (id == R.id.repoMenu) {
if(repository.hasRepository()) {
if (repository.hasRepository()) {
BottomSheetRepoFragment bottomSheet = new BottomSheetRepoFragment(repository);
bottomSheet.show(getSupportFragmentManager(), "repoBottomSheet");
}
return true;
}
else if(id == R.id.filter) {
} else if (id == R.id.filter) {
BottomSheetIssuesFilterFragment filterBottomSheet = new BottomSheetIssuesFilterFragment();
BottomSheetIssuesFilterFragment filterBottomSheet =
new BottomSheetIssuesFilterFragment();
filterBottomSheet.show(getSupportFragmentManager(), "repoFilterMenuBottomSheet");
return true;
}
else if(id == R.id.filterPr) {
} else if (id == R.id.filterPr) {
BottomSheetPullRequestFilterFragment filterPrBottomSheet = new BottomSheetPullRequestFilterFragment();
BottomSheetPullRequestFilterFragment filterPrBottomSheet =
new BottomSheetPullRequestFilterFragment();
filterPrBottomSheet.show(getSupportFragmentManager(), "repoFilterMenuPrBottomSheet");
return true;
}
else if(id == R.id.filterMilestone) {
} else if (id == R.id.filterMilestone) {
BottomSheetMilestonesFilterFragment filterMilestoneBottomSheet = new BottomSheetMilestonesFilterFragment();
filterMilestoneBottomSheet.show(getSupportFragmentManager(), "repoFilterMenuMilestoneBottomSheet");
BottomSheetMilestonesFilterFragment filterMilestoneBottomSheet =
new BottomSheetMilestonesFilterFragment();
filterMilestoneBottomSheet.show(
getSupportFragmentManager(), "repoFilterMenuMilestoneBottomSheet");
return true;
}
else if(id == R.id.switchBranches) {
} else if (id == R.id.switchBranches) {
chooseBranch();
return true;
}
else if(id == R.id.branchCommits) {
} else if (id == R.id.branchCommits) {
Intent intent = repository.getIntent(ctx, CommitsActivity.class);
ctx.startActivity(intent);
return true;
}
else if(id == R.id.filterReleases && getAccount().requiresVersion("1.15.0")) {
BottomSheetReleasesTagsFragment bottomSheetReleasesTagsFragment = new BottomSheetReleasesTagsFragment();
bottomSheetReleasesTagsFragment.show(getSupportFragmentManager(), "repoFilterReleasesMenuBottomSheet");
} else if (id == R.id.filterReleases && getAccount().requiresVersion("1.15.0")) {
BottomSheetReleasesTagsFragment bottomSheetReleasesTagsFragment =
new BottomSheetReleasesTagsFragment();
bottomSheetReleasesTagsFragment.show(
getSupportFragmentManager(), "repoFilterReleasesMenuBottomSheet");
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onButtonClicked(String text) {
switch(text) {
switch (text) {
case "label":
startActivity(repository.getIntent(ctx, CreateLabelActivity.class));
break;
case "newIssue":
startActivity(repository.getIntent(ctx, CreateIssueActivity.class));
break;
case "newMilestone":
createMilestoneLauncher.launch(repository.getIntent(ctx, CreateMilestoneActivity.class));
createMilestoneLauncher.launch(
repository.getIntent(ctx, CreateMilestoneActivity.class));
break;
case "addCollaborator":
startActivity(repository.getIntent(ctx, AddCollaboratorToRepositoryActivity.class));
break;
case "chooseBranch":
chooseBranch();
break;
case "createRelease":
createReleaseLauncher.launch(repository.getIntent(ctx, CreateReleaseActivity.class));
createReleaseLauncher.launch(
repository.getIntent(ctx, CreateReleaseActivity.class));
break;
case "openWebRepo":
AppUtil.openUrlInBrowser(this, repository.getRepository().getHtmlUrl());
@ -286,10 +306,12 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
AppUtil.sharingIntent(this, repository.getRepository().getHtmlUrl());
break;
case "copyRepoUrl":
AppUtil.copyToClipboard(this, repository.getRepository().getHtmlUrl(), ctx.getString(R.string.copyIssueUrlToastMsg));
AppUtil.copyToClipboard(
this,
repository.getRepository().getHtmlUrl(),
ctx.getString(R.string.copyIssueUrlToastMsg));
break;
case "newFile":
editFileLauncher.launch(repository.getIntent(ctx, CreateFileActivity.class));
break;
case "filterByMilestone":
@ -297,60 +319,59 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
break;
case "openIssues":
repository.setIssueState(RepositoryContext.State.OPEN);
if(getFragmentRefreshListener() != null) {
if (getFragmentRefreshListener() != null) {
getFragmentRefreshListener().onRefresh("open");
}
break;
case "closedIssues":
repository.setIssueState(RepositoryContext.State.CLOSED);
if(getFragmentRefreshListener() != null) {
if (getFragmentRefreshListener() != null) {
getFragmentRefreshListener().onRefresh("closed");
}
break;
case "openPr":
repository.setPrState(RepositoryContext.State.OPEN);
if(getFragmentRefreshListenerPr() != null) {
if (getFragmentRefreshListenerPr() != null) {
getFragmentRefreshListenerPr().onRefresh("open");
}
break;
case "closedPr":
repository.setPrState(RepositoryContext.State.CLOSED);
if(getFragmentRefreshListenerPr() != null) {
if (getFragmentRefreshListenerPr() != null) {
getFragmentRefreshListenerPr().onRefresh("closed");
}
break;
case "openMilestone":
repository.setMilestoneState(RepositoryContext.State.OPEN);
if(getFragmentRefreshListenerMilestone() != null) {
if (getFragmentRefreshListenerMilestone() != null) {
getFragmentRefreshListenerMilestone().onRefresh("open");
}
break;
case "closedMilestone":
repository.setMilestoneState(RepositoryContext.State.CLOSED);
if(getFragmentRefreshListenerMilestone() != null) {
if (getFragmentRefreshListenerMilestone() != null) {
getFragmentRefreshListenerMilestone().onRefresh("closed");
}
break;
case "repoSettings":
settingsLauncher.launch(repository.getIntent(ctx, RepositorySettingsActivity.class));
settingsLauncher.launch(
repository.getIntent(ctx, RepositorySettingsActivity.class));
break;
case "newPullRequest":
startActivity(repository.getIntent(ctx, CreatePullRequestActivity.class));
break;
case "tags":
if(getFragmentRefreshListenerReleases() != null) {
if (getFragmentRefreshListenerReleases() != null) {
getFragmentRefreshListenerReleases().onRefresh("tags");
}
break;
case "releases":
if(getFragmentRefreshListenerReleases() != null) {
if (getFragmentRefreshListenerReleases() != null) {
getFragmentRefreshListenerReleases().onRefresh("releases");
}
break;
@ -367,10 +388,10 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
repository.setStarred(true);
break;
case "createWiki":
Intent intent = new Intent(ctx, WikiActivity.class);
intent.putExtra("action", "add");
intent.putExtra(RepositoryContext.INTENT_EXTRA, ((RepoDetailActivity) ctx).repository);
intent.putExtra(
RepositoryContext.INTENT_EXTRA, ((RepoDetailActivity) ctx).repository);
ctx.startActivity(intent);
break;
}
@ -382,49 +403,66 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
progressDialog.setContentView(R.layout.custom_progress_loader);
progressDialog.show();
Call<List<Milestone>> call = RetrofitClient.getApiInterface(ctx).issueGetMilestonesList(repository.getOwner(), repository.getName(), "open", null, 1, 50);
Call<List<Milestone>> call =
RetrofitClient.getApiInterface(ctx)
.issueGetMilestonesList(
repository.getOwner(), repository.getName(), "open", null, 1, 50);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<Milestone>> call, @NonNull Response<List<Milestone>> response) {
public void onResponse(
@NonNull Call<List<Milestone>> call,
@NonNull Response<List<Milestone>> response) {
progressDialog.hide();
if(response.code() == 200) {
if (response.code() == 200) {
List<String> milestonesList = new ArrayList<>();
int selectedMilestone = 0;
assert response.body() != null;
milestonesList.add("All");
for(int i = 0; i < response.body().size(); i++) {
for (int i = 0; i < response.body().size(); i++) {
Milestone milestones = response.body().get(i);
milestonesList.add(milestones.getTitle());
}
for(int j = 0; j < milestonesList.size(); j++) {
if(repository.getIssueMilestoneFilterName() != null) {
if(repository.getIssueMilestoneFilterName().equals(milestonesList.get(j))) {
for (int j = 0; j < milestonesList.size(); j++) {
if (repository.getIssueMilestoneFilterName() != null) {
if (repository
.getIssueMilestoneFilterName()
.equals(milestonesList.get(j))) {
selectedMilestone = j;
}
}
}
materialAlertDialogBuilder.setTitle(R.string.selectMilestone).setSingleChoiceItems(milestonesList.toArray(new String[0]), selectedMilestone, (dialogInterface, i) -> {
materialAlertDialogBuilder
.setTitle(R.string.selectMilestone)
.setSingleChoiceItems(
milestonesList.toArray(new String[0]),
selectedMilestone,
(dialogInterface, i) -> {
repository.setIssueMilestoneFilterName(
milestonesList.get(i));
repository.setIssueMilestoneFilterName(milestonesList.get(i));
if(getFragmentRefreshListenerFilterIssuesByMilestone() != null) {
getFragmentRefreshListenerFilterIssuesByMilestone().onRefresh(milestonesList.get(i));
if (getFragmentRefreshListenerFilterIssuesByMilestone()
!= null) {
getFragmentRefreshListenerFilterIssuesByMilestone()
.onRefresh(milestonesList.get(i));
}
dialogInterface.dismiss();
}).setNeutralButton(R.string.cancelButton, null);
})
.setNeutralButton(R.string.cancelButton, null);
materialAlertDialogBuilder.create().show();
}
}
@Override
public void onFailure(@NonNull Call<List<Milestone>> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<List<Milestone>> call, @NonNull Throwable t) {
progressDialog.hide();
}
});
@ -434,7 +472,7 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
public void onDestroy() {
super.onDestroy();
if(progressDialog != null) {
if (progressDialog != null) {
progressDialog.dismiss();
}
}
@ -446,39 +484,50 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
progressDialog.setContentView(R.layout.custom_progress_loader);
progressDialog.show();
Call<List<Branch>> call = RetrofitClient.getApiInterface(ctx).repoListBranches(repository.getOwner(), repository.getName(), null, null);
Call<List<Branch>> call =
RetrofitClient.getApiInterface(ctx)
.repoListBranches(repository.getOwner(), repository.getName(), null, null);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<Branch>> call, @NonNull Response<List<Branch>> response) {
public void onResponse(
@NonNull Call<List<Branch>> call,
@NonNull Response<List<Branch>> response) {
progressDialog.hide();
if(response.code() == 200) {
if (response.code() == 200) {
List<String> branchesList = new ArrayList<>();
int selectedBranch = 0;
assert response.body() != null;
for(int i = 0; i < response.body().size(); i++) {
for (int i = 0; i < response.body().size(); i++) {
Branch branches = response.body().get(i);
branchesList.add(branches.getName());
if(repository.getBranchRef().equals(branches.getName())) {
if (repository.getBranchRef().equals(branches.getName())) {
selectedBranch = i;
}
}
materialAlertDialogBuilder.setTitle(R.string.pageTitleChooseBranch).setSingleChoiceItems(branchesList.toArray(new String[0]), selectedBranch, (dialogInterface, i) -> {
materialAlertDialogBuilder
.setTitle(R.string.pageTitleChooseBranch)
.setSingleChoiceItems(
branchesList.toArray(new String[0]),
selectedBranch,
(dialogInterface, i) -> {
repository.setBranchRef(branchesList.get(i));
if(getFragmentRefreshListenerFiles() != null) {
getFragmentRefreshListenerFiles().onRefresh(branchesList.get(i));
if (getFragmentRefreshListenerFiles() != null) {
getFragmentRefreshListenerFiles()
.onRefresh(branchesList.get(i));
}
dialogInterface.dismiss();
}).setNeutralButton(R.string.cancelButton, null);
})
.setNeutralButton(R.string.cancelButton, null);
materialAlertDialogBuilder.create().show();
}
}
@ -493,27 +542,29 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
private void getRepoInfo(final String owner, String repo) {
LinearProgressIndicator loading = findViewById(R.id.loadingIndicator);
if(repository.hasRepository()) {
if (repository.hasRepository()) {
loading.setVisibility(View.GONE);
initWithRepo();
return;
}
Call<Repository> call = RetrofitClient.getApiInterface(ctx).repoGet(owner, repo);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Repository> call, @NonNull retrofit2.Response<Repository> response) {
public void onResponse(
@NonNull Call<Repository> call,
@NonNull retrofit2.Response<Repository> response) {
Repository repoInfo = response.body();
loading.setVisibility(View.GONE);
if(response.code() == 200) {
if (response.code() == 200) {
assert repoInfo != null;
repository.setRepository(repoInfo);
initWithRepo();
}
else {
} else {
Toasty.error(ctx, getString(R.string.genericError));
finish();
}
@ -532,40 +583,51 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
repository.setBranchRef(repository.getRepository().getDefaultBranch());
ImageView repoTypeToolbar = findViewById(R.id.repoTypeToolbar);
if(repository.getRepository().isPrivate()) {
if (repository.getRepository().isPrivate()) {
repoTypeToolbar.setVisibility(View.VISIBLE);
}
else {
} else {
repoTypeToolbar.setVisibility(View.GONE);
}
TabLayout tabLayout = findViewById(R.id.tabs);
if(viewPager == null) {
if (viewPager == null) {
viewPager = findViewById(R.id.repositoryContainer);
viewPager.setOffscreenPageLimit(1);
viewPager.setAdapter(new ViewPagerAdapter(this));
String[] tabTitles = {ctx.getResources().getString(R.string.tabTextInfo), ctx.getResources().getString(R.string.tabTextFiles), ctx.getResources().getString(R.string.pageTitleIssues),
ctx.getResources().getString(R.string.tabPullRequests), ctx.getResources().getString(R.string.tabTextReleases), ctx.getResources().getString(R.string.wiki),
ctx.getResources().getString(R.string.tabTextMl), ctx.getResources().getString(R.string.newIssueLabelsTitle), ctx.getResources().getString(R.string.tabTextCollaborators)};
new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> tab.setText(tabTitles[position])).attach();
String[] tabTitles = {
ctx.getResources().getString(R.string.tabTextInfo),
ctx.getResources().getString(R.string.tabTextFiles),
ctx.getResources().getString(R.string.pageTitleIssues),
ctx.getResources().getString(R.string.tabPullRequests),
ctx.getResources().getString(R.string.tabTextReleases),
ctx.getResources().getString(R.string.wiki),
ctx.getResources().getString(R.string.tabTextMl),
ctx.getResources().getString(R.string.newIssueLabelsTitle),
ctx.getResources().getString(R.string.tabTextCollaborators)
};
new TabLayoutMediator(
tabLayout,
viewPager,
(tab, position) -> tab.setText(tabTitles[position]))
.attach();
ViewGroup viewGroup = (ViewGroup) tabLayout.getChildAt(0);
int tabsCount = viewGroup.getChildCount();
for(int j = 0; j < tabsCount; j++) {
for (int j = 0; j < tabsCount; j++) {
ViewGroup vgTab = (ViewGroup) viewGroup.getChildAt(j);
int tabChildCount = vgTab.getChildCount();
for(int i = 0; i < tabChildCount; i++) {
for (int i = 0; i < tabChildCount; i++) {
View tabViewChild = vgTab.getChildAt(i);
if(tabViewChild instanceof TextView) {
if (tabViewChild instanceof TextView) {
((TextView) tabViewChild).setTypeface(myTypeface);
}
@ -573,72 +635,80 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
}
}
if(tinyDB.getBoolean("enableCounterBadges", true)) {
@SuppressLint("InflateParams") View tabHeader2 = LayoutInflater.from(ctx).inflate(R.layout.badge_issue, null);
if(textViewBadgeIssue == null) {
if (tinyDB.getBoolean("enableCounterBadges", true)) {
@SuppressLint("InflateParams")
View tabHeader2 = LayoutInflater.from(ctx).inflate(R.layout.badge_issue, null);
if (textViewBadgeIssue == null) {
textViewBadgeIssue = tabHeader2.findViewById(R.id.counterBadgeIssue);
}
@SuppressLint("InflateParams") View tabHeader4 = LayoutInflater.from(ctx).inflate(R.layout.badge_pull, null);
if(textViewBadgePull == null) {
@SuppressLint("InflateParams")
View tabHeader4 = LayoutInflater.from(ctx).inflate(R.layout.badge_pull, null);
if (textViewBadgePull == null) {
textViewBadgePull = tabHeader4.findViewById(R.id.counterBadgePull);
}
@SuppressLint("InflateParams") View tabHeader6 = LayoutInflater.from(ctx).inflate(R.layout.badge_release, null);
if(textViewBadgeRelease == null) {
@SuppressLint("InflateParams")
View tabHeader6 = LayoutInflater.from(ctx).inflate(R.layout.badge_release, null);
if (textViewBadgeRelease == null) {
textViewBadgeRelease = tabHeader6.findViewById(R.id.counterBadgeRelease);
}
ColorStateList textColor = tabLayout.getTabTextColors();
if(repository.getRepository().getOpenIssuesCount() != null) {
if (repository.getRepository().getOpenIssuesCount() != null) {
textViewBadgeIssue.setVisibility(View.VISIBLE);
textViewBadgeIssue.setText(String.valueOf(repository.getRepository().getOpenIssuesCount()));
textViewBadgeIssue.setText(
String.valueOf(repository.getRepository().getOpenIssuesCount()));
TabLayout.Tab tabOpenIssues = tabLayout.getTabAt(2);
assert tabOpenIssues != null;
if(tabOpenIssues.getCustomView() == null) {
if (tabOpenIssues.getCustomView() == null) {
tabOpenIssues.setCustomView(tabHeader2);
}
TextView openIssueTabView = Objects.requireNonNull(tabOpenIssues.getCustomView()).findViewById(R.id.counterBadgeIssueText);
TextView openIssueTabView =
Objects.requireNonNull(tabOpenIssues.getCustomView())
.findViewById(R.id.counterBadgeIssueText);
openIssueTabView.setTextColor(textColor);
}
else {
} else {
textViewBadgeIssue.setVisibility(View.GONE);
}
if(repository.getRepository().getOpenPrCounter() != null) {
if (repository.getRepository().getOpenPrCounter() != null) {
textViewBadgePull.setVisibility(View.VISIBLE);
textViewBadgePull.setText(String.valueOf(repository.getRepository().getOpenPrCounter()));
textViewBadgePull.setText(
String.valueOf(repository.getRepository().getOpenPrCounter()));
TabLayout.Tab tabOpenPulls = tabLayout.getTabAt(3);
assert tabOpenPulls != null;
if(tabOpenPulls.getCustomView() == null) {
if (tabOpenPulls.getCustomView() == null) {
tabOpenPulls.setCustomView(tabHeader4);
}
TextView openPullTabView = Objects.requireNonNull(tabOpenPulls.getCustomView()).findViewById(R.id.counterBadgePullText);
TextView openPullTabView =
Objects.requireNonNull(tabOpenPulls.getCustomView())
.findViewById(R.id.counterBadgePullText);
openPullTabView.setTextColor(textColor);
}
else {
} else {
textViewBadgePull.setVisibility(View.GONE);
}
if(repository.getRepository().getReleaseCounter() != null) {
if (repository.getRepository().getReleaseCounter() != null) {
textViewBadgeRelease.setVisibility(View.VISIBLE);
textViewBadgeRelease.setText(String.valueOf(repository.getRepository().getReleaseCounter()));
textViewBadgeRelease.setText(
String.valueOf(repository.getRepository().getReleaseCounter()));
TabLayout.Tab tabOpenRelease = tabLayout.getTabAt(4);
assert tabOpenRelease != null;
if(tabOpenRelease.getCustomView() == null) {
if (tabOpenRelease.getCustomView() == null) {
tabOpenRelease.setCustomView(tabHeader6);
}
TextView openReleaseTabView = Objects.requireNonNull(tabOpenRelease.getCustomView()).findViewById(R.id.counterBadgeReleaseText);
TextView openReleaseTabView =
Objects.requireNonNull(tabOpenRelease.getCustomView())
.findViewById(R.id.counterBadgeReleaseText);
openReleaseTabView.setTextColor(textColor);
}
else {
} else {
textViewBadgeRelease.setVisibility(View.GONE);
}
}
@ -647,11 +717,11 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
String goToSection = mainIntent.getStringExtra("goToSection");
String goToSectionType = mainIntent.getStringExtra("goToSectionType");
if(goToSection != null) {
if (goToSection != null) {
mainIntent.removeExtra("goToSection");
mainIntent.removeExtra("goToSectionType");
switch(goToSectionType) {
switch (goToSectionType) {
case "branchesList":
viewPager.setCurrentItem(1);
chooseBranch();
@ -660,7 +730,7 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
viewPager.setCurrentItem(1);
String selectedBranch = mainIntent.getStringExtra("selectedBranch");
repository.setBranchRef(selectedBranch);
if(getFragmentRefreshListenerFiles() != null) {
if (getFragmentRefreshListenerFiles() != null) {
getFragmentRefreshListenerFiles().onRefresh(selectedBranch);
}
break;
@ -668,7 +738,7 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
viewPager.setCurrentItem(1);
String branch1 = mainIntent.getStringExtra("branch");
repository.setBranchRef(branch1);
if(getFragmentRefreshListenerFiles() != null) {
if (getFragmentRefreshListenerFiles() != null) {
getFragmentRefreshListenerFiles().onRefresh(branch1);
}
Intent intent = repository.getIntent(ctx, FileViewActivity.class);
@ -679,7 +749,7 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
viewPager.setCurrentItem(1);
String branch2 = mainIntent.getStringExtra("branch");
repository.setBranchRef(branch2);
if(getFragmentRefreshListenerFiles() != null) {
if (getFragmentRefreshListenerFiles() != null) {
getFragmentRefreshListenerFiles().onRefresh(branch2);
}
break;
@ -687,7 +757,7 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
viewPager.setCurrentItem(1);
String branch = mainIntent.getStringExtra("branchName");
repository.setBranchRef(branch);
if(getFragmentRefreshListenerFiles() != null) {
if (getFragmentRefreshListenerFiles() != null) {
getFragmentRefreshListenerFiles().onRefresh(branch);
}
Intent intent1 = repository.getIntent(ctx, CommitsActivity.class);
@ -712,7 +782,8 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
break;
case "newRelease":
viewPager.setCurrentItem(4);
createReleaseLauncher.launch(repository.getIntent(ctx, CreateReleaseActivity.class));
createReleaseLauncher.launch(
repository.getIntent(ctx, CreateReleaseActivity.class));
break;
case "wiki":
viewPager.setCurrentItem(5);
@ -720,7 +791,8 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
case "wikiNew":
viewPager.setCurrentItem(5);
intentWiki.putExtra("action", "add");
intentWiki.putExtra(RepositoryContext.INTENT_EXTRA, ((RepoDetailActivity) ctx).repository);
intentWiki.putExtra(
RepositoryContext.INTENT_EXTRA, ((RepoDetailActivity) ctx).repository);
ctx.startActivity(intentWiki);
break;
case "milestones":
@ -728,13 +800,15 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
break;
case "milestonesNew":
viewPager.setCurrentItem(6);
createMilestoneLauncher.launch(repository.getIntent(ctx, CreateMilestoneActivity.class));
createMilestoneLauncher.launch(
repository.getIntent(ctx, CreateMilestoneActivity.class));
break;
case "labels":
viewPager.setCurrentItem(7);
break;
case "settings":
settingsLauncher.launch(repository.getIntent(ctx, RepositorySettingsActivity.class));
settingsLauncher.launch(
repository.getIntent(ctx, RepositorySettingsActivity.class));
break;
}
}
@ -743,40 +817,43 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
private void checkRepositoryStarStatus(final String owner, String repo) {
Call<Void> call = RetrofitClient.getApiInterface(ctx).userCurrentCheckStarring(owner, repo);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
repository.setStarred(response.code() == 204);
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
}
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {}
});
}
private void checkRepositoryWatchStatus(final String owner, String repo) {
Call<WatchInfo> call = RetrofitClient.getApiInterface(ctx).userCurrentCheckSubscription(owner, repo);
call.enqueue(new Callback<>() {
Call<WatchInfo> call =
RetrofitClient.getApiInterface(ctx).userCurrentCheckSubscription(owner, repo);
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<WatchInfo> call, @NonNull retrofit2.Response<WatchInfo> response) {
public void onResponse(
@NonNull Call<WatchInfo> call,
@NonNull retrofit2.Response<WatchInfo> response) {
if(response.code() == 200) {
if (response.code() == 200) {
assert response.body() != null;
repository.setWatched(response.body().isSubscribed());
}
else {
} else {
repository.setWatched(false);
}
}
@Override
public void onFailure(@NonNull Call<WatchInfo> call, @NonNull Throwable t) {
}
public void onFailure(@NonNull Call<WatchInfo> call, @NonNull Throwable t) {}
});
}
@ -785,7 +862,8 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
return fragmentRefreshListenerFilterIssuesByMilestone;
}
public void setFragmentRefreshListenerFilterIssuesByMilestone(FragmentRefreshListener fragmentRefreshListener) {
public void setFragmentRefreshListenerFilterIssuesByMilestone(
FragmentRefreshListener fragmentRefreshListener) {
this.fragmentRefreshListenerFilterIssuesByMilestone = fragmentRefreshListener;
}
@ -812,7 +890,8 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
return fragmentRefreshListenerMilestone;
}
public void setFragmentRefreshListenerMilestone(FragmentRefreshListener fragmentRefreshListenerMilestone) {
public void setFragmentRefreshListenerMilestone(
FragmentRefreshListener fragmentRefreshListenerMilestone) {
this.fragmentRefreshListenerMilestone = fragmentRefreshListenerMilestone;
}
@ -821,16 +900,18 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
return fragmentRefreshListenerFiles;
}
public void setFragmentRefreshListenerFiles(FragmentRefreshListener fragmentRefreshListenerFiles) {
public void setFragmentRefreshListenerFiles(
FragmentRefreshListener fragmentRefreshListenerFiles) {
this.fragmentRefreshListenerFiles = fragmentRefreshListenerFiles;
}
//Releases interface
// Releases interface
public FragmentRefreshListener getFragmentRefreshListenerReleases() {
return fragmentRefreshListenerReleases;
}
public void setFragmentRefreshListenerReleases(FragmentRefreshListener fragmentRefreshListener) {
public void setFragmentRefreshListenerReleases(
FragmentRefreshListener fragmentRefreshListener) {
this.fragmentRefreshListenerReleases = fragmentRefreshListener;
}
@ -840,13 +921,12 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
super(fa);
}
@NonNull
@Override
@NonNull @Override
public Fragment createFragment(int position) {
Fragment fragment = null;
switch(position) {
switch (position) {
case 0: // Repository details
return RepoInfoFragment.newInstance(repository);
case 1: // Files
@ -877,6 +957,5 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetListe
public int getItemCount() {
return 9;
}
}
}

View File

@ -14,6 +14,8 @@ import androidx.annotation.NonNull;
import androidx.appcompat.widget.SearchView;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import java.util.ArrayList;
import java.util.List;
import org.gitnex.tea4j.v2.models.Repository;
import org.mian.gitnex.R;
import org.mian.gitnex.adapters.RepoForksAdapter;
@ -21,8 +23,6 @@ import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityRepoForksBinding;
import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -30,7 +30,6 @@ import retrofit2.Response;
/**
* @author M M Arif
*/
public class RepoForksActivity extends BaseActivity {
private ActivityRepoForksBinding activityRepoForksBinding;
@ -59,25 +58,33 @@ public class RepoForksActivity extends BaseActivity {
final String repoOwner = repository.getOwner();
final String repoName = repository.getName();
activityRepoForksBinding.toolbarTitle.setText(ctx.getResources().getString(R.string.infoTabRepoForksCount));
activityRepoForksBinding.toolbarTitle.setText(
ctx.getResources().getString(R.string.infoTabRepoForksCount));
activityRepoForksBinding.close.setOnClickListener(v -> finish());
resultLimit = Constants.getCurrentResultLimit(ctx);
forksList = new ArrayList<>();
activityRepoForksBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
activityRepoForksBinding.pullToRefresh.setOnRefreshListener(
() ->
new Handler(Looper.getMainLooper())
.postDelayed(
() -> {
pageSize = 1;
activityRepoForksBinding.pullToRefresh.setRefreshing(false);
activityRepoForksBinding.pullToRefresh.setRefreshing(
false);
loadInitial(repoOwner, repoName, pageSize, resultLimit);
adapter.notifyDataChanged();
}, 200));
},
200));
adapter = new RepoForksAdapter(ctx, forksList);
adapter.setLoadMoreListener(() -> activityRepoForksBinding.recyclerView.post(() -> {
if(forksList.size() == resultLimit || pageSize == resultLimit) {
adapter.setLoadMoreListener(
() ->
activityRepoForksBinding.recyclerView.post(
() -> {
if (forksList.size() == resultLimit
|| pageSize == resultLimit) {
int page = (forksList.size() + resultLimit) / resultLimit;
loadMore(repoOwner, repoName, page, resultLimit);
@ -93,38 +100,42 @@ public class RepoForksActivity extends BaseActivity {
private void loadInitial(String repoOwner, String repoName, int pageSize, int resultLimit) {
Call<List<Repository>> call = RetrofitClient.getApiInterface(ctx).listForks(repoOwner, repoName, pageSize, resultLimit);
Call<List<Repository>> call =
RetrofitClient.getApiInterface(ctx)
.listForks(repoOwner, repoName, pageSize, resultLimit);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<Repository>> call, @NonNull Response<List<Repository>> response) {
public void onResponse(
@NonNull Call<List<Repository>> call,
@NonNull Response<List<Repository>> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
assert response.body() != null;
if(response.body().size() > 0) {
if (response.body().size() > 0) {
forksList.clear();
forksList.addAll(response.body());
adapter.notifyDataChanged();
activityRepoForksBinding.noData.setVisibility(View.GONE);
}
else {
} else {
forksList.clear();
adapter.notifyDataChanged();
activityRepoForksBinding.noData.setVisibility(View.VISIBLE);
}
activityRepoForksBinding.progressBar.setVisibility(View.GONE);
}
else {
} else {
Log.e(TAG, String.valueOf(response.code()));
}
}
@Override
public void onFailure(@NonNull Call<List<Repository>> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<List<Repository>> call, @NonNull Throwable t) {
Log.e(TAG, t.toString());
}
});
@ -134,44 +145,46 @@ public class RepoForksActivity extends BaseActivity {
activityRepoForksBinding.progressLoadMore.setVisibility(View.VISIBLE);
Call<List<Repository>> call = RetrofitClient.getApiInterface(ctx).listForks(repoOwner, repoName, page, resultLimit);
Call<List<Repository>> call =
RetrofitClient.getApiInterface(ctx)
.listForks(repoOwner, repoName, page, resultLimit);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<Repository>> call, @NonNull Response<List<Repository>> response) {
public void onResponse(
@NonNull Call<List<Repository>> call,
@NonNull Response<List<Repository>> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
//remove loading view
// remove loading view
forksList.remove(forksList.size() - 1);
List<Repository> result = response.body();
assert result != null;
if(result.size() > 0) {
if (result.size() > 0) {
pageSize = result.size();
forksList.addAll(result);
}
else {
} else {
adapter.setMoreDataAvailable(false);
}
adapter.notifyDataChanged();
activityRepoForksBinding.progressLoadMore.setVisibility(View.GONE);
}
else {
} else {
Log.e(TAG, String.valueOf(response.code()));
}
}
@Override
public void onFailure(@NonNull Call<List<Repository>> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<List<Repository>> call, @NonNull Throwable t) {
Log.e(TAG, t.toString());
}
});
}
@Override
@ -184,7 +197,8 @@ public class RepoForksActivity extends BaseActivity {
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
searchView.setOnQueryTextListener(
new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
@ -204,8 +218,10 @@ public class RepoForksActivity extends BaseActivity {
private void filter(String text) {
List<Repository> userRepositories = new ArrayList<>();
for(Repository d : forksList) {
if(d.getOwner().getLogin().contains(text) || d.getName().toLowerCase().contains(text) || d.getDescription().toLowerCase().contains(text)) {
for (Repository d : forksList) {
if (d.getOwner().getLogin().contains(text)
|| d.getName().toLowerCase().contains(text)
|| d.getDescription().toLowerCase().contains(text)) {
userRepositories.add(d);
}
@ -219,5 +235,4 @@ public class RepoForksActivity extends BaseActivity {
super.onResume();
repository.checkAccountSwitch(this);
}
}

View File

@ -16,7 +16,6 @@ import org.mian.gitnex.viewmodels.RepoStargazersViewModel;
/**
* @author M M Arif
*/
public class RepoStargazersActivity extends BaseActivity {
private TextView noDataStargazers;
@ -32,7 +31,8 @@ public class RepoStargazersActivity extends BaseActivity {
super.onCreate(savedInstanceState);
ActivityRepoStargazersBinding activityRepoStargazersBinding = ActivityRepoStargazersBinding.inflate(getLayoutInflater());
ActivityRepoStargazersBinding activityRepoStargazersBinding =
ActivityRepoStargazersBinding.inflate(getLayoutInflater());
setContentView(activityRepoStargazersBinding.getRoot());
ImageView closeActivity = activityRepoStargazersBinding.close;
@ -55,18 +55,21 @@ public class RepoStargazersActivity extends BaseActivity {
private void fetchDataAsync(String repoOwner, String repoName) {
RepoStargazersViewModel repoStargazersModel = new ViewModelProvider(this).get(RepoStargazersViewModel.class);
repoStargazersModel.getRepoStargazers(repoOwner, repoName, ctx).observe(this, stargazersListMain -> {
RepoStargazersViewModel repoStargazersModel =
new ViewModelProvider(this).get(RepoStargazersViewModel.class);
repoStargazersModel
.getRepoStargazers(repoOwner, repoName, ctx)
.observe(
this,
stargazersListMain -> {
adapter = new UserGridAdapter(ctx, stargazersListMain);
if(adapter.getCount() > 0) {
if (adapter.getCount() > 0) {
mGridView.setAdapter(adapter);
noDataStargazers.setVisibility(View.GONE);
}
else {
} else {
adapter.notifyDataSetChanged();
mGridView.setAdapter(adapter);
@ -75,7 +78,6 @@ public class RepoStargazersActivity extends BaseActivity {
mProgressBar.setVisibility(View.GONE);
});
}
private void initCloseListener() {
@ -88,5 +90,4 @@ public class RepoStargazersActivity extends BaseActivity {
super.onResume();
repository.checkAccountSwitch(this);
}
}

View File

@ -16,7 +16,6 @@ import org.mian.gitnex.viewmodels.RepoWatchersViewModel;
/**
* @author M M Arif
*/
public class RepoWatchersActivity extends BaseActivity {
private TextView noDataWatchers;
@ -32,7 +31,8 @@ public class RepoWatchersActivity extends BaseActivity {
super.onCreate(savedInstanceState);
ActivityRepoWatchersBinding activityRepoWatchersBinding = ActivityRepoWatchersBinding.inflate(getLayoutInflater());
ActivityRepoWatchersBinding activityRepoWatchersBinding =
ActivityRepoWatchersBinding.inflate(getLayoutInflater());
setContentView(activityRepoWatchersBinding.getRoot());
ImageView closeActivity = activityRepoWatchersBinding.close;
@ -55,18 +55,21 @@ public class RepoWatchersActivity extends BaseActivity {
private void fetchDataAsync(String repoOwner, String repoName) {
RepoWatchersViewModel repoWatchersModel = new ViewModelProvider(this).get(RepoWatchersViewModel.class);
repoWatchersModel.getRepoWatchers(repoOwner, repoName, ctx).observe(this, watchersListMain -> {
RepoWatchersViewModel repoWatchersModel =
new ViewModelProvider(this).get(RepoWatchersViewModel.class);
repoWatchersModel
.getRepoWatchers(repoOwner, repoName, ctx)
.observe(
this,
watchersListMain -> {
adapter = new UserGridAdapter(ctx, watchersListMain);
if(adapter.getCount() > 0) {
if (adapter.getCount() > 0) {
mGridView.setAdapter(adapter);
noDataWatchers.setVisibility(View.GONE);
}
else {
} else {
adapter.notifyDataSetChanged();
mGridView.setAdapter(adapter);
@ -75,7 +78,6 @@ public class RepoWatchersActivity extends BaseActivity {
mProgressBar.setVisibility(View.GONE);
});
}
private void initCloseListener() {
@ -88,5 +90,4 @@ public class RepoWatchersActivity extends BaseActivity {
super.onResume();
repository.checkAccountSwitch(this);
}
}

View File

@ -8,6 +8,7 @@ import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.Objects;
import org.gitnex.tea4j.v2.models.EditRepoOption;
import org.gitnex.tea4j.v2.models.InternalTracker;
import org.gitnex.tea4j.v2.models.Repository;
@ -22,14 +23,12 @@ import org.mian.gitnex.databinding.CustomRepositoryEditPropertiesDialogBinding;
import org.mian.gitnex.databinding.CustomRepositoryTransferDialogBinding;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import java.util.Objects;
import retrofit2.Call;
import retrofit2.Callback;
/**
* @author M M Arif
*/
public class RepositorySettingsActivity extends BaseActivity {
private ActivityRepositorySettingsBinding viewBinding;
@ -59,36 +58,40 @@ public class RepositorySettingsActivity extends BaseActivity {
initCloseListener();
closeActivity.setOnClickListener(onClickListener);
materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx, R.style.ThemeOverlay_Material3_Dialog_Alert);
materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx, R.style.ThemeOverlay_Material3_Dialog_Alert);
viewBinding.editProperties.setOnClickListener(editProperties -> showRepositoryProperties());
viewBinding.deleteRepositoryFrame.setOnClickListener(deleteRepository -> showDeleteRepository());
viewBinding.deleteRepositoryFrame.setOnClickListener(
deleteRepository -> showDeleteRepository());
viewBinding.transferOwnerFrame.setOnClickListener(transferRepositoryOwnership -> showTransferRepository());
viewBinding.transferOwnerFrame.setOnClickListener(
transferRepositoryOwnership -> showTransferRepository());
}
private void showTransferRepository() {
transferRepoBinding = CustomRepositoryTransferDialogBinding.inflate(LayoutInflater.from(ctx));
transferRepoBinding =
CustomRepositoryTransferDialogBinding.inflate(LayoutInflater.from(ctx));
View view = transferRepoBinding.getRoot();
materialAlertDialogBuilder.setView(view);
transferRepoBinding.transfer.setOnClickListener(deleteRepo -> {
transferRepoBinding.transfer.setOnClickListener(
deleteRepo -> {
String newOwner =
String.valueOf(transferRepoBinding.ownerNameForTransfer.getText());
String repoName =
String.valueOf(transferRepoBinding.repoNameForTransfer.getText());
String newOwner = String.valueOf(transferRepoBinding.ownerNameForTransfer.getText());
String repoName = String.valueOf(transferRepoBinding.repoNameForTransfer.getText());
if(!repository.getName().equals(repoName)) {
if (!repository.getName().equals(repoName)) {
Toasty.error(ctx, getString(R.string.repoSettingsDeleteError));
}
else if(newOwner.matches("")) {
} else if (newOwner.matches("")) {
Toasty.error(ctx, getString(R.string.repoTransferOwnerError));
}
else {
} else {
transferRepository(newOwner);
}
@ -102,39 +105,44 @@ public class RepositorySettingsActivity extends BaseActivity {
TransferRepoOption repositoryTransfer = new TransferRepoOption();
repositoryTransfer.setNewOwner(newOwner);
Call<Repository> transferCall = RetrofitClient.getApiInterface(ctx).repoTransfer(repositoryTransfer, repository.getOwner(), repository.getName());
Call<Repository> transferCall =
RetrofitClient.getApiInterface(ctx)
.repoTransfer(
repositoryTransfer, repository.getOwner(), repository.getName());
transferCall.enqueue(new Callback<>() {
transferCall.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Repository> call, @NonNull retrofit2.Response<Repository> response) {
public void onResponse(
@NonNull Call<Repository> call,
@NonNull retrofit2.Response<Repository> response) {
transferRepoBinding.transfer.setVisibility(View.GONE);
transferRepoBinding.processingRequest.setVisibility(View.VISIBLE);
if(response.code() == 202 || response.code() == 201) {
if (response.code() == 202 || response.code() == 201) {
dialogRepo.dismiss();
Toasty.success(ctx, getString(R.string.repoTransferSuccess));
Objects.requireNonNull(BaseApi.getInstance(ctx, RepositoriesApi.class)).deleteRepository(repository.getRepositoryId());
Intent intent = new Intent(RepositorySettingsActivity.this, MainActivity.class);
Objects.requireNonNull(BaseApi.getInstance(ctx, RepositoriesApi.class))
.deleteRepository(repository.getRepositoryId());
Intent intent =
new Intent(RepositorySettingsActivity.this, MainActivity.class);
RepositorySettingsActivity.this.startActivity(intent);
finish();
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
transferRepoBinding.transfer.setVisibility(View.VISIBLE);
transferRepoBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.repoTransferError));
}
else {
} else {
transferRepoBinding.transfer.setVisibility(View.VISIBLE);
transferRepoBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
@ -154,13 +162,16 @@ public class RepositorySettingsActivity extends BaseActivity {
View view = deleteRepoBinding.getRoot();
materialAlertDialogBuilder.setView(view);
deleteRepoBinding.delete.setOnClickListener(deleteRepo -> {
if(!repository.getName().equals(String.valueOf(deleteRepoBinding.repoNameForDeletion.getText()))) {
deleteRepoBinding.delete.setOnClickListener(
deleteRepo -> {
if (!repository
.getName()
.equals(
String.valueOf(
deleteRepoBinding.repoNameForDeletion.getText()))) {
Toasty.error(ctx, getString(R.string.repoSettingsDeleteError));
}
else {
} else {
deleteRepository();
}
@ -171,33 +182,37 @@ public class RepositorySettingsActivity extends BaseActivity {
private void deleteRepository() {
Call<Void> deleteCall = RetrofitClient.getApiInterface(ctx).repoDelete(repository.getOwner(), repository.getName());
Call<Void> deleteCall =
RetrofitClient.getApiInterface(ctx)
.repoDelete(repository.getOwner(), repository.getName());
deleteCall.enqueue(new Callback<>() {
deleteCall.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
deleteRepoBinding.delete.setVisibility(View.GONE);
deleteRepoBinding.processingRequest.setVisibility(View.VISIBLE);
if(response.code() == 204) {
if (response.code() == 204) {
dialogRepo.dismiss();
Toasty.success(ctx, getString(R.string.repoDeletionSuccess));
Objects.requireNonNull(BaseApi.getInstance(ctx, RepositoriesApi.class)).deleteRepository(repository.getRepositoryId());
Intent intent = new Intent(RepositorySettingsActivity.this, MainActivity.class);
Objects.requireNonNull(BaseApi.getInstance(ctx, RepositoriesApi.class))
.deleteRepository(repository.getRepositoryId());
Intent intent =
new Intent(RepositorySettingsActivity.this, MainActivity.class);
RepositorySettingsActivity.this.startActivity(intent);
finish();
}
else {
} else {
deleteRepoBinding.delete.setVisibility(View.VISIBLE);
deleteRepoBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
@ -231,21 +246,20 @@ public class RepositorySettingsActivity extends BaseActivity {
propBinding.repoEnableIssues.setChecked(repoInfo.isHasIssues());
propBinding.repoEnableIssues.setOnCheckedChangeListener((buttonView, isChecked) -> {
if(isChecked) {
propBinding.repoEnableIssues.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
if (isChecked) {
propBinding.repoEnableTimer.setVisibility(View.VISIBLE);
}
else {
} else {
propBinding.repoEnableTimer.setVisibility(View.GONE);
}
});
if(repoInfo.getInternalTracker() != null) {
if (repoInfo.getInternalTracker() != null) {
propBinding.repoEnableTimer.setChecked(repoInfo.getInternalTracker().isEnableTimeTracker());
}
else {
propBinding.repoEnableTimer.setChecked(
repoInfo.getInternalTracker().isEnableTimeTracker());
} else {
propBinding.repoEnableTimer.setVisibility(View.GONE);
}
@ -258,16 +272,39 @@ public class RepositorySettingsActivity extends BaseActivity {
propBinding.repoEnableForceMerge.setChecked(repoInfo.isAllowRebaseExplicit());
propBinding.save.setOnClickListener(
saveProperties -> saveRepositoryProperties(String.valueOf(propBinding.repoName.getText()), String.valueOf(propBinding.repoWebsite.getText()), String.valueOf(propBinding.repoDescription.getText()),
propBinding.repoPrivate.isChecked(), propBinding.repoAsTemplate.isChecked(), propBinding.repoEnableIssues.isChecked(), propBinding.repoEnableWiki.isChecked(), propBinding.repoEnablePr.isChecked(),
propBinding.repoEnableTimer.isChecked(), propBinding.repoEnableMerge.isChecked(), propBinding.repoEnableRebase.isChecked(), propBinding.repoEnableSquash.isChecked(),
saveProperties ->
saveRepositoryProperties(
String.valueOf(propBinding.repoName.getText()),
String.valueOf(propBinding.repoWebsite.getText()),
String.valueOf(propBinding.repoDescription.getText()),
propBinding.repoPrivate.isChecked(),
propBinding.repoAsTemplate.isChecked(),
propBinding.repoEnableIssues.isChecked(),
propBinding.repoEnableWiki.isChecked(),
propBinding.repoEnablePr.isChecked(),
propBinding.repoEnableTimer.isChecked(),
propBinding.repoEnableMerge.isChecked(),
propBinding.repoEnableRebase.isChecked(),
propBinding.repoEnableSquash.isChecked(),
propBinding.repoEnableForceMerge.isChecked()));
dialogRepo = materialAlertDialogBuilder.show();
}
private void saveRepositoryProperties(String repoName, String repoWebsite, String repoDescription, boolean repoPrivate, boolean repoAsTemplate, boolean repoEnableIssues, boolean repoEnableWiki, boolean repoEnablePr,
boolean repoEnableTimer, boolean repoEnableMerge, boolean repoEnableRebase, boolean repoEnableSquash, boolean repoEnableForceMerge) {
private void saveRepositoryProperties(
String repoName,
String repoWebsite,
String repoDescription,
boolean repoPrivate,
boolean repoAsTemplate,
boolean repoEnableIssues,
boolean repoEnableWiki,
boolean repoEnablePr,
boolean repoEnableTimer,
boolean repoEnableMerge,
boolean repoEnableRebase,
boolean repoEnableSquash,
boolean repoEnableForceMerge) {
EditRepoOption repoProps = new EditRepoOption();
repoProps.setName(repoName);
@ -284,32 +321,41 @@ public class RepositorySettingsActivity extends BaseActivity {
repoProps.setAllowSquashMerge(repoEnableSquash);
repoProps.setAllowRebaseExplicit(repoEnableForceMerge);
Call<Repository> propsCall = RetrofitClient.getApiInterface(ctx).repoEdit(repository.getOwner(), repository.getName(), repoProps);
Call<Repository> propsCall =
RetrofitClient.getApiInterface(ctx)
.repoEdit(repository.getOwner(), repository.getName(), repoProps);
propsCall.enqueue(new Callback<>() {
propsCall.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Repository> call, @NonNull retrofit2.Response<Repository> response) {
public void onResponse(
@NonNull Call<Repository> call,
@NonNull retrofit2.Response<Repository> response) {
propBinding.save.setVisibility(View.GONE);
propBinding.processingRequest.setVisibility(View.VISIBLE);
if(response.code() == 200) {
if (response.code() == 200) {
dialogRepo.dismiss();
Toasty.success(ctx, getString(R.string.repoPropertiesSaveSuccess));
assert response.body() != null;
repository.setRepository(response.body());
if(!repository.getName().equals(repoName)) {
Objects.requireNonNull(BaseApi.getInstance(ctx, RepositoriesApi.class)).updateRepositoryOwnerAndName(repository.getOwner(), repoName, repository.getRepositoryId());
if (!repository.getName().equals(repoName)) {
Objects.requireNonNull(
BaseApi.getInstance(ctx, RepositoriesApi.class))
.updateRepositoryOwnerAndName(
repository.getOwner(),
repoName,
repository.getRepositoryId());
Intent result = new Intent();
result.putExtra("nameChanged", true);
setResult(200, result);
finish();
}
}
else {
} else {
propBinding.save.setVisibility(View.VISIBLE);
propBinding.processingRequest.setVisibility(View.GONE);
@ -336,5 +382,4 @@ public class RepositorySettingsActivity extends BaseActivity {
super.onResume();
repository.checkAccountSwitch(this);
}
}

View File

@ -22,7 +22,6 @@ import org.mian.gitnex.helpers.Toasty;
/**
* @author M M Arif
*/
public class SettingsAppearanceActivity extends BaseActivity {
private static String[] timeList;
@ -38,7 +37,8 @@ public class SettingsAppearanceActivity extends BaseActivity {
super.onCreate(savedInstanceState);
ActivitySettingsAppearanceBinding activitySettingsAppearanceBinding = ActivitySettingsAppearanceBinding.inflate(getLayoutInflater());
ActivitySettingsAppearanceBinding activitySettingsAppearanceBinding =
ActivitySettingsAppearanceBinding.inflate(getLayoutInflater());
setContentView(activitySettingsAppearanceBinding.getRoot());
ImageView closeActivity = activitySettingsAppearanceBinding.close;
@ -46,7 +46,8 @@ public class SettingsAppearanceActivity extends BaseActivity {
LinearLayout timeFrame = activitySettingsAppearanceBinding.timeFrame;
LinearLayout customFontFrame = activitySettingsAppearanceBinding.customFontFrame;
LinearLayout themeFrame = activitySettingsAppearanceBinding.themeSelectionFrame;
LinearLayout lightTimeFrame = activitySettingsAppearanceBinding.lightThemeTimeSelectionFrame;
LinearLayout lightTimeFrame =
activitySettingsAppearanceBinding.lightThemeTimeSelectionFrame;
LinearLayout darkTimeFrame = activitySettingsAppearanceBinding.darkThemeTimeSelectionFrame;
SwitchMaterial counterBadgesSwitch = activitySettingsAppearanceBinding.switchCounterBadge;
@ -60,19 +61,19 @@ public class SettingsAppearanceActivity extends BaseActivity {
String lightMinute = String.valueOf(tinyDB.getInt("lightThemeTimeMinute"));
String lightHour = String.valueOf(tinyDB.getInt("lightThemeTimeHour"));
if(lightMinute.length() == 1) {
if (lightMinute.length() == 1) {
lightMinute = "0" + lightMinute;
}
if(lightHour.length() == 1) {
if (lightHour.length() == 1) {
lightHour = "0" + lightHour;
}
String darkMinute = String.valueOf(tinyDB.getInt("darkThemeTimeMinute"));
String darkHour = String.valueOf(tinyDB.getInt("darkThemeTimeHour"));
if(darkMinute.length() == 1) {
if (darkMinute.length() == 1) {
darkMinute = "0" + darkMinute;
}
if(darkHour.length() == 1) {
if (darkHour.length() == 1) {
darkHour = "0" + darkHour;
}
@ -80,17 +81,21 @@ public class SettingsAppearanceActivity extends BaseActivity {
customFontSelectedChoice = tinyDB.getInt("customFontId", 1);
themeSelectedChoice = tinyDB.getInt("themeId", 6); // use system theme as default
activitySettingsAppearanceBinding.lightThemeSelectedTime.setText(ctx.getResources().getString(R.string.settingsThemeTimeSelectedHint, lightHour, lightMinute));
activitySettingsAppearanceBinding.darkThemeSelectedTime.setText(ctx.getResources().getString(R.string.settingsThemeTimeSelectedHint, darkHour, darkMinute));
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(timeList[timeSelectedChoice]);
activitySettingsAppearanceBinding.customFontSelected.setText(customFontList[customFontSelectedChoice]);
activitySettingsAppearanceBinding.customFontSelected.setText(
customFontList[customFontSelectedChoice]);
activitySettingsAppearanceBinding.themeSelected.setText(themeList[themeSelectedChoice]);
if(themeList[themeSelectedChoice].startsWith("Auto")) {
if (themeList[themeSelectedChoice].startsWith("Auto")) {
darkTimeFrame.setVisibility(View.VISIBLE);
lightTimeFrame.setVisibility(View.VISIBLE);
}
else {
} else {
darkTimeFrame.setVisibility(View.GONE);
lightTimeFrame.setVisibility(View.GONE);
}
@ -98,62 +103,83 @@ public class SettingsAppearanceActivity extends BaseActivity {
counterBadgesSwitch.setChecked(tinyDB.getBoolean("enableCounterBadges", true));
// counter badge switcher
counterBadgesSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
counterBadgesSwitch.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
tinyDB.putBoolean("enableCounterBadges", isChecked);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
});
activitySettingsAppearanceBinding.counterBadgeFrame.setOnClickListener(v -> counterBadgesSwitch.setChecked(!counterBadgesSwitch.isChecked()));
activitySettingsAppearanceBinding.counterBadgeFrame.setOnClickListener(
v -> counterBadgesSwitch.setChecked(!counterBadgesSwitch.isChecked()));
// show labels in lists(issues, pr) - default is color dots
activitySettingsAppearanceBinding.switchLabelsInListBadge.setChecked(tinyDB.getBoolean("showLabelsInList", false));
activitySettingsAppearanceBinding.switchLabelsInListBadge.setOnCheckedChangeListener((buttonView, isChecked) -> {
activitySettingsAppearanceBinding.switchLabelsInListBadge.setChecked(
tinyDB.getBoolean("showLabelsInList", false));
activitySettingsAppearanceBinding.switchLabelsInListBadge.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
tinyDB.putBoolean("showLabelsInList", isChecked);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
});
activitySettingsAppearanceBinding.labelsInListFrame.setOnClickListener(
v -> activitySettingsAppearanceBinding.switchLabelsInListBadge.setChecked(!activitySettingsAppearanceBinding.switchLabelsInListBadge.isChecked()));
v ->
activitySettingsAppearanceBinding.switchLabelsInListBadge.setChecked(
!activitySettingsAppearanceBinding.switchLabelsInListBadge
.isChecked()));
// theme selection dialog
themeFrame.setOnClickListener(view -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(R.string.themeSelectorDialogTitle)
.setSingleChoiceItems(themeList, themeSelectedChoice, (dialogInterfaceTheme, i) -> {
themeFrame.setOnClickListener(
view -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(R.string.themeSelectorDialogTitle)
.setSingleChoiceItems(
themeList,
themeSelectedChoice,
(dialogInterfaceTheme, i) -> {
themeSelectedChoice = i;
activitySettingsAppearanceBinding.themeSelected.setText(themeList[i]);
activitySettingsAppearanceBinding.themeSelected
.setText(themeList[i]);
tinyDB.putInt("themeId", i);
SettingsFragment.refreshParent = true;
this.recreate();
this.overridePendingTransition(0, 0);
dialogInterfaceTheme.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
Toasty.success(
appCtx,
getResources()
.getString(R.string.settingsSave));
});
materialAlertDialogBuilder.create().show();
});
lightTimeFrame.setOnClickListener(view -> {
lightTimeFrame.setOnClickListener(
view -> {
LightTimePicker timePicker = new LightTimePicker();
timePicker.show(getSupportFragmentManager(), "timePicker");
});
darkTimeFrame.setOnClickListener(view -> {
darkTimeFrame.setOnClickListener(
view -> {
DarkTimePicker timePicker = new DarkTimePicker();
timePicker.show(getSupportFragmentManager(), "timePicker");
});
// custom font dialog
customFontFrame.setOnClickListener(view -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(R.string.settingsCustomFontSelectorDialogTitle).setCancelable(customFontSelectedChoice != -1)
.setSingleChoiceItems(customFontList, customFontSelectedChoice, (dialogInterfaceCustomFont, i) -> {
customFontFrame.setOnClickListener(
view -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(R.string.settingsCustomFontSelectorDialogTitle)
.setCancelable(customFontSelectedChoice != -1)
.setSingleChoiceItems(
customFontList,
customFontSelectedChoice,
(dialogInterfaceCustomFont, i) -> {
customFontSelectedChoice = i;
activitySettingsAppearanceBinding.customFontSelected.setText(customFontList[i]);
activitySettingsAppearanceBinding.customFontSelected
.setText(customFontList[i]);
tinyDB.putInt("customFontId", i);
AppUtil.typeface = null; // reset typeface
FontsOverride.setDefaultFont(this);
@ -162,23 +188,32 @@ public class SettingsAppearanceActivity extends BaseActivity {
this.recreate();
this.overridePendingTransition(0, 0);
dialogInterfaceCustomFont.dismiss();
Toasty.success(appCtx, appCtx.getResources().getString(R.string.settingsSave));
Toasty.success(
appCtx,
appCtx.getResources()
.getString(R.string.settingsSave));
});
materialAlertDialogBuilder.create().show();
});
// time and date dialog
timeFrame.setOnClickListener(view -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(R.string.settingsTimeSelectorDialogTitle).setCancelable(timeSelectedChoice != -1)
.setSingleChoiceItems(timeList, timeSelectedChoice, (dialogInterfaceTime, i) -> {
timeFrame.setOnClickListener(
view -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(R.string.settingsTimeSelectorDialogTitle)
.setCancelable(timeSelectedChoice != -1)
.setSingleChoiceItems(
timeList,
timeSelectedChoice,
(dialogInterfaceTime, i) -> {
timeSelectedChoice = i;
activitySettingsAppearanceBinding.tvDateTimeSelected.setText(timeList[i]);
activitySettingsAppearanceBinding.tvDateTimeSelected
.setText(timeList[i]);
tinyDB.putInt("timeId", i);
switch(i) {
switch (i) {
case 0:
tinyDB.putString("dateFormat", "pretty");
break;
@ -188,24 +223,26 @@ public class SettingsAppearanceActivity extends BaseActivity {
}
dialogInterfaceTime.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
Toasty.success(
appCtx,
getResources()
.getString(R.string.settingsSave));
});
materialAlertDialogBuilder.create().show();
});
}
private void initCloseListener() {
onClickListener = view -> finish();
}
public static class LightTimePicker extends DialogFragment implements TimePickerDialog.OnTimeSetListener {
public static class LightTimePicker extends DialogFragment
implements TimePickerDialog.OnTimeSetListener {
TinyDB db = TinyDB.getInstance(getContext());
@NonNull
@Override
@NonNull @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
int hour = db.getInt("lightThemeTimeHour");
int minute = db.getInt("lightThemeTimeMinute");
@ -220,18 +257,19 @@ public class SettingsAppearanceActivity extends BaseActivity {
SettingsFragment.refreshParent = true;
requireActivity().overridePendingTransition(0, 0);
this.dismiss();
Toasty.success(requireActivity().getApplicationContext(), requireContext().getResources().getString(R.string.settingsSave));
Toasty.success(
requireActivity().getApplicationContext(),
requireContext().getResources().getString(R.string.settingsSave));
requireActivity().recreate();
}
}
public static class DarkTimePicker extends DialogFragment implements TimePickerDialog.OnTimeSetListener {
public static class DarkTimePicker extends DialogFragment
implements TimePickerDialog.OnTimeSetListener {
TinyDB db = TinyDB.getInstance(getContext());
@NonNull
@Override
@NonNull @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
int hour = db.getInt("darkThemeTimeHour");
int minute = db.getInt("darkThemeTimeMinute");
@ -246,10 +284,10 @@ public class SettingsAppearanceActivity extends BaseActivity {
SettingsFragment.refreshParent = true;
requireActivity().overridePendingTransition(0, 0);
this.dismiss();
Toasty.success(requireActivity().getApplicationContext(), requireContext().getResources().getString(R.string.settingsSave));
Toasty.success(
requireActivity().getApplicationContext(),
requireContext().getResources().getString(R.string.settingsSave));
requireActivity().recreate();
}
}
}

View File

@ -10,7 +10,6 @@ import org.mian.gitnex.helpers.Toasty;
/**
* @author M M Arif
*/
public class SettingsDraftsActivity extends BaseActivity {
private View.OnClickListener onClickListener;
@ -20,7 +19,8 @@ public class SettingsDraftsActivity extends BaseActivity {
super.onCreate(savedInstanceState);
ActivitySettingsDraftsBinding activitySettingsDraftsBinding = ActivitySettingsDraftsBinding.inflate(getLayoutInflater());
ActivitySettingsDraftsBinding activitySettingsDraftsBinding =
ActivitySettingsDraftsBinding.inflate(getLayoutInflater());
setContentView(activitySettingsDraftsBinding.getRoot());
ImageView closeActivity = activitySettingsDraftsBinding.close;
@ -28,21 +28,22 @@ public class SettingsDraftsActivity extends BaseActivity {
initCloseListener();
closeActivity.setOnClickListener(onClickListener);
activitySettingsDraftsBinding.commentsDeletionSwitch.setChecked(tinyDB.getBoolean("draftsCommentsDeletionEnabled", true));
activitySettingsDraftsBinding.commentsDeletionSwitch.setChecked(
tinyDB.getBoolean("draftsCommentsDeletionEnabled", true));
// delete comments on submit switcher
activitySettingsDraftsBinding.commentsDeletionSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
activitySettingsDraftsBinding.commentsDeletionSwitch.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
tinyDB.putBoolean("draftsCommentsDeletionEnabled", isChecked);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
});
activitySettingsDraftsBinding.enableDraftsCommentsDeletion.setOnClickListener(
v -> activitySettingsDraftsBinding.commentsDeletionSwitch.setChecked(!activitySettingsDraftsBinding.commentsDeletionSwitch.isChecked()));
v ->
activitySettingsDraftsBinding.commentsDeletionSwitch.setChecked(
!activitySettingsDraftsBinding.commentsDeletionSwitch.isChecked()));
}
private void initCloseListener() {
onClickListener = view -> finish();
}
}

View File

@ -3,17 +3,16 @@ package org.mian.gitnex.activities;
import android.os.Bundle;
import android.view.View;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import org.mian.gitnex.R;
import org.mian.gitnex.databinding.ActivitySettingsGeneralBinding;
import org.mian.gitnex.helpers.Toasty;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.mian.gitnex.R;
import org.mian.gitnex.databinding.ActivitySettingsGeneralBinding;
import org.mian.gitnex.helpers.Toasty;
/**
* @author M M Arif
*/
public class SettingsGeneralActivity extends BaseActivity {
private static int homeScreenSelectedChoice = 0;
@ -37,76 +36,82 @@ public class SettingsGeneralActivity extends BaseActivity {
// home screen
String[] appHomeDefaultScreen = getResources().getStringArray(R.array.appDefaultHomeScreen);
String[] appHomeDefaultScreenNew = getResources().getStringArray(R.array.appDefaultHomeScreenNew);
String[] appHomeDefaultScreenNew =
getResources().getStringArray(R.array.appDefaultHomeScreenNew);
if(getAccount().requiresVersion("1.12.3")) {
if (getAccount().requiresVersion("1.12.3")) {
appHomeDefaultScreen = appHomeDefaultScreenNew;
}
homeScreenList = new ArrayList<>(Arrays.asList(appHomeDefaultScreen));
if(!getAccount().requiresVersion("1.14.0")) {
if (!getAccount().requiresVersion("1.14.0")) {
homeScreenList.remove(8);
}
String[] homeScreenArray = new String[homeScreenList.size()];
homeScreenList.toArray(homeScreenArray);
if(homeScreenSelectedChoice == 0) {
if (homeScreenSelectedChoice == 0) {
homeScreenSelectedChoice = tinyDB.getInt("homeScreenId", 0);
viewBinding.homeScreenSelected.setText(getResources().getString(R.string.navMyRepos));
}
if(homeScreenSelectedChoice == 1) {
if (homeScreenSelectedChoice == 1) {
viewBinding.homeScreenSelected.setText(getResources().getString(R.string.pageTitleStarredRepos));
}
else if(homeScreenSelectedChoice == 2) {
viewBinding.homeScreenSelected.setText(
getResources().getString(R.string.pageTitleStarredRepos));
} else if (homeScreenSelectedChoice == 2) {
viewBinding.homeScreenSelected.setText(getResources().getString(R.string.navOrg));
}
else if(homeScreenSelectedChoice == 3) {
} else if (homeScreenSelectedChoice == 3) {
viewBinding.homeScreenSelected.setText(getResources().getString(R.string.navRepos));
}
else if(homeScreenSelectedChoice == 4) {
} else if (homeScreenSelectedChoice == 4) {
viewBinding.homeScreenSelected.setText(getResources().getString(R.string.navProfile));
}
else if(homeScreenSelectedChoice == 5) {
} else if (homeScreenSelectedChoice == 5) {
viewBinding.homeScreenSelected.setText(getResources().getString(R.string.pageTitleExplore));
}
else if(homeScreenSelectedChoice == 6) {
viewBinding.homeScreenSelected.setText(
getResources().getString(R.string.pageTitleExplore));
} else if (homeScreenSelectedChoice == 6) {
viewBinding.homeScreenSelected.setText(getResources().getString(R.string.titleDrafts));
}
else if(homeScreenSelectedChoice == 7) {
} else if (homeScreenSelectedChoice == 7) {
viewBinding.homeScreenSelected.setText(getResources().getString(R.string.pageTitleNotifications));
}
else if(homeScreenSelectedChoice == 8) {
viewBinding.homeScreenSelected.setText(
getResources().getString(R.string.pageTitleNotifications));
} else if (homeScreenSelectedChoice == 8) {
viewBinding.homeScreenSelected.setText(getResources().getString(R.string.navMyIssues));
}
else if(homeScreenSelectedChoice == 9) {
} else if (homeScreenSelectedChoice == 9) {
viewBinding.homeScreenSelected.setText(getResources().getString(R.string.navMostVisited));
viewBinding.homeScreenSelected.setText(
getResources().getString(R.string.navMostVisited));
}
viewBinding.homeScreenFrame.setOnClickListener(setDefaultHomeScreen -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(R.string.settingsHomeScreenSelectorDialogTitle).setCancelable(homeScreenSelectedChoice != -1)
.setSingleChoiceItems(homeScreenArray, homeScreenSelectedChoice, (dialogInterfaceHomeScreen, i) -> {
viewBinding.homeScreenFrame.setOnClickListener(
setDefaultHomeScreen -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(R.string.settingsHomeScreenSelectorDialogTitle)
.setCancelable(homeScreenSelectedChoice != -1)
.setSingleChoiceItems(
homeScreenArray,
homeScreenSelectedChoice,
(dialogInterfaceHomeScreen, i) -> {
homeScreenSelectedChoice = i;
viewBinding.homeScreenSelected.setText(homeScreenArray[i]);
viewBinding.homeScreenSelected.setText(
homeScreenArray[i]);
tinyDB.putInt("homeScreenId", i);
dialogInterfaceHomeScreen.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
Toasty.success(
appCtx,
getResources()
.getString(R.string.settingsSave));
});
materialAlertDialogBuilder.create().show();
@ -114,26 +119,37 @@ public class SettingsGeneralActivity extends BaseActivity {
// home screen
// link handler
String[] linkHandlerDefaultScreenList = getResources().getStringArray(R.array.linkHandlerDefaultScreen);
String[] linkHandlerDefaultScreenList =
getResources().getStringArray(R.array.linkHandlerDefaultScreen);
linkHandlerDefaultScreen = new ArrayList<>(Arrays.asList(linkHandlerDefaultScreenList));
String[] linksArray = new String[linkHandlerDefaultScreen.size()];
linkHandlerDefaultScreen.toArray(linksArray);
defaultLinkHandlerScreenSelectedChoice = tinyDB.getInt("defaultScreenId");
viewBinding.generalDeepLinkSelected.setText(linksArray[defaultLinkHandlerScreenSelectedChoice]);
viewBinding.setDefaultLinkHandler.setOnClickListener(setDefaultLinkHandler -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(R.string.linkSelectorDialogTitle).setCancelable(defaultLinkHandlerScreenSelectedChoice != -1)
.setSingleChoiceItems(linksArray, defaultLinkHandlerScreenSelectedChoice, (dialogInterfaceHomeScreen, i) -> {
viewBinding.generalDeepLinkSelected.setText(
linksArray[defaultLinkHandlerScreenSelectedChoice]);
viewBinding.setDefaultLinkHandler.setOnClickListener(
setDefaultLinkHandler -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(R.string.linkSelectorDialogTitle)
.setCancelable(defaultLinkHandlerScreenSelectedChoice != -1)
.setSingleChoiceItems(
linksArray,
defaultLinkHandlerScreenSelectedChoice,
(dialogInterfaceHomeScreen, i) -> {
defaultLinkHandlerScreenSelectedChoice = i;
viewBinding.generalDeepLinkSelected.setText(linksArray[i]);
viewBinding.generalDeepLinkSelected.setText(
linksArray[i]);
tinyDB.putInt("defaultScreenId", i);
dialogInterfaceHomeScreen.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
Toasty.success(
appCtx,
getResources()
.getString(R.string.settingsSave));
});
materialAlertDialogBuilder.create().show();
@ -142,16 +158,17 @@ public class SettingsGeneralActivity extends BaseActivity {
// custom tabs
viewBinding.switchTabs.setChecked(tinyDB.getBoolean("useCustomTabs"));
viewBinding.switchTabs.setOnCheckedChangeListener((buttonView, isChecked) -> {
viewBinding.switchTabs.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
tinyDB.putBoolean("useCustomTabs", isChecked);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
});
viewBinding.customTabsFrame.setOnClickListener(v -> viewBinding.switchTabs.setChecked(!viewBinding.switchTabs.isChecked()));
viewBinding.customTabsFrame.setOnClickListener(
v -> viewBinding.switchTabs.setChecked(!viewBinding.switchTabs.isChecked()));
// custom tabs
}
private void initCloseListener() {
onClickListener = view -> finish();
}
}

View File

@ -17,7 +17,6 @@ import org.mian.gitnex.notifications.Notifications;
* @author M M Arif
* @author opyale
*/
public class SettingsNotificationsActivity extends BaseActivity {
private ActivitySettingsNotificationsBinding viewBinding;
@ -34,58 +33,101 @@ public class SettingsNotificationsActivity extends BaseActivity {
viewBinding.close.setOnClickListener(onClickListener);
viewBinding.pollingDelaySelected.setText(String.format(getString(R.string.pollingDelaySelectedText), tinyDB.getInt("pollingDelayMinutes", Constants.defaultPollingDelay)));
viewBinding.chooseColorState.setCardBackgroundColor(tinyDB.getInt("notificationsLightColor", Color.GREEN));
viewBinding.pollingDelaySelected.setText(
String.format(
getString(R.string.pollingDelaySelectedText),
tinyDB.getInt("pollingDelayMinutes", Constants.defaultPollingDelay)));
viewBinding.chooseColorState.setCardBackgroundColor(
tinyDB.getInt("notificationsLightColor", Color.GREEN));
viewBinding.enableNotificationsMode.setChecked(tinyDB.getBoolean("notificationsEnabled", true));
viewBinding.enableLightsMode.setChecked(tinyDB.getBoolean("notificationsEnableLights", true));
viewBinding.enableVibrationMode.setChecked(tinyDB.getBoolean("notificationsEnableVibration", true));
viewBinding.enableNotificationsMode.setChecked(
tinyDB.getBoolean("notificationsEnabled", true));
viewBinding.enableLightsMode.setChecked(
tinyDB.getBoolean("notificationsEnableLights", true));
viewBinding.enableVibrationMode.setChecked(
tinyDB.getBoolean("notificationsEnableVibration", true));
if(!viewBinding.enableNotificationsMode.isChecked()) {
AppUtil.setMultiVisibility(View.GONE, viewBinding.chooseColorFrame, viewBinding.enableLightsFrame, viewBinding.enableVibrationFrame, viewBinding.pollingDelayFrame);
if (!viewBinding.enableNotificationsMode.isChecked()) {
AppUtil.setMultiVisibility(
View.GONE,
viewBinding.chooseColorFrame,
viewBinding.enableLightsFrame,
viewBinding.enableVibrationFrame,
viewBinding.pollingDelayFrame);
}
if(!viewBinding.enableLightsMode.isChecked()) {
if (!viewBinding.enableLightsMode.isChecked()) {
viewBinding.chooseColorFrame.setVisibility(View.GONE);
}
viewBinding.enableNotificationsMode.setOnCheckedChangeListener((buttonView, isChecked) -> {
viewBinding.enableNotificationsMode.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
tinyDB.putBoolean("notificationsEnabled", isChecked);
if(isChecked) {
if (isChecked) {
Notifications.startWorker(ctx);
AppUtil.setMultiVisibility(View.VISIBLE, viewBinding.chooseColorFrame, viewBinding.enableLightsFrame, viewBinding.enableVibrationFrame, viewBinding.pollingDelayFrame);
}
else {
AppUtil.setMultiVisibility(
View.VISIBLE,
viewBinding.chooseColorFrame,
viewBinding.enableLightsFrame,
viewBinding.enableVibrationFrame,
viewBinding.pollingDelayFrame);
} else {
Notifications.stopWorker(ctx);
AppUtil.setMultiVisibility(View.GONE, viewBinding.chooseColorFrame, viewBinding.enableLightsFrame, viewBinding.enableVibrationFrame, viewBinding.pollingDelayFrame);
AppUtil.setMultiVisibility(
View.GONE,
viewBinding.chooseColorFrame,
viewBinding.enableLightsFrame,
viewBinding.enableVibrationFrame,
viewBinding.pollingDelayFrame);
}
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
});
viewBinding.enableNotificationsFrame.setOnClickListener(v -> viewBinding.enableNotificationsMode.setChecked(!viewBinding.enableNotificationsMode.isChecked()));
viewBinding.enableNotificationsFrame.setOnClickListener(
v ->
viewBinding.enableNotificationsMode.setChecked(
!viewBinding.enableNotificationsMode.isChecked()));
// polling delay
viewBinding.pollingDelayFrame.setOnClickListener(v -> {
viewBinding.pollingDelayFrame.setOnClickListener(
v -> {
NumberPicker numberPicker = new NumberPicker(ctx);
numberPicker.setMinValue(Constants.minimumPollingDelay);
numberPicker.setMaxValue(Constants.maximumPollingDelay);
numberPicker.setValue(tinyDB.getInt("pollingDelayMinutes", Constants.defaultPollingDelay));
numberPicker.setValue(
tinyDB.getInt("pollingDelayMinutes", Constants.defaultPollingDelay));
numberPicker.setWrapSelectorWheel(true);
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(R.string.pollingDelayDialogHeaderText).setMessage(getString(R.string.pollingDelayDialogDescriptionText))
.setCancelable(true).setNeutralButton(R.string.cancelButton, (dialog, which) -> dialog.dismiss()).setPositiveButton(getString(R.string.okButton), (dialog, which) -> {
tinyDB.putInt("pollingDelayMinutes", numberPicker.getValue());
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(R.string.pollingDelayDialogHeaderText)
.setMessage(
getString(R.string.pollingDelayDialogDescriptionText))
.setCancelable(true)
.setNeutralButton(
R.string.cancelButton,
(dialog, which) -> dialog.dismiss())
.setPositiveButton(
getString(R.string.okButton),
(dialog, which) -> {
tinyDB.putInt(
"pollingDelayMinutes",
numberPicker.getValue());
Notifications.stopWorker(ctx);
Notifications.startWorker(ctx);
viewBinding.pollingDelaySelected.setText(String.format(getString(R.string.pollingDelaySelectedText), numberPicker.getValue()));
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
viewBinding.pollingDelaySelected.setText(
String.format(
getString(
R.string
.pollingDelaySelectedText),
numberPicker.getValue()));
Toasty.success(
appCtx,
getResources()
.getString(R.string.settingsSave));
});
materialAlertDialogBuilder.setView(numberPicker);
@ -93,47 +135,48 @@ public class SettingsNotificationsActivity extends BaseActivity {
});
// lights switcher
viewBinding.enableLightsMode.setOnCheckedChangeListener((buttonView, isChecked) -> {
if(!isChecked) {
viewBinding.enableLightsMode.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
if (!isChecked) {
viewBinding.chooseColorFrame.setVisibility(View.GONE);
}
else {
} else {
viewBinding.chooseColorFrame.setVisibility(View.VISIBLE);
}
tinyDB.putBoolean("notificationsEnableLights", isChecked);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
});
viewBinding.enableLightsFrame.setOnClickListener(v -> viewBinding.enableLightsMode.setChecked(!viewBinding.enableLightsMode.isChecked()));
viewBinding.enableLightsFrame.setOnClickListener(
v ->
viewBinding.enableLightsMode.setChecked(
!viewBinding.enableLightsMode.isChecked()));
// lights color chooser
viewBinding.chooseColorFrame.setOnClickListener(v -> {
viewBinding.chooseColorFrame.setOnClickListener(
v -> {
ColorPicker colorPicker = new ColorPicker(SettingsNotificationsActivity.this);
colorPicker.setColor(tinyDB.getInt("notificationsLightColor", Color.GREEN));
colorPicker.setCallback(color -> {
colorPicker.setCallback(
color -> {
tinyDB.putInt("notificationsLightColor", color);
viewBinding.chooseColorState.setCardBackgroundColor(color);
colorPicker.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
Toasty.success(
appCtx, getResources().getString(R.string.settingsSave));
});
colorPicker.show();
});
// vibration switcher
viewBinding.enableVibrationMode.setOnCheckedChangeListener((buttonView, isChecked) -> {
viewBinding.enableVibrationMode.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
tinyDB.putBoolean("notificationsEnableVibration", isChecked);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
});
viewBinding.enableVibrationFrame.setOnClickListener(v -> viewBinding.enableVibrationMode.setChecked(!viewBinding.enableVibrationMode.isChecked()));
viewBinding.enableVibrationFrame.setOnClickListener(
v ->
viewBinding.enableVibrationMode.setChecked(
!viewBinding.enableVibrationMode.isChecked()));
}
}

View File

@ -10,7 +10,6 @@ import org.mian.gitnex.helpers.Toasty;
/**
* @author M M Arif
*/
public class SettingsReportsActivity extends BaseActivity {
private View.OnClickListener onClickListener;
@ -20,7 +19,8 @@ public class SettingsReportsActivity extends BaseActivity {
super.onCreate(savedInstanceState);
ActivitySettingsReportsBinding activitySettingsReportsBinding = ActivitySettingsReportsBinding.inflate(getLayoutInflater());
ActivitySettingsReportsBinding activitySettingsReportsBinding =
ActivitySettingsReportsBinding.inflate(getLayoutInflater());
setContentView(activitySettingsReportsBinding.getRoot());
ImageView closeActivity = activitySettingsReportsBinding.close;
@ -28,19 +28,22 @@ public class SettingsReportsActivity extends BaseActivity {
initCloseListener();
closeActivity.setOnClickListener(onClickListener);
activitySettingsReportsBinding.crashReportsSwitch.setChecked(tinyDB.getBoolean("crashReportingEnabled", true));
activitySettingsReportsBinding.crashReportsSwitch.setChecked(
tinyDB.getBoolean("crashReportingEnabled", true));
// crash reports switcher
activitySettingsReportsBinding.crashReportsSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
activitySettingsReportsBinding.crashReportsSwitch.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
tinyDB.putBoolean("crashReportingEnabled", isChecked);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
});
activitySettingsReportsBinding.enableSendReports.setOnClickListener(v -> activitySettingsReportsBinding.crashReportsSwitch.setChecked(!activitySettingsReportsBinding.crashReportsSwitch.isChecked()));
activitySettingsReportsBinding.enableSendReports.setOnClickListener(
v ->
activitySettingsReportsBinding.crashReportsSwitch.setChecked(
!activitySettingsReportsBinding.crashReportsSwitch.isChecked()));
}
private void initCloseListener() {
onClickListener = view -> finish();
}
}

View File

@ -1,5 +1,8 @@
package org.mian.gitnex.activities;
import static androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG;
import static androidx.biometric.BiometricManager.Authenticators.DEVICE_CREDENTIAL;
import android.app.KeyguardManager;
import android.content.Context;
import android.os.Bundle;
@ -11,21 +14,18 @@ import android.widget.TextView;
import androidx.biometric.BiometricManager;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.switchmaterial.SwitchMaterial;
import java.io.File;
import java.io.IOException;
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;
import java.io.IOException;
import static androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG;
import static androidx.biometric.BiometricManager.Authenticators.DEVICE_CREDENTIAL;
/**
* @author M M Arif
*/
public class SettingsSecurityActivity extends BaseActivity {
private static String[] cacheSizeDataList;
@ -39,7 +39,8 @@ public class SettingsSecurityActivity extends BaseActivity {
super.onCreate(savedInstanceState);
ActivitySettingsSecurityBinding activitySettingsSecurityBinding = ActivitySettingsSecurityBinding.inflate(getLayoutInflater());
ActivitySettingsSecurityBinding activitySettingsSecurityBinding =
ActivitySettingsSecurityBinding.inflate(getLayoutInflater());
setContentView(activitySettingsSecurityBinding.getRoot());
ImageView closeActivity = activitySettingsSecurityBinding.close;
@ -47,13 +48,19 @@ public class SettingsSecurityActivity extends BaseActivity {
initCloseListener();
closeActivity.setOnClickListener(onClickListener);
TextView cacheSizeDataSelected = activitySettingsSecurityBinding.cacheSizeDataSelected; // setter for data cache size
TextView cacheSizeImagesSelected = activitySettingsSecurityBinding.cacheSizeImagesSelected; // setter for images cache size
TextView clearCacheSelected = activitySettingsSecurityBinding.clearCacheSelected; // setter for clear cache
TextView cacheSizeDataSelected =
activitySettingsSecurityBinding.cacheSizeDataSelected; // setter for data cache size
TextView cacheSizeImagesSelected =
activitySettingsSecurityBinding
.cacheSizeImagesSelected; // setter for images cache size
TextView clearCacheSelected =
activitySettingsSecurityBinding.clearCacheSelected; // setter for clear cache
LinearLayout certsFrame = activitySettingsSecurityBinding.certsFrame;
LinearLayout cacheSizeDataFrame = activitySettingsSecurityBinding.cacheSizeDataSelectionFrame;
LinearLayout cacheSizeImagesFrame = activitySettingsSecurityBinding.cacheSizeImagesSelectionFrame;
LinearLayout cacheSizeDataFrame =
activitySettingsSecurityBinding.cacheSizeDataSelectionFrame;
LinearLayout cacheSizeImagesFrame =
activitySettingsSecurityBinding.cacheSizeImagesSelectionFrame;
LinearLayout clearCacheFrame = activitySettingsSecurityBinding.clearCacheSelectionFrame;
SwitchMaterial switchBiometric = activitySettingsSecurityBinding.switchBiometric;
@ -61,15 +68,20 @@ public class SettingsSecurityActivity extends BaseActivity {
cacheSizeDataList = getResources().getStringArray(R.array.cacheSizeList);
cacheSizeImagesList = getResources().getStringArray(R.array.cacheSizeList);
cacheSizeDataSelected.setText(tinyDB.getString("cacheSizeStr", getString(R.string.cacheSizeDataSelectionSelectedText)));
cacheSizeImagesSelected.setText(tinyDB.getString("cacheSizeImagesStr", getString(R.string.cacheSizeImagesSelectionSelectedText)));
cacheSizeDataSelected.setText(
tinyDB.getString(
"cacheSizeStr", getString(R.string.cacheSizeDataSelectionSelectedText)));
cacheSizeImagesSelected.setText(
tinyDB.getString(
"cacheSizeImagesStr",
getString(R.string.cacheSizeImagesSelectionSelectedText)));
if(cacheSizeDataSelectedChoice == 0) {
if (cacheSizeDataSelectedChoice == 0) {
cacheSizeDataSelectedChoice = tinyDB.getInt("cacheSizeId");
}
if(cacheSizeImagesSelectedChoice == 0) {
if (cacheSizeImagesSelectedChoice == 0) {
cacheSizeImagesSelectedChoice = tinyDB.getInt("cacheSizeImagesId");
}
@ -77,79 +89,93 @@ public class SettingsSecurityActivity extends BaseActivity {
switchBiometric.setChecked(tinyDB.getBoolean("biometricStatus", false));
// biometric switcher
switchBiometric.setOnCheckedChangeListener((buttonView, isChecked) -> {
if(isChecked) {
switchBiometric.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
if (isChecked) {
BiometricManager biometricManager = BiometricManager.from(ctx);
KeyguardManager keyguardManager = (KeyguardManager) ctx.getSystemService(Context.KEYGUARD_SERVICE);
KeyguardManager keyguardManager =
(KeyguardManager) ctx.getSystemService(Context.KEYGUARD_SERVICE);
if(!keyguardManager.isDeviceSecure()) {
switch(biometricManager.canAuthenticate(BIOMETRIC_STRONG | DEVICE_CREDENTIAL)) {
if (!keyguardManager.isDeviceSecure()) {
switch (biometricManager.canAuthenticate(
BIOMETRIC_STRONG | DEVICE_CREDENTIAL)) {
case BiometricManager.BIOMETRIC_SUCCESS:
tinyDB.putBoolean("biometricStatus", true);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
Toasty.success(
appCtx,
getResources().getString(R.string.settingsSave));
break;
case BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE:
case BiometricManager.BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED:
case BiometricManager.BIOMETRIC_ERROR_UNSUPPORTED:
case BiometricManager.BIOMETRIC_STATUS_UNKNOWN:
tinyDB.putBoolean("biometricStatus", false);
switchBiometric.setChecked(false);
Toasty.error(appCtx, getResources().getString(R.string.biometricNotSupported));
Toasty.error(
appCtx,
getResources()
.getString(R.string.biometricNotSupported));
break;
case BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE:
tinyDB.putBoolean("biometricStatus", false);
switchBiometric.setChecked(false);
Toasty.error(appCtx, getResources().getString(R.string.biometricNotAvailable));
Toasty.error(
appCtx,
getResources()
.getString(R.string.biometricNotAvailable));
break;
case BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED:
tinyDB.putBoolean("biometricStatus", false);
switchBiometric.setChecked(false);
Toasty.info(appCtx, getResources().getString(R.string.enrollBiometric));
Toasty.info(
appCtx,
getResources().getString(R.string.enrollBiometric));
break;
}
}
else {
} else {
tinyDB.putBoolean("biometricStatus", true);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
}
}
else {
} else {
tinyDB.putBoolean("biometricStatus", false);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
}
});
activitySettingsSecurityBinding.biometricFrame.setOnClickListener(v -> switchBiometric.setChecked(!switchBiometric.isChecked()));
activitySettingsSecurityBinding.biometricFrame.setOnClickListener(
v -> switchBiometric.setChecked(!switchBiometric.isChecked()));
// clear cache setter
File cacheDir = appCtx.getCacheDir();
clearCacheSelected.setText(FileUtils.byteCountToDisplaySize((int) FileUtils.sizeOfDirectory(cacheDir)));
clearCacheSelected.setText(
FileUtils.byteCountToDisplaySize((int) FileUtils.sizeOfDirectory(cacheDir)));
// clear cache
clearCacheFrame.setOnClickListener(v1 -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(R.string.clearCacheDialogHeader).setMessage(getResources().getString(R.string.clearCacheDialogMessage))
.setNeutralButton(R.string.cancelButton, (dialog, which) -> dialog.dismiss()).setPositiveButton(R.string.menuDeleteText, (dialog, which) -> {
clearCacheFrame.setOnClickListener(
v1 -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(R.string.clearCacheDialogHeader)
.setMessage(
getResources()
.getString(R.string.clearCacheDialogMessage))
.setNeutralButton(
R.string.cancelButton,
(dialog, which) -> dialog.dismiss())
.setPositiveButton(
R.string.menuDeleteText,
(dialog, which) -> {
try {
FileUtils.deleteDirectory(cacheDir);
FileUtils.forceMkdir(cacheDir);
this.recreate();
this.overridePendingTransition(0, 0);
}
catch(IOException e) {
} catch (IOException e) {
Log.e("SettingsSecurity", e.toString());
}
@ -159,48 +185,83 @@ public class SettingsSecurityActivity extends BaseActivity {
});
// cache size images selection dialog
cacheSizeImagesFrame.setOnClickListener(view -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(R.string.cacheSizeImagesDialogHeader).setCancelable(cacheSizeImagesSelectedChoice != -1)
.setSingleChoiceItems(cacheSizeImagesList, cacheSizeImagesSelectedChoice, (dialogInterfaceTheme, i) -> {
cacheSizeImagesFrame.setOnClickListener(
view -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(R.string.cacheSizeImagesDialogHeader)
.setCancelable(cacheSizeImagesSelectedChoice != -1)
.setSingleChoiceItems(
cacheSizeImagesList,
cacheSizeImagesSelectedChoice,
(dialogInterfaceTheme, i) -> {
cacheSizeImagesSelectedChoice = i;
cacheSizeImagesSelected.setText(cacheSizeImagesList[i]);
tinyDB.putString("cacheSizeImagesStr", cacheSizeImagesList[i]);
cacheSizeImagesSelected.setText(
cacheSizeImagesList[i]);
tinyDB.putString(
"cacheSizeImagesStr",
cacheSizeImagesList[i]);
tinyDB.putInt("cacheSizeImagesId", i);
dialogInterfaceTheme.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
Toasty.success(
appCtx,
getResources()
.getString(R.string.settingsSave));
});
materialAlertDialogBuilder.create().show();
});
// cache size data selection dialog
cacheSizeDataFrame.setOnClickListener(view -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(R.string.cacheSizeDataDialogHeader).setCancelable(cacheSizeDataSelectedChoice != -1)
.setSingleChoiceItems(cacheSizeDataList, cacheSizeDataSelectedChoice, (dialogInterfaceTheme, i) -> {
cacheSizeDataFrame.setOnClickListener(
view -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(R.string.cacheSizeDataDialogHeader)
.setCancelable(cacheSizeDataSelectedChoice != -1)
.setSingleChoiceItems(
cacheSizeDataList,
cacheSizeDataSelectedChoice,
(dialogInterfaceTheme, i) -> {
cacheSizeDataSelectedChoice = i;
cacheSizeDataSelected.setText(cacheSizeDataList[i]);
tinyDB.putString("cacheSizeStr", cacheSizeDataList[i]);
tinyDB.putString(
"cacheSizeStr", cacheSizeDataList[i]);
tinyDB.putInt("cacheSizeId", i);
dialogInterfaceTheme.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
Toasty.success(
appCtx,
getResources()
.getString(R.string.settingsSave));
});
materialAlertDialogBuilder.create().show();
});
// certs deletion
certsFrame.setOnClickListener(v1 -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(R.string.settingsCertsPopupTitle).setMessage(getResources().getString(R.string.settingsCertsPopupMessage))
.setNeutralButton(R.string.cancelButton, (dialog, which) -> dialog.dismiss()).setPositiveButton(R.string.menuDeleteText, (dialog, which) -> {
appCtx.getSharedPreferences(MemorizingTrustManager.KEYSTORE_NAME, Context.MODE_PRIVATE).edit().remove(MemorizingTrustManager.KEYSTORE_KEY).apply();
certsFrame.setOnClickListener(
v1 -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(R.string.settingsCertsPopupTitle)
.setMessage(
getResources()
.getString(R.string.settingsCertsPopupMessage))
.setNeutralButton(
R.string.cancelButton,
(dialog, which) -> dialog.dismiss())
.setPositiveButton(
R.string.menuDeleteText,
(dialog, which) -> {
appCtx.getSharedPreferences(
MemorizingTrustManager
.KEYSTORE_NAME,
Context.MODE_PRIVATE)
.edit()
.remove(MemorizingTrustManager.KEYSTORE_KEY)
.apply();
AppUtil.logout(this);
});
@ -212,5 +273,4 @@ public class SettingsSecurityActivity extends BaseActivity {
onClickListener = view -> finish();
}
}

View File

@ -6,18 +6,17 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.LinkedHashMap;
import java.util.Locale;
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;
import java.util.Locale;
/**
* @author M M Arif
*/
public class SettingsTranslationActivity extends BaseActivity {
private static int langSelectedChoice = 0;
@ -26,7 +25,9 @@ public class SettingsTranslationActivity extends BaseActivity {
private static String getLanguageDisplayName(String langCode) {
Locale english = new Locale("en");
Locale translated = new Locale(langCode);
return String.format("%s (%s)", translated.getDisplayName(translated), translated.getDisplayName(english));
return String.format(
"%s (%s)",
translated.getDisplayName(translated), translated.getDisplayName(english));
}
@Override
@ -36,11 +37,12 @@ public class SettingsTranslationActivity extends BaseActivity {
LinkedHashMap<String, String> langs = new LinkedHashMap<>();
langs.put("", getString(R.string.settingsLanguageSystem));
for(String langCode : getResources().getStringArray(R.array.languages)) {
for (String langCode : getResources().getStringArray(R.array.languages)) {
langs.put(langCode, getLanguageDisplayName(langCode));
}
ActivitySettingsTranslationBinding activitySettingsTranslationBinding = ActivitySettingsTranslationBinding.inflate(getLayoutInflater());
ActivitySettingsTranslationBinding activitySettingsTranslationBinding =
ActivitySettingsTranslationBinding.inflate(getLayoutInflater());
setContentView(activitySettingsTranslationBinding.getRoot());
ImageView closeActivity = activitySettingsTranslationBinding.close;
@ -48,32 +50,45 @@ public class SettingsTranslationActivity extends BaseActivity {
initCloseListener();
closeActivity.setOnClickListener(onClickListener);
final TextView tvLanguageSelected = activitySettingsTranslationBinding.tvLanguageSelected; // setter for en, fr
final TextView tvLanguageSelected =
activitySettingsTranslationBinding.tvLanguageSelected; // setter for en, fr
TextView helpTranslate = activitySettingsTranslationBinding.helpTranslate;
LinearLayout langFrame = activitySettingsTranslationBinding.langFrame;
helpTranslate.setOnClickListener(v12 -> {
helpTranslate.setOnClickListener(
v12 -> {
AppUtil.openUrlInBrowser(this, getResources().getString(R.string.crowdInLink));
});
langSelectedChoice = tinyDB.getInt("langId");
tvLanguageSelected.setText(langs.get(langs.keySet().toArray(new String[0])[langSelectedChoice]));
tvLanguageSelected.setText(
langs.get(langs.keySet().toArray(new String[0])[langSelectedChoice]));
// language dialog
langFrame.setOnClickListener(view -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(R.string.settingsLanguageSelectorDialogTitle).setCancelable(langSelectedChoice != -1)
.setNeutralButton(getString(R.string.cancelButton), null).setSingleChoiceItems(langs.values().toArray(new String[0]), langSelectedChoice, (dialogInterface, i) -> {
String selectedLanguage = langs.keySet().toArray(new String[0])[i];
langFrame.setOnClickListener(
view -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(R.string.settingsLanguageSelectorDialogTitle)
.setCancelable(langSelectedChoice != -1)
.setNeutralButton(getString(R.string.cancelButton), null)
.setSingleChoiceItems(
langs.values().toArray(new String[0]),
langSelectedChoice,
(dialogInterface, i) -> {
String selectedLanguage =
langs.keySet().toArray(new String[0])[i];
tinyDB.putInt("langId", i);
tinyDB.putString("locale", selectedLanguage);
SettingsFragment.refreshParent = true;
this.overridePendingTransition(0, 0);
dialogInterface.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
Toasty.success(
appCtx,
getResources()
.getString(R.string.settingsSave));
this.recreate();
});
@ -85,5 +100,4 @@ public class SettingsTranslationActivity extends BaseActivity {
onClickListener = view -> finish();
}
}

View File

@ -10,6 +10,7 @@ import android.view.View;
import androidx.annotation.NonNull;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.vdurmont.emoji.EmojiParser;
import java.util.Objects;
import org.gitnex.tea4j.v2.models.CreateWikiPageOptions;
import org.gitnex.tea4j.v2.models.WikiPage;
import org.mian.gitnex.R;
@ -23,7 +24,6 @@ import org.mian.gitnex.helpers.Markdown;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import org.mian.gitnex.structs.BottomSheetListener;
import java.util.Objects;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -31,7 +31,6 @@ import retrofit2.Response;
/**
* @author M M Arif
*/
public class WikiActivity extends BaseActivity implements BottomSheetListener {
private ActivityWikiBinding binding;
@ -51,10 +50,9 @@ public class WikiActivity extends BaseActivity implements BottomSheetListener {
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbar);
if(getIntent().getStringExtra("action") != null) {
if (getIntent().getStringExtra("action") != null) {
action = getIntent().getStringExtra("action");
}
else {
} else {
action = "";
}
pageName = getIntent().getStringExtra("pageName");
@ -63,18 +61,16 @@ public class WikiActivity extends BaseActivity implements BottomSheetListener {
binding.toolbarTitle.setMovementMethod(new ScrollingMovementMethod());
binding.toolbarTitle.setText(pageName);
if(action.equalsIgnoreCase("edit")) {
if (action.equalsIgnoreCase("edit")) {
getWikiPageContents();
binding.renderWiki.setVisibility(View.GONE);
binding.wikiTitle.setText(pageName);
}
else if(action.equalsIgnoreCase("add")) {
} else if (action.equalsIgnoreCase("add")) {
binding.renderWiki.setVisibility(View.GONE);
binding.progressBar.setVisibility(View.GONE);
binding.toolbarTitle.setText(R.string.createWikiPage);
binding.createWiki.setVisibility(View.VISIBLE);
}
else {
} else {
getWikiPageContents();
binding.renderWiki.setVisibility(View.VISIBLE);
binding.createWiki.setVisibility(View.GONE);
@ -83,18 +79,21 @@ public class WikiActivity extends BaseActivity implements BottomSheetListener {
private void processWiki() {
String wikiTitle = binding.wikiTitle.getText() != null ? binding.wikiTitle.getText().toString() : "";
String wikiContent = binding.wikiContent.getText() != null ? binding.wikiContent.getText().toString() : "";
String wikiTitle =
binding.wikiTitle.getText() != null ? binding.wikiTitle.getText().toString() : "";
String wikiContent =
binding.wikiContent.getText() != null
? binding.wikiContent.getText().toString()
: "";
if(wikiTitle.isEmpty() || wikiContent.isEmpty()) {
if (wikiTitle.isEmpty() || wikiContent.isEmpty()) {
Toasty.error(ctx, getString(R.string.wikiPageNameAndContentError));
return;
}
if(action.equalsIgnoreCase("edit")) {
if (action.equalsIgnoreCase("edit")) {
patchWiki(wikiTitle, wikiContent);
}
else if(action.equalsIgnoreCase("add")) {
} else if (action.equalsIgnoreCase("add")) {
addWiki(wikiTitle, wikiContent);
}
}
@ -105,35 +104,57 @@ public class WikiActivity extends BaseActivity implements BottomSheetListener {
createWikiPageOptions.setTitle(wikiTitle);
createWikiPageOptions.setContentBase64(AppUtil.encodeBase64(wikiContent));
Call<WikiPage> call = RetrofitClient.getApiInterface(ctx).repoCreateWikiPage(repository.getOwner(), repository.getName(), createWikiPageOptions);
Call<WikiPage> call =
RetrofitClient.getApiInterface(ctx)
.repoCreateWikiPage(
repository.getOwner(), repository.getName(), createWikiPageOptions);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<WikiPage> call, @NonNull retrofit2.Response<WikiPage> response) {
public void onResponse(
@NonNull Call<WikiPage> call,
@NonNull retrofit2.Response<WikiPage> response) {
if(response.isSuccessful()) {
if(response.code() == 201) {
if (response.isSuccessful()) {
if (response.code() == 201) {
Toasty.success(ctx, getString(R.string.wikiCreated));
WikiFragment.resumeWiki = true;
finish();
}
else {
switch(response.code()) {
} else {
switch (response.code()) {
case 401:
runOnUiThread(() -> AlertDialogs.authorizationTokenRevokedDialog(ctx));
runOnUiThread(
() ->
AlertDialogs
.authorizationTokenRevokedDialog(
ctx));
break;
case 403:
runOnUiThread(() -> Toasty.error(ctx, ctx.getString(R.string.authorizeError)));
runOnUiThread(
() ->
Toasty.error(
ctx,
ctx.getString(
R.string.authorizeError)));
break;
case 404:
runOnUiThread(() -> Toasty.warning(ctx, ctx.getString(R.string.apiNotFound)));
runOnUiThread(
() ->
Toasty.warning(
ctx,
ctx.getString(
R.string.apiNotFound)));
break;
default:
runOnUiThread(() -> Toasty.error(ctx, getString(R.string.genericError)));
runOnUiThread(
() ->
Toasty.error(
ctx,
getString(R.string.genericError)));
}
}
}
@ -153,35 +174,60 @@ public class WikiActivity extends BaseActivity implements BottomSheetListener {
createWikiPageOptions.setTitle(wikiTitle);
createWikiPageOptions.setContentBase64(AppUtil.encodeBase64(wikiContent));
Call<WikiPage> call = RetrofitClient.getApiInterface(ctx).repoEditWikiPage(repository.getOwner(), repository.getName(), pageName, createWikiPageOptions);
Call<WikiPage> call =
RetrofitClient.getApiInterface(ctx)
.repoEditWikiPage(
repository.getOwner(),
repository.getName(),
pageName,
createWikiPageOptions);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<WikiPage> call, @NonNull retrofit2.Response<WikiPage> response) {
public void onResponse(
@NonNull Call<WikiPage> call,
@NonNull retrofit2.Response<WikiPage> response) {
if(response.isSuccessful()) {
if(response.code() == 200) {
if (response.isSuccessful()) {
if (response.code() == 200) {
Toasty.success(ctx, getString(R.string.wikiUpdated));
WikiFragment.resumeWiki = true;
finish();
}
else {
switch(response.code()) {
} else {
switch (response.code()) {
case 401:
runOnUiThread(() -> AlertDialogs.authorizationTokenRevokedDialog(ctx));
runOnUiThread(
() ->
AlertDialogs
.authorizationTokenRevokedDialog(
ctx));
break;
case 403:
runOnUiThread(() -> Toasty.error(ctx, ctx.getString(R.string.authorizeError)));
runOnUiThread(
() ->
Toasty.error(
ctx,
ctx.getString(
R.string.authorizeError)));
break;
case 404:
runOnUiThread(() -> Toasty.warning(ctx, ctx.getString(R.string.apiNotFound)));
runOnUiThread(
() ->
Toasty.warning(
ctx,
ctx.getString(
R.string.apiNotFound)));
break;
default:
runOnUiThread(() -> Toasty.error(ctx, getString(R.string.genericError)));
runOnUiThread(
() ->
Toasty.error(
ctx,
getString(R.string.genericError)));
}
}
}
@ -197,55 +243,81 @@ public class WikiActivity extends BaseActivity implements BottomSheetListener {
private void getWikiPageContents() {
Call<WikiPage> call = RetrofitClient.getApiInterface(ctx).repoGetWikiPage(repository.getOwner(), repository.getName(), pageName);
Call<WikiPage> call =
RetrofitClient.getApiInterface(ctx)
.repoGetWikiPage(repository.getOwner(), repository.getName(), pageName);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<WikiPage> call, @NonNull retrofit2.Response<WikiPage> response) {
public void onResponse(
@NonNull Call<WikiPage> call,
@NonNull retrofit2.Response<WikiPage> response) {
if(response.isSuccessful()) {
if(response.code() == 200) {
if (response.isSuccessful()) {
if (response.code() == 200) {
WikiPage wikiPage = response.body();
runOnUiThread(() -> {
runOnUiThread(
() -> {
assert wikiPage != null;
String pageContents = AppUtil.decodeBase64(wikiPage.getContentBase64());
String pageContents =
AppUtil.decodeBase64(
wikiPage.getContentBase64());
binding.contents.setContent(pageContents, "md");
if(renderMd) {
Markdown.render(ctx, EmojiParser.parseToUnicode(pageContents), binding.markdown, repository);
if (renderMd) {
Markdown.render(
ctx,
EmojiParser.parseToUnicode(pageContents),
binding.markdown,
repository);
binding.markdownFrame.setVisibility(View.VISIBLE);
binding.contents.setVisibility(View.GONE);
}
else {
} else {
binding.markdownFrame.setVisibility(View.GONE);
binding.contents.setVisibility(View.VISIBLE);
}
if(action.equalsIgnoreCase("edit")) {
if (action.equalsIgnoreCase("edit")) {
binding.wikiContent.setText(pageContents);
}
});
}
else {
switch(response.code()) {
} else {
switch (response.code()) {
case 401:
runOnUiThread(() -> AlertDialogs.authorizationTokenRevokedDialog(ctx));
runOnUiThread(
() ->
AlertDialogs
.authorizationTokenRevokedDialog(
ctx));
break;
case 403:
runOnUiThread(() -> Toasty.error(ctx, ctx.getString(R.string.authorizeError)));
runOnUiThread(
() ->
Toasty.error(
ctx,
ctx.getString(
R.string.authorizeError)));
break;
case 404:
runOnUiThread(() -> Toasty.warning(ctx, ctx.getString(R.string.apiNotFound)));
runOnUiThread(
() ->
Toasty.warning(
ctx,
ctx.getString(
R.string.apiNotFound)));
break;
default:
runOnUiThread(() -> Toasty.error(ctx, getString(R.string.genericError)));
runOnUiThread(
() ->
Toasty.error(
ctx,
getString(R.string.genericError)));
}
}
@ -263,30 +335,59 @@ public class WikiActivity extends BaseActivity implements BottomSheetListener {
private void deleteWiki(final String owner, final String repo, final String pageName) {
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(String.format(ctx.getString(R.string.deleteGenericTitle), pageName))
.setMessage(ctx.getString(R.string.deleteWikiPageMessage, pageName)).setNeutralButton(R.string.cancelButton, null)
.setPositiveButton(R.string.menuDeleteText, (dialog, whichButton) -> RetrofitClient.getApiInterface(ctx).repoDeleteWikiPage(owner, repo, pageName).enqueue(new Callback<>() {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(
String.format(ctx.getString(R.string.deleteGenericTitle), pageName))
.setMessage(ctx.getString(R.string.deleteWikiPageMessage, pageName))
.setNeutralButton(R.string.cancelButton, null)
.setPositiveButton(
R.string.menuDeleteText,
(dialog, whichButton) ->
RetrofitClient.getApiInterface(ctx)
.repoDeleteWikiPage(owner, repo, pageName)
.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call,
@NonNull Response<Void>
response) {
if(response.isSuccessful()) {
Toasty.success(ctx, getString(R.string.wikiPageDeleted));
if (response.isSuccessful()) {
Toasty.success(
ctx,
getString(
R.string
.wikiPageDeleted));
WikiFragment.resumeWiki = true;
finish();
}
else if(response.code() == 403) {
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
}
else {
Toasty.error(ctx, ctx.getString(R.string.genericError));
} else if (response.code() == 403) {
Toasty.error(
ctx,
ctx.getString(
R.string
.authorizeError));
} else {
Toasty.error(
ctx,
ctx.getString(
R.string
.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<Void> call,
@NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.genericError));
Toasty.error(
ctx,
ctx.getString(
R.string
.genericError));
}
}));
@ -298,11 +399,10 @@ public class WikiActivity extends BaseActivity implements BottomSheetListener {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.markdown_switcher, menu);
if(action.equalsIgnoreCase("edit") || action.equalsIgnoreCase("add")) {
if (action.equalsIgnoreCase("edit") || action.equalsIgnoreCase("add")) {
inflater.inflate(R.menu.save, menu);
}
else {
if(repository.getPermissions().isPush()) {
} else {
if (repository.getPermissions().isPush()) {
inflater.inflate(R.menu.generic_nav_dotted_menu, menu);
}
}
@ -312,8 +412,7 @@ public class WikiActivity extends BaseActivity implements BottomSheetListener {
@Override
public void onButtonClicked(String text) {
switch(text) {
switch (text) {
case "editWiki":
Intent intent = new Intent(ctx, WikiActivity.class);
intent.putExtra("pageName", pageName);
@ -333,52 +432,58 @@ public class WikiActivity extends BaseActivity implements BottomSheetListener {
int id = item.getItemId();
if(id == android.R.id.home) {
if (id == android.R.id.home) {
finish();
return true;
}
else if(id == R.id.genericMenu) {
} else if (id == R.id.genericMenu) {
BottomSheetWikiFragment bottomSheet = new BottomSheetWikiFragment();
bottomSheet.show(getSupportFragmentManager(), "wikiBottomSheet");
return true;
}
else if(id == R.id.save) {
} else if (id == R.id.save) {
processWiki();
return true;
}
else if(id == R.id.markdown) {
} else if (id == R.id.markdown) {
if(action.equalsIgnoreCase("edit") || action.equalsIgnoreCase("add")) {
if(renderMd) {
Markdown.render(ctx, EmojiParser.parseToUnicode(String.valueOf(Objects.requireNonNull(binding.contentLayout.getEditText()).getText())), binding.markdownPreview, repository);
if (action.equalsIgnoreCase("edit") || action.equalsIgnoreCase("add")) {
if (renderMd) {
Markdown.render(
ctx,
EmojiParser.parseToUnicode(
String.valueOf(
Objects.requireNonNull(
binding.contentLayout.getEditText())
.getText())),
binding.markdownPreview,
repository);
binding.markdownPreview.setVisibility(View.VISIBLE);
binding.contentLayout.setVisibility(View.GONE);
renderMd = false;
}
else {
} else {
binding.markdownPreview.setVisibility(View.GONE);
binding.contentLayout.setVisibility(View.VISIBLE);
renderMd = true;
}
}
else {
} else {
if(!renderMd) {
if (!renderMd) {
if(binding.markdown.getAdapter() == null) {
Markdown.render(ctx, EmojiParser.parseToUnicode(binding.contents.getContent()), binding.markdown, repository);
if (binding.markdown.getAdapter() == null) {
Markdown.render(
ctx,
EmojiParser.parseToUnicode(binding.contents.getContent()),
binding.markdown,
repository);
}
binding.contents.setVisibility(View.GONE);
binding.markdownFrame.setVisibility(View.VISIBLE);
renderMd = true;
}
else {
} else {
binding.markdownFrame.setVisibility(View.GONE);
binding.contents.setVisibility(View.VISIBLE);
@ -387,10 +492,8 @@ public class WikiActivity extends BaseActivity implements BottomSheetListener {
}
return true;
}
else {
} else {
return super.onOptionsItemSelected(item);
}
}
}

View File

@ -10,6 +10,8 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.List;
import java.util.Locale;
import org.apache.commons.lang3.StringUtils;
import org.gitnex.tea4j.v2.models.Cron;
import org.mian.gitnex.R;
@ -18,16 +20,14 @@ import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty;
import java.util.List;
import java.util.Locale;
import retrofit2.Call;
import retrofit2.Callback;
/**
* @author M M Arif
*/
public class AdminCronTasksAdapter extends RecyclerView.Adapter<AdminCronTasksAdapter.CronTasksViewHolder> {
public class AdminCronTasksAdapter
extends RecyclerView.Adapter<AdminCronTasksAdapter.CronTasksViewHolder> {
private final List<Cron> tasksList;
@ -50,19 +50,25 @@ public class AdminCronTasksAdapter extends RecyclerView.Adapter<AdminCronTasksAd
LinearLayout cronTasksInfo = itemView.findViewById(R.id.cronTasksInfo);
LinearLayout cronTasksRun = itemView.findViewById(R.id.cronTasksRun);
cronTasksInfo.setOnClickListener(taskInfo -> {
cronTasksInfo.setOnClickListener(
taskInfo -> {
String nextRun = "";
String lastRun = "";
if(cronTasks.getNext() != null) {
nextRun = TimeHelper.formatTime(cronTasks.getNext(), locale, timeFormat, ctx);
if (cronTasks.getNext() != null) {
nextRun =
TimeHelper.formatTime(
cronTasks.getNext(), locale, timeFormat, ctx);
}
if(cronTasks.getPrev() != null) {
lastRun = TimeHelper.formatTime(cronTasks.getPrev(), locale, timeFormat, ctx);
if (cronTasks.getPrev() != null) {
lastRun =
TimeHelper.formatTime(
cronTasks.getPrev(), locale, timeFormat, ctx);
}
View view = LayoutInflater.from(ctx).inflate(R.layout.layout_cron_task_info, null);
View view =
LayoutInflater.from(ctx)
.inflate(R.layout.layout_cron_task_info, null);
TextView taskScheduleContent = view.findViewById(R.id.taskScheduleContent);
TextView nextRunContent = view.findViewById(R.id.nextRunContent);
@ -74,34 +80,41 @@ public class AdminCronTasksAdapter extends RecyclerView.Adapter<AdminCronTasksAd
lastRunContent.setText(lastRun);
execTimeContent.setText(String.valueOf(cronTasks.getExecTimes()));
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(StringUtils.capitalize(cronTasks.getName().replace("_", " "))).setView(view)
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(
StringUtils.capitalize(
cronTasks.getName().replace("_", " ")))
.setView(view)
.setNeutralButton(ctx.getString(R.string.close), null);
materialAlertDialogBuilder.create().show();
});
cronTasksRun.setOnClickListener(taskInfo -> {
cronTasksRun.setOnClickListener(
taskInfo -> {
runCronTask(ctx, cronTasks.getName());
});
}
}
public AdminCronTasksAdapter(List<Cron> tasksListMain) {
this.tasksList = tasksListMain;
}
@NonNull
@Override
public AdminCronTasksAdapter.CronTasksViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@NonNull @Override
public AdminCronTasksAdapter.CronTasksViewHolder onCreateViewHolder(
@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_admin_cron_tasks, parent, false);
View v =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_admin_cron_tasks, parent, false);
return new AdminCronTasksAdapter.CronTasksViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull AdminCronTasksAdapter.CronTasksViewHolder holder, int position) {
public void onBindViewHolder(
@NonNull AdminCronTasksAdapter.CronTasksViewHolder holder, int position) {
Cron currentItem = tasksList.get(position);
@ -113,15 +126,18 @@ public class AdminCronTasksAdapter extends RecyclerView.Adapter<AdminCronTasksAd
Call<Void> call = RetrofitClient.getApiInterface(ctx).adminCronRun(taskName);
call.enqueue(new Callback<Void>() {
call.enqueue(
new Callback<Void>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
switch(response.code()) {
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
switch (response.code()) {
case 204:
Toasty.success(ctx, ctx.getString(R.string.adminCronTaskSuccessMsg, taskName));
Toasty.success(
ctx,
ctx.getString(R.string.adminCronTaskSuccessMsg, taskName));
break;
case 401:
@ -138,7 +154,6 @@ public class AdminCronTasksAdapter extends RecyclerView.Adapter<AdminCronTasksAd
default:
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
@ -154,5 +169,4 @@ public class AdminCronTasksAdapter extends RecyclerView.Adapter<AdminCronTasksAd
public int getItemCount() {
return tasksList.size();
}
}

View File

@ -15,39 +15,41 @@ import androidx.annotation.NonNull;
import androidx.core.content.res.ResourcesCompat;
import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable;
import java.util.ArrayList;
import java.util.List;
import org.gitnex.tea4j.v2.models.User;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation;
import java.util.ArrayList;
import java.util.List;
/**
* @author M M Arif
*/
public class AdminGetUsersAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements Filterable {
public class AdminGetUsersAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
implements Filterable {
private final List<User> usersListFull;
private final Context context;
private List<User> usersList;
private OnLoadMoreListener loadMoreListener;
private boolean isLoading = false, isMoreDataAvailable = true;
private final Filter usersFilter = new Filter() {
private final Filter usersFilter =
new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<User> filteredList = new ArrayList<>();
if(constraint == null || constraint.length() == 0) {
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(usersListFull);
}
else {
} else {
String filterPattern = constraint.toString().toLowerCase().trim();
for(User item : usersListFull) {
if(item.getEmail().toLowerCase().contains(filterPattern) || item.getFullName().toLowerCase().contains(filterPattern) || item.getLogin().toLowerCase().contains(filterPattern)) {
for (User item : usersListFull) {
if (item.getEmail().toLowerCase().contains(filterPattern)
|| item.getFullName().toLowerCase().contains(filterPattern)
|| item.getLogin().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}
@ -74,16 +76,19 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter<RecyclerView.View
usersListFull = new ArrayList<>(usersList);
}
@NonNull
@Override
@NonNull @Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
return new AdminGetUsersAdapter.ReposHolder(inflater.inflate(R.layout.list_admin_users, parent, false));
return new AdminGetUsersAdapter.ReposHolder(
inflater.inflate(R.layout.list_admin_users, parent, false));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
if (position >= getItemCount() - 1
&& isMoreDataAvailable
&& !isLoading
&& loadMoreListener != null) {
isLoading = true;
loadMoreListener.onLoadMore();
}
@ -103,7 +108,7 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter<RecyclerView.View
public void setMoreDataAvailable(boolean moreDataAvailable) {
isMoreDataAvailable = moreDataAvailable;
if(!isMoreDataAvailable) {
if (!isMoreDataAvailable) {
loadMoreListener.onLoadFinished();
}
}
@ -134,7 +139,6 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter<RecyclerView.View
void onLoadMore();
void onLoadFinished();
}
class ReposHolder extends RecyclerView.ViewHolder {
@ -155,14 +159,19 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter<RecyclerView.View
userEmail = itemView.findViewById(R.id.userEmail);
userRole = itemView.findViewById(R.id.userRole);
itemView.setOnClickListener(loginId -> {
itemView.setOnClickListener(
loginId -> {
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", userLoginId);
context.startActivity(intent);
});
userAvatar.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
userAvatar.setOnLongClickListener(
loginId -> {
AppUtil.copyToClipboard(
context,
userLoginId,
context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
return true;
});
}
@ -173,39 +182,60 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter<RecyclerView.View
userLoginId = users.getLogin();
if(!users.getFullName().equals("")) {
if (!users.getFullName().equals("")) {
userFullName.setText(Html.fromHtml(users.getFullName()));
userName.setText(context.getResources().getString(R.string.usernameWithAt, users.getLogin()));
}
else {
userName.setText(
context.getResources()
.getString(R.string.usernameWithAt, users.getLogin()));
} else {
userFullName.setText(context.getResources().getString(R.string.usernameWithAt, users.getLogin()));
userFullName.setText(
context.getResources()
.getString(R.string.usernameWithAt, users.getLogin()));
userName.setVisibility(View.GONE);
}
if(!users.getEmail().equals("")) {
if (!users.getEmail().equals("")) {
userEmail.setText(users.getEmail());
}
else {
} else {
userEmail.setVisibility(View.GONE);
}
if(users.isIsAdmin()) {
if (users.isIsAdmin()) {
userRole.setVisibility(View.VISIBLE);
TextDrawable drawable = TextDrawable.builder().beginConfig().textColor(ResourcesCompat.getColor(context.getResources(), R.color.colorWhite, null)).fontSize(60).width(200).height(80).endConfig()
.buildRoundRect(context.getResources().getString(R.string.userRoleAdmin).toLowerCase(), ResourcesCompat.getColor(context.getResources(), R.color.releasePre, null), 8);
TextDrawable drawable =
TextDrawable.builder()
.beginConfig()
.textColor(
ResourcesCompat.getColor(
context.getResources(), R.color.colorWhite, null))
.fontSize(60)
.width(200)
.height(80)
.endConfig()
.buildRoundRect(
context.getResources()
.getString(R.string.userRoleAdmin)
.toLowerCase(),
ResourcesCompat.getColor(
context.getResources(), R.color.releasePre, null),
8);
userRole.setImageDrawable(drawable);
}
else {
} else {
userRole.setVisibility(View.GONE);
}
PicassoService.getInstance(context).get().load(users.getAvatarUrl()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop().into(userAvatar);
PicassoService.getInstance(context)
.get()
.load(users.getAvatarUrl())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(120, 120)
.centerCrop()
.into(userAvatar);
}
}
}

View File

@ -9,12 +9,12 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.List;
import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityAdminCronTasksBinding;
import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.Toasty;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
@ -22,8 +22,8 @@ import retrofit2.Callback;
* @author M M Arif
* @author qwerty287
*/
public class AdminUnadoptedReposAdapter extends RecyclerView.Adapter<AdminUnadoptedReposAdapter.UnadoptedViewHolder> {
public class AdminUnadoptedReposAdapter
extends RecyclerView.Adapter<AdminUnadoptedReposAdapter.UnadoptedViewHolder> {
private final Runnable updateList;
private final Runnable loadMoreListener;
@ -31,24 +31,29 @@ public class AdminUnadoptedReposAdapter extends RecyclerView.Adapter<AdminUnadop
private List<String> repos;
private boolean isLoading = false, hasMore = true;
public AdminUnadoptedReposAdapter(List<String> list, Runnable updateList, Runnable loadMore, ActivityAdminCronTasksBinding activityAdminCronTasksBinding) {
public AdminUnadoptedReposAdapter(
List<String> list,
Runnable updateList,
Runnable loadMore,
ActivityAdminCronTasksBinding activityAdminCronTasksBinding) {
this.repos = list;
this.updateList = updateList;
this.loadMoreListener = loadMore;
this.activityAdminCronTasksBinding = activityAdminCronTasksBinding;
}
@NonNull
@Override
@NonNull @Override
public UnadoptedViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_admin_unadopted_repos, parent, false);
View v =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_admin_unadopted_repos, parent, false);
return new UnadoptedViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull UnadoptedViewHolder holder, int position) {
if(position >= getItemCount() - 1 && hasMore && !isLoading && loadMoreListener != null) {
if (position >= getItemCount() - 1 && hasMore && !isLoading && loadMoreListener != null) {
isLoading = true;
loadMoreListener.run();
}
@ -69,15 +74,18 @@ public class AdminUnadoptedReposAdapter extends RecyclerView.Adapter<AdminUnadop
String[] repoSplit = name.split("/");
Call<Void> call = RetrofitClient.getApiInterface(ctx).adminDeleteUnadoptedRepository(repoSplit[0], repoSplit[1]);
Call<Void> call =
RetrofitClient.getApiInterface(ctx)
.adminDeleteUnadoptedRepository(repoSplit[0], repoSplit[1]);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
switch(response.code()) {
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
switch (response.code()) {
case 204:
updateList.run();
Toasty.success(ctx, ctx.getString(R.string.repoDeletionSuccess));
@ -97,7 +105,6 @@ public class AdminUnadoptedReposAdapter extends RecyclerView.Adapter<AdminUnadop
default:
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
@ -113,19 +120,23 @@ public class AdminUnadoptedReposAdapter extends RecyclerView.Adapter<AdminUnadop
String[] repoSplit = name.split("/");
Call<Void> call = RetrofitClient.getApiInterface(ctx).adminAdoptRepository(repoSplit[0], repoSplit[1]);
Call<Void> call =
RetrofitClient.getApiInterface(ctx)
.adminAdoptRepository(repoSplit[0], repoSplit[1]);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
switch(response.code()) {
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
switch (response.code()) {
case 204:
updateAdapter(position);
if(getItemCount() == 0) {
activityAdminCronTasksBinding.noData.setVisibility(View.VISIBLE);
if (getItemCount() == 0) {
activityAdminCronTasksBinding.noData.setVisibility(
View.VISIBLE);
}
Toasty.success(ctx, ctx.getString(R.string.repoAdopted, name));
break;
@ -144,7 +155,6 @@ public class AdminUnadoptedReposAdapter extends RecyclerView.Adapter<AdminUnadop
default:
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
@ -184,17 +194,32 @@ public class AdminUnadoptedReposAdapter extends RecyclerView.Adapter<AdminUnadop
name = itemView.findViewById(R.id.repo_name);
itemView.setOnClickListener(taskInfo -> {
itemView.setOnClickListener(
taskInfo -> {
String[] repoSplit = repoName.split("/");
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(repoName).setMessage(ctx.getString(R.string.unadoptedReposMessage, repoSplit[1], repoSplit[0]))
.setNeutralButton(R.string.close, null).setPositiveButton(R.string.menuDeleteText, ((dialog, which) -> delete(ctx, repoName)))
.setNegativeButton(R.string.adoptRepo, ((dialog, which) -> adopt(ctx, repoName, getBindingAdapterPosition())));
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(repoName)
.setMessage(
ctx.getString(
R.string.unadoptedReposMessage,
repoSplit[1],
repoSplit[0]))
.setNeutralButton(R.string.close, null)
.setPositiveButton(
R.string.menuDeleteText,
((dialog, which) -> delete(ctx, repoName)))
.setNegativeButton(
R.string.adoptRepo,
((dialog, which) ->
adopt(
ctx,
repoName,
getBindingAdapterPosition())));
materialAlertDialogBuilder.create().show();
});
}
}
}

View File

@ -11,20 +11,20 @@ import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import org.gitnex.tea4j.v2.models.User;
import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
/**
* @author M M Arif
*/
public class AssigneesListAdapter extends RecyclerView.Adapter<AssigneesListAdapter.AssigneesViewHolder> {
public class AssigneesListAdapter
extends RecyclerView.Adapter<AssigneesListAdapter.AssigneesViewHolder> {
private final Context context;
private final List<User> assigneesList;
@ -32,7 +32,11 @@ public class AssigneesListAdapter extends RecyclerView.Adapter<AssigneesListAdap
private List<String> assigneesStrings = new ArrayList<>();
private List<String> currentAssignees;
public AssigneesListAdapter(Context ctx, List<User> dataMain, AssigneesListAdapterListener assigneesListener, List<String> currentAssignees) {
public AssigneesListAdapter(
Context ctx,
List<User> dataMain,
AssigneesListAdapterListener assigneesListener,
List<String> currentAssignees) {
this.context = ctx;
this.assigneesList = dataMain;
@ -40,34 +44,42 @@ public class AssigneesListAdapter extends RecyclerView.Adapter<AssigneesListAdap
this.currentAssignees = currentAssignees;
}
@NonNull
@Override
public AssigneesListAdapter.AssigneesViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@NonNull @Override
public AssigneesListAdapter.AssigneesViewHolder onCreateViewHolder(
@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_assignees_list, parent, false);
View v =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.custom_assignees_list, parent, false);
return new AssigneesListAdapter.AssigneesViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull AssigneesListAdapter.AssigneesViewHolder holder, int position) {
public void onBindViewHolder(
@NonNull AssigneesListAdapter.AssigneesViewHolder holder, int position) {
User currentItem = assigneesList.get(position);
int imgRadius = AppUtil.getPixelsFromDensity(context, 90);
if(currentItem.getFullName().equals("")) {
if (currentItem.getFullName().equals("")) {
holder.assigneesName.setText(currentItem.getLogin());
}
else {
} else {
holder.assigneesName.setText(Html.fromHtml(currentItem.getFullName()));
}
PicassoService.getInstance(context).get().load(currentItem.getAvatarUrl()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(180, 180).centerCrop()
PicassoService.getInstance(context)
.get()
.load(currentItem.getAvatarUrl())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(180, 180)
.centerCrop()
.into(holder.assigneesAvatar);
for(int i = 0; i < assigneesList.size(); i++) {
for (int i = 0; i < assigneesList.size(); i++) {
if(assigneesStrings.contains(currentItem.getLogin())) {
if (assigneesStrings.contains(currentItem.getLogin())) {
holder.assigneesSelection.setChecked(true);
}
@ -75,9 +87,9 @@ public class AssigneesListAdapter extends RecyclerView.Adapter<AssigneesListAdap
currentAssignees = new ArrayList<>(new LinkedHashSet<>(currentAssignees));
for(int i = 0; i < currentAssignees.size(); i++) {
for (int i = 0; i < currentAssignees.size(); i++) {
if(currentAssignees.contains(currentItem.getLogin())) {
if (currentAssignees.contains(currentItem.getLogin())) {
holder.assigneesSelection.setChecked(true);
assigneesStrings.add(currentAssignees.get(i));
@ -86,13 +98,12 @@ public class AssigneesListAdapter extends RecyclerView.Adapter<AssigneesListAdap
assigneesListener.assigneesInterface(assigneesStrings);
holder.assigneesSelection.setOnCheckedChangeListener((buttonView, isChecked) -> {
if(isChecked) {
holder.assigneesSelection.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
if (isChecked) {
assigneesStrings.add(currentItem.getLogin());
}
else {
} else {
assigneesStrings.remove(currentItem.getLogin());
}
@ -119,7 +130,6 @@ public class AssigneesListAdapter extends RecyclerView.Adapter<AssigneesListAdap
public interface AssigneesListAdapterListener {
void assigneesInterface(List<String> data);
}
static class AssigneesViewHolder extends RecyclerView.ViewHolder {
@ -137,7 +147,5 @@ public class AssigneesListAdapter extends RecyclerView.Adapter<AssigneesListAdap
assigneesName = itemView.findViewById(R.id.assigneesName);
assigneesAvatar = itemView.findViewById(R.id.assigneesAvatar);
}
}
}

View File

@ -15,6 +15,7 @@ import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.List;
import org.gitnex.tea4j.v2.models.User;
import org.mian.gitnex.R;
import org.mian.gitnex.actions.CollaboratorActions;
@ -26,7 +27,6 @@ import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -34,23 +34,26 @@ import retrofit2.Response;
/**
* @author M M Arif
*/
public class CollaboratorSearchAdapter extends RecyclerView.Adapter<CollaboratorSearchAdapter.CollaboratorSearchViewHolder> {
public class CollaboratorSearchAdapter
extends RecyclerView.Adapter<CollaboratorSearchAdapter.CollaboratorSearchViewHolder> {
private final List<User> usersSearchList;
private final Context context;
private final RepositoryContext repository;
public CollaboratorSearchAdapter(List<User> dataList, Context ctx, RepositoryContext repository) {
public CollaboratorSearchAdapter(
List<User> dataList, Context ctx, RepositoryContext repository) {
this.context = ctx;
this.usersSearchList = dataList;
this.repository = repository;
}
@NonNull
@Override
public CollaboratorSearchViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_collaborators_search, parent, false);
@NonNull @Override
public CollaboratorSearchViewHolder onCreateViewHolder(
@NonNull ViewGroup parent, int viewType) {
View v =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_collaborators_search, parent, false);
return new CollaboratorSearchAdapter.CollaboratorSearchViewHolder(v);
}
@ -61,50 +64,64 @@ public class CollaboratorSearchAdapter extends RecyclerView.Adapter<Collaborator
int imgRadius = AppUtil.getPixelsFromDensity(context, 60);
holder.userInfo = currentItem;
if(!currentItem.getFullName().equals("")) {
if (!currentItem.getFullName().equals("")) {
holder.userFullName.setText(Html.fromHtml(currentItem.getFullName()));
}
else {
} else {
holder.userFullName.setText(context.getResources().getString(R.string.usernameWithAt, currentItem.getLogin()));
holder.userFullName.setText(
context.getResources()
.getString(R.string.usernameWithAt, currentItem.getLogin()));
}
holder.userName.setText(context.getResources().getString(R.string.usernameWithAt, currentItem.getLogin()));
holder.userName.setText(
context.getResources().getString(R.string.usernameWithAt, currentItem.getLogin()));
if(!currentItem.getAvatarUrl().equals("")) {
PicassoService.getInstance(context).get().load(currentItem.getAvatarUrl()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop()
if (!currentItem.getAvatarUrl().equals("")) {
PicassoService.getInstance(context)
.get()
.load(currentItem.getAvatarUrl())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(120, 120)
.centerCrop()
.into(holder.userAvatar);
}
if(getItemCount() > 0) {
if (getItemCount() > 0) {
final String loginUid = ((BaseActivity) context).getAccount().getAccount().getUserName();
final String loginUid =
((BaseActivity) context).getAccount().getAccount().getUserName();
Call<Void> call = RetrofitClient.getApiInterface(context).repoCheckCollaborator(repository.getOwner(), repository.getName(), currentItem.getLogin());
Call<Void> call =
RetrofitClient.getApiInterface(context)
.repoCheckCollaborator(
repository.getOwner(),
repository.getName(),
currentItem.getLogin());
call.enqueue(new Callback<Void>() {
call.enqueue(
new Callback<Void>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call, @NonNull Response<Void> response) {
if(response.code() == 204) {
if(!currentItem.getLogin().equals(loginUid) && !currentItem.getLogin().equals(repository.getOwner())) {
if (response.code() == 204) {
if (!currentItem.getLogin().equals(loginUid)
&& !currentItem.getLogin().equals(repository.getOwner())) {
holder.addCollaboratorButtonRemove.setVisibility(View.VISIBLE);
}
else {
} else {
holder.addCollaboratorButtonRemove.setVisibility(View.GONE);
}
}
else if(response.code() == 404) {
if(!currentItem.getLogin().equals(loginUid) && !currentItem.getLogin().equals(repository.getOwner())) {
} else if (response.code() == 404) {
if (!currentItem.getLogin().equals(loginUid)
&& !currentItem.getLogin().equals(repository.getOwner())) {
holder.addCollaboratorButtonAdd.setVisibility(View.VISIBLE);
}
else {
} else {
holder.addCollaboratorButtonAdd.setVisibility(View.GONE);
}
}
else {
} else {
holder.addCollaboratorButtonRemove.setVisibility(View.GONE);
holder.addCollaboratorButtonAdd.setVisibility(View.GONE);
}
@ -131,7 +148,7 @@ public class CollaboratorSearchAdapter extends RecyclerView.Adapter<Collaborator
private final ImageView addCollaboratorButtonAdd;
private final ImageView addCollaboratorButtonRemove;
private final String[] permissionList = {"Read", "Write", "Admin"};
final private int permissionSelectedChoice = 0;
private final int permissionSelectedChoice = 0;
private User userInfo;
private CollaboratorSearchViewHolder(View itemView) {
@ -143,39 +160,67 @@ public class CollaboratorSearchAdapter extends RecyclerView.Adapter<Collaborator
addCollaboratorButtonAdd = itemView.findViewById(R.id.addCollaboratorButtonAdd);
addCollaboratorButtonRemove = itemView.findViewById(R.id.addCollaboratorButtonRemove);
addCollaboratorButtonAdd.setOnClickListener(v -> {
addCollaboratorButtonAdd.setOnClickListener(
v -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(context)
.setTitle(R.string.newTeamPermission)
.setSingleChoiceItems(
permissionList, permissionSelectedChoice, null)
.setNeutralButton(R.string.cancelButton, null)
.setPositiveButton(
R.string.addButton,
(dialog, which) -> {
ListView lw =
((AlertDialog) dialog).getListView();
Object checkedItem =
lw.getAdapter()
.getItem(
lw
.getCheckedItemPosition());
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(context).setTitle(R.string.newTeamPermission).setSingleChoiceItems(permissionList, permissionSelectedChoice, null)
.setNeutralButton(R.string.cancelButton, null).setPositiveButton(R.string.addButton, (dialog, which) -> {
ListView lw = ((AlertDialog) dialog).getListView();
Object checkedItem = lw.getAdapter().getItem(lw.getCheckedItemPosition());
CollaboratorActions.addCollaborator(context, String.valueOf(checkedItem).toLowerCase(), userInfo.getLogin(), repository);
CollaboratorActions.addCollaborator(
context,
String.valueOf(checkedItem)
.toLowerCase(),
userInfo.getLogin(),
repository);
});
materialAlertDialogBuilder.create().show();
});
addCollaboratorButtonRemove.setOnClickListener(v -> AlertDialogs.collaboratorRemoveDialog(context, userInfo.getLogin(), repository));
addCollaboratorButtonRemove.setOnClickListener(
v ->
AlertDialogs.collaboratorRemoveDialog(
context, userInfo.getLogin(), repository));
new Handler().postDelayed(() -> {
if(!AppUtil.checkGhostUsers(userInfo.getLogin())) {
new Handler()
.postDelayed(
() -> {
if (!AppUtil.checkGhostUsers(userInfo.getLogin())) {
userAvatar.setOnClickListener(loginId -> {
Intent intent = new Intent(context, ProfileActivity.class);
userAvatar.setOnClickListener(
loginId -> {
Intent intent =
new Intent(context, ProfileActivity.class);
intent.putExtra("username", userInfo.getLogin());
context.startActivity(intent);
});
userAvatar.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, userInfo.getLogin(), context.getString(R.string.copyLoginIdToClipBoard, userInfo.getLogin()));
userAvatar.setOnLongClickListener(
loginId -> {
AppUtil.copyToClipboard(
context,
userInfo.getLogin(),
context.getString(
R.string.copyLoginIdToClipBoard,
userInfo.getLogin()));
return true;
});
}
}, 500);
},
500);
}
}
}

View File

@ -10,18 +10,17 @@ import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
import org.gitnex.tea4j.v2.models.User;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation;
import java.util.List;
/**
* @author M M Arif
*/
public class CollaboratorsAdapter extends BaseAdapter {
private final List<User> collaboratorsList;
@ -54,13 +53,12 @@ public class CollaboratorsAdapter extends BaseAdapter {
ViewHolder viewHolder;
if(finalView == null) {
if (finalView == null) {
finalView = LayoutInflater.from(context).inflate(R.layout.list_collaborators, null);
viewHolder = new ViewHolder(finalView);
finalView.setTag(viewHolder);
}
else {
} else {
viewHolder = (ViewHolder) finalView.getTag();
}
@ -74,22 +72,28 @@ public class CollaboratorsAdapter extends BaseAdapter {
int imgRadius = AppUtil.getPixelsFromDensity(context, 90);
User currentItem = collaboratorsList.get(position);
PicassoService.getInstance(context).get().load(currentItem.getAvatarUrl()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(180, 180).centerCrop()
PicassoService.getInstance(context)
.get()
.load(currentItem.getAvatarUrl())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(180, 180)
.centerCrop()
.into(viewHolder.collaboratorAvatar);
viewHolder.userLoginId = currentItem.getLogin();
if(!currentItem.getFullName().equals("")) {
if (!currentItem.getFullName().equals("")) {
viewHolder.collaboratorName.setText(Html.fromHtml(currentItem.getFullName()));
viewHolder.userName.setText(context.getResources().getString(R.string.usernameWithAt, currentItem.getLogin()));
}
else {
viewHolder.userName.setText(
context.getResources()
.getString(R.string.usernameWithAt, currentItem.getLogin()));
} else {
viewHolder.collaboratorName.setText(currentItem.getLogin());
viewHolder.userName.setVisibility(View.GONE);
}
}
private class ViewHolder {
@ -105,18 +109,21 @@ public class CollaboratorsAdapter extends BaseAdapter {
collaboratorName = v.findViewById(R.id.collaboratorName);
userName = v.findViewById(R.id.userName);
v.setOnClickListener(loginId -> {
v.setOnClickListener(
loginId -> {
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", userLoginId);
context.startActivity(intent);
});
v.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
v.setOnLongClickListener(
loginId -> {
AppUtil.copyToClipboard(
context,
userLoginId,
context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
return true;
});
}
}
}

View File

@ -13,6 +13,8 @@ import androidx.core.text.HtmlCompat;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.card.MaterialCardView;
import com.vdurmont.emoji.EmojiParser;
import java.util.List;
import java.util.Objects;
import org.gitnex.tea4j.v2.models.Commit;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.CommitDetailActivity;
@ -23,13 +25,10 @@ import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.contexts.IssueContext;
import java.util.List;
import java.util.Objects;
/**
* @author M M Arif
*/
public class CommitsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final Context context;
@ -44,8 +43,7 @@ public class CommitsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
this.commitsList = commitsListMain;
}
@NonNull
@Override
@NonNull @Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
return new CommitsHolder(inflater.inflate(R.layout.list_commits, parent, false));
@ -54,7 +52,10 @@ public class CommitsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
if (position >= getItemCount() - 1
&& isMoreDataAvailable
&& !isLoading
&& loadMoreListener != null) {
isLoading = true;
loadMoreListener.run();
}
@ -120,69 +121,118 @@ public class CommitsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
void bindData(Commit commitsModel) {
String[] commitMessageParts = commitsModel.getCommit().getMessage().split("(\r\n|\n)", 2);
String[] commitMessageParts =
commitsModel.getCommit().getMessage().split("(\r\n|\n)", 2);
commitSubject.setText(EmojiParser.parseToUnicode(commitMessageParts[0].trim()));
if(!Objects.equals(commitsModel.getCommit().getCommitter().getEmail(), commitsModel.getCommit().getAuthor().getEmail())) {
commitAuthorAndCommitter.setText(HtmlCompat.fromHtml(
context.getString(R.string.commitAuthoredByAndCommittedByWhen, commitsModel.getCommit().getAuthor().getName(), commitsModel.getCommit().getCommitter().getName(),
TimeHelper.formatTime(TimeHelper.parseIso8601(commitsModel.getCommit().getCommitter().getDate()), context.getResources().getConfiguration().locale, "pretty", context)),
if (!Objects.equals(
commitsModel.getCommit().getCommitter().getEmail(),
commitsModel.getCommit().getAuthor().getEmail())) {
commitAuthorAndCommitter.setText(
HtmlCompat.fromHtml(
context.getString(
R.string.commitAuthoredByAndCommittedByWhen,
commitsModel.getCommit().getAuthor().getName(),
commitsModel.getCommit().getCommitter().getName(),
TimeHelper.formatTime(
TimeHelper.parseIso8601(
commitsModel
.getCommit()
.getCommitter()
.getDate()),
context.getResources().getConfiguration().locale,
"pretty",
context)),
HtmlCompat.FROM_HTML_MODE_COMPACT));
}
else {
commitAuthorAndCommitter.setText(HtmlCompat.fromHtml(context.getString(R.string.commitCommittedByWhen, commitsModel.getCommit().getCommitter().getName(),
TimeHelper.formatTime(TimeHelper.parseIso8601(commitsModel.getCommit().getCommitter().getDate()), context.getResources().getConfiguration().locale, "pretty", context)),
} else {
commitAuthorAndCommitter.setText(
HtmlCompat.fromHtml(
context.getString(
R.string.commitCommittedByWhen,
commitsModel.getCommit().getCommitter().getName(),
TimeHelper.formatTime(
TimeHelper.parseIso8601(
commitsModel
.getCommit()
.getCommitter()
.getDate()),
context.getResources().getConfiguration().locale,
"pretty",
context)),
HtmlCompat.FROM_HTML_MODE_COMPACT));
}
if(commitsModel.getAuthor() != null && commitsModel.getAuthor().getAvatarUrl() != null && !commitsModel.getAuthor().getAvatarUrl().isEmpty()) {
if (commitsModel.getAuthor() != null
&& commitsModel.getAuthor().getAvatarUrl() != null
&& !commitsModel.getAuthor().getAvatarUrl().isEmpty()) {
commitAuthorAvatarFrame.setVisibility(View.VISIBLE);
int imgRadius = AppUtil.getPixelsFromDensity(context, 60);
PicassoService.getInstance(context).get().load(commitsModel.getAuthor().getAvatarUrl()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120)
.centerCrop().into(commitAuthorAvatar);
PicassoService.getInstance(context)
.get()
.load(commitsModel.getAuthor().getAvatarUrl())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(120, 120)
.centerCrop()
.into(commitAuthorAvatar);
}
else {
} else {
commitAuthorAvatar.setImageDrawable(null);
commitAuthorAvatarFrame.setVisibility(View.GONE);
}
if(commitsModel.getCommitter() != null && (commitsModel.getAuthor() == null || !commitsModel.getAuthor().getLogin().equals(commitsModel.getCommitter().getLogin())) && commitsModel.getCommitter()
.getAvatarUrl() != null && !commitsModel.getCommitter().getAvatarUrl().isEmpty()) {
if (commitsModel.getCommitter() != null
&& (commitsModel.getAuthor() == null
|| !commitsModel
.getAuthor()
.getLogin()
.equals(commitsModel.getCommitter().getLogin()))
&& commitsModel.getCommitter().getAvatarUrl() != null
&& !commitsModel.getCommitter().getAvatarUrl().isEmpty()) {
commitCommitterAvatarFrame.setVisibility(View.VISIBLE);
int imgRadius = AppUtil.getPixelsFromDensity(context, 60);
PicassoService.getInstance(context).get().load(commitsModel.getCommitter().getAvatarUrl()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120)
.centerCrop().into(commitCommitterAvatar);
PicassoService.getInstance(context)
.get()
.load(commitsModel.getCommitter().getAvatarUrl())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(120, 120)
.centerCrop()
.into(commitCommitterAvatar);
}
else {
} else {
commitCommitterAvatar.setImageDrawable(null);
commitCommitterAvatarFrame.setVisibility(View.GONE);
}
commitSha.setText(commitsModel.getSha().substring(0, Math.min(commitsModel.getSha().length(), 10)));
rootView.setOnClickListener(v -> {
commitSha.setText(
commitsModel
.getSha()
.substring(0, Math.min(commitsModel.getSha().length(), 10)));
rootView.setOnClickListener(
v -> {
Intent intent;
if(context instanceof CommitsActivity) {
intent = ((CommitsActivity) context).repository.getIntent(context, CommitDetailActivity.class);
}
else {
intent = IssueContext.fromIntent(((DiffActivity) context).getIntent()).getRepository().getIntent(context, CommitDetailActivity.class);
if (context instanceof CommitsActivity) {
intent =
((CommitsActivity) context)
.repository.getIntent(
context, CommitDetailActivity.class);
} else {
intent =
IssueContext.fromIntent(((DiffActivity) context).getIntent())
.getRepository()
.getIntent(context, CommitDetailActivity.class);
}
intent.putExtra("sha", commitsModel.getSha());
context.startActivity(intent);
});
}
}
}

View File

@ -9,18 +9,17 @@ import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import androidx.fragment.app.FragmentManager;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
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;
/**
* @author opyale
*/
public class DiffAdapter extends BaseAdapter {
private static int COLOR_ADDED;
@ -36,7 +35,12 @@ public class DiffAdapter extends BaseAdapter {
private final Typeface typeface;
private final String type;
public DiffAdapter(Context context, FragmentManager fragmentManager, List<String> lines, IssueContext issue, String type) {
public DiffAdapter(
Context context,
FragmentManager fragmentManager,
List<String> lines,
IssueContext issue,
String type) {
this.context = context;
this.fragmentManager = fragmentManager;
@ -52,7 +56,6 @@ public class DiffAdapter extends BaseAdapter {
COLOR_NORMAL = AppUtil.getColorFromAttribute(context, R.attr.primaryBackgroundColor);
COLOR_SELECTED = AppUtil.getColorFromAttribute(context, R.attr.diffSelectedColor);
COLOR_FONT = AppUtil.getColorFromAttribute(context, R.attr.inputTextColor);
}
@Override
@ -73,43 +76,45 @@ public class DiffAdapter extends BaseAdapter {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
if (convertView == null) {
TextView textView = new TextView(context);
textView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
textView.setLayoutParams(
new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
textView.setTextColor(COLOR_FONT);
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
textView.setPadding(32, 0, 32, 0);
textView.setTypeface(typeface);
convertView = textView;
}
if(type.equalsIgnoreCase("pull")) {
convertView.setOnClickListener(v -> {
if(selectedLines.contains(position)) {
if (type.equalsIgnoreCase("pull")) {
convertView.setOnClickListener(
v -> {
if (selectedLines.contains(position)) {
selectedLines.remove((Object) position);
v.setBackgroundColor(getLineColor(lines.get(position)));
}
else {
} else {
selectedLines.add(position);
v.setBackgroundColor(COLOR_SELECTED);
}
});
convertView.setOnLongClickListener(v -> {
if(selectedLines.contains(position)) {
convertView.setOnLongClickListener(
v -> {
if (selectedLines.contains(position)) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("```\n");
for(Integer selectedLine : selectedLines.stream().sorted().collect(Collectors.toList())) {
for (Integer selectedLine :
selectedLines.stream().sorted().collect(Collectors.toList())) {
stringBuilder.append(lines.get(selectedLine));
stringBuilder.append("\n");
}
@ -121,32 +126,32 @@ public class DiffAdapter extends BaseAdapter {
bundle.putString("commentBody", stringBuilder.toString());
bundle.putBoolean("cursorToEnd", true);
BottomSheetReplyFragment.newInstance(bundle, issue).show(fragmentManager, "replyBottomSheet");
BottomSheetReplyFragment.newInstance(bundle, issue)
.show(fragmentManager, "replyBottomSheet");
}
return true;
});
}
String line = lines.get(position);
int backgroundColor = selectedLines.contains(position) ? COLOR_SELECTED : getLineColor(line);
int backgroundColor =
selectedLines.contains(position) ? COLOR_SELECTED : getLineColor(line);
convertView.setBackgroundColor(backgroundColor);
((TextView) convertView).setText(line);
return convertView;
}
private int getLineColor(String line) {
if(line.length() == 0) {
if (line.length() == 0) {
return COLOR_NORMAL;
}
switch(line.charAt(0)) {
switch (line.charAt(0)) {
case '+':
return COLOR_ADDED;
case '-':
@ -156,5 +161,4 @@ public class DiffAdapter extends BaseAdapter {
return COLOR_NORMAL;
}
}
}

View File

@ -9,20 +9,19 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.CommitDetailActivity;
import org.mian.gitnex.activities.DiffActivity;
import org.mian.gitnex.fragments.DiffFragment;
import org.mian.gitnex.helpers.FileDiffView;
import org.mian.gitnex.helpers.contexts.IssueContext;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author M M Arif
*/
public class DiffFilesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final Pattern statisticsPattern = Pattern.compile("(\\d+).*?,.*?(\\d+)");
@ -32,7 +31,11 @@ public class DiffFilesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
private final String fragmentType;
private List<FileDiffView> fileDiffViews;
public DiffFilesAdapter(Context context, List<FileDiffView> fileDiffViews, IssueContext issue, String fragmentType) {
public DiffFilesAdapter(
Context context,
List<FileDiffView> fileDiffViews,
IssueContext issue,
String fragmentType) {
this.context = context;
this.fileDiffViews = fileDiffViews;
@ -40,11 +43,11 @@ public class DiffFilesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
this.fragmentType = fragmentType;
}
@NonNull
@Override
@NonNull @Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
return new DiffFilesAdapter.FilesHolder(inflater.inflate(R.layout.list_diff_files, parent, false));
return new DiffFilesAdapter.FilesHolder(
inflater.inflate(R.layout.list_diff_files, parent, false));
}
@Override
@ -87,14 +90,25 @@ public class DiffFilesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
fileStatistics = itemView.findViewById(R.id.fileStatistics);
main_frame = itemView.findViewById(R.id.main_frame);
main_frame.setOnClickListener(v -> {
if(fragmentType.equalsIgnoreCase("commit")) {
((CommitDetailActivity) context).getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, DiffFragment.newInstance(diffFilesObject, fragmentType)).commit();
main_frame.setOnClickListener(
v -> {
if (fragmentType.equalsIgnoreCase("commit")) {
((CommitDetailActivity) context)
.getSupportFragmentManager()
.beginTransaction()
.replace(
R.id.fragment_container,
DiffFragment.newInstance(diffFilesObject, fragmentType))
.commit();
} else {
((DiffActivity) context)
.getSupportFragmentManager()
.beginTransaction()
.replace(
R.id.fragment_container,
DiffFragment.newInstance(diffFilesObject, issue))
.commit();
}
else {
((DiffActivity) context).getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, DiffFragment.newInstance(diffFilesObject, issue)).commit();
}
});
}
@ -105,14 +119,13 @@ public class DiffFilesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
Matcher matcher = statisticsPattern.matcher(fileDiffView.getFileInfo());
if(matcher.find() && matcher.groupCount() == 2) {
fileStatistics.setText(context.getString(R.string.diffStatistics, matcher.group(1), matcher.group(2)));
}
else {
if (matcher.find() && matcher.groupCount() == 2) {
fileStatistics.setText(
context.getString(
R.string.diffStatistics, matcher.group(1), matcher.group(2)));
} else {
fileStatistics.setText(fileDiffView.getFileInfo());
}
}
}
}

View File

@ -15,6 +15,7 @@ import androidx.core.content.res.ResourcesCompat;
import androidx.core.text.HtmlCompat;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.IssueDetailActivity;
import org.mian.gitnex.database.api.BaseApi;
@ -25,19 +26,20 @@ import org.mian.gitnex.helpers.Markdown;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.contexts.IssueContext;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import java.util.List;
/**
* @author M M Arif
*/
public class DraftsAdapter extends RecyclerView.Adapter<DraftsAdapter.DraftsViewHolder> {
private final FragmentManager fragmentManager;
private final Context context;
private List<DraftWithRepository> draftsList;
public DraftsAdapter(Context ctx, FragmentManager fragmentManager, List<DraftWithRepository> draftsListMain) {
public DraftsAdapter(
Context ctx,
FragmentManager fragmentManager,
List<DraftWithRepository> draftsListMain) {
this.context = ctx;
this.fragmentManager = fragmentManager;
this.draftsList = draftsListMain;
@ -48,13 +50,16 @@ public class DraftsAdapter extends RecyclerView.Adapter<DraftsAdapter.DraftsView
draftsList.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, draftsList.size());
Toasty.success(context, context.getResources().getString(R.string.draftsSingleDeleteSuccess));
Toasty.success(
context, context.getResources().getString(R.string.draftsSingleDeleteSuccess));
}
@NonNull
@Override
public DraftsAdapter.DraftsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_drafts, parent, false);
@NonNull @Override
public DraftsAdapter.DraftsViewHolder onCreateViewHolder(
@NonNull ViewGroup parent, int viewType) {
View v =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_drafts, parent, false);
return new DraftsViewHolder(v);
}
@ -64,18 +69,30 @@ public class DraftsAdapter extends RecyclerView.Adapter<DraftsAdapter.DraftsView
DraftWithRepository currentItem = draftsList.get(position);
String issueNumber = "<font color='" + ResourcesCompat.getColor(context.getResources(), R.color.lightGray, null) + "'>" + context.getResources().getString(R.string.hash) + currentItem.getIssueId() + "</font>";
Spanned headTitle = HtmlCompat.fromHtml(issueNumber + " " + currentItem.getRepositoryOwner() + " / " + currentItem.getRepositoryName(), HtmlCompat.FROM_HTML_MODE_LEGACY);
String issueNumber =
"<font color='"
+ ResourcesCompat.getColor(context.getResources(), R.color.lightGray, null)
+ "'>"
+ context.getResources().getString(R.string.hash)
+ currentItem.getIssueId()
+ "</font>";
Spanned headTitle =
HtmlCompat.fromHtml(
issueNumber
+ " "
+ currentItem.getRepositoryOwner()
+ " / "
+ currentItem.getRepositoryName(),
HtmlCompat.FROM_HTML_MODE_LEGACY);
holder.repoInfo.setText(headTitle);
holder.draftWithRepository = currentItem;
Markdown.render(context, currentItem.getDraftText(), holder.draftText);
if(!currentItem.getCommentId().equalsIgnoreCase("new")) {
if (!currentItem.getCommentId().equalsIgnoreCase("new")) {
holder.editCommentStatus.setVisibility(View.VISIBLE);
}
else {
} else {
holder.editCommentStatus.setVisibility(View.GONE);
}
}
@ -112,8 +129,8 @@ public class DraftsAdapter extends RecyclerView.Adapter<DraftsAdapter.DraftsView
ImageView deleteDraft = itemView.findViewById(R.id.deleteDraft);
editCommentStatus = itemView.findViewById(R.id.editCommentStatus);
deleteDraft.setOnClickListener(itemDelete -> {
deleteDraft.setOnClickListener(
itemDelete -> {
int getDraftId = draftWithRepository.getDraftId();
deleteDraft(getBindingAdapterPosition());
@ -122,34 +139,53 @@ public class DraftsAdapter extends RecyclerView.Adapter<DraftsAdapter.DraftsView
draftsApi.deleteSingleDraft(getDraftId);
});
itemView.setOnClickListener(itemEdit -> {
RepositoryContext repository = new RepositoryContext(draftWithRepository.getRepositoryOwner(), draftWithRepository.getRepositoryName(), context);
itemView.setOnClickListener(
itemEdit -> {
RepositoryContext repository =
new RepositoryContext(
draftWithRepository.getRepositoryOwner(),
draftWithRepository.getRepositoryName(),
context);
repository.setRepositoryId(draftWithRepository.getRepositoryId());
IssueContext issue = new IssueContext(repository, draftWithRepository.getIssueId(), draftWithRepository.getIssueType());
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(
"issueNumber", String.valueOf(draftWithRepository.getIssueId()));
bundle.putString("draftTitle", repoInfo.getText().toString());
bundle.putString("commentId", draftWithRepository.getCommentId());
bundle.putString("draftId", String.valueOf(draftWithRepository.getDraftId()));
bundle.putString(
"draftId", String.valueOf(draftWithRepository.getDraftId()));
if(!draftWithRepository.getCommentId().isEmpty()) {
if (!draftWithRepository.getCommentId().isEmpty()) {
bundle.putString("commentAction", "edit");
}
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);
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");
});
}
}
}

View File

@ -20,6 +20,10 @@ import androidx.core.content.res.ResourcesCompat;
import androidx.core.text.HtmlCompat;
import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
import org.gitnex.tea4j.v2.models.Issue;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.IssueDetailActivity;
@ -35,15 +39,10 @@ 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;
import java.util.List;
import java.util.Locale;
/**
* @author M M Arif
*/
public class ExploreIssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final Context context;
@ -58,16 +57,19 @@ public class ExploreIssuesAdapter extends RecyclerView.Adapter<RecyclerView.View
this.tinyDb = TinyDB.getInstance(context);
}
@NonNull
@Override
@NonNull @Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
return new ExploreIssuesAdapter.IssuesHolder(inflater.inflate(R.layout.list_issues, parent, false));
return new ExploreIssuesAdapter.IssuesHolder(
inflater.inflate(R.layout.list_issues, parent, false));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
if (position >= getItemCount() - 1
&& isMoreDataAvailable
&& !isLoading
&& loadMoreListener != null) {
isLoading = true;
loadMoreListener.onLoadMore();
}
@ -87,7 +89,7 @@ public class ExploreIssuesAdapter extends RecyclerView.Adapter<RecyclerView.View
public void setMoreDataAvailable(boolean moreDataAvailable) {
isMoreDataAvailable = moreDataAvailable;
if(!isMoreDataAvailable) {
if (!isMoreDataAvailable) {
loadMoreListener.onLoadFinished();
}
}
@ -113,7 +115,6 @@ public class ExploreIssuesAdapter extends RecyclerView.Adapter<RecyclerView.View
void onLoadMore();
void onLoadFinished();
}
class IssuesHolder extends RecyclerView.ViewHolder {
@ -142,39 +143,54 @@ public class ExploreIssuesAdapter extends RecyclerView.Adapter<RecyclerView.View
frameLabelsDots = itemView.findViewById(R.id.frameLabelsDots);
commentIcon = itemView.findViewById(R.id.comment_icon);
new Handler().postDelayed(() -> {
new Handler()
.postDelayed(
() -> {
String[] parts = issue.getRepository().getFullName().split("/");
final String repoOwner = parts[0];
final String repoName = parts[1];
RepositoryContext repo = new RepositoryContext(repoOwner, repoName, context);
RepositoryContext repo =
new RepositoryContext(repoOwner, repoName, context);
Intent intentIssueDetail = new IssueContext(issue, repo).getIntent(context, IssueDetailActivity.class);
Intent intentIssueDetail =
new IssueContext(issue, repo)
.getIntent(context, IssueDetailActivity.class);
intentIssueDetail.putExtra("openedFromLink", "true");
itemView.setOnClickListener(v -> {
itemView.setOnClickListener(
v -> {
repo.saveToDB(context);
context.startActivity(intentIssueDetail);
});
frameLabels.setOnClickListener(v -> {
frameLabels.setOnClickListener(
v -> {
repo.saveToDB(context);
context.startActivity(intentIssueDetail);
});
frameLabelsDots.setOnClickListener(v -> {
frameLabelsDots.setOnClickListener(
v -> {
repo.saveToDB(context);
context.startActivity(intentIssueDetail);
});
}, 200);
},
200);
issueAssigneeAvatar.setOnClickListener(v -> {
issueAssigneeAvatar.setOnClickListener(
v -> {
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", issue.getUser().getLogin());
context.startActivity(intent);
});
issueAssigneeAvatar.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, issue.getUser().getLogin(), context.getString(R.string.copyLoginIdToClipBoard, issue.getUser().getLogin()));
issueAssigneeAvatar.setOnLongClickListener(
loginId -> {
AppUtil.copyToClipboard(
context,
issue.getUser().getLogin(),
context.getString(
R.string.copyLoginIdToClipBoard,
issue.getUser().getLogin()));
return true;
});
}
@ -187,27 +203,46 @@ public class ExploreIssuesAdapter extends RecyclerView.Adapter<RecyclerView.View
Locale locale = context.getResources().getConfiguration().locale;
String timeFormat = tinyDb.getString("dateFormat", "pretty");
PicassoService.getInstance(context).get().load(issue.getUser().getAvatarUrl()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop()
PicassoService.getInstance(context)
.get()
.load(issue.getUser().getAvatarUrl())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(120, 120)
.centerCrop()
.into(issueAssigneeAvatar);
String issueNumber_ = "<font color='" + ResourcesCompat.getColor(context.getResources(), R.color.lightGray, null) + "'>" + issue.getRepository().getFullName() + context.getResources()
.getString(R.string.hash) + issue.getNumber() + "</font>";
String issueNumber_ =
"<font color='"
+ ResourcesCompat.getColor(
context.getResources(), R.color.lightGray, null)
+ "'>"
+ issue.getRepository().getFullName()
+ context.getResources().getString(R.string.hash)
+ issue.getNumber()
+ "</font>";
issueTitle.setText(HtmlCompat.fromHtml(issueNumber_ + " " + issue.getTitle(), HtmlCompat.FROM_HTML_MODE_LEGACY));
issueTitle.setText(
HtmlCompat.fromHtml(
issueNumber_ + " " + issue.getTitle(),
HtmlCompat.FROM_HTML_MODE_LEGACY));
issueCommentsCount.setText(String.valueOf(issue.getComments()));
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
LinearLayout.LayoutParams params =
new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(0, 0, 15, 0);
if(issue.getLabels() != null) {
if (issue.getLabels() != null) {
if(!tinyDb.getBoolean("showLabelsInList", false)) { // default
if (!tinyDb.getBoolean("showLabelsInList", false)) { // default
labelsScrollViewWithText.setVisibility(View.GONE);
labelsScrollViewDots.setVisibility(View.VISIBLE);
frameLabelsDots.removeAllViews();
for(int i = 0; i < issue.getLabels().size(); i++) {
for (int i = 0; i < issue.getLabels().size(); i++) {
String labelColor = issue.getLabels().get(i).getColor();
int color = Color.parseColor("#" + labelColor);
@ -217,19 +252,25 @@ public class ExploreIssuesAdapter extends RecyclerView.Adapter<RecyclerView.View
frameLabelsDots.setGravity(Gravity.START | Gravity.TOP);
labelsView.setLayoutParams(params);
TextDrawable drawable = TextDrawable.builder().beginConfig().useFont(Typeface.DEFAULT).width(54).height(54).endConfig().buildRound("", color);
TextDrawable drawable =
TextDrawable.builder()
.beginConfig()
.useFont(Typeface.DEFAULT)
.width(54)
.height(54)
.endConfig()
.buildRound("", color);
labelsView.setImageDrawable(drawable);
frameLabelsDots.addView(labelsView);
}
}
else {
} else {
labelsScrollViewDots.setVisibility(View.GONE);
labelsScrollViewWithText.setVisibility(View.VISIBLE);
frameLabels.removeAllViews();
for(int i = 0; i < issue.getLabels().size(); i++) {
for (int i = 0; i < issue.getLabels().size(); i++) {
String labelColor = issue.getLabels().get(i).getColor();
String labelName = issue.getLabels().get(i).getName();
@ -243,49 +284,81 @@ public class ExploreIssuesAdapter extends RecyclerView.Adapter<RecyclerView.View
int height = AppUtil.getPixelsFromDensity(context, 20);
int textSize = AppUtil.getPixelsFromScaledDensity(context, 12);
TextDrawable drawable = TextDrawable.builder().beginConfig().useFont(Typeface.DEFAULT).textColor(new ColorInverter().getContrastColor(color)).fontSize(textSize)
.width(LabelWidthCalculator.calculateLabelWidth(labelName, Typeface.DEFAULT, textSize, AppUtil.getPixelsFromDensity(context, 8))).height(height).endConfig()
.buildRoundRect(labelName, color, AppUtil.getPixelsFromDensity(context, 18));
TextDrawable drawable =
TextDrawable.builder()
.beginConfig()
.useFont(Typeface.DEFAULT)
.textColor(new ColorInverter().getContrastColor(color))
.fontSize(textSize)
.width(
LabelWidthCalculator.calculateLabelWidth(
labelName,
Typeface.DEFAULT,
textSize,
AppUtil.getPixelsFromDensity(context, 8)))
.height(height)
.endConfig()
.buildRoundRect(
labelName,
color,
AppUtil.getPixelsFromDensity(context, 18));
labelsView.setImageDrawable(drawable);
frameLabels.addView(labelsView);
}
}
}
else {
} else {
labelsScrollViewDots.setVisibility(View.GONE);
labelsScrollViewWithText.setVisibility(View.GONE);
}
if(issue.getComments() > 15) {
commentIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_flame));
commentIcon.setColorFilter(context.getResources().getColor(R.color.releasePre, null));
if (issue.getComments() > 15) {
commentIcon.setImageDrawable(
ContextCompat.getDrawable(context, R.drawable.ic_flame));
commentIcon.setColorFilter(
context.getResources().getColor(R.color.releasePre, null));
}
switch(timeFormat) {
case "pretty": {
switch (timeFormat) {
case "pretty":
{
PrettyTime prettyTime = new PrettyTime(locale);
String createdTime = prettyTime.format(issue.getCreatedAt());
issueCreatedTime.setText(createdTime);
issueCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(issue.getCreatedAt()), context));
issueCreatedTime.setOnClickListener(
new ClickListener(
TimeHelper.customDateFormatForToastDateFormat(
issue.getCreatedAt()),
context));
break;
}
case "normal": {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
case "normal":
{
DateFormat formatter =
new SimpleDateFormat(
"yyyy-MM-dd '"
+ context.getResources()
.getString(R.string.timeAtText)
+ "' HH:mm",
locale);
String createdTime = formatter.format(issue.getCreatedAt());
issueCreatedTime.setText(createdTime);
break;
}
case "normal1": {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
case "normal1":
{
DateFormat formatter =
new SimpleDateFormat(
"dd-MM-yyyy '"
+ context.getResources()
.getString(R.string.timeAtText)
+ "' HH:mm",
locale);
String createdTime = formatter.format(issue.getCreatedAt());
issueCreatedTime.setText(createdTime);
break;
}
}
}
}
}

View File

@ -14,6 +14,10 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.RepoDetailActivity;
import org.mian.gitnex.clients.PicassoService;
@ -24,15 +28,10 @@ import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import org.ocpsoft.prettytime.PrettyTime;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
/**
* @author M M Arif
*/
public class ExploreRepositoriesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final Context context;
@ -41,22 +40,26 @@ public class ExploreRepositoriesAdapter extends RecyclerView.Adapter<RecyclerVie
private Runnable loadMoreListener;
private boolean isLoading = false, isMoreDataAvailable = true;
public ExploreRepositoriesAdapter(List<org.gitnex.tea4j.v2.models.Repository> dataList, Context ctx) {
public ExploreRepositoriesAdapter(
List<org.gitnex.tea4j.v2.models.Repository> dataList, Context ctx) {
this.context = ctx;
this.reposList = dataList;
this.tinyDb = TinyDB.getInstance(context);
}
@NonNull
@Override
@NonNull @Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
return new ExploreRepositoriesAdapter.RepositoriesHolder(inflater.inflate(R.layout.list_repositories, parent, false));
return new ExploreRepositoriesAdapter.RepositoriesHolder(
inflater.inflate(R.layout.list_repositories, parent, false));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
if (position >= getItemCount() - 1
&& isMoreDataAvailable
&& !isLoading
&& loadMoreListener != null) {
isLoading = true;
loadMoreListener.run();
}
@ -115,7 +118,8 @@ public class ExploreRepositoriesAdapter extends RecyclerView.Adapter<RecyclerVie
repoLastUpdated = itemView.findViewById(R.id.repoLastUpdated);
spacerView = itemView.findViewById(R.id.spacerView);
itemView.setOnClickListener(v -> {
itemView.setOnClickListener(
v -> {
Context context = v.getContext();
RepositoryContext repo = new RepositoryContext(userRepositories, context);
repo.saveToDB(context);
@ -141,65 +145,96 @@ public class ExploreRepositoriesAdapter extends RecyclerView.Adapter<RecyclerVie
int color = generator.getColor(userRepositories.getName());
String firstCharacter = String.valueOf(userRepositories.getFullName().charAt(0));
TextDrawable drawable = TextDrawable.builder().beginConfig().useFont(Typeface.DEFAULT).fontSize(18).toUpperCase().width(28).height(28).endConfig().buildRoundRect(firstCharacter, color, 14);
TextDrawable drawable =
TextDrawable.builder()
.beginConfig()
.useFont(Typeface.DEFAULT)
.fontSize(18)
.toUpperCase()
.width(28)
.height(28)
.endConfig()
.buildRoundRect(firstCharacter, color, 14);
if(userRepositories.getAvatarUrl() != null) {
if(!userRepositories.getAvatarUrl().equals("")) {
PicassoService.getInstance(context).get().load(userRepositories.getAvatarUrl()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop()
if (userRepositories.getAvatarUrl() != null) {
if (!userRepositories.getAvatarUrl().equals("")) {
PicassoService.getInstance(context)
.get()
.load(userRepositories.getAvatarUrl())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(120, 120)
.centerCrop()
.into(image);
}
else {
} else {
image.setImageDrawable(drawable);
}
}
else {
} else {
image.setImageDrawable(drawable);
}
if(userRepositories.getUpdatedAt() != null) {
if (userRepositories.getUpdatedAt() != null) {
switch(timeFormat) {
case "pretty": {
switch (timeFormat) {
case "pretty":
{
PrettyTime prettyTime = new PrettyTime(locale);
String createdTime = prettyTime.format(userRepositories.getUpdatedAt());
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(userRepositories.getUpdatedAt()), context));
repoLastUpdated.setText(
context.getString(R.string.lastUpdatedAt, createdTime));
repoLastUpdated.setOnClickListener(
new ClickListener(
TimeHelper.customDateFormatForToastDateFormat(
userRepositories.getUpdatedAt()),
context));
break;
}
case "normal": {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
case "normal":
{
DateFormat formatter =
new SimpleDateFormat(
"yyyy-MM-dd '"
+ context.getResources()
.getString(R.string.timeAtText)
+ "' HH:mm",
locale);
String createdTime = formatter.format(userRepositories.getUpdatedAt());
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
repoLastUpdated.setText(
context.getString(R.string.lastUpdatedAt, createdTime));
break;
}
case "normal1": {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
case "normal1":
{
DateFormat formatter =
new SimpleDateFormat(
"dd-MM-yyyy '"
+ context.getResources()
.getString(R.string.timeAtText)
+ "' HH:mm",
locale);
String createdTime = formatter.format(userRepositories.getUpdatedAt());
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
repoLastUpdated.setText(
context.getString(R.string.lastUpdatedAt, createdTime));
break;
}
}
}
else {
} else {
repoLastUpdated.setVisibility(View.GONE);
}
if(!userRepositories.getDescription().equals("")) {
if (!userRepositories.getDescription().equals("")) {
repoDescription.setVisibility(View.VISIBLE);
repoDescription.setText(userRepositories.getDescription());
spacerView.setVisibility(View.GONE);
}
else {
} else {
repoDescription.setVisibility(View.GONE);
spacerView.setVisibility(View.VISIBLE);
}
if(isRepoAdmin == null) {
if (isRepoAdmin == null) {
isRepoAdmin = new CheckBox(context);
}
isRepoAdmin.setChecked(userRepositories.getPermissions().isAdmin());
}
}
}

View File

@ -12,17 +12,17 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.gitnex.tea4j.v2.models.ContentsResponse;
import org.mian.gitnex.R;
import java.util.ArrayList;
import java.util.List;
/**
* @author M M Arif
*/
public class FilesAdapter extends RecyclerView.Adapter<FilesAdapter.FilesViewHolder> implements Filterable {
public class FilesAdapter extends RecyclerView.Adapter<FilesAdapter.FilesViewHolder>
implements Filterable {
private final List<ContentsResponse> originalFiles = new ArrayList<>();
private final List<ContentsResponse> alteredFiles = new ArrayList<>();
@ -30,21 +30,22 @@ public class FilesAdapter extends RecyclerView.Adapter<FilesAdapter.FilesViewHol
private final Context context;
private final FilesAdapterListener filesListener;
private final Filter filesFilter = new Filter() {
private final Filter filesFilter =
new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<ContentsResponse> filteredList = new ArrayList<>();
if(constraint == null || constraint.length() == 0) {
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(originalFiles);
}
else {
} else {
String filterPattern = constraint.toString().toLowerCase().trim();
for(ContentsResponse item : originalFiles) {
if(item.getName().toLowerCase().contains(filterPattern) || item.getPath().toLowerCase().contains(filterPattern)) {
for (ContentsResponse item : originalFiles) {
if (item.getName().toLowerCase().contains(filterPattern)
|| item.getPath().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}
@ -54,7 +55,6 @@ public class FilesAdapter extends RecyclerView.Adapter<FilesAdapter.FilesViewHol
results.values = filteredList;
return results;
}
@Override
@ -64,9 +64,7 @@ public class FilesAdapter extends RecyclerView.Adapter<FilesAdapter.FilesViewHol
alteredFiles.addAll((List) results.values);
notifyDataSetChanged();
}
};
public FilesAdapter(Context ctx, FilesAdapterListener filesListener) {
@ -87,10 +85,12 @@ public class FilesAdapter extends RecyclerView.Adapter<FilesAdapter.FilesViewHol
notifyDataSetChanged();
}
@NonNull
@Override
public FilesAdapter.FilesViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_files, parent, false);
@NonNull @Override
public FilesAdapter.FilesViewHolder onCreateViewHolder(
@NonNull ViewGroup parent, int viewType) {
View v =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_files, parent, false);
return new FilesAdapter.FilesViewHolder(v);
}
@ -102,32 +102,36 @@ public class FilesAdapter extends RecyclerView.Adapter<FilesAdapter.FilesViewHol
holder.file = currentItem;
holder.fileName.setText(currentItem.getName());
switch(currentItem.getType()) {
switch (currentItem.getType()) {
case "file":
holder.fileTypeIs.setImageDrawable(AppCompatResources.getDrawable(context, R.drawable.ic_file));
holder.fileTypeIs.setImageDrawable(
AppCompatResources.getDrawable(context, R.drawable.ic_file));
holder.fileInfo.setVisibility(View.VISIBLE);
holder.fileInfo.setText(FileUtils.byteCountToDisplaySize(Math.toIntExact(currentItem.getSize())));
holder.fileInfo.setText(
FileUtils.byteCountToDisplaySize(Math.toIntExact(currentItem.getSize())));
break;
case "dir":
holder.fileTypeIs.setImageDrawable(AppCompatResources.getDrawable(context, R.drawable.ic_directory));
holder.fileTypeIs.setImageDrawable(
AppCompatResources.getDrawable(context, R.drawable.ic_directory));
holder.fileInfo.setVisibility(View.GONE);
break;
case "submodule":
holder.fileTypeIs.setImageDrawable(AppCompatResources.getDrawable(context, R.drawable.ic_submodule));
holder.fileTypeIs.setImageDrawable(
AppCompatResources.getDrawable(context, R.drawable.ic_submodule));
holder.fileInfo.setVisibility(View.GONE);
break;
case "symlink":
holder.fileTypeIs.setImageDrawable(AppCompatResources.getDrawable(context, R.drawable.ic_symlink));
holder.fileTypeIs.setImageDrawable(
AppCompatResources.getDrawable(context, R.drawable.ic_symlink));
holder.fileInfo.setVisibility(View.GONE);
break;
default:
holder.fileTypeIs.setImageDrawable(AppCompatResources.getDrawable(context, R.drawable.ic_question));
holder.fileTypeIs.setImageDrawable(
AppCompatResources.getDrawable(context, R.drawable.ic_question));
}
}
@ -144,7 +148,6 @@ public class FilesAdapter extends RecyclerView.Adapter<FilesAdapter.FilesViewHol
public interface FilesAdapterListener {
void onClickFile(ContentsResponse file);
}
class FilesViewHolder extends RecyclerView.ViewHolder {
@ -165,7 +168,7 @@ public class FilesAdapter extends RecyclerView.Adapter<FilesAdapter.FilesViewHol
fileFrame.setOnClickListener(v -> filesListener.onClickFile(file));
//ImageView filesDropdownMenu = itemView.findViewById(R.id.filesDropdownMenu);
// ImageView filesDropdownMenu = itemView.findViewById(R.id.filesDropdownMenu);
/*filesDropdownMenu.setOnClickListener(new View.OnClickListener() {
@Override
@ -231,7 +234,5 @@ public class FilesAdapter extends RecyclerView.Adapter<FilesAdapter.FilesViewHol
});*/
}
}
}

View File

@ -21,6 +21,10 @@ import androidx.core.text.HtmlCompat;
import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable;
import com.vdurmont.emoji.EmojiParser;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
import org.gitnex.tea4j.v2.models.Issue;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.IssueDetailActivity;
@ -36,15 +40,10 @@ import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.contexts.IssueContext;
import org.ocpsoft.prettytime.PrettyTime;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
/**
* @author M M Arif
*/
public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final Context context;
@ -60,8 +59,7 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
tinyDb = TinyDB.getInstance(context);
}
@NonNull
@Override
@NonNull @Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
return new IssuesHolder(inflater.inflate(R.layout.list_issues, parent, false));
@ -70,7 +68,10 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
if (position >= getItemCount() - 1
&& isMoreDataAvailable
&& !isLoading
&& loadMoreListener != null) {
isLoading = true;
loadMoreListener.run();
}
@ -134,21 +135,34 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
frameLabelsDots = itemView.findViewById(R.id.frameLabelsDots);
commentIcon = itemView.findViewById(R.id.comment_icon);
new Handler().postDelayed(() -> {
if(!AppUtil.checkGhostUsers(issueObject.getUser().getLogin())) {
new Handler()
.postDelayed(
() -> {
if (!AppUtil.checkGhostUsers(issueObject.getUser().getLogin())) {
issueAssigneeAvatar.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, issueObject.getUser().getLogin(), context.getString(R.string.copyLoginIdToClipBoard, issueObject.getUser().getLogin()));
issueAssigneeAvatar.setOnLongClickListener(
loginId -> {
AppUtil.copyToClipboard(
context,
issueObject.getUser().getLogin(),
context.getString(
R.string.copyLoginIdToClipBoard,
issueObject.getUser().getLogin()));
return true;
});
issueAssigneeAvatar.setOnClickListener(v -> {
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", issueObject.getUser().getLogin());
issueAssigneeAvatar.setOnClickListener(
v -> {
Intent intent =
new Intent(context, ProfileActivity.class);
intent.putExtra(
"username",
issueObject.getUser().getLogin());
context.startActivity(intent);
});
}
}, 500);
},
500);
}
@SuppressLint("SetTextI18n")
@ -159,33 +173,54 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
PicassoService.getInstance(context).get().load(issue.getUser().getAvatarUrl()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop()
PicassoService.getInstance(context)
.get()
.load(issue.getUser().getAvatarUrl())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(120, 120)
.centerCrop()
.into(issueAssigneeAvatar);
String issueNumber_ = "<font color='" + ResourcesCompat.getColor(context.getResources(), R.color.lightGray, null) + "'>" + context.getResources().getString(R.string.hash) + issue.getNumber() + "</font>";
issueTitle.setText(HtmlCompat.fromHtml(issueNumber_ + " " + EmojiParser.parseToUnicode(issue.getTitle()), HtmlCompat.FROM_HTML_MODE_LEGACY));
String issueNumber_ =
"<font color='"
+ ResourcesCompat.getColor(
context.getResources(), R.color.lightGray, null)
+ "'>"
+ context.getResources().getString(R.string.hash)
+ issue.getNumber()
+ "</font>";
issueTitle.setText(
HtmlCompat.fromHtml(
issueNumber_ + " " + EmojiParser.parseToUnicode(issue.getTitle()),
HtmlCompat.FROM_HTML_MODE_LEGACY));
this.issueObject = issue;
this.issueCommentsCount.setText(String.valueOf(issue.getComments()));
Intent intentIssueDetail = new IssueContext(issueObject, ((RepoDetailActivity) context).repository).getIntent(context, IssueDetailActivity.class);
Intent intentIssueDetail =
new IssueContext(issueObject, ((RepoDetailActivity) context).repository)
.getIntent(context, IssueDetailActivity.class);
itemView.setOnClickListener(layoutView -> context.startActivity(intentIssueDetail));
frameLabels.setOnClickListener(v -> context.startActivity(intentIssueDetail));
frameLabelsDots.setOnClickListener(v -> context.startActivity(intentIssueDetail));
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
LinearLayout.LayoutParams params =
new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(0, 0, 15, 0);
if(issue.getLabels() != null) {
if (issue.getLabels() != null) {
if(!tinyDb.getBoolean("showLabelsInList", false)) { // default
if (!tinyDb.getBoolean("showLabelsInList", false)) { // default
labelsScrollViewWithText.setVisibility(View.GONE);
labelsScrollViewDots.setVisibility(View.VISIBLE);
frameLabelsDots.removeAllViews();
for(int i = 0; i < issue.getLabels().size(); i++) {
for (int i = 0; i < issue.getLabels().size(); i++) {
String labelColor = issue.getLabels().get(i).getColor();
int color = Color.parseColor("#" + labelColor);
@ -195,19 +230,25 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
frameLabelsDots.setGravity(Gravity.START | Gravity.TOP);
labelsView.setLayoutParams(params);
TextDrawable drawable = TextDrawable.builder().beginConfig().useFont(Typeface.DEFAULT).width(54).height(54).endConfig().buildRound("", color);
TextDrawable drawable =
TextDrawable.builder()
.beginConfig()
.useFont(Typeface.DEFAULT)
.width(54)
.height(54)
.endConfig()
.buildRound("", color);
labelsView.setImageDrawable(drawable);
frameLabelsDots.addView(labelsView);
}
}
else {
} else {
labelsScrollViewDots.setVisibility(View.GONE);
labelsScrollViewWithText.setVisibility(View.VISIBLE);
frameLabels.removeAllViews();
for(int i = 0; i < issue.getLabels().size(); i++) {
for (int i = 0; i < issue.getLabels().size(); i++) {
String labelColor = issue.getLabels().get(i).getColor();
String labelName = issue.getLabels().get(i).getName();
@ -221,9 +262,24 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
int height = AppUtil.getPixelsFromDensity(context, 20);
int textSize = AppUtil.getPixelsFromScaledDensity(context, 12);
TextDrawable drawable = TextDrawable.builder().beginConfig().useFont(Typeface.DEFAULT).textColor(new ColorInverter().getContrastColor(color)).fontSize(textSize)
.width(LabelWidthCalculator.calculateLabelWidth(labelName, Typeface.DEFAULT, textSize, AppUtil.getPixelsFromDensity(context, 8))).height(height).endConfig()
.buildRoundRect(labelName, color, AppUtil.getPixelsFromDensity(context, 18));
TextDrawable drawable =
TextDrawable.builder()
.beginConfig()
.useFont(Typeface.DEFAULT)
.textColor(new ColorInverter().getContrastColor(color))
.fontSize(textSize)
.width(
LabelWidthCalculator.calculateLabelWidth(
labelName,
Typeface.DEFAULT,
textSize,
AppUtil.getPixelsFromDensity(context, 8)))
.height(height)
.endConfig()
.buildRoundRect(
labelName,
color,
AppUtil.getPixelsFromDensity(context, 18));
labelsView.setImageDrawable(drawable);
frameLabels.addView(labelsView);
@ -231,35 +287,53 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
}
}
if(issue.getComments() > 15) {
commentIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_flame));
commentIcon.setColorFilter(context.getResources().getColor(R.color.releasePre, null));
if (issue.getComments() > 15) {
commentIcon.setImageDrawable(
ContextCompat.getDrawable(context, R.drawable.ic_flame));
commentIcon.setColorFilter(
context.getResources().getColor(R.color.releasePre, null));
}
switch(timeFormat) {
case "pretty": {
switch (timeFormat) {
case "pretty":
{
PrettyTime prettyTime = new PrettyTime(locale);
String createdTime = prettyTime.format(issue.getCreatedAt());
this.issueCreatedTime.setText(createdTime);
this.issueCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(issue.getCreatedAt()), context));
this.issueCreatedTime.setOnClickListener(
new ClickListener(
TimeHelper.customDateFormatForToastDateFormat(
issue.getCreatedAt()),
context));
break;
}
case "normal": {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
case "normal":
{
DateFormat formatter =
new SimpleDateFormat(
"yyyy-MM-dd '"
+ context.getResources()
.getString(R.string.timeAtText)
+ "' HH:mm",
locale);
String createdTime = formatter.format(issue.getCreatedAt());
this.issueCreatedTime.setText(createdTime);
break;
}
case "normal1": {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
case "normal1":
{
DateFormat formatter =
new SimpleDateFormat(
"dd-MM-yyyy '"
+ context.getResources()
.getString(R.string.timeAtText)
+ "' HH:mm",
locale);
String createdTime = formatter.format(issue.getCreatedAt());
this.issueCreatedTime.setText(createdTime);
break;
}
}
}
}
}

View File

@ -15,6 +15,7 @@ import androidx.core.widget.ImageViewCompat;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.card.MaterialCardView;
import java.util.List;
import org.gitnex.tea4j.v2.models.Label;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.CreateLabelActivity;
@ -23,12 +24,10 @@ import org.mian.gitnex.activities.RepoDetailActivity;
import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.ColorInverter;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import java.util.List;
/**
* @author M M Arif
*/
public class LabelsAdapter extends RecyclerView.Adapter<LabelsAdapter.LabelsViewHolder> {
private final List<Label> labelsList;
@ -42,10 +41,12 @@ public class LabelsAdapter extends RecyclerView.Adapter<LabelsAdapter.LabelsView
this.orgName = orgName;
}
@NonNull
@Override
public LabelsAdapter.LabelsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_labels, parent, false);
@NonNull @Override
public LabelsAdapter.LabelsViewHolder onCreateViewHolder(
@NonNull ViewGroup parent, int viewType) {
View v =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_labels, parent, false);
return new LabelsAdapter.LabelsViewHolder(v);
}
@ -93,15 +94,26 @@ public class LabelsAdapter extends RecyclerView.Adapter<LabelsAdapter.LabelsView
labelName = itemView.findViewById(R.id.labelName);
ImageView labelsOptionsMenu = itemView.findViewById(R.id.labelsOptionsMenu);
if((type.equals("repo") && !((RepoDetailActivity) itemView.getContext()).repository.getPermissions().isPush()) || (type.equals(
"org") && (((OrganizationDetailActivity) itemView.getContext()).permissions == null || !((OrganizationDetailActivity) itemView.getContext()).permissions.isIsOwner()))) {
if ((type.equals("repo")
&& !((RepoDetailActivity) itemView.getContext())
.repository
.getPermissions()
.isPush())
|| (type.equals("org")
&& (((OrganizationDetailActivity) itemView.getContext()).permissions
== null
|| !((OrganizationDetailActivity) itemView.getContext())
.permissions.isIsOwner()))) {
labelsOptionsMenu.setVisibility(View.GONE);
}
labelsOptionsMenu.setOnClickListener(v -> {
labelsOptionsMenu.setOnClickListener(
v -> {
final Context context = v.getContext();
@SuppressLint("InflateParams") View view = LayoutInflater.from(context).inflate(R.layout.bottom_sheet_labels_in_list, null);
@SuppressLint("InflateParams")
View view =
LayoutInflater.from(context)
.inflate(R.layout.bottom_sheet_labels_in_list, null);
TextView labelMenuEdit = view.findViewById(R.id.labelMenuEdit);
TextView labelMenuDelete = view.findViewById(R.id.labelMenuDelete);
@ -112,8 +124,8 @@ public class LabelsAdapter extends RecyclerView.Adapter<LabelsAdapter.LabelsView
dialog.setContentView(view);
dialog.show();
labelMenuEdit.setOnClickListener(editLabel -> {
labelMenuEdit.setOnClickListener(
editLabel -> {
Intent intent = new Intent(context, CreateLabelActivity.class);
intent.putExtra("labelId", String.valueOf(labels.getId()));
intent.putExtra("labelTitle", labels.getName());
@ -121,30 +133,37 @@ public class LabelsAdapter extends RecyclerView.Adapter<LabelsAdapter.LabelsView
intent.putExtra("labelAction", "edit");
intent.putExtra("type", type);
intent.putExtra("orgName", orgName);
if(type.equals("repo")) {
intent.putExtra(RepositoryContext.INTENT_EXTRA, ((RepoDetailActivity) itemView.getContext()).repository);
if (type.equals("repo")) {
intent.putExtra(
RepositoryContext.INTENT_EXTRA,
((RepoDetailActivity) itemView.getContext())
.repository);
}
context.startActivity(intent);
dialog.dismiss();
});
labelMenuDelete.setOnClickListener(deleteLabel -> {
labelMenuDelete.setOnClickListener(
deleteLabel -> {
RepositoryContext repo;
if(type.equals("repo")) {
repo = ((RepoDetailActivity) itemView.getContext()).repository;
}
else {
if (type.equals("repo")) {
repo =
((RepoDetailActivity) itemView.getContext())
.repository;
} else {
repo = null;
}
AlertDialogs.labelDeleteDialog(context, labels.getName(), String.valueOf(labels.getId()), type, orgName, repo);
AlertDialogs.labelDeleteDialog(
context,
labels.getName(),
String.valueOf(labels.getId()),
type,
orgName,
repo);
dialog.dismiss();
});
});
}
}
}

View File

@ -9,16 +9,15 @@ import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import org.gitnex.tea4j.v2.models.Label;
import org.mian.gitnex.R;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import org.gitnex.tea4j.v2.models.Label;
import org.mian.gitnex.R;
/**
* @author M M Arif
*/
public class LabelsListAdapter extends RecyclerView.Adapter<LabelsListAdapter.LabelsViewHolder> {
private final List<Label> labels;
@ -27,18 +26,23 @@ public class LabelsListAdapter extends RecyclerView.Adapter<LabelsListAdapter.La
private List<Integer> currentLabelsIds;
private List<Integer> labelsIds = new ArrayList<>();
public LabelsListAdapter(List<Label> labelsMain, LabelsListAdapterListener labelsListener, List<Integer> currentLabelsIds) {
public LabelsListAdapter(
List<Label> labelsMain,
LabelsListAdapterListener labelsListener,
List<Integer> currentLabelsIds) {
this.labels = labelsMain;
this.labelsListener = labelsListener;
this.currentLabelsIds = currentLabelsIds;
}
@NonNull
@Override
public LabelsListAdapter.LabelsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@NonNull @Override
public LabelsListAdapter.LabelsViewHolder onCreateViewHolder(
@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_labels_list, parent, false);
View v =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.custom_labels_list, parent, false);
return new LabelsListAdapter.LabelsViewHolder(v);
}
@ -53,9 +57,9 @@ public class LabelsListAdapter extends RecyclerView.Adapter<LabelsListAdapter.La
holder.labelText.setText(currentItem.getName());
holder.labelColor.setBackgroundColor(color);
for(int i = 0; i < labelsIds.size(); i++) {
for (int i = 0; i < labelsIds.size(); i++) {
if(labelsStrings.contains(currentItem.getName())) {
if (labelsStrings.contains(currentItem.getName())) {
holder.labelSelection.setChecked(true);
}
@ -63,9 +67,9 @@ public class LabelsListAdapter extends RecyclerView.Adapter<LabelsListAdapter.La
currentLabelsIds = new ArrayList<>(new LinkedHashSet<>(currentLabelsIds));
for(int i = 0; i < currentLabelsIds.size(); i++) {
for (int i = 0; i < currentLabelsIds.size(); i++) {
if(currentLabelsIds.contains(currentItem.getId().intValue())) {
if (currentLabelsIds.contains(currentItem.getId().intValue())) {
holder.labelSelection.setChecked(true);
labelsIds.add(currentLabelsIds.get(i));
@ -74,14 +78,13 @@ public class LabelsListAdapter extends RecyclerView.Adapter<LabelsListAdapter.La
labelsListener.labelsIdsInterface(labelsIds);
holder.labelSelection.setOnCheckedChangeListener((buttonView, isChecked) -> {
if(isChecked) {
holder.labelSelection.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
if (isChecked) {
labelsStrings.add(currentItem.getName());
labelsIds.add(currentItem.getId().intValue());
}
else {
} else {
labelsStrings.remove(currentItem.getName());
labelsIds.remove(Integer.valueOf(currentItem.getId().intValue()));
@ -111,7 +114,6 @@ public class LabelsListAdapter extends RecyclerView.Adapter<LabelsListAdapter.La
void labelsInterface(List<String> data);
void labelsIdsInterface(List<Integer> data);
}
static class LabelsViewHolder extends RecyclerView.ViewHolder {
@ -129,7 +131,5 @@ public class LabelsListAdapter extends RecyclerView.Adapter<LabelsListAdapter.La
labelText = itemView.findViewById(R.id.labelText);
labelColor = itemView.findViewById(R.id.labelColor);
}
}
}

View File

@ -13,6 +13,11 @@ import androidx.core.content.res.ResourcesCompat;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.vdurmont.emoji.EmojiParser;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import org.gitnex.tea4j.v2.models.Milestone;
import org.mian.gitnex.R;
import org.mian.gitnex.actions.MilestoneActions;
@ -22,16 +27,10 @@ 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.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
/**
* @author M M Arif
*/
public class MilestonesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final Context context;
@ -40,23 +39,27 @@ public class MilestonesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
private OnLoadMoreListener loadMoreListener;
private boolean isLoading = false, isMoreDataAvailable = true;
public MilestonesAdapter(Context ctx, List<Milestone> dataListMain, RepositoryContext repository) {
public MilestonesAdapter(
Context ctx, List<Milestone> dataListMain, RepositoryContext repository) {
this.repository = repository;
this.context = ctx;
this.dataList = dataListMain;
}
@NonNull
@Override
@NonNull @Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
return new MilestonesAdapter.DataHolder(inflater.inflate(R.layout.list_milestones, parent, false));
return new MilestonesAdapter.DataHolder(
inflater.inflate(R.layout.list_milestones, parent, false));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
if (position >= getItemCount() - 1
&& isMoreDataAvailable
&& !isLoading
&& loadMoreListener != null) {
isLoading = true;
loadMoreListener.onLoadMore();
@ -82,7 +85,7 @@ public class MilestonesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
public void setMoreDataAvailable(boolean moreDataAvailable) {
isMoreDataAvailable = moreDataAvailable;
if(!isMoreDataAvailable) {
if (!isMoreDataAvailable) {
loadMoreListener.onLoadFinished();
}
}
@ -108,7 +111,6 @@ public class MilestonesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
void onLoadMore();
void onLoadFinished();
}
class DataHolder extends RecyclerView.ViewHolder {
@ -133,15 +135,21 @@ public class MilestonesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
msProgress = itemView.findViewById(R.id.milestoneProgress);
ImageView milestonesMenu = itemView.findViewById(R.id.milestonesMenu);
if(!((RepoDetailActivity) itemView.getContext()).repository.getPermissions().isPush()) {
if (!((RepoDetailActivity) itemView.getContext())
.repository
.getPermissions()
.isPush()) {
milestonesMenu.setVisibility(View.GONE);
}
milestonesMenu.setOnClickListener(v -> {
milestonesMenu.setOnClickListener(
v -> {
Context ctx = v.getContext();
int milestoneId_ = Integer.parseInt(String.valueOf(milestones.getId()));
@SuppressLint("InflateParams") View view = LayoutInflater.from(ctx).inflate(R.layout.bottom_sheet_milestones_in_list, null);
@SuppressLint("InflateParams")
View view =
LayoutInflater.from(ctx)
.inflate(R.layout.bottom_sheet_milestones_in_list, null);
TextView closeMilestone = view.findViewById(R.id.closeMilestone);
TextView openMilestone = view.findViewById(R.id.openMilestone);
@ -150,33 +158,30 @@ public class MilestonesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
dialog.setContentView(view);
dialog.show();
if(milestones.getState().equals("open")) {
if (milestones.getState().equals("open")) {
closeMilestone.setVisibility(View.VISIBLE);
openMilestone.setVisibility(View.GONE);
}
else {
} else {
closeMilestone.setVisibility(View.GONE);
openMilestone.setVisibility(View.VISIBLE);
}
closeMilestone.setOnClickListener(v12 -> {
closeMilestone.setOnClickListener(
v12 -> {
MilestoneActions.closeMilestone(ctx, milestoneId_, repository);
dialog.dismiss();
updateAdapter(getBindingAdapterPosition());
});
openMilestone.setOnClickListener(v12 -> {
openMilestone.setOnClickListener(
v12 -> {
MilestoneActions.openMilestone(ctx, milestoneId_, repository);
dialog.dismiss();
updateAdapter(getBindingAdapterPosition());
});
});
}
@SuppressLint("SetTextI18n")
@ -189,43 +194,63 @@ public class MilestonesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
Markdown.render(context, dataModel.getTitle(), msTitle);
if(!dataModel.getDescription().equals("")) {
if (!dataModel.getDescription().equals("")) {
Markdown.render(context, EmojiParser.parseToUnicode(dataModel.getDescription()), msDescription);
}
else {
Markdown.render(
context,
EmojiParser.parseToUnicode(dataModel.getDescription()),
msDescription);
} else {
msDescription.setText(context.getString(R.string.milestoneNoDescription));
}
msOpenIssues.setText(context.getString(R.string.milestoneIssueStatusOpen, dataModel.getOpenIssues()));
msClosedIssues.setText(context.getString(R.string.milestoneIssueStatusClosed, dataModel.getClosedIssues()));
msOpenIssues.setText(
context.getString(
R.string.milestoneIssueStatusOpen, dataModel.getOpenIssues()));
msClosedIssues.setText(
context.getString(
R.string.milestoneIssueStatusClosed, dataModel.getClosedIssues()));
if((dataModel.getOpenIssues() + dataModel.getClosedIssues()) > 0) {
if ((dataModel.getOpenIssues() + dataModel.getClosedIssues()) > 0) {
if(dataModel.getOpenIssues() == 0) {
if (dataModel.getOpenIssues() == 0) {
msProgress.setProgress(100);
msProgress.setOnClickListener(new ClickListener(context.getResources().getString(R.string.milestoneCompletion, 100), context));
}
else {
msProgress.setOnClickListener(
new ClickListener(
context.getResources()
.getString(R.string.milestoneCompletion, 100),
context));
} else {
int msCompletion = (int) (100 * dataModel.getClosedIssues() / (dataModel.getOpenIssues() + dataModel.getClosedIssues()));
msProgress.setOnClickListener(new ClickListener(context.getResources().getString(R.string.milestoneCompletion, msCompletion), context));
int msCompletion =
(int)
(100
* dataModel.getClosedIssues()
/ (dataModel.getOpenIssues()
+ dataModel.getClosedIssues()));
msProgress.setOnClickListener(
new ClickListener(
context.getResources()
.getString(R.string.milestoneCompletion, msCompletion),
context));
msProgress.setProgress(msCompletion);
}
}
else {
} else {
msProgress.setProgress(0);
msProgress.setOnClickListener(new ClickListener(context.getResources().getString(R.string.milestoneCompletion, 0), context));
msProgress.setOnClickListener(
new ClickListener(
context.getResources().getString(R.string.milestoneCompletion, 0),
context));
}
if(dataModel.getDueOn() != null) {
if (dataModel.getDueOn() != null) {
String TAG = "MilestonesAdapter";
if(timeFormat.equals("normal") || timeFormat.equals("pretty")) {
if (timeFormat.equals("normal") || timeFormat.equals("pretty")) {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", new Locale(locale));
Date date = dataModel.getDueOn();
@ -233,16 +258,22 @@ public class MilestonesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
assert date != null;
String dueDate = formatter.format(date);
if(date.before(new Date())) {
msDueDate.setTextColor(ResourcesCompat.getColor(context.getResources(), R.color.darkRed, null));
if (date.before(new Date())) {
msDueDate.setTextColor(
ResourcesCompat.getColor(
context.getResources(), R.color.darkRed, null));
}
msDueDate.setText(dueDate);
msDueDate.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(dataModel.getDueOn()), context));
}
else if(timeFormat.equals("normal1")) {
msDueDate.setOnClickListener(
new ClickListener(
TimeHelper.customDateFormatForToastDateFormat(
dataModel.getDueOn()),
context));
} else if (timeFormat.equals("normal1")) {
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", new Locale(locale));
SimpleDateFormat formatter =
new SimpleDateFormat("dd-MM-yyyy", new Locale(locale));
Date date1 = dataModel.getDueOn();
@ -251,13 +282,10 @@ public class MilestonesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
msDueDate.setText(dueDate);
}
}
else {
} else {
msDueDate.setText(context.getString(R.string.milestoneNoDueDate));
}
}
}
}

View File

@ -14,6 +14,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.List;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.RepoDetailActivity;
import org.mian.gitnex.database.api.BaseApi;
@ -22,13 +23,12 @@ import org.mian.gitnex.database.models.Repository;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import java.util.List;
/**
* @author M M Arif
*/
public class MostVisitedReposAdapter extends RecyclerView.Adapter<MostVisitedReposAdapter.MostVisitedViewHolder> {
public class MostVisitedReposAdapter
extends RecyclerView.Adapter<MostVisitedReposAdapter.MostVisitedViewHolder> {
private List<Repository> mostVisitedReposList;
private final Context ctx;
@ -53,31 +53,47 @@ public class MostVisitedReposAdapter extends RecyclerView.Adapter<MostVisitedRep
mostVisited = itemView.findViewById(R.id.most_visited);
resetCounter = itemView.findViewById(R.id.reset_counter);
itemView.setOnClickListener(v -> {
itemView.setOnClickListener(
v -> {
Context context = v.getContext();
RepositoryContext repositoryContext = new RepositoryContext(repository.getRepositoryOwner(), repository.getRepositoryName(), context);
Intent intent = repositoryContext.getIntent(context, RepoDetailActivity.class);
RepositoryContext repositoryContext =
new RepositoryContext(
repository.getRepositoryOwner(),
repository.getRepositoryName(),
context);
Intent intent =
repositoryContext.getIntent(context, RepoDetailActivity.class);
context.startActivity(intent);
});
resetCounter.setOnClickListener(itemDelete -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx, R.style.ThemeOverlay_Material3_Dialog_Alert);
materialAlertDialogBuilder.setTitle(ctx.getString(R.string.reset)).setMessage(ctx.getString(R.string.resetCounterDialogMessage, repository.getRepositoryName()))
.setPositiveButton(R.string.reset, (dialog, whichButton) -> {
resetCounter.setOnClickListener(
itemDelete -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(
ctx, R.style.ThemeOverlay_Material3_Dialog_Alert);
materialAlertDialogBuilder
.setTitle(ctx.getString(R.string.reset))
.setMessage(
ctx.getString(
R.string.resetCounterDialogMessage,
repository.getRepositoryName()))
.setPositiveButton(
R.string.reset,
(dialog, whichButton) -> {
int getRepositoryId = repository.getRepositoryId();
resetRepositoryCounter(getBindingAdapterPosition());
RepositoriesApi repositoriesApi = BaseApi.getInstance(ctx, RepositoriesApi.class);
RepositoriesApi repositoriesApi =
BaseApi.getInstance(ctx, RepositoriesApi.class);
assert repositoriesApi != null;
repositoriesApi.updateRepositoryMostVisited(0, getRepositoryId);
}).setNeutralButton(R.string.cancelButton, null).show();
repositoriesApi.updateRepositoryMostVisited(
0, getRepositoryId);
})
.setNeutralButton(R.string.cancelButton, null)
.show();
});
}
}
private void resetRepositoryCounter(int position) {
@ -93,10 +109,11 @@ public class MostVisitedReposAdapter extends RecyclerView.Adapter<MostVisitedRep
this.mostVisitedReposList = reposListMain;
}
@NonNull
@Override
@NonNull @Override
public MostVisitedViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_most_visited_repos, parent, false);
View v =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_most_visited_repos, parent, false);
return new MostVisitedViewHolder(v);
}
@ -110,7 +127,16 @@ public class MostVisitedReposAdapter extends RecyclerView.Adapter<MostVisitedRep
ColorGenerator generator = ColorGenerator.Companion.getMATERIAL();
int color = generator.getColor(currentItem.getRepositoryOwner());
String firstCharacter = String.valueOf(currentItem.getRepositoryOwner().charAt(0));
TextDrawable drawable = TextDrawable.builder().beginConfig().useFont(Typeface.DEFAULT).fontSize(18).toUpperCase().width(28).height(28).endConfig().buildRoundRect(firstCharacter, color, 14);
TextDrawable drawable =
TextDrawable.builder()
.beginConfig()
.useFont(Typeface.DEFAULT)
.fontSize(18)
.toUpperCase()
.width(28)
.height(28)
.endConfig()
.buildRoundRect(firstCharacter, color, 14);
holder.image.setImageDrawable(drawable);
holder.orgName.setText(currentItem.getRepositoryOwner());
@ -133,5 +159,4 @@ public class MostVisitedReposAdapter extends RecyclerView.Adapter<MostVisitedRep
mostVisitedReposList = list;
notifyDataChanged();
}
}

View File

@ -10,15 +10,15 @@ import androidx.annotation.NonNull;
import androidx.core.content.res.ResourcesCompat;
import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable;
import java.util.List;
import org.gitnex.tea4j.v2.models.Email;
import org.mian.gitnex.R;
import java.util.List;
/**
* @author M M Arif
*/
public class MyProfileEmailsAdapter extends RecyclerView.Adapter<MyProfileEmailsAdapter.EmailsViewHolder> {
public class MyProfileEmailsAdapter
extends RecyclerView.Adapter<MyProfileEmailsAdapter.EmailsViewHolder> {
private final List<Email> emailsList;
private final Context context;
@ -28,29 +28,45 @@ public class MyProfileEmailsAdapter extends RecyclerView.Adapter<MyProfileEmails
this.emailsList = emailsListMain;
}
@NonNull
@Override
public MyProfileEmailsAdapter.EmailsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_profile_emails, parent, false);
@NonNull @Override
public MyProfileEmailsAdapter.EmailsViewHolder onCreateViewHolder(
@NonNull ViewGroup parent, int viewType) {
View v =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_profile_emails, parent, false);
return new MyProfileEmailsAdapter.EmailsViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull MyProfileEmailsAdapter.EmailsViewHolder holder, int position) {
public void onBindViewHolder(
@NonNull MyProfileEmailsAdapter.EmailsViewHolder holder, int position) {
Email currentItem = emailsList.get(position);
holder.userEmail.setText(currentItem.getEmail());
if(currentItem.isPrimary()) {
TextDrawable drawable = TextDrawable.builder().beginConfig().textColor(ResourcesCompat.getColor(context.getResources(), R.color.colorWhite, null)).fontSize(36).width(220).height(60).endConfig()
.buildRoundRect(context.getResources().getString(R.string.emailTypeText), ResourcesCompat.getColor(context.getResources(), R.color.tooltipBackground, null), 8);
if (currentItem.isPrimary()) {
TextDrawable drawable =
TextDrawable.builder()
.beginConfig()
.textColor(
ResourcesCompat.getColor(
context.getResources(), R.color.colorWhite, null))
.fontSize(36)
.width(220)
.height(60)
.endConfig()
.buildRoundRect(
context.getResources().getString(R.string.emailTypeText),
ResourcesCompat.getColor(
context.getResources(),
R.color.tooltipBackground,
null),
8);
holder.emailPrimary.setImageDrawable(drawable);
}
else {
} else {
holder.emailPrimary.setVisibility(View.GONE);
}
}
@Override
@ -68,9 +84,6 @@ public class MyProfileEmailsAdapter extends RecyclerView.Adapter<MyProfileEmails
emailPrimary = itemView.findViewById(R.id.emailPrimary);
userEmail = itemView.findViewById(R.id.userEmail);
}
}
}

View File

@ -14,16 +14,15 @@ import androidx.core.content.res.ResourcesCompat;
import androidx.core.text.HtmlCompat;
import androidx.core.widget.ImageViewCompat;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.gitnex.tea4j.v2.models.NotificationThread;
import org.mian.gitnex.R;
import org.mian.gitnex.helpers.AppUtil;
import java.util.List;
/**
* @author opyale
*/
public class NotificationsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final Context context;
@ -32,7 +31,11 @@ public class NotificationsAdapter extends RecyclerView.Adapter<RecyclerView.View
private List<NotificationThread> notificationThreads;
private boolean isLoading = false, isMoreDataAvailable = true;
public NotificationsAdapter(Context context, List<NotificationThread> notificationThreads, OnMoreClickedListener onMoreClickedListener, OnNotificationClickedListener onNotificationClickedListener) {
public NotificationsAdapter(
Context context,
List<NotificationThread> notificationThreads,
OnMoreClickedListener onMoreClickedListener,
OnNotificationClickedListener onNotificationClickedListener) {
this.context = context;
this.notificationThreads = notificationThreads;
@ -40,19 +43,20 @@ public class NotificationsAdapter extends RecyclerView.Adapter<RecyclerView.View
this.onNotificationClickedListener = onNotificationClickedListener;
}
@NonNull
@Override
@NonNull @Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
return new NotificationsAdapter.NotificationsHolder(inflater.inflate(R.layout.list_notifications, parent, false));
return new NotificationsAdapter.NotificationsHolder(
inflater.inflate(R.layout.list_notifications, parent, false));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading) {
if (position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading) {
isLoading = true;
}
((NotificationsAdapter.NotificationsHolder) holder).bindData(notificationThreads.get(position));
((NotificationsAdapter.NotificationsHolder) holder)
.bindData(notificationThreads.get(position));
}
@Override
@ -83,13 +87,11 @@ public class NotificationsAdapter extends RecyclerView.Adapter<RecyclerView.View
public interface OnNotificationClickedListener {
void onNotificationClicked(NotificationThread notificationThread);
}
public interface OnMoreClickedListener {
void onMoreClicked(NotificationThread notificationThread);
}
class NotificationsHolder extends RecyclerView.ViewHolder {
@ -118,30 +120,37 @@ public class NotificationsAdapter extends RecyclerView.Adapter<RecyclerView.View
String url = notificationThread.getSubject().getUrl();
String subjectId = "";
if(StringUtils.containsAny(notificationThread.getSubject().getType().toLowerCase(), "pull", "issue")) {
subjectId = "<font color='" + ResourcesCompat.getColor(context.getResources(), R.color.lightGray, null) + "'>" + context.getResources().getString(R.string.hash) + url.substring(
url.lastIndexOf("/") + 1) + "</font>";
if (StringUtils.containsAny(
notificationThread.getSubject().getType().toLowerCase(), "pull", "issue")) {
subjectId =
"<font color='"
+ ResourcesCompat.getColor(
context.getResources(), R.color.lightGray, null)
+ "'>"
+ context.getResources().getString(R.string.hash)
+ url.substring(url.lastIndexOf("/") + 1)
+ "</font>";
}
subject.setText(HtmlCompat.fromHtml(subjectId + " " + notificationThread.getSubject().getTitle(), HtmlCompat.FROM_HTML_MODE_LEGACY));
if(!notificationThread.getSubject().getType().equalsIgnoreCase("repository")) {
subject.setText(
HtmlCompat.fromHtml(
subjectId + " " + notificationThread.getSubject().getTitle(),
HtmlCompat.FROM_HTML_MODE_LEGACY));
if (!notificationThread.getSubject().getType().equalsIgnoreCase("repository")) {
repository.setText(notificationThread.getRepository().getFullName());
}
else {
} else {
repository.setVisibility(View.GONE);
pinned.setVisibility(View.GONE);
pinned = itemView.findViewById(R.id.pinnedVertical);
}
if(notificationThread.isPinned()) {
if (notificationThread.isPinned()) {
pinned.setVisibility(View.VISIBLE);
}
else {
} else {
pinned.setVisibility(View.GONE);
}
switch(notificationThread.getSubject().getType().toLowerCase()) {
switch (notificationThread.getSubject().getType().toLowerCase()) {
case "pull":
type.setImageResource(R.drawable.ic_pull_request);
break;
@ -158,29 +167,36 @@ public class NotificationsAdapter extends RecyclerView.Adapter<RecyclerView.View
default:
type.setImageResource(R.drawable.ic_question);
break;
}
switch(notificationThread.getSubject().getState().toLowerCase()) {
switch (notificationThread.getSubject().getState().toLowerCase()) {
case "closed":
ImageViewCompat.setImageTintList(type, ColorStateList.valueOf(context.getResources().getColor(R.color.iconIssuePrClosedColor)));
ImageViewCompat.setImageTintList(
type,
ColorStateList.valueOf(
context.getResources()
.getColor(R.color.iconIssuePrClosedColor)));
break;
case "merged":
ImageViewCompat.setImageTintList(type, ColorStateList.valueOf(context.getResources().getColor(R.color.iconPrMergedColor)));
ImageViewCompat.setImageTintList(
type,
ColorStateList.valueOf(
context.getResources().getColor(R.color.iconPrMergedColor)));
break;
default:
case "open":
ImageViewCompat.setImageTintList(type, ColorStateList.valueOf(AppUtil.getColorFromAttribute(context, R.attr.iconsColor)));
ImageViewCompat.setImageTintList(
type,
ColorStateList.valueOf(
AppUtil.getColorFromAttribute(context, R.attr.iconsColor)));
break;
}
frame.setOnClickListener(v -> onNotificationClickedListener.onNotificationClicked(notificationThread));
frame.setOnClickListener(
v -> onNotificationClickedListener.onNotificationClicked(notificationThread));
more.setOnClickListener(v -> onMoreClickedListener.onMoreClicked(notificationThread));
}
}
}

View File

@ -11,6 +11,7 @@ import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
import org.gitnex.tea4j.v2.models.User;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.BaseActivity;
@ -21,7 +22,6 @@ import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.Toasty;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -29,99 +29,112 @@ import retrofit2.Response;
/**
* @author M M Arif
*/
public class OrganizationAddUserToTeamMemberAdapter extends RecyclerView.Adapter<OrganizationAddUserToTeamMemberAdapter.UserSearchViewHolder> {
public class OrganizationAddUserToTeamMemberAdapter
extends RecyclerView.Adapter<OrganizationAddUserToTeamMemberAdapter.UserSearchViewHolder> {
private final List<User> usersSearchList;
private final Context context;
private final int teamId;
private final String orgName;
public OrganizationAddUserToTeamMemberAdapter(List<User> dataList, Context ctx, int teamId, String orgName) {
public OrganizationAddUserToTeamMemberAdapter(
List<User> dataList, Context ctx, int teamId, String orgName) {
this.context = ctx;
this.usersSearchList = dataList;
this.teamId = teamId;
this.orgName = orgName;
}
@NonNull
@Override
public OrganizationAddUserToTeamMemberAdapter.UserSearchViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_collaborators_search, parent, false);
@NonNull @Override
public OrganizationAddUserToTeamMemberAdapter.UserSearchViewHolder onCreateViewHolder(
@NonNull ViewGroup parent, int viewType) {
View v =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_collaborators_search, parent, false);
return new OrganizationAddUserToTeamMemberAdapter.UserSearchViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull final OrganizationAddUserToTeamMemberAdapter.UserSearchViewHolder holder, int position) {
public void onBindViewHolder(
@NonNull final OrganizationAddUserToTeamMemberAdapter.UserSearchViewHolder holder,
int position) {
User currentItem = usersSearchList.get(position);
holder.userInfo = currentItem;
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
if(!currentItem.getFullName().equals("")) {
if (!currentItem.getFullName().equals("")) {
holder.userFullName.setText(Html.fromHtml(currentItem.getFullName()));
}
else {
} else {
holder.userFullName.setText(context.getResources().getString(R.string.usernameWithAt, currentItem.getLogin()));
holder.userFullName.setText(
context.getResources()
.getString(R.string.usernameWithAt, currentItem.getLogin()));
}
holder.userName.setText(context.getResources().getString(R.string.usernameWithAt, currentItem.getLogin()));
holder.userName.setText(
context.getResources().getString(R.string.usernameWithAt, currentItem.getLogin()));
if(!currentItem.getAvatarUrl().equals("")) {
PicassoService.getInstance(context).get().load(currentItem.getAvatarUrl()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop()
if (!currentItem.getAvatarUrl().equals("")) {
PicassoService.getInstance(context)
.get()
.load(currentItem.getAvatarUrl())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(120, 120)
.centerCrop()
.into(holder.userAvatar);
}
if(getItemCount() > 0) {
if (getItemCount() > 0) {
final String loginUid = ((BaseActivity) context).getAccount().getAccount().getUserName();
final String loginUid =
((BaseActivity) context).getAccount().getAccount().getUserName();
Call<User> call = RetrofitClient.getApiInterface(context).orgListTeamMember((long) teamId, currentItem.getLogin());
Call<User> call =
RetrofitClient.getApiInterface(context)
.orgListTeamMember((long) teamId, currentItem.getLogin());
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<User> call, @NonNull Response<User> response) {
public void onResponse(
@NonNull Call<User> call, @NonNull Response<User> response) {
if(response.code() == 200) {
if (response.code() == 200) {
if(!currentItem.getLogin().equals(loginUid)) {
if (!currentItem.getLogin().equals(loginUid)) {
holder.addMemberButtonRemove.setVisibility(View.VISIBLE);
}
else {
} else {
holder.addMemberButtonRemove.setVisibility(View.GONE);
}
}
else if(response.code() == 404) {
} else if (response.code() == 404) {
if(!currentItem.getLogin().equals(loginUid)) {
if (!currentItem.getLogin().equals(loginUid)) {
holder.addMemberButtonAdd.setVisibility(View.VISIBLE);
}
else {
} else {
holder.addMemberButtonAdd.setVisibility(View.GONE);
}
}
else {
} else {
holder.addMemberButtonRemove.setVisibility(View.GONE);
holder.addMemberButtonAdd.setVisibility(View.GONE);
}
}
@Override
public void onFailure(@NonNull Call<User> call, @NonNull Throwable t) {
Toasty.error(context, context.getResources().getString(R.string.genericServerResponseError));
Toasty.error(
context,
context.getResources()
.getString(R.string.genericServerResponseError));
}
});
}
}
@Override
@ -147,26 +160,45 @@ public class OrganizationAddUserToTeamMemberAdapter extends RecyclerView.Adapter
addMemberButtonAdd = itemView.findViewById(R.id.addCollaboratorButtonAdd);
addMemberButtonRemove = itemView.findViewById(R.id.addCollaboratorButtonRemove);
addMemberButtonAdd.setOnClickListener(v -> AlertDialogs.addMemberDialog(context, userInfo.getLogin(), Integer.parseInt(String.valueOf(teamId))));
addMemberButtonRemove.setOnClickListener(v -> AlertDialogs.removeMemberDialog(context, userInfo.getLogin(), Integer.parseInt(String.valueOf(teamId))));
addMemberButtonAdd.setOnClickListener(
v ->
AlertDialogs.addMemberDialog(
context,
userInfo.getLogin(),
Integer.parseInt(String.valueOf(teamId))));
addMemberButtonRemove.setOnClickListener(
v ->
AlertDialogs.removeMemberDialog(
context,
userInfo.getLogin(),
Integer.parseInt(String.valueOf(teamId))));
new Handler().postDelayed(() -> {
if(!AppUtil.checkGhostUsers(userInfo.getLogin())) {
new Handler()
.postDelayed(
() -> {
if (!AppUtil.checkGhostUsers(userInfo.getLogin())) {
userAvatar.setOnClickListener(loginId -> {
Intent intent = new Intent(context, ProfileActivity.class);
userAvatar.setOnClickListener(
loginId -> {
Intent intent =
new Intent(context, ProfileActivity.class);
intent.putExtra("username", userInfo.getLogin());
context.startActivity(intent);
});
userAvatar.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, userInfo.getLogin(), context.getString(R.string.copyLoginIdToClipBoard, userInfo.getLogin()));
userAvatar.setOnLongClickListener(
loginId -> {
AppUtil.copyToClipboard(
context,
userInfo.getLogin(),
context.getString(
R.string.copyLoginIdToClipBoard,
userInfo.getLogin()));
return true;
});
}
}, 500);
},
500);
}
}
}

View File

@ -7,18 +7,18 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
import org.gitnex.tea4j.v2.models.User;
import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation;
import java.util.List;
/**
* @author opyale
*/
public class OrganizationTeamMembersPreviewAdapter extends RecyclerView.Adapter<OrganizationTeamMembersPreviewAdapter.ViewHolder> {
public class OrganizationTeamMembersPreviewAdapter
extends RecyclerView.Adapter<OrganizationTeamMembersPreviewAdapter.ViewHolder> {
private final Context context;
private final List<User> userData;
@ -28,10 +28,11 @@ public class OrganizationTeamMembersPreviewAdapter extends RecyclerView.Adapter<
this.userData = userInfo;
}
@NonNull
@Override
@NonNull @Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(context).inflate(R.layout.list_organization_members_preview, parent, false);
View v =
LayoutInflater.from(context)
.inflate(R.layout.list_organization_members_preview, parent, false);
return new ViewHolder(v);
}
@ -39,8 +40,14 @@ public class OrganizationTeamMembersPreviewAdapter extends RecyclerView.Adapter<
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
User userInfo = userData.get(position);
PicassoService.getInstance(context).get().load(userInfo.getAvatarUrl()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(AppUtil.getPixelsFromDensity(context, 3), 0)).resize(120, 120)
.centerCrop().into(holder.avatar);
PicassoService.getInstance(context)
.get()
.load(userInfo.getAvatarUrl())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(AppUtil.getPixelsFromDensity(context, 3), 0))
.resize(120, 120)
.centerCrop()
.into(holder.avatar);
}
@Override
@ -56,7 +63,5 @@ public class OrganizationTeamMembersPreviewAdapter extends RecyclerView.Adapter<
super(itemView);
avatar = itemView.findViewById(R.id.avatar);
}
}
}

View File

@ -13,6 +13,9 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import org.gitnex.tea4j.v2.models.Repository;
import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService;
@ -20,9 +23,6 @@ import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -30,8 +30,8 @@ import retrofit2.Response;
/**
* @author M M Arif
*/
public class OrganizationTeamRepositoriesAdapter extends RecyclerView.Adapter<OrganizationTeamRepositoriesAdapter.TeamReposViewHolder> {
public class OrganizationTeamRepositoriesAdapter
extends RecyclerView.Adapter<OrganizationTeamRepositoriesAdapter.TeamReposViewHolder> {
private final List<Repository> reposList;
private final Context context;
@ -40,7 +40,8 @@ public class OrganizationTeamRepositoriesAdapter extends RecyclerView.Adapter<Or
private final String teamName;
private final List<Repository> reposArr;
public OrganizationTeamRepositoriesAdapter(List<Repository> dataList, Context ctx, int teamId, String orgName, String teamName) {
public OrganizationTeamRepositoriesAdapter(
List<Repository> dataList, Context ctx, int teamId, String orgName, String teamName) {
this.context = ctx;
this.reposList = dataList;
this.teamId = teamId;
@ -65,44 +66,62 @@ public class OrganizationTeamRepositoriesAdapter extends RecyclerView.Adapter<Or
itemView.findViewById(R.id.userName).setVisibility(View.GONE);
addRepoButtonAdd = itemView.findViewById(R.id.addCollaboratorButtonAdd);
ImageView addRepoButtonRemove = itemView.findViewById(R.id.addCollaboratorButtonRemove);
//addRepoButtonAdd.setVisibility(View.VISIBLE);
//addRepoButtonRemove.setVisibility(View.GONE);
// addRepoButtonAdd.setVisibility(View.VISIBLE);
// addRepoButtonRemove.setVisibility(View.GONE);
new Handler(Looper.getMainLooper()).postDelayed(OrganizationTeamRepositoriesAdapter.this::getTeamRepos, 200);
new Handler(Looper.getMainLooper())
.postDelayed(OrganizationTeamRepositoriesAdapter.this::getTeamRepos, 200);
new Handler(Looper.getMainLooper()).postDelayed(() -> {
if(reposArr.size() > 0) {
for(int i = 0; i < reposArr.size(); i++) {
if(!reposArr.get(i).getName().equals(repoInfo.getName())) {
new Handler(Looper.getMainLooper())
.postDelayed(
() -> {
if (reposArr.size() > 0) {
for (int i = 0; i < reposArr.size(); i++) {
if (!reposArr.get(i).getName().equals(repoInfo.getName())) {
addRepoButtonAdd.setVisibility(View.VISIBLE);
}
else {
} else {
addRepoButtonAdd.setVisibility(View.GONE);
}
}
}
else {
} else {
addRepoButtonAdd.setVisibility(View.VISIBLE);
}
}, 500);
},
500);
addRepoButtonAdd.setOnClickListener(v -> AlertDialogs.addRepoDialog(context, orgName, repoInfo.getName(), Integer.parseInt(String.valueOf(teamId)), teamName));
addRepoButtonAdd.setOnClickListener(
v ->
AlertDialogs.addRepoDialog(
context,
orgName,
repoInfo.getName(),
Integer.parseInt(String.valueOf(teamId)),
teamName));
addRepoButtonRemove.setOnClickListener(v -> AlertDialogs.removeRepoDialog(context, orgName, repoInfo.getName(), Integer.parseInt(String.valueOf(teamId)), teamName));
addRepoButtonRemove.setOnClickListener(
v ->
AlertDialogs.removeRepoDialog(
context,
orgName,
repoInfo.getName(),
Integer.parseInt(String.valueOf(teamId)),
teamName));
}
}
}
@NonNull
@Override
public OrganizationTeamRepositoriesAdapter.TeamReposViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_collaborators_search, parent, false);
@NonNull @Override
public OrganizationTeamRepositoriesAdapter.TeamReposViewHolder onCreateViewHolder(
@NonNull ViewGroup parent, int viewType) {
View v =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_collaborators_search, parent, false);
return new OrganizationTeamRepositoriesAdapter.TeamReposViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull final OrganizationTeamRepositoriesAdapter.TeamReposViewHolder holder, int position) {
public void onBindViewHolder(
@NonNull final OrganizationTeamRepositoriesAdapter.TeamReposViewHolder holder,
int position) {
Repository currentItem = reposList.get(position);
holder.repoInfo = currentItem;
@ -110,17 +129,33 @@ public class OrganizationTeamRepositoriesAdapter extends RecyclerView.Adapter<Or
holder.name.setText(currentItem.getName());
TextDrawable drawable = TextDrawable.builder().beginConfig().useFont(Typeface.DEFAULT).fontSize(18).toUpperCase().width(28).height(28).endConfig()
.buildRoundRect(String.valueOf(currentItem.getFullName().charAt(0)), ColorGenerator.Companion.getMATERIAL().getColor(currentItem.getName()), 14);
TextDrawable drawable =
TextDrawable.builder()
.beginConfig()
.useFont(Typeface.DEFAULT)
.fontSize(18)
.toUpperCase()
.width(28)
.height(28)
.endConfig()
.buildRoundRect(
String.valueOf(currentItem.getFullName().charAt(0)),
ColorGenerator.Companion.getMATERIAL()
.getColor(currentItem.getName()),
14);
if(currentItem.getAvatarUrl() != null && !currentItem.getAvatarUrl().equals("")) {
PicassoService.getInstance(context).get().load(currentItem.getAvatarUrl()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop()
if (currentItem.getAvatarUrl() != null && !currentItem.getAvatarUrl().equals("")) {
PicassoService.getInstance(context)
.get()
.load(currentItem.getAvatarUrl())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(120, 120)
.centerCrop()
.into(holder.repoAvatar);
}
else {
} else {
holder.repoAvatar.setImageDrawable(drawable);
}
}
@Override
@ -130,26 +165,31 @@ public class OrganizationTeamRepositoriesAdapter extends RecyclerView.Adapter<Or
private void getTeamRepos() {
if(getItemCount() > 0) {
Call<List<Repository>> call = RetrofitClient.getApiInterface(context).orgListTeamRepos((long) teamId, 1, 50);
if (getItemCount() > 0) {
Call<List<Repository>> call =
RetrofitClient.getApiInterface(context).orgListTeamRepos((long) teamId, 1, 50);
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<Repository>> call, @NonNull Response<List<Repository>> response) {
public void onResponse(
@NonNull Call<List<Repository>> call,
@NonNull Response<List<Repository>> response) {
if(response.code() == 200) {
if (response.code() == 200) {
for(int i = 0; i < Objects.requireNonNull(response.body()).size(); i++) {
for (int i = 0;
i < Objects.requireNonNull(response.body()).size();
i++) {
reposArr.addAll(response.body());
}
}
}
@Override
public void onFailure(@NonNull Call<List<Repository>> call, @NonNull Throwable t) {
}
public void onFailure(
@NonNull Call<List<Repository>> call, @NonNull Throwable t) {}
});
}
}
}

View File

@ -12,15 +12,15 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.gitnex.tea4j.v2.models.OrganizationPermissions;
import org.gitnex.tea4j.v2.models.Team;
import org.gitnex.tea4j.v2.models.User;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.OrganizationTeamInfoActivity;
import org.mian.gitnex.clients.RetrofitClient;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -28,8 +28,9 @@ import retrofit2.Response;
/**
* @author M M Arif
*/
public class OrganizationTeamsAdapter extends RecyclerView.Adapter<OrganizationTeamsAdapter.OrgTeamsViewHolder> implements Filterable {
public class OrganizationTeamsAdapter
extends RecyclerView.Adapter<OrganizationTeamsAdapter.OrgTeamsViewHolder>
implements Filterable {
private final List<Team> teamList;
private final Context context;
@ -62,10 +63,12 @@ public class OrganizationTeamsAdapter extends RecyclerView.Adapter<OrganizationT
userInfos = new ArrayList<>();
adapter = new OrganizationTeamMembersPreviewAdapter(itemView.getContext(), userInfos);
membersPreview.setLayoutManager(new LinearLayoutManager(itemView.getContext(), RecyclerView.HORIZONTAL, false));
membersPreview.setLayoutManager(
new LinearLayoutManager(itemView.getContext(), RecyclerView.HORIZONTAL, false));
membersPreview.setAdapter(adapter);
itemView.setOnClickListener(v -> {
itemView.setOnClickListener(
v -> {
Context context = v.getContext();
Intent intent = new Intent(context, OrganizationTeamInfoActivity.class);
@ -75,10 +78,13 @@ public class OrganizationTeamsAdapter extends RecyclerView.Adapter<OrganizationT
context.startActivity(intent);
});
}
}
public OrganizationTeamsAdapter(Context ctx, List<Team> teamListMain, OrganizationPermissions permissions, String orgName) {
public OrganizationTeamsAdapter(
Context ctx,
List<Team> teamListMain,
OrganizationPermissions permissions,
String orgName) {
this.context = ctx;
this.teamList = teamListMain;
this.permissions = permissions;
@ -86,15 +92,18 @@ public class OrganizationTeamsAdapter extends RecyclerView.Adapter<OrganizationT
this.orgName = orgName;
}
@NonNull
@Override
public OrganizationTeamsAdapter.OrgTeamsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_organization_teams, parent, false);
@NonNull @Override
public OrganizationTeamsAdapter.OrgTeamsViewHolder onCreateViewHolder(
@NonNull ViewGroup parent, int viewType) {
View v =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_organization_teams, parent, false);
return new OrganizationTeamsAdapter.OrgTeamsViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull OrganizationTeamsAdapter.OrgTeamsViewHolder holder, int position) {
public void onBindViewHolder(
@NonNull OrganizationTeamsAdapter.OrgTeamsViewHolder holder, int position) {
Team currentItem = teamList.get(position);
@ -107,28 +116,37 @@ public class OrganizationTeamsAdapter extends RecyclerView.Adapter<OrganizationT
holder.userInfos.clear();
holder.adapter.notifyDataSetChanged();
RetrofitClient.getApiInterface(context).orgListTeamMembers(currentItem.getId(), null, null).enqueue(new Callback<List<User>>() {
RetrofitClient.getApiInterface(context)
.orgListTeamMembers(currentItem.getId(), null, null)
.enqueue(
new Callback<List<User>>() {
@Override
public void onResponse(@NonNull Call<List<User>> call, @NonNull Response<List<User>> response) {
if(response.isSuccessful() && response.body() != null && response.body().size() > 0) {
public void onResponse(
@NonNull Call<List<User>> call,
@NonNull Response<List<User>> response) {
if (response.isSuccessful()
&& response.body() != null
&& response.body().size() > 0) {
holder.membersPreviewFrame.setVisibility(View.VISIBLE);
holder.userInfos.addAll(response.body().stream().limit(Math.min(response.body().size(), 6)).collect(Collectors.toList()));
holder.userInfos.addAll(
response.body().stream()
.limit(Math.min(response.body().size(), 6))
.collect(Collectors.toList()));
holder.adapter.notifyDataSetChanged();
}
}
@Override
public void onFailure(@NonNull Call<List<User>> call, @NonNull Throwable t) {
}
public void onFailure(
@NonNull Call<List<User>> call, @NonNull Throwable t) {}
});
if(currentItem.getDescription() != null && !currentItem.getDescription().isEmpty()) {
if (currentItem.getDescription() != null && !currentItem.getDescription().isEmpty()) {
holder.teamDescription.setVisibility(View.VISIBLE);
holder.teamDescription.setText(currentItem.getDescription());
}
else {
} else {
holder.teamDescription.setVisibility(View.GONE);
holder.teamDescription.setText("");
}
@ -144,19 +162,22 @@ public class OrganizationTeamsAdapter extends RecyclerView.Adapter<OrganizationT
return orgTeamsFilter;
}
private final Filter orgTeamsFilter = new Filter() {
private final Filter orgTeamsFilter =
new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<Team> filteredList = new ArrayList<>();
if(constraint == null || constraint.length() == 0) {
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(teamListFull);
}
else {
} else {
String filterPattern = constraint.toString().toLowerCase().trim();
for(Team item : teamListFull) {
if(item.getName().toLowerCase().contains(filterPattern) || item.getDescription().toLowerCase().contains(filterPattern)) {
for (Team item : teamListFull) {
if (item.getName().toLowerCase().contains(filterPattern)
|| item.getDescription()
.toLowerCase()
.contains(filterPattern)) {
filteredList.add(item);
}
}
@ -175,5 +196,4 @@ public class OrganizationTeamsAdapter extends RecyclerView.Adapter<OrganizationT
notifyDataSetChanged();
}
};
}

View File

@ -12,43 +12,46 @@ import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
import org.gitnex.tea4j.v2.models.Organization;
import org.mian.gitnex.R;
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 java.util.ArrayList;
import java.util.List;
/**
* @author M M Arif
*/
public class OrganizationsListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements Filterable {
public class OrganizationsListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
implements Filterable {
private final Context context;
private final List<Organization> orgListFull;
private List<Organization> orgList;
private OnLoadMoreListener loadMoreListener;
private boolean isLoading = false, isMoreDataAvailable = true;
private final Filter orgFilter = new Filter() {
private final Filter orgFilter =
new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<Organization> filteredList = new ArrayList<>();
if(constraint == null || constraint.length() == 0) {
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(orgListFull);
}
else {
} else {
String filterPattern = constraint.toString().toLowerCase().trim();
for(Organization item : orgListFull) {
if(item.getUsername().toLowerCase().contains(filterPattern) || item.getDescription().toLowerCase().contains(filterPattern)) {
for (Organization item : orgListFull) {
if (item.getUsername().toLowerCase().contains(filterPattern)
|| item.getDescription()
.toLowerCase()
.contains(filterPattern)) {
filteredList.add(item);
}
}
@ -75,16 +78,19 @@ public class OrganizationsListAdapter extends RecyclerView.Adapter<RecyclerView.
orgListFull = new ArrayList<>(orgList);
}
@NonNull
@Override
@NonNull @Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
return new OrganizationsListAdapter.OrgHolder(inflater.inflate(R.layout.list_organizations, parent, false));
return new OrganizationsListAdapter.OrgHolder(
inflater.inflate(R.layout.list_organizations, parent, false));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
if (position >= getItemCount() - 1
&& isMoreDataAvailable
&& !isLoading
&& loadMoreListener != null) {
isLoading = true;
loadMoreListener.onLoadMore();
}
@ -104,7 +110,7 @@ public class OrganizationsListAdapter extends RecyclerView.Adapter<RecyclerView.
public void setMoreDataAvailable(boolean moreDataAvailable) {
isMoreDataAvailable = moreDataAvailable;
if(!isMoreDataAvailable) {
if (!isMoreDataAvailable) {
loadMoreListener.onLoadFinished();
}
}
@ -134,9 +140,7 @@ public class OrganizationsListAdapter extends RecyclerView.Adapter<RecyclerView.
protected abstract void onLoadMore();
public void onLoadFinished() {
}
public void onLoadFinished() {}
}
class OrgHolder extends RecyclerView.ViewHolder {
@ -153,7 +157,8 @@ public class OrganizationsListAdapter extends RecyclerView.Adapter<RecyclerView.
orgDescription = itemView.findViewById(R.id.orgDescription);
image = itemView.findViewById(R.id.imageAvatar);
itemView.setOnClickListener(v -> {
itemView.setOnClickListener(
v -> {
Context context = v.getContext();
Intent intent = new Intent(context, OrganizationDetailActivity.class);
intent.putExtra("orgName", userOrganizations.getUsername());
@ -168,17 +173,21 @@ public class OrganizationsListAdapter extends RecyclerView.Adapter<RecyclerView.
this.userOrganizations = org;
orgName.setText(org.getUsername());
PicassoService.getInstance(context).get().load(org.getAvatarUrl()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop().into(image);
PicassoService.getInstance(context)
.get()
.load(org.getAvatarUrl())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(120, 120)
.centerCrop()
.into(image);
if(!org.getDescription().equals("")) {
if (!org.getDescription().equals("")) {
orgDescription.setVisibility(View.VISIBLE);
orgDescription.setText(org.getDescription());
}
else {
} else {
orgDescription.setVisibility(View.GONE);
}
}
}
}

View File

@ -21,6 +21,8 @@ import androidx.core.text.HtmlCompat;
import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable;
import com.vdurmont.emoji.EmojiParser;
import java.util.List;
import java.util.Locale;
import org.gitnex.tea4j.v2.models.PullRequest;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.IssueDetailActivity;
@ -35,13 +37,10 @@ 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 java.util.List;
import java.util.Locale;
/**
* @author M M Arif
*/
public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final Context context;
@ -54,17 +53,20 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
this.prList = prListMain;
}
@NonNull
@Override
@NonNull @Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
return new PullRequestsAdapter.PullRequestsHolder(inflater.inflate(R.layout.list_pr, parent, false));
return new PullRequestsAdapter.PullRequestsHolder(
inflater.inflate(R.layout.list_pr, parent, false));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
if (position >= getItemCount() - 1
&& isMoreDataAvailable
&& !isLoading
&& loadMoreListener != null) {
isLoading = true;
loadMoreListener.run();
}
@ -126,8 +128,13 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
frameLabelsDots = itemView.findViewById(R.id.frameLabelsDots);
commentIcon = itemView.findViewById(R.id.comment_icon);
View.OnClickListener openPr = v -> {
Intent intentPrDetail = new IssueContext(pullRequestObject, ((RepoDetailActivity) context).repository).getIntent(context, IssueDetailActivity.class);
View.OnClickListener openPr =
v -> {
Intent intentPrDetail =
new IssueContext(
pullRequestObject,
((RepoDetailActivity) context).repository)
.getIntent(context, IssueDetailActivity.class);
context.startActivity(intentPrDetail);
};
@ -135,21 +142,37 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
frameLabels.setOnClickListener(openPr);
frameLabelsDots.setOnClickListener(openPr);
new Handler().postDelayed(() -> {
if(!AppUtil.checkGhostUsers(pullRequestObject.getUser().getLogin())) {
new Handler()
.postDelayed(
() -> {
if (!AppUtil.checkGhostUsers(
pullRequestObject.getUser().getLogin())) {
assigneeAvatar.setOnClickListener(v -> {
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", pullRequestObject.getUser().getLogin());
assigneeAvatar.setOnClickListener(
v -> {
Intent intent =
new Intent(context, ProfileActivity.class);
intent.putExtra(
"username",
pullRequestObject.getUser().getLogin());
context.startActivity(intent);
});
assigneeAvatar.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, pullRequestObject.getUser().getLogin(), context.getString(R.string.copyLoginIdToClipBoard, pullRequestObject.getUser().getLogin()));
assigneeAvatar.setOnLongClickListener(
loginId -> {
AppUtil.copyToClipboard(
context,
pullRequestObject.getUser().getLogin(),
context.getString(
R.string.copyLoginIdToClipBoard,
pullRequestObject
.getUser()
.getLogin()));
return true;
});
}
}, 500);
},
500);
}
@SuppressLint("SetTextI18n")
@ -160,23 +183,32 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
String timeFormat = tinyDb.getString("dateFormat", "pretty");
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
PicassoService.getInstance(context).get().load(pullRequest.getUser().getAvatarUrl()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop()
PicassoService.getInstance(context)
.get()
.load(pullRequest.getUser().getAvatarUrl())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(120, 120)
.centerCrop()
.into(this.assigneeAvatar);
this.pullRequestObject = pullRequest;
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
LinearLayout.LayoutParams params =
new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(0, 0, 15, 0);
if(pullRequest.getLabels() != null) {
if (pullRequest.getLabels() != null) {
if(!tinyDb.getBoolean("showLabelsInList", false)) { // default
if (!tinyDb.getBoolean("showLabelsInList", false)) { // default
labelsScrollViewWithText.setVisibility(View.GONE);
labelsScrollViewDots.setVisibility(View.VISIBLE);
frameLabelsDots.removeAllViews();
for(int i = 0; i < pullRequest.getLabels().size(); i++) {
for (int i = 0; i < pullRequest.getLabels().size(); i++) {
String labelColor = pullRequest.getLabels().get(i).getColor();
int color = Color.parseColor("#" + labelColor);
@ -186,19 +218,25 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
frameLabelsDots.setGravity(Gravity.START | Gravity.TOP);
labelsView.setLayoutParams(params);
TextDrawable drawable = TextDrawable.builder().beginConfig().useFont(Typeface.DEFAULT).width(54).height(54).endConfig().buildRound("", color);
TextDrawable drawable =
TextDrawable.builder()
.beginConfig()
.useFont(Typeface.DEFAULT)
.width(54)
.height(54)
.endConfig()
.buildRound("", color);
labelsView.setImageDrawable(drawable);
frameLabelsDots.addView(labelsView);
}
}
else {
} else {
labelsScrollViewDots.setVisibility(View.GONE);
labelsScrollViewWithText.setVisibility(View.VISIBLE);
frameLabels.removeAllViews();
for(int i = 0; i < pullRequest.getLabels().size(); i++) {
for (int i = 0; i < pullRequest.getLabels().size(); i++) {
String labelColor = pullRequest.getLabels().get(i).getColor();
String labelName = pullRequest.getLabels().get(i).getName();
@ -212,9 +250,24 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
int height = AppUtil.getPixelsFromDensity(context, 20);
int textSize = AppUtil.getPixelsFromScaledDensity(context, 12);
TextDrawable drawable = TextDrawable.builder().beginConfig().useFont(Typeface.DEFAULT).textColor(new ColorInverter().getContrastColor(color)).fontSize(textSize)
.width(LabelWidthCalculator.calculateLabelWidth(labelName, Typeface.DEFAULT, textSize, AppUtil.getPixelsFromDensity(context, 8))).height(height).endConfig()
.buildRoundRect(labelName, color, AppUtil.getPixelsFromDensity(context, 18));
TextDrawable drawable =
TextDrawable.builder()
.beginConfig()
.useFont(Typeface.DEFAULT)
.textColor(new ColorInverter().getContrastColor(color))
.fontSize(textSize)
.width(
LabelWidthCalculator.calculateLabelWidth(
labelName,
Typeface.DEFAULT,
textSize,
AppUtil.getPixelsFromDensity(context, 8)))
.height(height)
.endConfig()
.buildRoundRect(
labelName,
color,
AppUtil.getPixelsFromDensity(context, 18));
labelsView.setImageDrawable(drawable);
frameLabels.addView(labelsView);
@ -222,22 +275,37 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
}
}
String prNumber_ = "<font color='" + ResourcesCompat.getColor(context.getResources(), R.color.lightGray, null) + "'>" + context.getResources().getString(R.string.hash) + pullRequest.getNumber() + "</font>";
String prNumber_ =
"<font color='"
+ ResourcesCompat.getColor(
context.getResources(), R.color.lightGray, null)
+ "'>"
+ context.getResources().getString(R.string.hash)
+ pullRequest.getNumber()
+ "</font>";
this.prTitle.setText(HtmlCompat.fromHtml(prNumber_ + " " + EmojiParser.parseToUnicode(pullRequest.getTitle()), HtmlCompat.FROM_HTML_MODE_LEGACY));
this.prTitle.setText(
HtmlCompat.fromHtml(
prNumber_ + " " + EmojiParser.parseToUnicode(pullRequest.getTitle()),
HtmlCompat.FROM_HTML_MODE_LEGACY));
this.prCommentsCount.setText(String.valueOf(pullRequest.getComments()));
this.prCreatedTime.setText(TimeHelper.formatTime(pullRequest.getCreatedAt(), locale, timeFormat, context));
this.prCreatedTime.setText(
TimeHelper.formatTime(pullRequest.getCreatedAt(), locale, timeFormat, context));
if(pullRequest.getComments() > 15) {
commentIcon.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_flame));
commentIcon.setColorFilter(context.getResources().getColor(R.color.releasePre, null));
if (pullRequest.getComments() > 15) {
commentIcon.setImageDrawable(
ContextCompat.getDrawable(context, R.drawable.ic_flame));
commentIcon.setColorFilter(
context.getResources().getColor(R.color.releasePre, null));
}
if(timeFormat.equals("pretty")) {
this.prCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(pullRequest.getCreatedAt()), context));
if (timeFormat.equals("pretty")) {
this.prCreatedTime.setOnClickListener(
new ClickListener(
TimeHelper.customDateFormatForToastDateFormat(
pullRequest.getCreatedAt()),
context));
}
}
}
}

View File

@ -8,18 +8,18 @@ import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
import org.gitnex.tea4j.v2.models.User;
import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation;
import java.util.List;
/**
* @author opyale
*/
public class ReactionAuthorsAdapter extends RecyclerView.Adapter<ReactionAuthorsAdapter.ViewHolder> {
public class ReactionAuthorsAdapter
extends RecyclerView.Adapter<ReactionAuthorsAdapter.ViewHolder> {
private final Context context;
private final List<User> userInfos;
@ -29,23 +29,29 @@ public class ReactionAuthorsAdapter extends RecyclerView.Adapter<ReactionAuthors
this.userInfos = userInfos;
}
@NonNull
@Override
@NonNull @Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.list_reaction_authors, parent, false));
return new ViewHolder(
LayoutInflater.from(context)
.inflate(R.layout.list_reaction_authors, parent, false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
User userInfo = userInfos.get(position);
PicassoService.getInstance(context).get().load(userInfo.getAvatarUrl()).placeholder(R.drawable.loader_animated).resize(240, 240).transform(new RoundedTransformation(AppUtil.getPixelsFromDensity(context, 6), 0))
.centerCrop().into(holder.authorAvatar);
PicassoService.getInstance(context)
.get()
.load(userInfo.getAvatarUrl())
.placeholder(R.drawable.loader_animated)
.resize(240, 240)
.transform(new RoundedTransformation(AppUtil.getPixelsFromDensity(context, 6), 0))
.centerCrop()
.into(holder.authorAvatar);
if(userInfo.getFullName() == null || userInfo.getFullName().isEmpty()) {
if (userInfo.getFullName() == null || userInfo.getFullName().isEmpty()) {
holder.authorFullName.setVisibility(View.GONE);
}
else {
} else {
holder.authorFullName.setText(userInfo.getFullName());
holder.authorFullName.setVisibility(View.VISIBLE);
}
@ -72,7 +78,5 @@ public class ReactionAuthorsAdapter extends RecyclerView.Adapter<ReactionAuthors
authorFullName = itemView.findViewById(R.id.authorFullName);
authorLogin = itemView.findViewById(R.id.authorLogin);
}
}
}

View File

@ -15,6 +15,8 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.List;
import java.util.Locale;
import org.gitnex.tea4j.v2.models.Release;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.MainActivity;
@ -31,8 +33,6 @@ import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.structs.FragmentRefreshListener;
import java.util.List;
import java.util.Locale;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -40,7 +40,6 @@ import retrofit2.Response;
/**
* @author M M Arif
*/
public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.ReleasesViewHolder> {
private final Context context;
@ -52,7 +51,13 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
private OnLoadMoreListener loadMoreListener;
private boolean isLoading = false, isMoreDataAvailable = true;
public ReleasesAdapter(Context ctx, List<Release> releasesMain, FragmentRefreshListener startDownload, String repoOwner, String repoName, FragmentReleasesBinding fragmentReleasesBinding) {
public ReleasesAdapter(
Context ctx,
List<Release> releasesMain,
FragmentRefreshListener startDownload,
String repoOwner,
String repoName,
FragmentReleasesBinding fragmentReleasesBinding) {
this.context = ctx;
this.releasesList = releasesMain;
this.startDownload = startDownload;
@ -61,10 +66,12 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
this.fragmentReleasesBinding = fragmentReleasesBinding;
}
@NonNull
@Override
public ReleasesAdapter.ReleasesViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_releases, parent, false);
@NonNull @Override
public ReleasesAdapter.ReleasesViewHolder onCreateViewHolder(
@NonNull ViewGroup parent, int viewType) {
View v =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_releases, parent, false);
return new ReleasesAdapter.ReleasesViewHolder(v);
}
@ -81,72 +88,88 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
holder.releaseName.setText(currentItem.getName());
if(currentItem.isPrerelease()) {
if (currentItem.isPrerelease()) {
holder.releaseType.setBackgroundResource(R.drawable.shape_pre_release);
holder.releaseType.setText(R.string.releaseTypePre);
}
else if(currentItem.isDraft()) {
} else if (currentItem.isDraft()) {
holder.releaseType.setBackgroundResource(R.drawable.shape_draft_release);
holder.releaseType.setText(R.string.releaseDraftText);
}
else {
} else {
holder.releaseType.setBackgroundResource(R.drawable.shape_stable_release);
holder.releaseType.setText(R.string.releaseTypeStable);
}
if(currentItem.getAuthor().getAvatarUrl() != null) {
PicassoService.getInstance(context).get().load(currentItem.getAuthor().getAvatarUrl()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop()
if (currentItem.getAuthor().getAvatarUrl() != null) {
PicassoService.getInstance(context)
.get()
.load(currentItem.getAuthor().getAvatarUrl())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(120, 120)
.centerCrop()
.into(holder.authorAvatar);
}
holder.authorName.setText(context.getResources().getString(R.string.releasePublishedBy, currentItem.getAuthor().getLogin()));
holder.authorName.setText(
context.getResources()
.getString(
R.string.releasePublishedBy, currentItem.getAuthor().getLogin()));
if(currentItem.getTagName() != null) {
if (currentItem.getTagName() != null) {
holder.releaseTag.setText(currentItem.getTagName());
}
if(currentItem.getPublishedAt() != null) {
holder.releaseDate.setText(TimeHelper.formatTime(currentItem.getPublishedAt(), locale, timeFormat, context));
if (currentItem.getPublishedAt() != null) {
holder.releaseDate.setText(
TimeHelper.formatTime(
currentItem.getPublishedAt(), locale, timeFormat, context));
}
if(timeFormat.equals("pretty")) {
holder.releaseDate.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getPublishedAt()), context));
if (timeFormat.equals("pretty")) {
holder.releaseDate.setOnClickListener(
new ClickListener(
TimeHelper.customDateFormatForToastDateFormat(
currentItem.getPublishedAt()),
context));
}
if(!currentItem.getBody().equals("")) {
if (!currentItem.getBody().equals("")) {
Markdown.render(context, currentItem.getBody(), holder.releaseBodyContent);
}
else {
} else {
holder.releaseBodyContent.setText(R.string.noReleaseBodyContent);
}
holder.downloadCopyFrame.setOnClickListener(v -> {
if(holder.downloads.getVisibility() == View.GONE) {
holder.downloadCopyFrame.setOnClickListener(
v -> {
if (holder.downloads.getVisibility() == View.GONE) {
holder.downloadDropdownIcon.setImageResource(R.drawable.ic_chevron_down);
holder.downloads.setVisibility(View.VISIBLE);
}
else {
} else {
holder.downloadDropdownIcon.setImageResource(R.drawable.ic_chevron_right);
holder.downloads.setVisibility(View.GONE);
}
});
holder.releaseZipDownloadFrame.setOnClickListener(v -> startDownload.onRefresh(currentItem.getZipballUrl()));
holder.releaseTarDownloadFrame.setOnClickListener(v -> startDownload.onRefresh(currentItem.getTarballUrl()));
holder.releaseZipDownloadFrame.setOnClickListener(
v -> startDownload.onRefresh(currentItem.getZipballUrl()));
holder.releaseTarDownloadFrame.setOnClickListener(
v -> startDownload.onRefresh(currentItem.getTarballUrl()));
ReleasesDownloadsAdapter adapter = new ReleasesDownloadsAdapter(currentItem.getAssets(), startDownload);
ReleasesDownloadsAdapter adapter =
new ReleasesDownloadsAdapter(currentItem.getAssets(), startDownload);
holder.downloadList.setAdapter(adapter);
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
if (position >= getItemCount() - 1
&& isMoreDataAvailable
&& !isLoading
&& loadMoreListener != null) {
isLoading = true;
loadMoreListener.onLoadMore();
}
if(!((RepoDetailActivity) context).repository.getPermissions().isPush()) {
if (!((RepoDetailActivity) context).repository.getPermissions().isPush()) {
holder.optionsMenu.setVisibility(View.GONE);
}
}
@ -158,7 +181,7 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
public void setMoreDataAvailable(boolean moreDataAvailable) {
isMoreDataAvailable = moreDataAvailable;
if(!isMoreDataAvailable) {
if (!isMoreDataAvailable) {
loadMoreListener.onLoadFinished();
}
}
@ -185,38 +208,76 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
notifyItemRangeChanged(position, releasesList.size());
}
private void deleteRelease(final Context context, final String releaseName, final Long releaseId, final String owner, final String repo, int position) {
private void deleteRelease(
final Context context,
final String releaseName,
final Long releaseId,
final String owner,
final String repo,
int position) {
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(context, R.style.ThemeOverlay_Material3_Dialog_Alert);
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(
context, R.style.ThemeOverlay_Material3_Dialog_Alert);
materialAlertDialogBuilder.setTitle(String.format(context.getString(R.string.deleteGenericTitle), releaseName)).setMessage(R.string.deleteReleaseConfirmation)
.setPositiveButton(R.string.menuDeleteText, (dialog, whichButton) -> RetrofitClient.getApiInterface(context).repoDeleteRelease(owner, repo, releaseId).enqueue(new Callback<>() {
materialAlertDialogBuilder
.setTitle(
String.format(context.getString(R.string.deleteGenericTitle), releaseName))
.setMessage(R.string.deleteReleaseConfirmation)
.setPositiveButton(
R.string.menuDeleteText,
(dialog, whichButton) ->
RetrofitClient.getApiInterface(context)
.repoDeleteRelease(owner, repo, releaseId)
.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call,
@NonNull Response<Void> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
updateAdapter(position);
Toasty.success(context, context.getString(R.string.releaseDeleted));
Toasty.success(
context,
context.getString(
R.string
.releaseDeleted));
MainActivity.reloadRepos = true;
if(getItemCount() == 0) {
fragmentReleasesBinding.noDataReleases.setVisibility(View.VISIBLE);
if (getItemCount() == 0) {
fragmentReleasesBinding
.noDataReleases
.setVisibility(
View.VISIBLE);
}
}
else if(response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else {
Toasty.error(context, context.getString(R.string.genericError));
} else if (response.code() == 403) {
Toasty.error(
context,
context.getString(
R.string
.authorizeError));
} else {
Toasty.error(
context,
context.getString(
R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<Void> call,
@NonNull Throwable t) {
Toasty.error(context, context.getString(R.string.genericError));
Toasty.error(
context,
context.getString(
R.string.genericError));
}
})).setNeutralButton(R.string.cancelButton, null).show();
}))
.setNeutralButton(R.string.cancelButton, null)
.show();
}
public interface OnLoadMoreListener {
@ -224,7 +285,6 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
void onLoadMore();
void onLoadFinished();
}
protected class ReleasesViewHolder extends RecyclerView.ViewHolder {
@ -268,23 +328,36 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
downloadList.setHasFixedSize(true);
downloadList.setLayoutManager(new LinearLayoutManager(itemView.getContext()));
new Handler().postDelayed(() -> {
if(!AppUtil.checkGhostUsers(releases.getAuthor().getLogin())) {
new Handler()
.postDelayed(
() -> {
if (!AppUtil.checkGhostUsers(releases.getAuthor().getLogin())) {
authorAvatar.setOnClickListener(loginId -> {
authorAvatar.setOnClickListener(
loginId -> {
Context context = loginId.getContext();
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", releases.getAuthor().getLogin());
Intent intent =
new Intent(context, ProfileActivity.class);
intent.putExtra(
"username",
releases.getAuthor().getLogin());
context.startActivity(intent);
});
}
}, 500);
},
500);
optionsMenu.setOnClickListener(v -> {
optionsMenu.setOnClickListener(
v -> {
final Context context = v.getContext();
View view = LayoutInflater.from(context).inflate(R.layout.bottom_sheet_release_in_list, itemView.findViewById(android.R.id.content), false);
View view =
LayoutInflater.from(context)
.inflate(
R.layout.bottom_sheet_release_in_list,
itemView.findViewById(android.R.id.content),
false);
TextView deleteRelease = view.findViewById(R.id.deleteRelease);
@ -292,13 +365,18 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
dialog.setContentView(view);
dialog.show();
deleteRelease.setOnClickListener(v1 -> {
deleteRelease(context, releases.getName(), releases.getId(), repoOwner, repoName, getBindingAdapterPosition());
deleteRelease.setOnClickListener(
v1 -> {
deleteRelease(
context,
releases.getName(),
releases.getId(),
repoOwner,
repoName,
getBindingAdapterPosition());
dialog.dismiss();
});
});
}
}
}

View File

@ -6,43 +6,47 @@ import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
import org.gitnex.tea4j.v2.models.Attachment;
import org.mian.gitnex.R;
import org.mian.gitnex.structs.FragmentRefreshListener;
import java.util.List;
/**
* @author M M Arif
**/
public class ReleasesDownloadsAdapter extends RecyclerView.Adapter<ReleasesDownloadsAdapter.ReleasesDownloadsViewHolder> {
*/
public class ReleasesDownloadsAdapter
extends RecyclerView.Adapter<ReleasesDownloadsAdapter.ReleasesDownloadsViewHolder> {
private final List<Attachment> releasesDownloadsList;
private final FragmentRefreshListener startDownload;
ReleasesDownloadsAdapter(List<Attachment> releasesDownloadsMain, FragmentRefreshListener startDownload) {
ReleasesDownloadsAdapter(
List<Attachment> releasesDownloadsMain, FragmentRefreshListener startDownload) {
this.releasesDownloadsList = releasesDownloadsMain;
this.startDownload = startDownload;
}
@NonNull
@Override
public ReleasesDownloadsAdapter.ReleasesDownloadsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_releases_downloads, parent, false);
@NonNull @Override
public ReleasesDownloadsAdapter.ReleasesDownloadsViewHolder onCreateViewHolder(
@NonNull ViewGroup parent, int viewType) {
View v =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_releases_downloads, parent, false);
return new ReleasesDownloadsAdapter.ReleasesDownloadsViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull ReleasesDownloadsAdapter.ReleasesDownloadsViewHolder holder, int position) {
public void onBindViewHolder(
@NonNull ReleasesDownloadsAdapter.ReleasesDownloadsViewHolder holder, int position) {
Attachment currentItem = releasesDownloadsList.get(position);
if(currentItem.getName() != null) {
if (currentItem.getName() != null) {
holder.downloadName.setText(currentItem.getName());
holder.downloadName.setOnClickListener(v -> startDownload.onRefresh(currentItem.getBrowserDownloadUrl()));
holder.downloadName.setOnClickListener(
v -> startDownload.onRefresh(currentItem.getBrowserDownloadUrl()));
}
}
@ -60,7 +64,5 @@ public class ReleasesDownloadsAdapter extends RecyclerView.Adapter<ReleasesDownl
super(itemView);
downloadName = itemView.findViewById(R.id.downloadName);
}
}
}

View File

@ -14,6 +14,10 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.RepoDetailActivity;
import org.mian.gitnex.clients.PicassoService;
@ -24,15 +28,10 @@ import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import org.ocpsoft.prettytime.PrettyTime;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
/**
* @author M M Arif
*/
public class RepoForksAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final Context context;
@ -41,23 +40,27 @@ public class RepoForksAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
private boolean isLoading = false;
private boolean isMoreDataAvailable = true;
public RepoForksAdapter(Context ctx, List<org.gitnex.tea4j.v2.models.Repository> forksListMain) {
public RepoForksAdapter(
Context ctx, List<org.gitnex.tea4j.v2.models.Repository> forksListMain) {
this.context = ctx;
this.forksList = forksListMain;
}
@NonNull
@Override
@NonNull @Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
return new RepoForksAdapter.ForksHolder(inflater.inflate(R.layout.list_repositories, parent, false));
return new RepoForksAdapter.ForksHolder(
inflater.inflate(R.layout.list_repositories, parent, false));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
if (position >= getItemCount() - 1
&& isMoreDataAvailable
&& !isLoading
&& loadMoreListener != null) {
isLoading = true;
loadMoreListener.run();
}
@ -133,63 +136,96 @@ public class RepoForksAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
int color = generator.getColor(forksModel.getName());
String firstCharacter = String.valueOf(forksModel.getFullName().charAt(0));
TextDrawable drawable = TextDrawable.builder().beginConfig().useFont(Typeface.DEFAULT).fontSize(18).toUpperCase().width(28).height(28).endConfig().buildRoundRect(firstCharacter, color, 3);
TextDrawable drawable =
TextDrawable.builder()
.beginConfig()
.useFont(Typeface.DEFAULT)
.fontSize(18)
.toUpperCase()
.width(28)
.height(28)
.endConfig()
.buildRoundRect(firstCharacter, color, 3);
if(forksModel.getAvatarUrl() != null) {
if(!forksModel.getAvatarUrl().equals("")) {
PicassoService.getInstance(context).get().load(forksModel.getAvatarUrl()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop()
if (forksModel.getAvatarUrl() != null) {
if (!forksModel.getAvatarUrl().equals("")) {
PicassoService.getInstance(context)
.get()
.load(forksModel.getAvatarUrl())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(120, 120)
.centerCrop()
.into(image);
}
else {
} else {
image.setImageDrawable(drawable);
}
}
else {
} else {
image.setImageDrawable(drawable);
}
if(forksModel.getUpdatedAt() != null) {
if (forksModel.getUpdatedAt() != null) {
switch(timeFormat) {
case "pretty": {
switch (timeFormat) {
case "pretty":
{
PrettyTime prettyTime = new PrettyTime(locale);
String createdTime = prettyTime.format(forksModel.getUpdatedAt());
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(forksModel.getUpdatedAt()), context));
repoLastUpdated.setText(
context.getString(R.string.lastUpdatedAt, createdTime));
repoLastUpdated.setOnClickListener(
new ClickListener(
TimeHelper.customDateFormatForToastDateFormat(
forksModel.getUpdatedAt()),
context));
break;
}
case "normal": {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
case "normal":
{
DateFormat formatter =
new SimpleDateFormat(
"yyyy-MM-dd '"
+ context.getResources()
.getString(R.string.timeAtText)
+ "' HH:mm",
locale);
String createdTime = formatter.format(forksModel.getUpdatedAt());
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
repoLastUpdated.setText(
context.getString(R.string.lastUpdatedAt, createdTime));
break;
}
case "normal1": {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
case "normal1":
{
DateFormat formatter =
new SimpleDateFormat(
"dd-MM-yyyy '"
+ context.getResources()
.getString(R.string.timeAtText)
+ "' HH:mm",
locale);
String createdTime = formatter.format(forksModel.getUpdatedAt());
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
repoLastUpdated.setText(
context.getString(R.string.lastUpdatedAt, createdTime));
break;
}
}
}
else {
} else {
repoLastUpdated.setVisibility(View.GONE);
}
if(!forksModel.getDescription().equals("")) {
if (!forksModel.getDescription().equals("")) {
repoDescription.setText(forksModel.getDescription());
}
else {
} else {
repoDescription.setText(context.getString(R.string.noDataDescription));
}
if(isRepoAdmin == null) {
if (isRepoAdmin == null) {
isRepoAdmin = new CheckBox(context);
}
isRepoAdmin.setChecked(forksModel.getPermissions().isAdmin());
itemView.setOnClickListener(v -> {
itemView.setOnClickListener(
v -> {
Context context = v.getContext();
RepositoryContext repo = new RepositoryContext(userRepositories, context);
@ -197,10 +233,7 @@ public class RepoForksAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
Intent intent = repo.getIntent(context, RepoDetailActivity.class);
context.startActivity(intent);
});
}
}
}

View File

@ -16,6 +16,11 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.RepoDetailActivity;
import org.mian.gitnex.clients.PicassoService;
@ -26,17 +31,12 @@ import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import org.ocpsoft.prettytime.PrettyTime;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
/**
* @author M M Arif
*/
public class ReposListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements Filterable {
public class ReposListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
implements Filterable {
private final Context context;
private final List<org.gitnex.tea4j.v2.models.Repository> reposListFull;
@ -45,21 +45,24 @@ public class ReposListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
private List<org.gitnex.tea4j.v2.models.Repository> reposList;
private OnLoadMoreListener loadMoreListener;
private boolean isLoading = false, isMoreDataAvailable = true;
private final Filter reposFilter = new Filter() {
private final Filter reposFilter =
new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<org.gitnex.tea4j.v2.models.Repository> filteredList = new ArrayList<>();
if(constraint == null || constraint.length() == 0) {
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(reposListFull);
}
else {
} else {
String filterPattern = constraint.toString().toLowerCase().trim();
for(org.gitnex.tea4j.v2.models.Repository item : reposListFull) {
if(item.getFullName().toLowerCase().contains(filterPattern) || item.getDescription().toLowerCase().contains(filterPattern)) {
for (org.gitnex.tea4j.v2.models.Repository item : reposListFull) {
if (item.getFullName().toLowerCase().contains(filterPattern)
|| item.getDescription()
.toLowerCase()
.contains(filterPattern)) {
filteredList.add(item);
}
}
@ -80,23 +83,27 @@ public class ReposListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
}
};
public ReposListAdapter(List<org.gitnex.tea4j.v2.models.Repository> reposListMain, Context ctx) {
public ReposListAdapter(
List<org.gitnex.tea4j.v2.models.Repository> reposListMain, Context ctx) {
this.context = ctx;
this.reposList = reposListMain;
reposListFull = new ArrayList<>(reposList);
this.tinyDb = TinyDB.getInstance(context);
}
@NonNull
@Override
@NonNull @Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
return new ReposListAdapter.ReposHolder(inflater.inflate(R.layout.list_repositories, parent, false));
return new ReposListAdapter.ReposHolder(
inflater.inflate(R.layout.list_repositories, parent, false));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
if (position >= getItemCount() - 1
&& isMoreDataAvailable
&& !isLoading
&& loadMoreListener != null) {
isLoading = true;
loadMoreListener.onLoadMore();
}
@ -116,7 +123,7 @@ public class ReposListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
public void setMoreDataAvailable(boolean moreDataAvailable) {
isMoreDataAvailable = moreDataAvailable;
if(!isMoreDataAvailable) {
if (!isMoreDataAvailable) {
loadMoreListener.onLoadFinished();
}
}
@ -147,7 +154,6 @@ public class ReposListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
void onLoadMore();
void onLoadFinished();
}
class ReposHolder extends RecyclerView.ViewHolder {
@ -174,12 +180,13 @@ public class ReposListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
repoLastUpdated = itemView.findViewById(R.id.repoLastUpdated);
spacerView = itemView.findViewById(R.id.spacerView);
itemView.setOnClickListener(v -> {
itemView.setOnClickListener(
v -> {
Context context = v.getContext();
RepositoryContext repo = new RepositoryContext(userRepositories, context);
repo.saveToDB(context);
Intent intent = repo.getIntent(context, RepoDetailActivity.class);
if(isUserOrg) {
if (isUserOrg) {
intent.putExtra("openedFromUserOrg", true);
}
context.startActivity(intent);
@ -202,65 +209,96 @@ public class ReposListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
int color = generator.getColor(repositories.getName());
String firstCharacter = String.valueOf(repositories.getFullName().charAt(0));
TextDrawable drawable = TextDrawable.builder().beginConfig().useFont(Typeface.DEFAULT).fontSize(18).toUpperCase().width(28).height(28).endConfig().buildRoundRect(firstCharacter, color, 14);
TextDrawable drawable =
TextDrawable.builder()
.beginConfig()
.useFont(Typeface.DEFAULT)
.fontSize(18)
.toUpperCase()
.width(28)
.height(28)
.endConfig()
.buildRoundRect(firstCharacter, color, 14);
if(repositories.getAvatarUrl() != null) {
if(!repositories.getAvatarUrl().equals("")) {
PicassoService.getInstance(context).get().load(repositories.getAvatarUrl()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop()
if (repositories.getAvatarUrl() != null) {
if (!repositories.getAvatarUrl().equals("")) {
PicassoService.getInstance(context)
.get()
.load(repositories.getAvatarUrl())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(120, 120)
.centerCrop()
.into(image);
}
else {
} else {
image.setImageDrawable(drawable);
}
}
else {
} else {
image.setImageDrawable(drawable);
}
if(repositories.getUpdatedAt() != null) {
if (repositories.getUpdatedAt() != null) {
switch(timeFormat) {
case "pretty": {
switch (timeFormat) {
case "pretty":
{
PrettyTime prettyTime = new PrettyTime(locale);
String createdTime = prettyTime.format(repositories.getUpdatedAt());
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(repositories.getUpdatedAt()), context));
repoLastUpdated.setText(
context.getString(R.string.lastUpdatedAt, createdTime));
repoLastUpdated.setOnClickListener(
new ClickListener(
TimeHelper.customDateFormatForToastDateFormat(
repositories.getUpdatedAt()),
context));
break;
}
case "normal": {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
case "normal":
{
DateFormat formatter =
new SimpleDateFormat(
"yyyy-MM-dd '"
+ context.getResources()
.getString(R.string.timeAtText)
+ "' HH:mm",
locale);
String createdTime = formatter.format(repositories.getUpdatedAt());
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
repoLastUpdated.setText(
context.getString(R.string.lastUpdatedAt, createdTime));
break;
}
case "normal1": {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
case "normal1":
{
DateFormat formatter =
new SimpleDateFormat(
"dd-MM-yyyy '"
+ context.getResources()
.getString(R.string.timeAtText)
+ "' HH:mm",
locale);
String createdTime = formatter.format(repositories.getUpdatedAt());
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
repoLastUpdated.setText(
context.getString(R.string.lastUpdatedAt, createdTime));
break;
}
}
}
else {
} else {
repoLastUpdated.setVisibility(View.GONE);
}
if(!repositories.getDescription().equals("")) {
if (!repositories.getDescription().equals("")) {
repoDescription.setVisibility(View.VISIBLE);
repoDescription.setText(repositories.getDescription());
spacerView.setVisibility(View.GONE);
}
else {
} else {
repoDescription.setVisibility(View.GONE);
spacerView.setVisibility(View.VISIBLE);
}
if(isRepoAdmin == null) {
if (isRepoAdmin == null) {
isRepoAdmin = new CheckBox(context);
}
isRepoAdmin.setChecked(repositories.getPermissions().isAdmin());
}
}
}

View File

@ -12,6 +12,7 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.List;
import org.gitnex.tea4j.v2.models.Tag;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.RepoDetailActivity;
@ -20,7 +21,6 @@ import org.mian.gitnex.databinding.FragmentReleasesBinding;
import org.mian.gitnex.helpers.Markdown;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.structs.FragmentRefreshListener;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -28,7 +28,6 @@ import retrofit2.Response;
/**
* @author qwerty287
*/
public class TagsAdapter extends RecyclerView.Adapter<TagsAdapter.TagsViewHolder> {
private final Context context;
@ -40,7 +39,13 @@ public class TagsAdapter extends RecyclerView.Adapter<TagsAdapter.TagsViewHolder
private OnLoadMoreListener loadMoreListener;
private boolean isLoading = false, isMoreDataAvailable = true;
public TagsAdapter(Context ctx, List<Tag> releasesMain, String repoOwner, String repoName, FragmentRefreshListener startDownload, FragmentReleasesBinding fragmentReleasesBinding) {
public TagsAdapter(
Context ctx,
List<Tag> releasesMain,
String repoOwner,
String repoName,
FragmentRefreshListener startDownload,
FragmentReleasesBinding fragmentReleasesBinding) {
this.context = ctx;
this.tags = releasesMain;
owner = repoOwner;
@ -49,10 +54,10 @@ public class TagsAdapter extends RecyclerView.Adapter<TagsAdapter.TagsViewHolder
this.fragmentReleasesBinding = fragmentReleasesBinding;
}
@NonNull
@Override
@NonNull @Override
public TagsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_tags, parent, false);
View v =
LayoutInflater.from(parent.getContext()).inflate(R.layout.list_tags, parent, false);
return new TagsViewHolder(v);
}
@ -64,35 +69,38 @@ public class TagsAdapter extends RecyclerView.Adapter<TagsAdapter.TagsViewHolder
holder.tagName.setText(currentItem.getName());
if(!currentItem.getMessage().equals("")) {
if (!currentItem.getMessage().equals("")) {
Markdown.render(context, currentItem.getMessage(), holder.tagBody);
}
else {
} else {
holder.tagBody.setVisibility(View.GONE);
}
holder.downloadCopyFrame.setOnClickListener(v -> {
if(holder.downloads.getVisibility() == View.GONE) {
holder.downloadCopyFrame.setOnClickListener(
v -> {
if (holder.downloads.getVisibility() == View.GONE) {
holder.downloadDropdownIcon.setImageResource(R.drawable.ic_chevron_down);
holder.downloads.setVisibility(View.VISIBLE);
}
else {
} else {
holder.downloadDropdownIcon.setImageResource(R.drawable.ic_chevron_right);
holder.downloads.setVisibility(View.GONE);
}
});
if(!((RepoDetailActivity) context).repository.getPermissions().isPush()) {
if (!((RepoDetailActivity) context).repository.getPermissions().isPush()) {
holder.options.setVisibility(View.GONE);
}
holder.releaseZipDownloadFrame.setOnClickListener(v -> startDownload.onRefresh(currentItem.getZipballUrl()));
holder.releaseTarDownloadFrame.setOnClickListener(v -> startDownload.onRefresh(currentItem.getTarballUrl()));
holder.releaseZipDownloadFrame.setOnClickListener(
v -> startDownload.onRefresh(currentItem.getZipballUrl()));
holder.releaseTarDownloadFrame.setOnClickListener(
v -> startDownload.onRefresh(currentItem.getTarballUrl()));
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
if (position >= getItemCount() - 1
&& isMoreDataAvailable
&& !isLoading
&& loadMoreListener != null) {
isLoading = true;
loadMoreListener.onLoadMore();
}
@ -105,7 +113,7 @@ public class TagsAdapter extends RecyclerView.Adapter<TagsAdapter.TagsViewHolder
public void setMoreDataAvailable(boolean moreDataAvailable) {
isMoreDataAvailable = moreDataAvailable;
if(!isMoreDataAvailable) {
if (!isMoreDataAvailable) {
loadMoreListener.onLoadFinished();
}
}
@ -132,39 +140,83 @@ public class TagsAdapter extends RecyclerView.Adapter<TagsAdapter.TagsViewHolder
notifyItemRangeChanged(position, tags.size());
}
private void tagDeleteDialog(final Context context, final String tagName, final String owner, final String repo, int position) {
private void tagDeleteDialog(
final Context context,
final String tagName,
final String owner,
final String repo,
int position) {
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(context).setTitle(String.format(context.getString(R.string.deleteGenericTitle), tagName))
.setMessage(R.string.deleteTagConfirmation).setCancelable(false).setNeutralButton(R.string.cancelButton, null)
.setPositiveButton(R.string.menuDeleteText, (dialog, whichButton) -> RetrofitClient.getApiInterface(context).repoDeleteTag(owner, repo, tagName).enqueue(new Callback<>() {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(context)
.setTitle(
String.format(
context.getString(R.string.deleteGenericTitle), tagName))
.setMessage(R.string.deleteTagConfirmation)
.setCancelable(false)
.setNeutralButton(R.string.cancelButton, null)
.setPositiveButton(
R.string.menuDeleteText,
(dialog, whichButton) ->
RetrofitClient.getApiInterface(context)
.repoDeleteTag(owner, repo, tagName)
.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call,
@NonNull Response<Void>
response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
updateAdapter(position);
Toasty.success(context, context.getString(R.string.tagDeleted));
if(getItemCount() == 0) {
fragmentReleasesBinding.noDataReleases.setVisibility(View.VISIBLE);
Toasty.success(
context,
context.getString(
R.string
.tagDeleted));
if (getItemCount() == 0) {
fragmentReleasesBinding
.noDataReleases
.setVisibility(
View
.VISIBLE);
}
}
else if(response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 409) {
Toasty.error(context, context.getString(R.string.tagDeleteError));
}
else {
Toasty.error(context, context.getString(R.string.genericError));
} else if (response.code() == 403) {
Toasty.error(
context,
context.getString(
R.string
.authorizeError));
} else if (response.code() == 409) {
Toasty.error(
context,
context.getString(
R.string
.tagDeleteError));
} else {
Toasty.error(
context,
context.getString(
R.string
.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<Void> call,
@NonNull Throwable t) {
Toasty.error(context, context.getString(R.string.genericError));
Toasty.error(
context,
context.getString(
R.string
.genericError));
}
})).setNeutralButton(R.string.cancelButton, null);
}))
.setNeutralButton(R.string.cancelButton, null);
materialAlertDialogBuilder.create().show();
}
@ -174,7 +226,6 @@ public class TagsAdapter extends RecyclerView.Adapter<TagsAdapter.TagsViewHolder
void onLoadMore();
void onLoadFinished();
}
protected class TagsViewHolder extends RecyclerView.ViewHolder {
@ -202,10 +253,14 @@ public class TagsAdapter extends RecyclerView.Adapter<TagsAdapter.TagsViewHolder
downloadDropdownIcon = itemView.findViewById(R.id.downloadDropdownIcon);
options = itemView.findViewById(R.id.tagsOptionsMenu);
options.setOnClickListener(v -> {
options.setOnClickListener(
v -> {
final Context context = v.getContext();
@SuppressLint("InflateParams") View view = LayoutInflater.from(context).inflate(R.layout.bottom_sheet_tag_in_list, null);
@SuppressLint("InflateParams")
View view =
LayoutInflater.from(context)
.inflate(R.layout.bottom_sheet_tag_in_list, null);
TextView delete = view.findViewById(R.id.tagMenuDelete);
@ -213,13 +268,17 @@ public class TagsAdapter extends RecyclerView.Adapter<TagsAdapter.TagsViewHolder
dialog.setContentView(view);
dialog.show();
delete.setOnClickListener(v1 -> {
tagDeleteDialog(context, tagsHolder.getName(), owner, repo, getBindingAdapterPosition());
delete.setOnClickListener(
v1 -> {
tagDeleteDialog(
context,
tagsHolder.getName(),
owner,
repo,
getBindingAdapterPosition());
dialog.dismiss();
});
});
}
}
}

View File

@ -14,6 +14,9 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import io.mikael.urlbuilder.UrlBuilder;
import java.util.List;
import java.util.Objects;
import org.gitnex.tea4j.v2.models.NotificationCount;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.AddNewAccountActivity;
@ -26,17 +29,14 @@ import org.mian.gitnex.helpers.AppUtil;
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;
import retrofit2.Call;
import retrofit2.Callback;
/**
* @author M M Arif
*/
public class UserAccountsAdapter extends RecyclerView.Adapter<UserAccountsAdapter.UserAccountsViewHolder> {
public class UserAccountsAdapter
extends RecyclerView.Adapter<UserAccountsAdapter.UserAccountsViewHolder> {
private final List<UserAccount> userAccountsList;
private final Context context;
@ -46,7 +46,9 @@ public class UserAccountsAdapter extends RecyclerView.Adapter<UserAccountsAdapte
public UserAccountsAdapter(Context ctx, Dialog dialog) {
this.dialog = dialog;
this.context = ctx;
this.userAccountsList = Objects.requireNonNull(BaseApi.getInstance(context, UserAccountsApi.class)).usersAccounts();
this.userAccountsList =
Objects.requireNonNull(BaseApi.getInstance(context, UserAccountsApi.class))
.usersAccounts();
this.tinyDB = TinyDB.getInstance(context);
}
@ -62,40 +64,53 @@ public class UserAccountsAdapter extends RecyclerView.Adapter<UserAccountsAdapte
Call<NotificationCount> call = RetrofitClient.getApiInterface(context).notifyNewAvailable();
call.enqueue(new Callback<>() {
call.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<NotificationCount> call, @NonNull retrofit2.Response<NotificationCount> response) {
public void onResponse(
@NonNull Call<NotificationCount> call,
@NonNull retrofit2.Response<NotificationCount> response) {
NotificationCount notificationCount = response.body();
if(response.code() == 200) {
if (response.code() == 200) {
assert notificationCount != null;
if(notificationCount.getNew() > 0) {
String toastMsg = context.getResources().getQuantityString(R.plurals.youHaveNewNotifications, Math.toIntExact(notificationCount.getNew()), Math.toIntExact(notificationCount.getNew()));
new Handler().postDelayed(() -> Toasty.info(context, toastMsg), 5000);
if (notificationCount.getNew() > 0) {
String toastMsg =
context.getResources()
.getQuantityString(
R.plurals.youHaveNewNotifications,
Math.toIntExact(notificationCount.getNew()),
Math.toIntExact(
notificationCount.getNew()));
new Handler()
.postDelayed(() -> Toasty.info(context, toastMsg), 5000);
}
}
}
@Override
public void onFailure(@NonNull Call<NotificationCount> call, @NonNull Throwable t) {
}
public void onFailure(
@NonNull Call<NotificationCount> call, @NonNull Throwable t) {}
});
}
@NonNull
@Override
public UserAccountsAdapter.UserAccountsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@NonNull @Override
public UserAccountsAdapter.UserAccountsViewHolder onCreateViewHolder(
@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_user_accounts, parent, false);
View v =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_user_accounts, parent, false);
return new UserAccountsViewHolder(v);
}
@SuppressLint("DefaultLocale")
@Override
public void onBindViewHolder(@NonNull UserAccountsAdapter.UserAccountsViewHolder holder, int position) {
public void onBindViewHolder(
@NonNull UserAccountsAdapter.UserAccountsViewHolder holder, int position) {
UserAccount currentItem = userAccountsList.get(position);
@ -105,22 +120,26 @@ public class UserAccountsAdapter extends RecyclerView.Adapter<UserAccountsAdapte
holder.accountName = currentItem.getAccountName();
holder.userId.setText(currentItem.getUserName());
if(currentItem.isLoggedIn()) {
if (currentItem.isLoggedIn()) {
holder.accountUrl.setText(url);
}
else {
} else {
holder.accountUrl.setText(context.getString(R.string.notLoggedIn, url));
}
int imgRadius = AppUtil.getPixelsFromDensity(context, 60);
PicassoService.getInstance(context).get().load(url + "assets/img/favicon.png").placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop()
PicassoService.getInstance(context)
.get()
.load(url + "assets/img/favicon.png")
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(120, 120)
.centerCrop()
.into(holder.repoAvatar);
if(tinyDB.getInt("currentActiveAccountId") == currentItem.getAccountId()) {
if (tinyDB.getInt("currentActiveAccountId") == currentItem.getAccountId()) {
holder.activeAccount.setVisibility(View.VISIBLE);
}
else {
} else {
holder.deleteAccount.setVisibility(View.VISIBLE);
}
}
@ -150,44 +169,63 @@ public class UserAccountsAdapter extends RecyclerView.Adapter<UserAccountsAdapte
deleteAccount = itemView.findViewById(R.id.deleteAccount);
repoAvatar = itemView.findViewById(R.id.repoAvatar);
deleteAccount.setOnClickListener(itemDelete -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(context).setTitle(context.getResources().getString(R.string.removeAccountPopupTitle))
.setMessage(context.getResources().getString(R.string.removeAccountPopupMessage)).setNeutralButton(context.getResources().getString(R.string.cancelButton), null)
.setPositiveButton(context.getResources().getString(R.string.removeButton), (dialog, which) -> {
updateLayoutByPosition(getBindingAdapterPosition());
UserAccountsApi userAccountsApi = BaseApi.getInstance(context, UserAccountsApi.class);
deleteAccount.setOnClickListener(
itemDelete -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(context)
.setTitle(
context.getResources()
.getString(
R.string.removeAccountPopupTitle))
.setMessage(
context.getResources()
.getString(
R.string.removeAccountPopupMessage))
.setNeutralButton(
context.getResources()
.getString(R.string.cancelButton),
null)
.setPositiveButton(
context.getResources()
.getString(R.string.removeButton),
(dialog, which) -> {
updateLayoutByPosition(
getBindingAdapterPosition());
UserAccountsApi userAccountsApi =
BaseApi.getInstance(
context, UserAccountsApi.class);
assert userAccountsApi != null;
userAccountsApi.deleteAccount(Integer.parseInt(String.valueOf(accountId)));
userAccountsApi.deleteAccount(
Integer.parseInt(
String.valueOf(accountId)));
});
materialAlertDialogBuilder.create().show();
});
itemView.setOnClickListener(switchAccount -> {
UserAccountsApi userAccountsApi = BaseApi.getInstance(context, UserAccountsApi.class);
itemView.setOnClickListener(
switchAccount -> {
UserAccountsApi userAccountsApi =
BaseApi.getInstance(context, UserAccountsApi.class);
assert userAccountsApi != null;
UserAccount userAccount = userAccountsApi.getAccountByName(accountName);
if(!userAccount.isLoggedIn()) {
UrlBuilder url = UrlBuilder.fromString(userAccount.getInstanceUrl()).withPath("/");
if (!userAccount.isLoggedIn()) {
UrlBuilder url =
UrlBuilder.fromString(userAccount.getInstanceUrl())
.withPath("/");
String host;
if(url.scheme.equals("http")) {
if(url.port == 80 || url.port == 0) {
if (url.scheme.equals("http")) {
if (url.port == 80 || url.port == 0) {
host = url.hostName;
}
else {
} else {
host = url.hostName + ":" + url.port;
}
}
else {
if(url.port == 443 || url.port == 0) {
} else {
if (url.port == 443 || url.port == 0) {
host = url.hostName;
}
else {
} else {
host = url.hostName + ":" + url.port;
}
}
@ -203,12 +241,21 @@ public class UserAccountsAdapter extends RecyclerView.Adapter<UserAccountsAdapte
return;
}
if(tinyDB.getInt("currentActiveAccountId") != userAccount.getAccountId()) {
if(AppUtil.switchToAccount(context, userAccount)) {
if (tinyDB.getInt("currentActiveAccountId") != userAccount.getAccountId()) {
if (AppUtil.switchToAccount(context, userAccount)) {
String url = UrlBuilder.fromString(userAccount.getInstanceUrl()).withPath("/").toString();
String url =
UrlBuilder.fromString(userAccount.getInstanceUrl())
.withPath("/")
.toString();
Toasty.success(context, context.getResources().getString(R.string.switchAccountSuccess, userAccount.getUserName(), url));
Toasty.success(
context,
context.getResources()
.getString(
R.string.switchAccountSuccess,
userAccount.getUserName(),
url));
getNotificationsCount();
((Activity) context).recreate();
dialog.dismiss();
@ -216,7 +263,5 @@ public class UserAccountsAdapter extends RecyclerView.Adapter<UserAccountsAdapte
}
});
}
}
}

View File

@ -15,43 +15,47 @@ import androidx.annotation.NonNull;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import io.mikael.urlbuilder.UrlBuilder;
import java.util.List;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.AddNewAccountActivity;
import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.database.models.UserAccount;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation;
import java.util.List;
import io.mikael.urlbuilder.UrlBuilder;
/**
* @author M M Arif
*/
public class UserAccountsNavAdapter extends RecyclerView.Adapter<UserAccountsNavAdapter.UserAccountsViewHolder> {
public class UserAccountsNavAdapter
extends RecyclerView.Adapter<UserAccountsNavAdapter.UserAccountsViewHolder> {
private final DrawerLayout drawer;
private final List<UserAccount> userAccountsList;
private final Context context;
public UserAccountsNavAdapter(Context ctx, List<UserAccount> userAccountsListMain, DrawerLayout drawerLayout) {
public UserAccountsNavAdapter(
Context ctx, List<UserAccount> userAccountsListMain, DrawerLayout drawerLayout) {
this.context = ctx;
this.userAccountsList = userAccountsListMain;
this.drawer = drawerLayout;
}
@NonNull
@Override
public UserAccountsNavAdapter.UserAccountsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@NonNull @Override
public UserAccountsNavAdapter.UserAccountsViewHolder onCreateViewHolder(
@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.nav_user_accounts, parent, false);
View v =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.nav_user_accounts, parent, false);
return new UserAccountsViewHolder(v);
}
@SuppressLint("DefaultLocale")
@Override
public void onBindViewHolder(@NonNull UserAccountsNavAdapter.UserAccountsViewHolder holder, int position) {
public void onBindViewHolder(
@NonNull UserAccountsNavAdapter.UserAccountsViewHolder holder, int position) {
UserAccount currentItem = userAccountsList.get(position);
@ -59,7 +63,13 @@ public class UserAccountsNavAdapter extends RecyclerView.Adapter<UserAccountsNav
int imageSize = AppUtil.getPixelsFromDensity(context, 36);
PicassoService.getInstance(context).get().load(url + "assets/img/favicon.png").placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(18, 0)).resize(imageSize, imageSize).centerCrop()
PicassoService.getInstance(context)
.get()
.load(url + "assets/img/favicon.png")
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(18, 0))
.resize(imageSize, imageSize)
.centerCrop()
.into(holder.userAccountAvatar);
}
@ -77,14 +87,14 @@ public class UserAccountsNavAdapter extends RecyclerView.Adapter<UserAccountsNav
RecyclerView listView = dialog.findViewById(R.id.accountsList);
Button newAccount = dialog.findViewById(R.id.newAccount);
if(dialog.getWindow() != null) {
if (dialog.getWindow() != null) {
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
newAccount.setOnClickListener(item -> {
newAccount.setOnClickListener(
item -> {
context.startActivity(new Intent(context, AddNewAccountActivity.class));
dialog.dismiss();
});
UserAccountsAdapter arrayAdapter = new UserAccountsAdapter(context, dialog);
@ -103,12 +113,11 @@ public class UserAccountsNavAdapter extends RecyclerView.Adapter<UserAccountsNav
userAccountAvatar = itemView.findViewById(R.id.userAccountAvatar);
itemView.setOnClickListener(item -> {
itemView.setOnClickListener(
item -> {
customDialogUserAccountsList();
drawer.closeDrawers();
});
}
}
}

View File

@ -12,19 +12,18 @@ import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import org.gitnex.tea4j.v2.models.User;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation;
import java.util.ArrayList;
import java.util.List;
/**
* @author M M Arif
*/
public class UserGridAdapter extends BaseAdapter implements Filterable {
private final List<User> membersList;
@ -45,18 +44,22 @@ public class UserGridAdapter extends BaseAdapter implements Filterable {
memberName = v.findViewById(R.id.userNameTv);
userName = v.findViewById(R.id.userName);
v.setOnClickListener(loginId -> {
v.setOnClickListener(
loginId -> {
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", userLoginId);
context.startActivity(intent);
});
v.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
v.setOnLongClickListener(
loginId -> {
AppUtil.copyToClipboard(
context,
userLoginId,
context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
return true;
});
}
}
public UserGridAdapter(Context ctx, List<User> membersListMain) {
@ -87,13 +90,12 @@ public class UserGridAdapter extends BaseAdapter implements Filterable {
UserGridAdapter.ViewHolder viewHolder;
if(finalView == null) {
if (finalView == null) {
finalView = LayoutInflater.from(context).inflate(R.layout.list_users_grid, null);
viewHolder = new ViewHolder(finalView);
finalView.setTag(viewHolder);
}
else {
} else {
viewHolder = (UserGridAdapter.ViewHolder) finalView.getTag();
}
@ -107,17 +109,24 @@ public class UserGridAdapter extends BaseAdapter implements Filterable {
User currentItem = membersList.get(position);
int imgRadius = AppUtil.getPixelsFromDensity(context, 0);
PicassoService.getInstance(context).get().load(currentItem.getAvatarUrl()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop()
PicassoService.getInstance(context)
.get()
.load(currentItem.getAvatarUrl())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(120, 120)
.centerCrop()
.into(viewHolder.memberAvatar);
viewHolder.userLoginId = currentItem.getLogin();
if(!currentItem.getFullName().equals("")) {
if (!currentItem.getFullName().equals("")) {
viewHolder.memberName.setText(Html.fromHtml(currentItem.getFullName()));
viewHolder.userName.setText(context.getResources().getString(R.string.usernameWithAt, currentItem.getLogin()));
}
else {
viewHolder.userName.setText(
context.getResources()
.getString(R.string.usernameWithAt, currentItem.getLogin()));
} else {
viewHolder.memberName.setText(currentItem.getLogin());
viewHolder.userName.setVisibility(View.GONE);
@ -129,21 +138,22 @@ public class UserGridAdapter extends BaseAdapter implements Filterable {
return membersFilter;
}
private final Filter membersFilter = new Filter() {
private final Filter membersFilter =
new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<User> filteredList = new ArrayList<>();
if(constraint == null || constraint.length() == 0) {
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(membersListFull);
}
else {
} else {
String filterPattern = constraint.toString().toLowerCase().trim();
for(User item : membersListFull) {
if(item.getFullName().toLowerCase().contains(filterPattern) || item.getLogin().toLowerCase().contains(filterPattern)) {
for (User item : membersListFull) {
if (item.getFullName().toLowerCase().contains(filterPattern)
|| item.getLogin().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}
@ -163,5 +173,4 @@ public class UserGridAdapter extends BaseAdapter implements Filterable {
notifyDataSetChanged();
}
};
}

View File

@ -12,18 +12,17 @@ import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
import org.gitnex.tea4j.v2.models.User;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation;
import java.util.List;
/**
* @author M M Arif
*/
public class UsersAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final Context context;
@ -36,8 +35,7 @@ public class UsersAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
this.followersList = dataList;
}
@NonNull
@Override
@NonNull @Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
return new UsersAdapter.UsersHolder(inflater.inflate(R.layout.list_users, parent, false));
@ -45,7 +43,10 @@ public class UsersAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
if (position >= getItemCount() - 1
&& isMoreDataAvailable
&& !isLoading
&& loadMoreListener != null) {
isLoading = true;
loadMoreListener.run();
}
@ -95,21 +96,32 @@ public class UsersAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
userFullName = itemView.findViewById(R.id.userFullName);
userName = itemView.findViewById(R.id.userName);
new Handler().postDelayed(() -> {
if(!AppUtil.checkGhostUsers(userInfo.getLogin())) {
new Handler()
.postDelayed(
() -> {
if (!AppUtil.checkGhostUsers(userInfo.getLogin())) {
itemView.setOnClickListener(loginId -> {
Intent intent = new Intent(context, ProfileActivity.class);
itemView.setOnClickListener(
loginId -> {
Intent intent =
new Intent(context, ProfileActivity.class);
intent.putExtra("username", userInfo.getLogin());
context.startActivity(intent);
});
itemView.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, userInfo.getLogin(), context.getString(R.string.copyLoginIdToClipBoard, userInfo.getLogin()));
itemView.setOnLongClickListener(
loginId -> {
AppUtil.copyToClipboard(
context,
userInfo.getLogin(),
context.getString(
R.string.copyLoginIdToClipBoard,
userInfo.getLogin()));
return true;
});
}
}, 500);
},
500);
}
@SuppressLint("SetTextI18n")
@ -117,21 +129,24 @@ public class UsersAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
this.userInfo = userInfo;
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
if(!userInfo.getFullName().equals("")) {
if (!userInfo.getFullName().equals("")) {
userFullName.setText(Html.fromHtml(userInfo.getFullName()));
userName.setText(context.getResources().getString(R.string.usernameWithAt, userInfo.getLogin()));
}
else {
userName.setText(
context.getResources()
.getString(R.string.usernameWithAt, userInfo.getLogin()));
} else {
userFullName.setText(userInfo.getLogin());
userName.setVisibility(View.GONE);
}
PicassoService.getInstance(context).get().load(userInfo.getAvatarUrl()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop()
PicassoService.getInstance(context)
.get()
.load(userInfo.getAvatarUrl())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(120, 120)
.centerCrop()
.into(userAvatar);
}
}
}

View File

@ -16,6 +16,7 @@ import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import java.util.List;
import org.gitnex.tea4j.v2.models.WikiPageMetaData;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.RepoDetailActivity;
@ -26,7 +27,6 @@ import org.mian.gitnex.helpers.ClickListener;
import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.contexts.RepositoryContext;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -34,7 +34,6 @@ import retrofit2.Response;
/**
* @author M M Arif
*/
public class WikiListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final Context ctx;
@ -45,7 +44,12 @@ public class WikiListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
private OnLoadMoreListener loadMoreListener;
private boolean isLoading = false, isMoreDataAvailable = true;
public WikiListAdapter(List<WikiPageMetaData> wikiListMain, Context ctx, String repoOwner, String repoName, FragmentWikiBinding fragmentWikiBinding) {
public WikiListAdapter(
List<WikiPageMetaData> wikiListMain,
Context ctx,
String repoOwner,
String repoName,
FragmentWikiBinding fragmentWikiBinding) {
this.ctx = ctx;
this.wikiList = wikiListMain;
this.repoOwner = repoOwner;
@ -53,8 +57,7 @@ public class WikiListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
this.fragmentWikiBinding = fragmentWikiBinding;
}
@NonNull
@Override
@NonNull @Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(ctx);
return new WikiListAdapter.WikisHolder(inflater.inflate(R.layout.list_wiki, parent, false));
@ -62,7 +65,10 @@ public class WikiListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
if (position >= getItemCount() - 1
&& isMoreDataAvailable
&& !isLoading
&& loadMoreListener != null) {
isLoading = true;
loadMoreListener.onLoadMore();
}
@ -88,7 +94,7 @@ public class WikiListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
public void setMoreDataAvailable(boolean moreDataAvailable) {
isMoreDataAvailable = moreDataAvailable;
if(!isMoreDataAvailable) {
if (!isMoreDataAvailable) {
loadMoreListener.onLoadFinished();
}
}
@ -109,37 +115,72 @@ public class WikiListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
notifyDataChanged();
}
private void deleteWiki(final String owner, final String repo, final String pageName, int position, final Context context) {
private void deleteWiki(
final String owner,
final String repo,
final String pageName,
int position,
final Context context) {
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(context, R.style.ThemeOverlay_Material3_Dialog_Alert);
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(
context, R.style.ThemeOverlay_Material3_Dialog_Alert);
materialAlertDialogBuilder.setTitle(String.format(context.getString(R.string.deleteGenericTitle), pageName)).setMessage(context.getString(R.string.deleteWikiPageMessage, pageName))
.setPositiveButton(R.string.menuDeleteText, (dialog, whichButton) -> RetrofitClient.getApiInterface(context).repoDeleteWikiPage(owner, repo, pageName).enqueue(new Callback<>() {
materialAlertDialogBuilder
.setTitle(String.format(context.getString(R.string.deleteGenericTitle), pageName))
.setMessage(context.getString(R.string.deleteWikiPageMessage, pageName))
.setPositiveButton(
R.string.menuDeleteText,
(dialog, whichButton) ->
RetrofitClient.getApiInterface(context)
.repoDeleteWikiPage(owner, repo, pageName)
.enqueue(
new Callback<>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
public void onResponse(
@NonNull Call<Void> call,
@NonNull Response<Void> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
updateAdapter(position);
Toasty.success(context, context.getString(R.string.wikiPageDeleted));
if(getItemCount() == 0) {
fragmentWikiBinding.noData.setVisibility(View.VISIBLE);
Toasty.success(
context,
context.getString(
R.string
.wikiPageDeleted));
if (getItemCount() == 0) {
fragmentWikiBinding.noData
.setVisibility(
View.VISIBLE);
}
}
else if(response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else {
Toasty.error(context, context.getString(R.string.genericError));
} else if (response.code() == 403) {
Toasty.error(
context,
context.getString(
R.string
.authorizeError));
} else {
Toasty.error(
context,
context.getString(
R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
public void onFailure(
@NonNull Call<Void> call,
@NonNull Throwable t) {
Toasty.error(context, context.getString(R.string.genericError));
Toasty.error(
context,
context.getString(
R.string.genericError));
}
})).setNeutralButton(R.string.cancelButton, null).show();
}))
.setNeutralButton(R.string.cancelButton, null)
.show();
}
public interface OnLoadMoreListener {
@ -147,7 +188,6 @@ public class WikiListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
void onLoadMore();
void onLoadFinished();
}
class WikisHolder extends RecyclerView.ViewHolder {
@ -166,19 +206,26 @@ public class WikiListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
wikiLastUpdatedBy = itemView.findViewById(R.id.wiki_last_updated_by);
wikiMenu = itemView.findViewById(R.id.wiki_menu);
itemView.setOnClickListener(v -> {
itemView.setOnClickListener(
v -> {
Intent intent = new Intent(ctx, WikiActivity.class);
intent.putExtra("pageName", wikiPageMeta.getTitle());
intent.putExtra(RepositoryContext.INTENT_EXTRA, ((RepoDetailActivity) itemView.getContext()).repository);
intent.putExtra(
RepositoryContext.INTENT_EXTRA,
((RepoDetailActivity) itemView.getContext()).repository);
ctx.startActivity(intent);
});
wikiMenu.setOnClickListener(v -> {
wikiMenu.setOnClickListener(
v -> {
Context ctx = v.getContext();
View view = LayoutInflater.from(ctx).inflate(R.layout.bottom_sheet_wiki_in_list, itemView.findViewById(android.R.id.content), false);
View view =
LayoutInflater.from(ctx)
.inflate(
R.layout.bottom_sheet_wiki_in_list,
itemView.findViewById(android.R.id.content),
false);
TextView bottomSheetHeader = view.findViewById(R.id.bottom_sheet_header);
TextView editWiki = view.findViewById(R.id.edit_wiki);
@ -190,19 +237,27 @@ public class WikiListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
dialog.setContentView(view);
dialog.show();
editWiki.setOnClickListener(v12 -> {
editWiki.setOnClickListener(
v12 -> {
Intent intent = new Intent(ctx, WikiActivity.class);
intent.putExtra("pageName", wikiPageMeta.getTitle());
intent.putExtra("action", "edit");
intent.putExtra(RepositoryContext.INTENT_EXTRA, ((RepoDetailActivity) itemView.getContext()).repository);
intent.putExtra(
RepositoryContext.INTENT_EXTRA,
((RepoDetailActivity) itemView.getContext())
.repository);
ctx.startActivity(intent);
dialog.dismiss();
});
deleteWiki.setOnClickListener(v12 -> {
deleteWiki(repoOwner, repoName, wikiPageMeta.getTitle(), getAbsoluteAdapterPosition(), ctx);
deleteWiki.setOnClickListener(
v12 -> {
deleteWiki(
repoOwner,
repoName,
wikiPageMeta.getTitle(),
getAbsoluteAdapterPosition(),
ctx);
dialog.dismiss();
});
});
@ -214,26 +269,55 @@ public class WikiListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
this.wikiPageMeta = wikiPageMetaData;
pageName.setText(wikiPageMetaData.getTitle());
wikiLastUpdatedBy.setText(HtmlCompat.fromHtml(ctx.getResources().getString(R.string.wikiAuthor, wikiPageMetaData.getLastCommit().getAuthor().getName(),
TimeHelper.formatTime(TimeHelper.parseIso8601(wikiPageMetaData.getLastCommit().getAuthor().getDate()), ctx.getResources().getConfiguration().locale, "pretty", ctx)), HtmlCompat.FROM_HTML_MODE_COMPACT));
this.wikiLastUpdatedBy.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(TimeHelper.parseIso8601(wikiPageMetaData.getLastCommit().getAuthor().getDate())), ctx));
wikiLastUpdatedBy.setText(
HtmlCompat.fromHtml(
ctx.getResources()
.getString(
R.string.wikiAuthor,
wikiPageMetaData.getLastCommit().getAuthor().getName(),
TimeHelper.formatTime(
TimeHelper.parseIso8601(
wikiPageMetaData
.getLastCommit()
.getAuthor()
.getDate()),
ctx.getResources().getConfiguration().locale,
"pretty",
ctx)),
HtmlCompat.FROM_HTML_MODE_COMPACT));
this.wikiLastUpdatedBy.setOnClickListener(
new ClickListener(
TimeHelper.customDateFormatForToastDateFormat(
TimeHelper.parseIso8601(
wikiPageMetaData
.getLastCommit()
.getAuthor()
.getDate())),
ctx));
ColorGenerator generator = ColorGenerator.Companion.getMATERIAL();
int color = generator.getColor(wikiPageMetaData.getTitle());
if (wikiPageMetaData.getTitle() != null && wikiPageMetaData.getTitle().length() > 0) {
String firstCharacter = String.valueOf(wikiPageMetaData.getTitle().charAt(0));
TextDrawable drawable = TextDrawable.builder().beginConfig().useFont(Typeface.DEFAULT).fontSize(18).toUpperCase().width(28).height(28).endConfig().buildRoundRect(firstCharacter, color, 14);
TextDrawable drawable =
TextDrawable.builder()
.beginConfig()
.useFont(Typeface.DEFAULT)
.fontSize(18)
.toUpperCase()
.width(28)
.height(28)
.endConfig()
.buildRoundRect(firstCharacter, color, 14);
avatar.setImageDrawable(drawable);
} else {
avatar.setVisibility(View.GONE);
}
if(!((RepoDetailActivity) ctx).repository.getPermissions().isPush()) {
if (!((RepoDetailActivity) ctx).repository.getPermissions().isPush()) {
wikiMenu.setVisibility(View.GONE);
}
}
}
}

View File

@ -4,20 +4,19 @@ import android.content.Context;
import android.util.Log;
import com.squareup.picasso.OkHttp3Downloader;
import com.squareup.picasso.Picasso;
import org.mian.gitnex.activities.BaseActivity;
import org.mian.gitnex.helpers.PicassoCache;
import org.mian.gitnex.helpers.ssl.MemorizingTrustManager;
import java.io.File;
import java.security.SecureRandom;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.X509TrustManager;
import okhttp3.OkHttpClient;
import org.mian.gitnex.activities.BaseActivity;
import org.mian.gitnex.helpers.PicassoCache;
import org.mian.gitnex.helpers.ssl.MemorizingTrustManager;
/**
* @author opyale
*/
public class PicassoService {
private static volatile PicassoService picassoService;
@ -34,10 +33,15 @@ public class PicassoService {
SSLContext sslContext = SSLContext.getInstance("TLS");
MemorizingTrustManager memorizingTrustManager = new MemorizingTrustManager(context);
sslContext.init(null, new X509TrustManager[]{memorizingTrustManager}, new SecureRandom());
sslContext.init(
null, new X509TrustManager[] {memorizingTrustManager}, new SecureRandom());
OkHttpClient.Builder okHttpClient = new OkHttpClient.Builder().sslSocketFactory(sslContext.getSocketFactory(), memorizingTrustManager)
.hostnameVerifier(memorizingTrustManager.wrapHostnameVerifier(HttpsURLConnection.getDefaultHostnameVerifier()));
OkHttpClient.Builder okHttpClient =
new OkHttpClient.Builder()
.sslSocketFactory(sslContext.getSocketFactory(), memorizingTrustManager)
.hostnameVerifier(
memorizingTrustManager.wrapHostnameVerifier(
HttpsURLConnection.getDefaultHostnameVerifier()));
builder.downloader(new OkHttp3Downloader(okHttpClient.build()));
/*builder.listener((picasso, uri, exception) -> {
@ -49,8 +53,7 @@ public class PicassoService {
picasso = builder.memoryCache(new PicassoCache(cachePath, context)).build();
}
catch(Exception e) {
} catch (Exception e) {
Log.e("PicassoService", e.toString());
}
@ -58,23 +61,20 @@ public class PicassoService {
public static synchronized PicassoService getInstance(Context context) {
if(picassoService == null) {
synchronized(PicassoService.class) {
if(picassoService == null) {
if (picassoService == null) {
synchronized (PicassoService.class) {
if (picassoService == null) {
picassoService = new PicassoService(context);
}
}
}
return picassoService;
}
public Picasso get() {
cachePath.mkdirs();
return picasso;
}
}

Some files were not shown because too many files have changed in this diff Show More