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,103 +13,130 @@ 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) {
@Override
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;
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 {
Toasty.error(ctx, ctx.getResources().getString(R.string.genericError));
}
}
}
else {
Toasty.error(ctx, ctx.getResources().getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Issue> call, @NonNull Throwable t) {
@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) {
@Override
public void onResponse(
@NonNull Call<List<User>> call,
@NonNull retrofit2.Response<List<User>> response) {
assigneesList.clear();
List<User> assigneesList_ = response.body();
assigneesList.clear();
List<User> assigneesList_ = response.body();
if(response.code() == 200) {
if (response.code() == 200) {
assert assigneesList_ != null;
assert assigneesList_ != null;
if(assigneesList_.size() > 0) {
if (assigneesList_.size() > 0) {
assigneesList.addAll(assigneesList_);
materialAlertDialogBuilder.show();
}
else {
assigneesList.addAll(assigneesList_);
materialAlertDialogBuilder.show();
} else {
Toasty.warning(ctx, ctx.getResources().getString(R.string.noAssigneesFound));
Toasty.warning(
ctx,
ctx.getResources().getString(R.string.noAssigneesFound));
}
assigneesBinding.assigneesRecyclerView.setAdapter(assigneesAdapter);
} else {
Toasty.error(ctx, ctx.getResources().getString(R.string.genericError));
}
if (progressBar != null) {
progressBar.setVisibility(View.GONE);
}
}
assigneesBinding.assigneesRecyclerView.setAdapter(assigneesAdapter);
@Override
public void onFailure(@NonNull Call<List<User>> call, @NonNull Throwable t) {
}
else {
Toasty.error(ctx, ctx.getResources().getString(R.string.genericError));
}
if(progressBar != null) {
progressBar.setVisibility(View.GONE);
}
}
@Override
public void onFailure(@NonNull Call<List<User>> call, @NonNull Throwable t) {
if(progressBar != null) {
progressBar.setVisibility(View.GONE);
}
Toasty.error(ctx, ctx.getResources().getString(R.string.genericServerResponseError));
}
});
if (progressBar != null) {
progressBar.setVisibility(View.GONE);
}
Toasty.error(
ctx,
ctx.getResources().getString(R.string.genericServerResponseError));
}
});
}
}

View File

@ -16,97 +16,114 @@ 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) {
@Override
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));
((AddCollaboratorToRepositoryActivity) context).finish();
CollaboratorsFragment.refreshCollaborators = true;
Toasty.success(
context,
context.getString(R.string.removeCollaboratorToastText));
((AddCollaboratorToRepositoryActivity) context).finish();
}
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
} else if (response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
} else if (response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
} else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
}
else if(response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
}
else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(context, context.getResources().getString(R.string.genericServerResponseError));
}
});
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
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) {
@Override
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));
((AddCollaboratorToRepositoryActivity) context).finish();
CollaboratorsFragment.refreshCollaborators = true;
Toasty.success(
context,
context.getString(R.string.addCollaboratorToastText));
((AddCollaboratorToRepositoryActivity) context).finish();
}
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
} else if (response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
} else if (response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
} else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
}
else if(response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
}
else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
@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,243 +25,288 @@ 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) {
@Override
public void onResponse(
@NonNull Call<Comment> call,
@NonNull retrofit2.Response<Comment> response) {
switch(response.code()) {
switch (response.code()) {
case 200:
actionResult.finish(ActionResult.Status.SUCCESS);
break;
case 200:
actionResult.finish(ActionResult.Status.SUCCESS);
break;
case 401:
actionResult.finish(ActionResult.Status.FAILED, response);
AlertDialogs.authorizationTokenRevokedDialog(context);
break;
case 401:
actionResult.finish(ActionResult.Status.FAILED, response);
AlertDialogs.authorizationTokenRevokedDialog(context);
break;
default:
actionResult.finish(ActionResult.Status.FAILED, response);
break;
}
}
default:
actionResult.finish(ActionResult.Status.FAILED, response);
break;
@Override
public void onFailure(@NonNull Call<Comment> call, @NonNull Throwable t) {
}
}
@Override
public void onFailure(@NonNull Call<Comment> call, @NonNull Throwable t) {
actionResult.finish(ActionResult.Status.FAILED);
}
});
actionResult.finish(ActionResult.Status.FAILED);
}
});
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) {
@Override
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.getIssueType().equalsIgnoreCase("Pull")) {
if(issueState.equals("closed")) {
Toasty.success(ctx, ctx.getString(R.string.prClosed));
if (issue.hasIssue()) {
IssuesFragment.resumeIssues =
issue.getIssue().getPullRequest() == null;
PullRequestsFragment.resumePullRequests =
issue.getIssue().getPullRequest() != null;
}
if (issue.getIssueType().equalsIgnoreCase("Pull")) {
if (issueState.equals("closed")) {
Toasty.success(ctx, ctx.getString(R.string.prClosed));
} 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));
}
}
IssueDetailActivity.singleIssueUpdate = true;
((IssueDetailActivity) ctx).onResume();
if (((Activity) ctx).getIntent().getStringExtra("openedFromLink")
== null
|| !((Activity) ctx)
.getIntent()
.getStringExtra("openedFromLink")
.equals("true")) {
RepoDetailActivity.updateRepo = true;
}
}
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 (response.code() == 401) {
IssueDetailActivity.singleIssueUpdate = true;
((IssueDetailActivity) ctx).onResume();
if(((Activity) ctx).getIntent().getStringExtra("openedFromLink") == null || !((Activity) ctx).getIntent().getStringExtra("openedFromLink").equals("true")) {
RepoDetailActivity.updateRepo = true;
AlertDialogs.authorizationTokenRevokedDialog(ctx);
} else if (response.code() == 403) {
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
} else if (response.code() == 404) {
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
} else {
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
}
else if(response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else if(response.code() == 403) {
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
}
else {
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Issue> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getResources().getString(R.string.genericServerResponseError));
}
});
@Override
public void onFailure(@NonNull Call<Issue> call, @NonNull Throwable t) {
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) {
@Override
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));
Toasty.success(ctx, ctx.getString(R.string.subscribedSuccessfully));
} else if (response.code() == 200) {
Toasty.success(ctx, ctx.getString(R.string.alreadySubscribed));
}
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
} else {
Toasty.error(ctx, ctx.getString(R.string.subscriptionError));
}
}
else if(response.code() == 200) {
Toasty.success(ctx, ctx.getString(R.string.alreadySubscribed));
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(
ctx,
ctx.getResources().getString(R.string.genericServerResponseError));
}
}
else if(response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
Toasty.error(ctx, ctx.getString(R.string.subscriptionError));
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getResources().getString(R.string.genericServerResponseError));
}
});
});
}
public static void unsubscribe(final Context ctx, IssueContext issue) {
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) {
@Override
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));
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) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
} else {
Toasty.error(ctx, ctx.getString(R.string.unSubscriptionError));
}
}
else if(response.code() == 200) {
Toasty.success(ctx, ctx.getString(R.string.alreadyUnsubscribed));
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(
ctx,
ctx.getResources().getString(R.string.genericServerResponseError));
}
}
else if(response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
Toasty.error(ctx, ctx.getString(R.string.unSubscriptionError));
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
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) {
@Override
public void onResponse(
@NonNull Call<Comment> call,
@NonNull retrofit2.Response<Comment> response) {
if(response.code() == 201) {
actionResult.finish(ActionResult.Status.SUCCESS);
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) {
AlertDialogs.authorizationTokenRevokedDialog(context);
} else {
actionResult.finish(ActionResult.Status.FAILED);
}
}
}
else if(response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
@Override
public void onFailure(@NonNull Call<Comment> call, @NonNull Throwable t) {
}
else {
actionResult.finish(ActionResult.Status.FAILED);
}
}
@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,124 +5,160 @@ 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) {
@Override
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();
List<Label> issueLabelsList = response.body();
assert issueLabelsList != null;
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 {
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
}
else {
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<List<Label>> call, @NonNull Throwable t) {
@Override
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));
}
});
}
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) {
@Override
public void onResponse(
@NonNull Call<List<Label>> call,
@NonNull retrofit2.Response<List<Label>> response) {
labelsList.clear();
labelsList.clear();
if(response.isSuccessful()) {
if (response.isSuccessful()) {
if(response.body() != null) {
if (response.body() != null) {
labelsList.addAll(response.body());
labelsList.addAll(response.body());
}
// Load organization labels
Call<List<Label>> callOrgLabels =
RetrofitClient.getApiInterface(ctx)
.orgListLabels(repoOwner, null, null);
callOrgLabels.enqueue(
new Callback<>() {
@Override
public void onResponse(
@NonNull Call<List<Label>> call,
@NonNull retrofit2.Response<List<Label>>
responseOrg) {
if (responseOrg.body() != null) {
labelsList.addAll(responseOrg.body());
materialAlertDialogBuilder.show();
}
if (labelsList.isEmpty()) {
Toasty.warning(
ctx,
ctx.getResources()
.getString(R.string.noDataFound));
}
labelsBinding.labelsRecyclerView.setAdapter(
labelsAdapter);
}
@Override
public void onFailure(
@NonNull Call<List<Label>> call,
@NonNull Throwable t) {
Toasty.error(
ctx,
ctx.getString(
R.string.genericServerResponseError));
}
});
} else {
Toasty.error(ctx, ctx.getResources().getString(R.string.genericError));
}
if (progressBar != null) {
progressBar.setVisibility(View.GONE);
}
}
// Load organization labels
Call<List<Label>> callOrgLabels = RetrofitClient.getApiInterface(ctx).orgListLabels(repoOwner, null, null);
@Override
public void onFailure(@NonNull Call<List<Label>> call, @NonNull Throwable t) {
callOrgLabels.enqueue(new Callback<>() {
@Override
public void onResponse(@NonNull Call<List<Label>> call, @NonNull retrofit2.Response<List<Label>> responseOrg) {
if(responseOrg.body() != null) {
labelsList.addAll(responseOrg.body());
materialAlertDialogBuilder.show();
}
if(labelsList.isEmpty()) {
Toasty.warning(ctx, ctx.getResources().getString(R.string.noDataFound));
}
labelsBinding.labelsRecyclerView.setAdapter(labelsAdapter);
if (progressBar != null) {
progressBar.setVisibility(View.GONE);
}
@Override
public void onFailure(@NonNull Call<List<Label>> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
}
else {
Toasty.error(ctx, ctx.getResources().getString(R.string.genericError));
}
if(progressBar != null) {
progressBar.setVisibility(View.GONE);
}
}
@Override
public void onFailure(@NonNull Call<List<Label>> call, @NonNull Throwable t) {
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) {
@Override
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));
Toasty.success(ctx, ctx.getString(R.string.milestoneStatusUpdate));
}
else if(response.code() == 401) {
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
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));
}
});
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,97 +13,107 @@ 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) {
@Override
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) {
AlertDialogs.authorizationTokenRevokedDialog(context);
} else if (response.code() == 403) {
if (showToasts) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
} else if (response.code() == 404) {
if (showToasts) {
Toasty.warning(
context,
context.getString(R.string.deleteBranchErrorNotFound));
}
} else {
if (showToasts) {
Toasty.error(context, context.getString(R.string.genericError));
}
}
}
}
else if(response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
if(showToasts) {
Toasty.error(context, context.getString(R.string.authorizeError));
if (showToasts) {
Toasty.error(context, context.getString(R.string.deleteBranchError));
}
}
}
else if(response.code() == 404) {
if(showToasts) {
Toasty.warning(context, context.getString(R.string.deleteBranchErrorNotFound));
}
}
else {
if(showToasts) {
Toasty.error(context, context.getString(R.string.genericError));
}
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
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) {
@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));
}
}
}
@Override
public void onFailure(@NonNull Call call, @NonNull Throwable t) {
@Override
public void onFailure(@NonNull Call call, @NonNull Throwable t) {
Toasty.error(context, context.getString(R.string.genericError));
}
});
Toasty.error(context, context.getString(R.string.genericError));
}
});
}
}

View File

@ -15,173 +15,180 @@ 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) {
@Override
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));
MainActivity.reloadRepos = true;
Toasty.success(
context, context.getString(R.string.starRepositorySuccess));
}
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
} else if (response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
} else if (response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
} else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
}
else if(response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
}
else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
@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) {
@Override
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));
MainActivity.reloadRepos = true;
Toasty.success(
context,
context.getString(R.string.unStarRepositorySuccess));
}
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
} else if (response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
} else if (response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
} else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
}
else if(response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
}
else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
@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) {
@Override
public void onResponse(
@NonNull Call<WatchInfo> call,
@NonNull retrofit2.Response<WatchInfo> response) {
if(response.isSuccessful()) {
if(response.code() == 200) {
if (response.isSuccessful()) {
if (response.code() == 200) {
Toasty.success(context, context.getString(R.string.watchRepositorySuccess));
Toasty.success(
context,
context.getString(R.string.watchRepositorySuccess));
}
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
} else if (response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
} else if (response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
} else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
}
else if(response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
@Override
public void onFailure(@NonNull Call<WatchInfo> call, @NonNull Throwable t) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
}
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) {
@Override
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) {
AlertDialogs.authorizationTokenRevokedDialog(context);
} else if (response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
Toasty.error(context, context.getString(R.string.authorizeError));
} else if (response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
}
else {
Toasty.warning(context, context.getString(R.string.apiNotFound));
} else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
Toasty.error(context, context.getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
@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,183 +15,197 @@ 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) {
@Override
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));
((AddNewTeamMemberActivity) context).finish();
Toasty.success(
context, context.getString(R.string.memberRemovedMessage));
((AddNewTeamMemberActivity) context).finish();
}
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
} else if (response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
} else if (response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
} else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
}
else if(response.code() == 401) {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
}
else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
@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) {
@Override
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));
((AddNewTeamMemberActivity) context).finish();
Toasty.success(
context, context.getString(R.string.memberAddedMessage));
((AddNewTeamMemberActivity) context).finish();
}
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
} else if (response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
} else if (response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
} else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
}
else if(response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
}
else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
@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) {
@Override
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));
((AddNewTeamRepoActivity) context).finish();
OrganizationTeamInfoReposFragment.repoAdded = true;
Toasty.success(
context, context.getString(R.string.repoRemovedMessage));
((AddNewTeamRepoActivity) context).finish();
}
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
} else if (response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
} else if (response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
} else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
}
else if(response.code() == 401) {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
}
else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
@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) {
@Override
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));
((AddNewTeamRepoActivity) context).finish();
OrganizationTeamInfoReposFragment.repoAdded = true;
Toasty.success(
context, context.getString(R.string.repoAddedMessage));
((AddNewTeamRepoActivity) context).finish();
}
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
} else if (response.code() == 403) {
Toasty.error(context, context.getString(R.string.authorizeError));
} else if (response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
} else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
}
else if(response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(context);
}
else if(response.code() == 403) {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
Toasty.warning(context, context.getString(R.string.apiNotFound));
}
else {
Toasty.error(context, context.getString(R.string.genericError));
}
}
@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,79 +35,98 @@ 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());
}
}
return false;
});
return false;
});
}
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) {
@Override
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 {
assert response.body() != null;
getUsersList(response.body().getData(), ctx);
} else {
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<InlineResponse2001> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
@Override
public void onFailure(
@NonNull Call<InlineResponse2001> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
}
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,235 +57,292 @@ 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);
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
if (!connToInternet) {
if(!connToInternet) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
}
else {
processLogin();
}
});
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
} 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) {
@Override
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();
ServerVersion version = responseVersion.body();
assert version != null;
assert version != null;
if(!Version.valid(version.getVersion())) {
if (!Version.valid(version.getVersion())) {
Toasty.error(ctx, getResources().getString(R.string.versionUnknown));
return;
}
Toasty.error(
ctx, getResources().getString(R.string.versionUnknown));
return;
}
giteaVersion = new Version(version.getVersion());
giteaVersion = new Version(version.getVersion());
if(giteaVersion.less(getString(R.string.versionLow))) {
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) -> {
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))) {
dialog.dismiss();
login(instanceUrl, loginToken);
});
} else {
materialAlertDialogBuilder.create().show();
}
else if(giteaVersion.lessOrEqual(getString(R.string.versionHigh))) {
Toasty.warning(
ctx,
getResources().getString(R.string.versionUnsupportedNew));
login(instanceUrl, loginToken);
}
login(instanceUrl, loginToken);
}
else {
} else if (responseVersion.code() == 403) {
Toasty.warning(ctx, getResources().getString(R.string.versionUnsupportedNew));
login(instanceUrl, loginToken);
login(instanceUrl, loginToken);
}
}
}
else if(responseVersion.code() == 403) {
private void login(String instanceUrl, String loginToken) {
login(instanceUrl, loginToken);
}
}
setupNewAccountWithToken(instanceUrl, loginToken);
}
private void login(String instanceUrl, String loginToken) {
@Override
public void onFailure(
@NonNull Call<ServerVersion> callVersion, @NonNull Throwable t) {
setupNewAccountWithToken(instanceUrl, loginToken);
}
@Override
public void onFailure(@NonNull Call<ServerVersion> callVersion, @NonNull Throwable t) {
Log.e("onFailure-versionCheck", t.toString());
Toasty.error(ctx, getResources().getString(R.string.genericServerResponseError));
}
});
Log.e("onFailure-versionCheck", t.toString());
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) {
@Override
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) {
}
});
@Override
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) {
@Override
public void onResponse(
@NonNull Call<User> call, @NonNull retrofit2.Response<User> response) {
User userDetails = response.body();
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);
case 200:
if (!userAccountExists) {
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);
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));
MainActivity.refActivity = true;
finish();
} 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);
userAccountsApi.login(account.getAccountId());
AppUtil.switchToAccount(
AddNewAccountActivity.this, account);
}
}
finish();
break;
if(!userAccountExists) {
case 401:
Toasty.error(
ctx,
getResources().getString(R.string.unauthorizedApiError));
break;
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));
MainActivity.refActivity = true;
finish();
default:
Toasty.error(
ctx,
getResources()
.getString(
R.string.genericApiError, response.code()));
}
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);
userAccountsApi.login(account.getAccountId());
AppUtil.switchToAccount(AddNewAccountActivity.this, account);
}
}
finish();
break;
}
case 401:
Toasty.error(ctx, getResources().getString(R.string.unauthorizedApiError));
break;
default:
Toasty.error(ctx, getResources().getString(R.string.genericApiError, response.code()));
}
}
@Override
public void onFailure(@NonNull Call<User> call, @NonNull Throwable t) {
Toasty.error(ctx, getResources().getString(R.string.genericError));
}
});
@Override
public void onFailure(@NonNull Call<User> call, @NonNull Throwable t) {
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) {
@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"));
loadUserSearchList(addNewTeamMember.getText().toString());
}
}
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) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
@Override
public void beforeTextChanged(
CharSequence s, int start, int count, int after) {}
@Override
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) {
@Override
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) {
assert response.body() != null;
if (response.body().getData().size() > 0) {
dataList.clear();
dataList.addAll(response.body().getData());
mRecyclerView.setAdapter(adapter);
noData.setVisibility(View.GONE);
}
else {
dataList.clear();
dataList.addAll(response.body().getData());
mRecyclerView.setAdapter(adapter);
noData.setVisibility(View.GONE);
} else {
noData.setVisibility(View.VISIBLE);
noData.setVisibility(View.VISIBLE);
}
mProgressBar.setVisibility(View.GONE);
}
}
mProgressBar.setVisibility(View.GONE);
}
@Override
public void onFailure(
@NonNull Call<InlineResponse2001> call, @NonNull Throwable t) {
}
@Override
public void onFailure(@NonNull Call<InlineResponse2001> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
}
});
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,49 +57,59 @@ 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) {
@Override
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) {
assert response.body() != null;
if (response.body().size() > 0) {
dataList.clear();
dataList.addAll(response.body());
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.noData.setVisibility(View.GONE);
}
else {
addNewTeamRepositoryBinding.recyclerViewTeamRepos.setAdapter(
adapter);
addNewTeamRepositoryBinding.noData.setVisibility(View.GONE);
} else {
addNewTeamRepositoryBinding.noData.setVisibility(View.VISIBLE);
addNewTeamRepositoryBinding.noData.setVisibility(View.VISIBLE);
}
addNewTeamRepositoryBinding.progressBar.setVisibility(View.GONE);
} else {
Toasty.error(ctx, getString(R.string.genericError));
}
}
addNewTeamRepositoryBinding.progressBar.setVisibility(View.GONE);
}
else {
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<List<Repository>> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
@Override
public void onFailure(
@NonNull Call<List<Repository>> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
}
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,36 +46,43 @@ 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);
adapter = new AdminCronTasksAdapter(cronTasksListMain);
if(adapter.getItemCount() > 0) {
activityAdminCronTasksBinding.recyclerView.setAdapter(adapter);
activityAdminCronTasksBinding.noData.setVisibility(View.GONE);
activityAdminCronTasksBinding.progressBar.setVisibility(View.GONE);
}
else {
activityAdminCronTasksBinding.noData.setVisibility(View.VISIBLE);
}
});
if (adapter.getItemCount() > 0) {
activityAdminCronTasksBinding.recyclerView.setAdapter(adapter);
activityAdminCronTasksBinding.noData.setVisibility(View.GONE);
activityAdminCronTasksBinding.progressBar.setVisibility(View.GONE);
} else {
activityAdminCronTasksBinding.noData.setVisibility(View.VISIBLE);
}
});
}
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,56 +54,69 @@ 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(() -> {
page = 1;
activityAdminGetUsersBinding.pullToRefresh.setRefreshing(false);
fetchDataAsync();
activityAdminGetUsersBinding.progressBar.setVisibility(View.VISIBLE);
}, 50));
activityAdminGetUsersBinding.pullToRefresh.setOnRefreshListener(
() ->
new Handler(Looper.getMainLooper())
.postDelayed(
() -> {
page = 1;
activityAdminGetUsersBinding.pullToRefresh
.setRefreshing(false);
fetchDataAsync();
activityAdminGetUsersBinding.progressBar.setVisibility(
View.VISIBLE);
},
50));
fetchDataAsync();
}
;
private void fetchDataAsync() {
AdminGetUsersViewModel adminUsersModel = new ViewModelProvider(this).get(AdminGetUsersViewModel.class);
AdminGetUsersViewModel adminUsersModel =
new ViewModelProvider(this).get(AdminGetUsersViewModel.class);
adminUsersModel.getUsersList(page, resultLimit, ctx).observe(this, adminUsersListMain -> {
adminUsersModel
.getUsersList(page, resultLimit, ctx)
.observe(
this,
adminUsersListMain -> {
adapter = new AdminGetUsersAdapter(adminUsersListMain, ctx);
adapter.setLoadMoreListener(
new AdminGetUsersAdapter.OnLoadMoreListener() {
adapter = new AdminGetUsersAdapter(adminUsersListMain, ctx);
adapter.setLoadMoreListener(new AdminGetUsersAdapter.OnLoadMoreListener() {
@Override
public void onLoadMore() {
@Override
public void onLoadMore() {
page += 1;
adminGetUsersViewModel.loadMoreUsersList(
page, resultLimit, ctx, adapter);
activityAdminGetUsersBinding.progressBar.setVisibility(
View.VISIBLE);
}
page += 1;
adminGetUsersViewModel.loadMoreUsersList(page, resultLimit, ctx, adapter);
activityAdminGetUsersBinding.progressBar.setVisibility(View.VISIBLE);
}
@Override
public void onLoadFinished() {
@Override
public void onLoadFinished() {
activityAdminGetUsersBinding.progressBar.setVisibility(
View.GONE);
}
});
activityAdminGetUsersBinding.progressBar.setVisibility(View.GONE);
}
});
if (adapter.getItemCount() > 0) {
activityAdminGetUsersBinding.recyclerView.setAdapter(adapter);
activityAdminGetUsersBinding.noDataUsers.setVisibility(View.GONE);
searchFilter = true;
} else {
adapter.notifyDataChanged();
activityAdminGetUsersBinding.recyclerView.setAdapter(adapter);
activityAdminGetUsersBinding.noDataUsers.setVisibility(
View.VISIBLE);
}
if(adapter.getItemCount() > 0) {
activityAdminGetUsersBinding.recyclerView.setAdapter(adapter);
activityAdminGetUsersBinding.noDataUsers.setVisibility(View.GONE);
searchFilter = true;
}
else {
adapter.notifyDataChanged();
activityAdminGetUsersBinding.recyclerView.setAdapter(adapter);
activityAdminGetUsersBinding.noDataUsers.setVisibility(View.VISIBLE);
}
activityAdminGetUsersBinding.progressBar.setVisibility(View.GONE);
});
activityAdminGetUsersBinding.progressBar.setVisibility(View.GONE);
});
}
@Override
@ -113,38 +125,42 @@ 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(() -> {
new Handler(Looper.getMainLooper())
.postDelayed(
() -> {
if (searchFilter) {
if(searchFilter) {
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
inflater.inflate(R.menu.search_menu, menu);
inflater.inflate(R.menu.search_menu, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
if (!connToInternet) {
return;
}
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) {
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return false;
}
});
}
}, 500);
adapter.getFilter().filter(newText);
return false;
}
});
}
},
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));
binding.pullToRefresh.setRefreshing(false);
PAGE = 1;
binding.progressBar.setVisibility(View.VISIBLE);
reload = true;
viewModel.loadRepos(ctx, PAGE, resultLimit, null);
}, 500));
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);
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.recyclerView.setAdapter(adapter);
@ -84,28 +91,29 @@ 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);
binding.progressBar.setVisibility(View.GONE);
boolean hasMore = reload || list.size() > prevSize.get();
reload = false;
boolean hasMore = reload || list.size() > prevSize.get();
reload = false;
prevSize.set(list.size());
prevSize.set(list.size());
if(list.size() > 0) {
adapter.updateList(list);
adapter.setHasMore(hasMore);
binding.noData.setVisibility(View.GONE);
}
else {
binding.noData.setVisibility(View.VISIBLE);
}
});
if (list.size() > 0) {
adapter.updateList(list);
adapter.setHasMore(hasMore);
binding.noData.setVisibility(View.GONE);
} else {
binding.noData.setVisibility(View.VISIBLE);
}
});
}
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,48 +94,54 @@ 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) {
@Override
public void onAuthenticationError(
int errorCode, @NonNull CharSequence errString) {
super.onAuthenticationError(errorCode, errString);
super.onAuthenticationError(errorCode, errString);
// Authentication error, close the app
finish();
}
// Authentication error, close the app
finish();
}
// Authentication succeeded, continue to app
@Override
public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) {
super.onAuthenticationSucceeded(result);
tinyDB.putBoolean("biometricLifeCycle", true);
}
// Authentication succeeded, continue to app
@Override
public void onAuthenticationSucceeded(
@NonNull BiometricPrompt.AuthenticationResult result) {
super.onAuthenticationSucceeded(result);
tinyDB.putBoolean("biometricLifeCycle", true);
}
// Authentication failed, close the app
@Override
public void onAuthenticationFailed() {
super.onAuthenticationFailed();
}
// Authentication failed, close the app
@Override
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,21 +36,21 @@ public class CodeEditorActivity extends BaseActivity {
binding = ActivityCodeEditorBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
binding.close.setOnClickListener(view -> {
sendResults();
finish();
});
binding.close.setOnClickListener(
view -> {
sendResults();
finish();
});
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 {
finish();
}
}
});
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
@Override
public void handleOnBackPressed() {
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();
}
}

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,22 +81,38 @@ public class CommitsActivity extends BaseActivity {
recyclerView = activityCommitsBinding.recyclerView;
commitsList = new ArrayList<>();
swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
swipeRefresh.setRefreshing(false);
loadInitial(repository.getOwner(), repository.getName(), branchName, resultLimit);
adapter.notifyDataChanged();
}, 200));
swipeRefresh.setOnRefreshListener(
() ->
new Handler(Looper.getMainLooper())
.postDelayed(
() -> {
swipeRefresh.setRefreshing(false);
loadInitial(
repository.getOwner(),
repository.getName(),
branchName,
resultLimit);
adapter.notifyDataChanged();
},
200));
adapter = new CommitsAdapter(ctx, commitsList);
adapter.setLoadMoreListener(() -> recyclerView.post(() -> {
adapter.setLoadMoreListener(
() ->
recyclerView.post(
() -> {
if (commitsList.size() == resultLimit
|| pageSize == resultLimit) {
if(commitsList.size() == resultLimit || pageSize == resultLimit) {
int page = (commitsList.size() + resultLimit) / resultLimit;
loadMore(repository.getOwner(), repository.getName(), page, branchName, resultLimit);
}
}));
int page = (commitsList.size() + resultLimit) / resultLimit;
loadMore(
repository.getOwner(),
repository.getName(),
page,
branchName,
resultLimit);
}
}));
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(ctx));
@ -105,98 +121,105 @@ 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) {
@Override
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) {
assert response.body() != null;
if (response.body().size() > 0) {
commitsList.clear();
commitsList.addAll(response.body());
adapter.notifyDataChanged();
noData.setVisibility(View.GONE);
commitsList.clear();
commitsList.addAll(response.body());
adapter.notifyDataChanged();
noData.setVisibility(View.GONE);
} else {
commitsList.clear();
adapter.notifyDataChanged();
noData.setVisibility(View.VISIBLE);
}
}
if (response.code() == 409) {
noData.setVisibility(View.VISIBLE);
} else {
Log.e(TAG, String.valueOf(response.code()));
}
progressBar.setVisibility(View.GONE);
}
else {
commitsList.clear();
adapter.notifyDataChanged();
noData.setVisibility(View.VISIBLE);
@Override
public void onFailure(@NonNull Call<List<Commit>> call, @NonNull Throwable t) {
Toasty.error(
ctx, getResources().getString(R.string.genericServerResponseError));
}
}
if(response.code() == 409) {
noData.setVisibility(View.VISIBLE);
}
else {
Log.e(TAG, String.valueOf(response.code()));
}
progressBar.setVisibility(View.GONE);
}
@Override
public void onFailure(@NonNull Call<List<Commit>> call, @NonNull Throwable t) {
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) {
@Override
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;
List<Commit> result = response.body();
assert result != null;
if(result.size() > 0) {
if (result.size() > 0) {
pageSize = result.size();
commitsList.addAll(result);
}
else {
pageSize = result.size();
commitsList.addAll(result);
} else {
adapter.setMoreDataAvailable(false);
adapter.setMoreDataAvailable(false);
}
adapter.notifyDataChanged();
} else {
Log.e(TAG, String.valueOf(response.code()));
}
progressBar.setVisibility(View.GONE);
}
adapter.notifyDataChanged();
}
else {
Log.e(TAG, String.valueOf(response.code()));
}
progressBar.setVisibility(View.GONE);
}
@Override
public void onFailure(@NonNull Call<List<Commit>> call, @NonNull Throwable t) {
Toasty.error(ctx, getResources().getString(R.string.genericServerResponseError));
}
});
@Override
public void onFailure(@NonNull Call<List<Commit>> call, @NonNull Throwable t) {
Toasty.error(
ctx, getResources().getString(R.string.genericServerResponseError));
}
});
}
@Override
@ -206,25 +229,26 @@ 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) {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
@Override
public boolean onQueryTextChange(String newText) {
filter(newText);
return true;
}
});
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,13 +45,17 @@ 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) {
Intent data = result.getData();
assert data != null;
binding.newFileContent.setText(data.getStringExtra("fileContentFromActivity"));
}
});
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"));
}
});
private int fileAction = FILE_ACTION_CREATE;
private String filePath;
private String fileSha;
@ -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);
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);
}
touchView.getParent().requestDisallowInterceptTouchEvent(false);
}
return 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,254 +157,327 @@ 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) {
@Override
public void onResponse(
@NonNull Call<FileResponse> call,
@NonNull retrofit2.Response<FileResponse> response) {
switch(response.code()) {
switch (response.code()) {
case 201:
enableProcessButton();
Toasty.success(ctx, getString(R.string.newFileSuccessMessage));
Intent result = new Intent();
result.putExtra("fileModified", true);
result.putExtra("fileAction", fileAction);
setResult(200, result);
finish();
break;
case 201:
case 401:
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
break;
case 404:
enableProcessButton();
Toasty.warning(ctx, getString(R.string.apiNotFound));
break;
default:
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
break;
}
}
@Override
public void onFailure(@NonNull Call<FileResponse> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
enableProcessButton();
Toasty.success(ctx, getString(R.string.newFileSuccessMessage));
Intent result = new Intent();
result.putExtra("fileModified", true);
result.putExtra("fileAction", fileAction);
setResult(200, result);
finish();
break;
case 401:
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
break;
case 404:
enableProcessButton();
Toasty.warning(ctx, getString(R.string.apiNotFound));
break;
default:
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
break;
}
}
@Override
public void onFailure(@NonNull Call<FileResponse> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
enableProcessButton();
}
});
}
});
}
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) {
@Override
public void onResponse(
@NonNull Call<FileDeleteResponse> call,
@NonNull retrofit2.Response<FileDeleteResponse> response) {
switch(response.code()) {
switch (response.code()) {
case 200:
enableProcessButton();
Toasty.info(
ctx,
getString(
R.string.deleteFileMessage,
repository.getBranchRef()));
Intent result = new Intent();
result.putExtra("fileModified", true);
result.putExtra("fileAction", fileAction);
setResult(200, result);
finish();
break;
case 200:
case 401:
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
break;
case 404:
enableProcessButton();
Toasty.info(ctx, getString(R.string.apiNotFound));
break;
default:
enableProcessButton();
Toasty.info(ctx, getString(R.string.genericError));
break;
}
}
@Override
public void onFailure(
@NonNull Call<FileDeleteResponse> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
enableProcessButton();
Toasty.info(ctx, getString(R.string.deleteFileMessage, repository.getBranchRef()));
Intent result = new Intent();
result.putExtra("fileModified", true);
result.putExtra("fileAction", fileAction);
setResult(200, result);
finish();
break;
case 401:
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
break;
case 404:
enableProcessButton();
Toasty.info(ctx, getString(R.string.apiNotFound));
break;
default:
enableProcessButton();
Toasty.info(ctx, getString(R.string.genericError));
break;
}
}
@Override
public void onFailure(@NonNull Call<FileDeleteResponse> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
enableProcessButton();
}
});
}
});
}
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) {
@Override
public void onResponse(
@NonNull Call<FileResponse> call,
@NonNull retrofit2.Response<FileResponse> response) {
switch(response.code()) {
switch (response.code()) {
case 200:
enableProcessButton();
Toasty.info(ctx, getString(R.string.editFileMessage, branchName));
Intent result = new Intent();
result.putExtra("fileModified", true);
result.putExtra("fileAction", fileAction);
setResult(200, result);
finish();
break;
case 200:
case 401:
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
break;
case 404:
enableProcessButton();
Toasty.info(ctx, getString(R.string.apiNotFound));
break;
default:
enableProcessButton();
Toasty.info(ctx, getString(R.string.genericError));
break;
}
}
@Override
public void onFailure(@NonNull Call<FileResponse> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
enableProcessButton();
Toasty.info(ctx, getString(R.string.editFileMessage, branchName));
Intent result = new Intent();
result.putExtra("fileModified", true);
result.putExtra("fileAction", fileAction);
setResult(200, result);
finish();
break;
case 401:
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
break;
case 404:
enableProcessButton();
Toasty.info(ctx, getString(R.string.apiNotFound));
break;
default:
enableProcessButton();
Toasty.info(ctx, getString(R.string.genericError));
break;
}
}
@Override
public void onFailure(@NonNull Call<FileResponse> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
enableProcessButton();
}
});
}
});
}
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) {
@Override
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());
assert response.body() != null;
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);
binding.newFileBranches.setAdapter(adapter);
binding.newFileBranches.setText(repository.getBranchRef(), false);
enableProcessButton();
}
}
enableProcessButton();
}
}
@Override
public void onFailure(@NonNull Call<List<Branch>> call, @NonNull Throwable t) {
@Override
public void onFailure(@NonNull Call<List<Branch>> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
}
});
Log.e("onFailure", t.toString());
}
});
}
private void disableProcessButton() {
@ -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,19 +88,22 @@ 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);
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;
});
touchView.getParent().requestDisallowInterceptTouchEvent(false);
}
return false;
});
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,43 +255,45 @@ 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) {
@Override
public void onResponse(
@NonNull Call<Issue> call,
@NonNull retrofit2.Response<Issue> response2) {
if(response2.code() == 201) {
if (response2.code() == 201) {
IssuesFragment.resumeIssues = true;
IssuesFragment.resumeIssues = true;
Toasty.success(ctx, getString(R.string.issueCreated));
enableProcessButton();
RepoDetailActivity.updateRepo = true;
MainActivity.reloadRepos = true;
finish();
}
else if(response2.code() == 401) {
Toasty.success(ctx, getString(R.string.issueCreated));
enableProcessButton();
RepoDetailActivity.updateRepo = true;
MainActivity.reloadRepos = true;
finish();
} else if (response2.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
} else {
Toasty.error(ctx, getString(R.string.genericError));
enableProcessButton();
}
Toasty.error(ctx, getString(R.string.genericError));
enableProcessButton();
}
}
}
@Override
public void onFailure(@NonNull Call<Issue> call, @NonNull Throwable t) {
@Override
public void onFailure(@NonNull Call<Issue> call, @NonNull Throwable t) {
Toasty.error(ctx, getString(R.string.genericServerResponseError));
enableProcessButton();
}
});
Toasty.error(ctx, getString(R.string.genericServerResponseError));
enableProcessButton();
}
});
}
private void initCloseListener() {
@ -264,80 +304,106 @@ 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) {
@Override
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();
List<Milestone> milestonesList_ = response.body();
Milestone ms = new Milestone();
ms.setId(0L);
ms.setTitle(getString(R.string.issueCreatedNoMilestone));
milestonesList.put(ms.getTitle(), ms);
assert milestonesList_ != null;
Milestone ms = new Milestone();
ms.setId(0L);
ms.setTitle(getString(R.string.issueCreatedNoMilestone));
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")) {
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<>(
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) {
milestoneId = 0;
} else if (view instanceof TextView) {
milestoneId =
Math.toIntExact(
Objects.requireNonNull(
milestonesList.get(
((TextView)
view)
.getText()
.toString()))
.getId());
}
});
}
}
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) {
milestoneId = 0;
}
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) {
@Override
public void onFailure(@NonNull Call<List<Milestone>> call, @NonNull Throwable t) {
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
}
@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));
currentDate = new Date(year - 1900, monthOfYear, dayOfMonth);
}, mYear, mMonth, mDay);
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);
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)));
activityCreateLabelBinding.colorPicker.setBackgroundColor(color);
labelColor = String.format("#%06X", (0xFFFFFF & color));
cp.dismiss();
});
// 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,52 +204,61 @@ 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) {
@Override
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) {
Toasty.success(ctx, getString(R.string.labelCreated));
refreshLabels = true;
finish();
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
} else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Label> call, @NonNull Throwable t) {
@Override
public void onFailure(@NonNull Call<Label> call, @NonNull Throwable t) {
labelColor = "";
Log.e("onFailure", t.toString());
enableProcessButton();
}
});
labelColor = "";
Log.e("onFailure", t.toString());
enableProcessButton();
}
});
}
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,50 +266,62 @@ 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) {
@Override
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();
Toasty.success(ctx, getString(R.string.labelUpdated));
refreshLabels = true;
finish();
}
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
} else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
}
else if(response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
@Override
public void onFailure(@NonNull Call<Label> call, @NonNull Throwable t) {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Label> call, @NonNull Throwable t) {
labelColor = "";
labelColorDefault = "";
Log.e("onFailure", t.toString());
enableProcessButton();
}
});
labelColor = "";
labelColorDefault = "";
Log.e("onFailure", t.toString());
enableProcessButton();
}
});
}
private void initCloseListener() {
@ -299,51 +333,59 @@ 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) {
@Override
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")) {
Toasty.success(ctx, getString(R.string.labelDeleteText));
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) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
} else {
Toasty.error(ctx, getString(R.string.genericError));
}
}
}
else if(response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
}
});
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
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,30 +68,29 @@ 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);
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;
});
touchView.getParent().requestDisallowInterceptTouchEvent(false);
}
return false;
});
initCloseListener();
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,64 +142,76 @@ 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) {
@Override
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);
setResult(201, result);
Toasty.success(ctx, getString(R.string.milestoneCreated));
enableProcessButton();
finish();
Intent result = new Intent();
result.putExtra("milestoneCreated", true);
setResult(201, result);
Toasty.success(ctx, getString(R.string.milestoneCreated));
enableProcessButton();
finish();
}
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
} else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
}
else if(response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Milestone> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
enableProcessButton();
}
});
@Override
public void onFailure(@NonNull Call<Milestone> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
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));
currentDate = new Date(year - 1900, monthOfYear, dayOfMonth);
}, mYear, mMonth, mDay);
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);
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,52 +128,48 @@ 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) {
@Override
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) {
Toasty.success(ctx, getString(R.string.userCreatedText));
enableProcessButton();
finish();
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else if(response.code() == 403) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
} else if (response.code() == 403) {
enableProcessButton();
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
enableProcessButton();
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
} else if (response.code() == 404) {
enableProcessButton();
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
}
else if(response.code() == 422) {
enableProcessButton();
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
} else if (response.code() == 422) {
enableProcessButton();
Toasty.warning(ctx, ctx.getString(R.string.userExistsError));
}
else {
enableProcessButton();
Toasty.warning(ctx, ctx.getString(R.string.userExistsError));
} else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<User> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
enableProcessButton();
}
});
@Override
public void onFailure(@NonNull Call<User> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
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,31 +59,30 @@ 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);
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;
});
touchView.getParent().requestDisallowInterceptTouchEvent(false);
}
return false;
});
initCloseListener();
closeActivity.setOnClickListener(onClickListener);
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,55 +133,52 @@ 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) {
@Override
public void onResponse(
@NonNull Call<Organization> call,
@NonNull retrofit2.Response<Organization> response) {
if(response.code() == 201) {
OrganizationsFragment.orgCreated = true;
enableProcessButton();
Toasty.success(ctx, getString(R.string.orgCreated));
finish();
}
else if(response.code() == 401) {
if (response.code() == 201) {
OrganizationsFragment.orgCreated = true;
enableProcessButton();
Toasty.success(ctx, getString(R.string.orgCreated));
finish();
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else if(response.code() == 409) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
} else if (response.code() == 409) {
enableProcessButton();
Toasty.warning(ctx, getString(R.string.orgExistsError));
}
else if(response.code() == 422) {
enableProcessButton();
Toasty.warning(ctx, getString(R.string.orgExistsError));
} else if (response.code() == 422) {
enableProcessButton();
Toasty.warning(ctx, getString(R.string.orgExistsError));
}
else {
enableProcessButton();
Toasty.warning(ctx, getString(R.string.orgExistsError));
} else {
if(response.code() == 404) {
if (response.code() == 404) {
enableProcessButton();
Toasty.warning(ctx, getString(R.string.apiNotFound));
enableProcessButton();
Toasty.warning(ctx, getString(R.string.apiNotFound));
} else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
}
else {
@Override
public void onFailure(@NonNull Call<Organization> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
}
@Override
public void onFailure(@NonNull Call<Organization> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
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);
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;
});
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,47 +163,51 @@ 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) {
@Override
public void onResponse(
@NonNull Call<PullRequest> call,
@NonNull retrofit2.Response<PullRequest> response) {
disableProcessButton();
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")) {
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")) {
enableProcessButton();
Toasty.error(ctx, getString(R.string.prAlreadyExists));
}
else if(response.code() == 404) {
enableProcessButton();
Toasty.error(ctx, getString(R.string.prAlreadyExists));
} else if (response.code() == 404) {
enableProcessButton();
Toasty.error(ctx, getString(R.string.apiNotFound));
}
else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.apiNotFound));
} else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<PullRequest> call, @NonNull Throwable t) {
@Override
public void onFailure(@NonNull Call<PullRequest> call, @NonNull Throwable t) {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
}
@Override
@ -217,104 +226,141 @@ 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) {
@Override
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;
List<Branch> branchesList_ = response.body();
assert branchesList_ != null;
for(Branch i : branchesList_) {
branchesList.add(i.getName());
for (Branch i : branchesList_) {
branchesList.add(i.getName());
}
ArrayAdapter<String> adapter =
new ArrayAdapter<>(
CreatePullRequestActivity.this,
R.layout.list_spinner_items,
branchesList);
viewBinding.mergeIntoBranchSpinner.setAdapter(adapter);
viewBinding.pullFromBranchSpinner.setAdapter(adapter);
enableProcessButton();
}
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(CreatePullRequestActivity.this, R.layout.list_spinner_items, branchesList);
viewBinding.mergeIntoBranchSpinner.setAdapter(adapter);
viewBinding.pullFromBranchSpinner.setAdapter(adapter);
enableProcessButton();
}
}
}
@Override
public void onFailure(@NonNull Call<List<Branch>> call, @NonNull Throwable t) {
@Override
public void onFailure(@NonNull Call<List<Branch>> call, @NonNull Throwable t) {
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
}
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) {
@Override
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();
milestonesList.put(getString(R.string.issueCreatedNoMilestone), new Milestone().id(0L).title(getString(R.string.issueCreatedNoMilestone)));
assert milestonesList_ != null;
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")) {
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<>(
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) {
milestoneId = 0;
} else if (view instanceof TextView) {
milestoneId =
Math.toIntExact(
Objects.requireNonNull(
milestonesList.get(
((TextView)
view)
.getText()
.toString()))
.getId());
}
});
}
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(CreatePullRequestActivity.this, R.layout.list_spinner_items, new ArrayList<>(milestonesList.keySet()));
@Override
public void onFailure(
@NonNull Call<List<Milestone>> call, @NonNull Throwable t) {
viewBinding.milestonesSpinner.setAdapter(adapter);
enableProcessButton();
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());
}
});
}
}
@Override
public void onFailure(@NonNull Call<List<Milestone>> call, @NonNull Throwable t) {
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
}
private void setDueDate() {
@ -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));
currentDate = new Date(year - 1900, monthOfYear, dayOfMonth);
}, mYear, mMonth, mDay);
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);
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,16 +80,17 @@ 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);
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;
});
touchView.getParent().requestDisallowInterceptTouchEvent(false);
}
return false;
});
initCloseListener();
closeActivity.setOnClickListener(onClickListener);
@ -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,45 +142,46 @@ 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) {
@Override
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) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else if(response.code() == 403) {
enableProcessButton();
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
enableProcessButton();
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
}
else {
enableProcessButton();
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
Intent result = new Intent();
result.putExtra("updateReleases", true);
setResult(201, result);
Toasty.success(ctx, getString(R.string.tagCreated));
finish();
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
} else if (response.code() == 403) {
enableProcessButton();
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
} else if (response.code() == 404) {
enableProcessButton();
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
} else {
enableProcessButton();
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Tag> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
enableProcessButton();
}
});
@Override
public void onFailure(@NonNull Call<Tag> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
enableProcessButton();
}
});
}
private void processNewRelease() {
@ -192,36 +195,51 @@ 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,
boolean newReleaseDraft) {
private void createNewReleaseFunc(
String repoOwner,
String repoName,
String newReleaseTagName,
String newReleaseTitle,
String newReleaseContent,
String selectedBranch,
boolean newReleaseType,
boolean newReleaseDraft) {
CreateReleaseOption createReleaseJson = new CreateReleaseOption();
createReleaseJson.setName(newReleaseTitle);
@ -231,91 +249,98 @@ 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) {
@Override
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) {
Intent result = new Intent();
result.putExtra("updateReleases", true);
setResult(201, result);
Toasty.success(ctx, getString(R.string.releaseCreatedText));
finish();
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else if(response.code() == 403) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
} else if (response.code() == 403) {
enableProcessButton();
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
enableProcessButton();
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
} else if (response.code() == 404) {
enableProcessButton();
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
}
else {
enableProcessButton();
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
} else {
enableProcessButton();
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Release> call, @NonNull Throwable t) {
enableProcessButton();
}
});
enableProcessButton();
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Release> call, @NonNull Throwable t) {
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) {
@Override
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();
List<Branch> branchesList_ = response.body();
assert branchesList_ != null;
for(Branch i : branchesList_) {
branchesList.add(i.getName());
assert branchesList_ != null;
for (Branch i : branchesList_) {
branchesList.add(i.getName());
}
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));
}
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
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));
}
}
else if(response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
}
@Override
public void onFailure(@NonNull Call<List<Branch>> call, @NonNull Throwable t) {
}
});
@Override
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,119 +153,138 @@ 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) {
@Override
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) {
MainActivity.reloadRepos = true;
Toasty.success(ctx, getString(R.string.repoCreated));
enableProcessButton();
finish();
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else if(response.code() == 409) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
} else if (response.code() == 409) {
enableProcessButton();
Toasty.warning(ctx, getString(R.string.repoExistsError));
}
else {
enableProcessButton();
Toasty.warning(ctx, getString(R.string.repoExistsError));
} else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Repository> call, @NonNull Throwable t) {
@Override
public void onFailure(@NonNull Call<Repository> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
enableProcessButton();
}
});
Log.e("onFailure", t.toString());
enableProcessButton();
}
});
}
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) {
@Override
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;
int organizationId = 0;
List<Organization> organizationsList_ = response.body();
List<Organization> organizationsList_ = response.body();
organizationsList.add(userLogin);
assert organizationsList_ != null;
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())) {
organizationId = i + 1;
if (getIntent().getStringExtra("orgName") != null
&& !"".equals(getIntent().getStringExtra("orgName"))) {
if (getIntent()
.getStringExtra("orgName")
.equals(organizationsList_.get(i).getUsername())) {
organizationId = i + 1;
}
}
organizationsList.add(organizationsList_.get(i).getUsername());
}
}
organizationsList.add(organizationsList_.get(i).getUsername());
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));
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);
getIntent().removeExtra("organizationAction");
}
enableProcessButton();
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(CreateRepoActivity.this, R.layout.list_spinner_items, organizationsList);
@Override
public void onFailure(
@NonNull Call<List<Organization>> call, @NonNull Throwable t) {
spinner.setAdapter(adapter);
spinner.setOnItemClickListener((parent, view, position, id) -> selectedOwner = organizationsList.get(position));
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);
getIntent().removeExtra("organizationAction");
Log.e("onFailure", t.toString());
enableProcessButton();
}
enableProcessButton();
}
else if(response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
}
@Override
public void onFailure(@NonNull Call<List<Organization>> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
enableProcessButton();
}
});
});
}
private void initCloseListener() {
@ -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,116 +89,152 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic
initCloseListener();
closeActivity.setOnClickListener(onClickListener);
teamPermission.setOnClickListener(view -> {
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]) {
case "Read":
teamPermissionDetail.setVisibility(
View.VISIBLE);
teamPermissionDetail.setText(
R.string.newTeamPermissionRead);
break;
case "Write":
teamPermissionDetail.setVisibility(
View.VISIBLE);
teamPermissionDetail.setText(
R.string.newTeamPermissionWrite);
break;
case "Admin":
teamPermissionDetail.setVisibility(
View.VISIBLE);
teamPermissionDetail.setText(
R.string.newTeamPermissionAdmin);
break;
default:
teamPermissionDetail.setVisibility(
View.GONE);
break;
}
MaterialAlertDialogBuilder materialAlertDialogBuilderPerm = new MaterialAlertDialogBuilder(ctx).setTitle(R.string.newTeamPermission).setCancelable(permissionSelectedChoice != -1)
.setSingleChoiceItems(permissionList, permissionSelectedChoice, (dialogInterface, i) -> {
dialogInterface.dismiss();
});
permissionSelectedChoice = i;
teamPermission.setText(permissionList[i]);
switch(permissionList[i]) {
case "Read":
teamPermissionDetail.setVisibility(View.VISIBLE);
teamPermissionDetail.setText(R.string.newTeamPermissionRead);
break;
case "Write":
teamPermissionDetail.setVisibility(View.VISIBLE);
teamPermissionDetail.setText(R.string.newTeamPermissionWrite);
break;
case "Admin":
teamPermissionDetail.setVisibility(View.VISIBLE);
teamPermissionDetail.setText(R.string.newTeamPermissionAdmin);
break;
default:
teamPermissionDetail.setVisibility(View.GONE);
break;
}
dialogInterface.dismiss();
materialAlertDialogBuilderPerm.create().show();
});
materialAlertDialogBuilderPerm.create().show();
});
teamAccessControls.setOnClickListener(
v -> {
teamAccessControls.setText("");
teamAccessControlsArray.setText("");
pushAccessList = Arrays.asList(accessControlsList);
teamAccessControls.setOnClickListener(v -> {
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];
teamAccessControls.setText("");
teamAccessControlsArray.setText("");
pushAccessList = Arrays.asList(accessControlsList);
String repoCode = "";
if (selectedVal == 0) {
repoCode = "repo.code";
}
if (selectedVal == 1) {
repoCode = "repo.issues";
}
if (selectedVal == 2) {
repoCode = "repo.pulls";
}
if (selectedVal == 3) {
repoCode = "repo.releases";
}
if (selectedVal == 4) {
repoCode = "repo.wiki";
}
if (selectedVal == 5) {
repoCode = "repo.ext_wiki";
}
if (selectedVal == 6) {
repoCode = "repo.ext_issues";
}
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setMultiChoiceItems(accessControlsList, selectedAccessControlsTrueFalse, (dialog, which, isChecked) -> {
}).setTitle(R.string.newTeamAccessControls).setPositiveButton(R.string.okButton, (dialog, which) -> {
if (value) {
int selectedVal = 0;
while(selectedVal < selectedAccessControlsTrueFalse.length) {
boolean value = selectedAccessControlsTrueFalse[selectedVal];
teamAccessControls.setText(
getString(
R.string
.newTeamPermissionValues,
teamAccessControls
.getText(),
pushAccessList.get(
selectedVal)));
teamAccessControlsArray.setText(
getString(
R.string
.newTeamPermissionValuesFinal,
teamAccessControlsArray
.getText(),
repoCode));
}
String repoCode = "";
if(selectedVal == 0) {
repoCode = "repo.code";
}
if(selectedVal == 1) {
repoCode = "repo.issues";
}
if(selectedVal == 2) {
repoCode = "repo.pulls";
}
if(selectedVal == 3) {
repoCode = "repo.releases";
}
if(selectedVal == 4) {
repoCode = "repo.wiki";
}
if(selectedVal == 5) {
repoCode = "repo.ext_wiki";
}
if(selectedVal == 6) {
repoCode = "repo.ext_issues";
}
selectedVal++;
}
if(value) {
String data =
String.valueOf(
teamAccessControls.getText());
if (!data.equals("")) {
teamAccessControls.setText(getString(R.string.newTeamPermissionValues, teamAccessControls.getText(), pushAccessList.get(selectedVal)));
teamAccessControlsArray.setText(getString(R.string.newTeamPermissionValuesFinal, teamAccessControlsArray.getText(), repoCode));
}
teamAccessControls.setText(
data.substring(0, data.length() - 2));
}
selectedVal++;
}
String dataArray =
String.valueOf(
teamAccessControlsArray.getText());
String data = String.valueOf(teamAccessControls.getText());
if(!data.equals("")) {
if (!dataArray.equals("")) {
teamAccessControls.setText(data.substring(0, data.length() - 2));
}
teamAccessControlsArray.setText(
dataArray.substring(
0, dataArray.length() - 2));
}
});
String dataArray = String.valueOf(teamAccessControlsArray.getText());
if(!dataArray.equals("")) {
teamAccessControlsArray.setText(dataArray.substring(0, dataArray.length() - 2));
}
});
materialAlertDialogBuilder.create().show();
});
materialAlertDialogBuilder.create().show();
});
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,49 +325,48 @@ 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) {
@Override
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;
OrganizationTeamsFragment.resumeTeams = true;
Toasty.success(ctx, getString(R.string.teamCreated));
finish();
Toasty.success(ctx, getString(R.string.teamCreated));
finish();
}
} else if (response2.code() == 404) {
Toasty.warning(ctx, getString(R.string.apiNotFound));
} else if (response2.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
} else {
Toasty.error(ctx, getString(R.string.genericError));
}
}
}
else if(response2.code() == 404) {
Toasty.warning(ctx, getString(R.string.apiNotFound));
}
else if(response2.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Team> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
}
});
@Override
public void onFailure(@NonNull Call<Team> call, @NonNull Throwable t) {
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,336 +199,478 @@ 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())) {
if (!Objects.requireNonNull(data.getLastPathSegment()).contains("pulls")
& StringUtils.isNumeric(data.getLastPathSegment())) {
new Handler(Looper.getMainLooper()).postDelayed(() -> {
new Handler(Looper.getMainLooper())
.postDelayed(
() -> {
String[] urlSplitted = data.toString().split("#");
if (urlSplitted.length == 2) {
issueIntent.putExtra(
"issueComment", urlSplitted[1]);
}
String[] urlSplitted = data.toString().split("#");
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(() -> {
issueIntent.putExtra("openPrDiff", "true");
getPullRequest(data.getPathSegments().get(0), data.getPathSegments().get(1), Integer.parseInt(data.getPathSegments().get(3)));
}, 500);
}
else {
} 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 {
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.addAccountText.setText(
String.format(
getResources().getString(R.string.accountDoesNotExist),
data.getHost()));
viewBinding.addNewAccount.setOnClickListener(addNewAccount -> {
viewBinding.addNewAccount.setOnClickListener(
addNewAccount -> {
Intent accountIntent = new Intent(ctx, AddNewAccountActivity.class);
accountIntent.putExtra("instanceUrl", data.getHost());
startActivity(accountIntent);
finish();
});
Intent accountIntent = new Intent(ctx, AddNewAccountActivity.class);
accountIntent.putExtra("instanceUrl", data.getHost());
startActivity(accountIntent);
finish();
});
viewBinding.openInBrowser.setOnClickListener(
addNewAccount -> {
Integer port = data.getPort() >= 0 ? data.getPort() : null;
viewBinding.openInBrowser.setOnClickListener(addNewAccount -> {
URI host =
UrlBuilder.fromString(UrlHelper.fixScheme(data.getHost(), "https"))
.withPort(port)
.toUri();
Integer port = data.getPort() >= 0 ? data.getPort() : null;
AppUtil.openUrlInBrowser(this, String.valueOf(host));
finish();
});
URI host = UrlBuilder.fromString(UrlHelper.fixScheme(data.getHost(), "https")).withPort(port).toUri();
AppUtil.openUrlInBrowser(this, String.valueOf(host));
finish();
});
viewBinding.launchApp.setOnClickListener(launchApp -> {
startActivity(mainIntent);
finish();
});
viewBinding.launchApp.setOnClickListener(
launchApp -> {
startActivity(mainIntent);
finish();
});
}
}
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) {
@Override
public void onResponse(
@NonNull Call<PullRequest> call,
@NonNull retrofit2.Response<PullRequest> response) {
PullRequest prInfo = response.body();
PullRequest prInfo = response.body();
if(response.code() == 200) {
if (response.code() == 200) {
assert prInfo != null;
assert prInfo != null;
issueIntent.putExtra("openedFromLink", "true");
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);
issue.getRepository().saveToDB(ctx);
issueIntent.putExtra(IssueContext.INTENT_EXTRA, issue);
ctx.startActivity(issueIntent);
finish();
}
issueIntent.putExtra(IssueContext.INTENT_EXTRA, issue);
ctx.startActivity(issueIntent);
finish();
} else {
else {
ctx.startActivity(mainIntent);
finish();
Log.e("onFailure-links-pr", String.valueOf(response.code()));
}
}
ctx.startActivity(mainIntent);
finish();
Log.e("onFailure-links-pr", String.valueOf(response.code()));
}
}
@Override
public void onFailure(@NonNull Call<PullRequest> call, @NonNull Throwable t) {
@Override
public void onFailure(@NonNull Call<PullRequest> call, @NonNull Throwable t) {
ctx.startActivity(issueIntent);
finish();
Log.e("onFailure-links-pr", t.toString());
}
});
ctx.startActivity(issueIntent);
finish();
Log.e("onFailure-links-pr", t.toString());
}
});
}
private void goToRepoSection(String repoOwner, String repoName, String type) {
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) {
Repository repoInfo = response.body();
@Override
public void onResponse(
@NonNull Call<Repository> call,
@NonNull retrofit2.Response<Repository> response) {
Repository repoInfo = response.body();
if(response.code() == 200) {
assert repoInfo != null;
if (response.code() == 200) {
assert repoInfo != null;
RepositoryContext repo = new RepositoryContext(repoInfo, ctx);
RepositoryContext repo = new RepositoryContext(repoInfo, ctx);
repoIntent.putExtra("goToSection", "yes");
repoIntent.putExtra("goToSectionType", type);
repoIntent.putExtra("goToSection", "yes");
repoIntent.putExtra("goToSectionType", type);
repo.saveToDB(ctx);
repoIntent.putExtra(RepositoryContext.INTENT_EXTRA, repo);
repo.saveToDB(ctx);
repoIntent.putExtra(RepositoryContext.INTENT_EXTRA, repo);
ctx.startActivity(repoIntent);
finish();
}
else {
ctx.startActivity(mainIntent);
finish();
Log.e("error-goToRepo", response.message());
}
ctx.startActivity(repoIntent);
finish();
} else {
ctx.startActivity(mainIntent);
finish();
Log.e("error-goToRepo", response.message());
}
}
}
@Override
public void onFailure(@NonNull Call<Repository> call, @NonNull Throwable t) {
@Override
public void onFailure(@NonNull Call<Repository> call, @NonNull Throwable t) {
ctx.startActivity(mainIntent);
finish();
Log.e("onFailure-goToRepo", t.toString());
}
});
ctx.startActivity(mainIntent);
finish();
Log.e("onFailure-goToRepo", t.toString());
}
});
}
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
Log.d("getUserOrOrg-404", String.valueOf(response.code()));
getUser(userOrgName);
}
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 {
Log.e("getUserOrOrg-code", String.valueOf(response.code()));
ctx.startActivity(mainIntent);
finish();
}
}
@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
Log.d("getUserOrOrg-404", String.valueOf(response.code()));
getUser(userOrgName);
} 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 {
Log.e("getUserOrOrg-code", String.valueOf(response.code()));
ctx.startActivity(mainIntent);
finish();
}
}
@Override
public void onFailure(@NonNull Call<Organization> call, @NonNull Throwable t) {
Log.e("onFailure-getUserOrOrg", t.toString());
}
});
@Override
public void onFailure(@NonNull Call<Organization> call, @NonNull Throwable t) {
Log.e("onFailure-getUserOrOrg", t.toString());
}
});
}
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) {
assert response.body() != null;
userIntent.putExtra("username", response.body().getLogin());
ctx.startActivity(userIntent);
}
else {
Log.e("getUser-code", String.valueOf(response.code()));
ctx.startActivity(mainIntent);
}
finish();
}
@Override
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 {
Log.e("getUser-code", String.valueOf(response.code()));
ctx.startActivity(mainIntent);
}
finish();
}
@Override
public void onFailure(@NonNull Call<User> call, @NonNull Throwable t) {
Log.e("onFailure-getUser", t.toString());
ctx.startActivity(mainIntent);
finish();
}
});
@Override
public void onFailure(@NonNull Call<User> call, @NonNull Throwable t) {
Log.e("onFailure-getUser", t.toString());
ctx.startActivity(mainIntent);
finish();
}
});
}
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) {
// check if file and open file/dir
ContentsResponse file = response.body();
assert file != null;
if(file.getType().equals("file")) {
repoIntent.putExtra("file", file);
repoIntent.putExtra("branch", branch);
goToRepoSection(owner, repo, "file");
@Override
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")) {
repoIntent.putExtra("file", file);
repoIntent.putExtra("branch", branch);
goToRepoSection(owner, repo, "file");
}
} else {
Log.e("getFile-onFailure", String.valueOf(response.code()));
ctx.startActivity(mainIntent);
finish();
}
}
}
else {
Log.e("getFile-onFailure", String.valueOf(response.code()));
ctx.startActivity(mainIntent);
finish();
}
}
@Override
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);
}
});
@Override
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);
}
});
}
private void getDir(String owner, String repo, String filePath, String 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();
});
tinyDB.putInt("defaultScreenId", 1);
mainIntent.putExtra("launchFragmentByLinkHandler", "repos");
ctx.startActivity(mainIntent);
finish();
});
viewBinding.organization.setOnClickListener(
organization -> {
tinyDB.putInt("defaultScreenId", 2);
mainIntent.putExtra("launchFragmentByLinkHandler", "org");
ctx.startActivity(mainIntent);
finish();
});
viewBinding.organization.setOnClickListener(organization -> {
viewBinding.notification.setOnClickListener(
notification -> {
tinyDB.putInt("defaultScreenId", 3);
mainIntent.putExtra("launchFragmentByLinkHandler", "notification");
ctx.startActivity(mainIntent);
finish();
});
tinyDB.putInt("defaultScreenId", 2);
mainIntent.putExtra("launchFragmentByLinkHandler", "org");
ctx.startActivity(mainIntent);
finish();
});
viewBinding.explore.setOnClickListener(
explore -> {
tinyDB.putInt("defaultScreenId", 4);
mainIntent.putExtra("launchFragmentByLinkHandler", "explore");
ctx.startActivity(mainIntent);
finish();
});
viewBinding.notification.setOnClickListener(notification -> {
tinyDB.putInt("defaultScreenId", 3);
mainIntent.putExtra("launchFragmentByLinkHandler", "notification");
ctx.startActivity(mainIntent);
finish();
});
viewBinding.explore.setOnClickListener(explore -> {
tinyDB.putInt("defaultScreenId", 4);
mainIntent.putExtra("launchFragmentByLinkHandler", "explore");
ctx.startActivity(mainIntent);
finish();
});
viewBinding.launchApp2.setOnClickListener(launchApp2 -> {
tinyDB.putInt("defaultScreenId", 0);
ctx.startActivity(mainIntent);
finish();
});
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 {
finish();
}
}
});
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
@Override
public void handleOnBackPressed() {
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();
}
}

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,16 +87,17 @@ 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);
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;
});
touchView.getParent().requestDisallowInterceptTouchEvent(false);
}
return false;
});
editIssueMilestoneSpinner = findViewById(R.id.editIssueMilestoneSpinner);
@ -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,189 +178,264 @@ 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) {
@Override
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 {
Toasty.success(ctx, getString(R.string.editPrSuccessMessage));
} else {
Toasty.success(ctx, getString(R.string.editIssueSuccessMessage));
Toasty.success(ctx, getString(R.string.editIssueSuccessMessage));
}
Intent result = new Intent();
result.putExtra("issueEdited", true);
IssuesFragment.resumeIssues = issue.getIssue().getPullRequest() == null;
PullRequestsFragment.resumePullRequests =
issue.getIssue().getPullRequest() != null;
setResult(200, result);
finish();
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
} else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
Intent result = new Intent();
result.putExtra("issueEdited", true);
IssuesFragment.resumeIssues = issue.getIssue().getPullRequest() == null;
PullRequestsFragment.resumePullRequests = issue.getIssue().getPullRequest() != null;
setResult(200, result);
finish();
}
else if(response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Issue> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
enableProcessButton();
}
});
@Override
public void onFailure(@NonNull Call<Issue> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
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));
currentDate = new Date(year - 1900, monthOfYear, dayOfMonth);
}, mYear, mMonth, mDay);
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);
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) {
@Override
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());
editIssueDescription.setText(response.body().getBody());
assert response.body() != null;
editIssueTitle.setText(response.body().getTitle());
editIssueDescription.setText(response.body().getBody());
Milestone currentMilestone = response.body().getMilestone();
Milestone currentMilestone = response.body().getMilestone();
// get milestones list
if(response.body().getId() > 0) {
// get milestones list
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_) {
@Override
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;
assert milestonesList_ != null;
Milestone ms = new Milestone();
ms.setId(0L);
ms.setTitle(getString(R.string.issueCreatedNoMilestone));
milestonesList.put(ms.getTitle(), ms);
Milestone ms = new Milestone();
ms.setId(0L);
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()));
editIssueMilestoneSpinner.setAdapter(adapter);
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());
}
});
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);
}
},
500);
enableProcessButton();
}
}
}
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(EditIssueActivity.this, R.layout.list_spinner_items, new ArrayList<>(milestonesList.keySet()));
@Override
public void onFailure(
@NonNull Call<List<Milestone>> call,
@NonNull Throwable t) {
editIssueMilestoneSpinner.setAdapter(adapter);
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());
}
});
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);
}
}, 500);
enableProcessButton();
}
Log.e("onFailure", t.toString());
}
});
}
// get milestones list
@Override
public void onFailure(@NonNull Call<List<Milestone>> call, @NonNull Throwable t) {
if (response.body().getDueDate() != null) {
Log.e("onFailure", t.toString());
@SuppressLint("SimpleDateFormat")
DateFormat formatter = new SimpleDateFormat("yyyy-M-dd");
String dueDate = formatter.format(response.body().getDueDate());
editIssueDueDate.setText(dueDate);
}
});
// enableProcessButton();
} else if (response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
} else {
Toasty.error(ctx, getString(R.string.genericError));
}
}
// get milestones list
if(response.body().getDueDate() != null) {
@Override
public void onFailure(@NonNull Call<Issue> call, @NonNull Throwable t) {
@SuppressLint("SimpleDateFormat") DateFormat formatter = new SimpleDateFormat("yyyy-M-dd");
String dueDate = formatter.format(response.body().getDueDate());
editIssueDueDate.setText(dueDate);
Log.e("onFailure", t.toString());
}
//enableProcessButton();
}
else if(response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else {
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Issue> call, @NonNull Throwable t) {
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,98 +37,154 @@ 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 -> {
ActivityResultLauncher<Intent> activityResultLauncher =
registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == Activity.RESULT_OK) {
if(result.getResultCode() == Activity.RESULT_OK) {
assert result.getData() != null;
assert result.getData() != null;
try {
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);
int notificationId = Notifications.uniqueNotificationId(ctx);
NotificationManager notificationManager =
(NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(notificationId, builder.build());
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(notificationId, builder.build());
Thread thread =
new Thread(
() -> {
try {
Thread thread = new Thread(() -> {
Call<ResponseBody> call =
RetrofitClient.getWebInterface(ctx)
.getFileContents(
repository
.getOwner(),
repository
.getName(),
repository
.getBranchRef(),
file.getPath());
try {
Response<ResponseBody> response =
call.execute();
Call<ResponseBody> call = RetrofitClient.getWebInterface(ctx).getFileContents(repository.getOwner(), repository.getName(), repository.getBranchRef(), file.getPath());
assert response.body() != null;
Response<ResponseBody> response = call.execute();
AppUtil.copyProgress(
response.body().byteStream(),
outputStream,
file.getSize(),
progress -> {
builder.setProgress(
100, progress, false);
notificationManager.notify(
notificationId,
builder.build());
});
assert response.body() != null;
builder.setContentTitle(
getString(
R.string
.fileViewerNotificationTitleFinished))
.setContentText(
getString(
R.string
.fileViewerNotificationDescriptionFinished,
file.getName()));
AppUtil.copyProgress(response.body().byteStream(), outputStream, file.getSize(), progress -> {
builder.setProgress(100, progress, false);
notificationManager.notify(notificationId, builder.build());
});
} catch (IOException ignored) {
builder.setContentTitle(getString(R.string.fileViewerNotificationTitleFinished)).setContentText(getString(R.string.fileViewerNotificationDescriptionFinished, file.getName()));
builder.setContentTitle(
getString(
R.string
.fileViewerNotificationTitleFailed))
.setContentText(
getString(
R.string
.fileViewerNotificationDescriptionFailed,
file.getName()));
}
catch(IOException ignored) {
} finally {
builder.setContentTitle(getString(R.string.fileViewerNotificationTitleFailed)).setContentText(getString(R.string.fileViewerNotificationDescriptionFailed, file.getName()));
builder.setProgress(0, 0, false)
.setOngoing(false);
}
finally {
notificationManager.notify(
notificationId, builder.build());
}
});
builder.setProgress(0, 0, false).setOngoing(false);
thread.start();
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) {
assert result.getData() != null;
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());
break;
default:
finish();
}
}
}
});
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)) {
case CreateFileActivity.FILE_ACTION_CREATE:
case CreateFileActivity.FILE_ACTION_EDIT:
getSingleFileContents(
repository.getOwner(),
repository.getName(),
file.getPath(),
repository.getBranchRef());
break;
default:
finish();
}
}
}
});
@Override
public void onCreate(Bundle savedInstanceState) {
@ -144,135 +204,190 @@ 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(() -> {
Thread thread =
new Thread(
() -> {
Call<ResponseBody> call =
RetrofitClient.getWebInterface(ctx)
.getFileContents(owner, repo, ref, filename);
Call<ResponseBody> call = RetrofitClient.getWebInterface(ctx).getFileContents(owner, repo, ref, filename);
try {
try {
Response<ResponseBody> response = call.execute();
Response<ResponseBody> response = call.execute();
if (response.code() == 200) {
if(response.code() == 200) {
ResponseBody responseBody = response.body();
ResponseBody responseBody = response.body();
if (responseBody != null) {
if(responseBody != null) {
runOnUiThread(
() -> binding.progressBar.setVisibility(View.GONE));
String fileExtension = FilenameUtils.getExtension(filename);
runOnUiThread(() -> binding.progressBar.setVisibility(View.GONE));
String fileExtension = FilenameUtils.getExtension(filename);
switch (AppUtil.getFileType(fileExtension)) {
case IMAGE:
switch(AppUtil.getFileType(fileExtension)) {
// 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())) {
case IMAGE:
byte[] pictureBytes = responseBody.bytes();
// 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())) {
Bitmap image =
Images.scaleImage(pictureBytes, 1920);
processable = image != null;
if (processable) {
runOnUiThread(
() -> {
binding.contents.setVisibility(
View.GONE);
binding.markdownFrame
.setVisibility(
View.GONE);
byte[] pictureBytes = responseBody.bytes();
binding.photoView.setVisibility(
View.VISIBLE);
binding.photoView
.setImageBitmap(image);
});
}
}
break;
Bitmap image = Images.scaleImage(pictureBytes, 1920);
processable = image != null;
if(processable) {
runOnUiThread(() -> {
binding.contents.setVisibility(View.GONE);
binding.markdownFrame.setVisibility(View.GONE);
case UNKNOWN:
case TEXT:
if (file.getSize()
> Constants.maximumFileViewerSize) {
break;
}
binding.photoView.setVisibility(View.VISIBLE);
binding.photoView.setImageBitmap(image);
});
processable = true;
String text = responseBody.string();
runOnUiThread(
() -> {
binding.photoView.setVisibility(
View.GONE);
binding.contents.setContent(
text, fileExtension);
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);
}
});
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.
responseBody.close();
runOnUiThread(
() -> {
binding.photoView.setVisibility(View.GONE);
binding.contents.setVisibility(View.GONE);
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);
});
}
} else {
runOnUiThread(
() -> {
binding.markdownTv.setText("");
binding.progressBar.setVisibility(View.GONE);
});
}
} else {
switch (response.code()) {
case 401:
runOnUiThread(
() ->
AlertDialogs
.authorizationTokenRevokedDialog(
ctx));
break;
case 403:
runOnUiThread(
() ->
Toasty.error(
ctx,
ctx.getString(
R.string
.authorizeError)));
break;
case 404:
runOnUiThread(
() ->
Toasty.warning(
ctx,
ctx.getString(
R.string.apiNotFound)));
break;
default:
runOnUiThread(
() ->
Toasty.error(
ctx,
getString(
R.string
.genericError)));
}
}
break;
case UNKNOWN:
case TEXT:
if(file.getSize() > Constants.maximumFileViewerSize) {
break;
}
processable = true;
String text = responseBody.string();
runOnUiThread(() -> {
binding.photoView.setVisibility(View.GONE);
binding.contents.setContent(text, fileExtension);
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);
}
});
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.
responseBody.close();
runOnUiThread(() -> {
binding.photoView.setVisibility(View.GONE);
binding.contents.setVisibility(View.GONE);
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);
});
}
}
else {
runOnUiThread(() -> {
binding.markdownTv.setText("");
binding.progressBar.setVisibility(View.GONE);
} catch (IOException ignored) {
}
});
}
}
else {
switch(response.code()) {
case 401:
runOnUiThread(() -> AlertDialogs.authorizationTokenRevokedDialog(ctx));
break;
case 403:
runOnUiThread(() -> Toasty.error(ctx, ctx.getString(R.string.authorizeError)));
break;
case 404:
runOnUiThread(() -> Toasty.warning(ctx, ctx.getString(R.string.apiNotFound)));
break;
default:
runOnUiThread(() -> Toasty.error(ctx, getString(R.string.genericError)));
}
}
}
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

@ -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,22 +111,33 @@ 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) -> {
Do = mergeList.get(position).getId();
});
viewBinding.mergeSpinner.setOnItemClickListener(
(parent, view, position, id) -> {
Do = mergeList.get(position).getId();
});
}
private void initCloseListener() {
@ -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,67 +192,82 @@ 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) {
@Override
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();
String[] parts = repoFullName.split("/");
final String repoOwner = parts[0];
final String repoName = parts[1];
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);
}
}
Toasty.success(ctx, getString(R.string.mergePRSuccessMsg));
Intent result = new Intent();
PullRequestsFragment.resumePullRequests = true;
IssueDetailActivity.singleIssueUpdate = true;
RepoDetailActivity.updateRepo = true;
setResult(200, result);
finish();
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
} else if (response.code() == 404) {
enableProcessButton();
Toasty.warning(ctx, getString(R.string.mergePR404ErrorMsg));
} else if (response.code() == 405) {
enableProcessButton();
Toasty.warning(ctx, getString(R.string.mergeNotAllowed));
} else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
else {
PullRequestActions.deleteHeadBranch(ctx, issue.getRepository().getOwner(), issue.getRepository().getName(), issue.getPullRequest().getHead().getRef(), false);
}
}
Toasty.success(ctx, getString(R.string.mergePRSuccessMsg));
Intent result = new Intent();
PullRequestsFragment.resumePullRequests = true;
IssueDetailActivity.singleIssueUpdate = true;
RepoDetailActivity.updateRepo = true;
setResult(200, result);
finish();
}
else if(response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else if(response.code() == 404) {
enableProcessButton();
Toasty.warning(ctx, getString(R.string.mergePR404ErrorMsg));
}
else if(response.code() == 405) {
enableProcessButton();
Toasty.warning(ctx, getString(R.string.mergeNotAllowed));
}
else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
enableProcessButton();
}
});
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
enableProcessButton();
}
});
}
private void disableProcessButton() {
@ -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,53 +104,50 @@ 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) {
@Override
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) {
Toasty.success(ctx, getString(R.string.emailAddedText));
MyProfileEmailsFragment.refreshEmails = true;
enableProcessButton();
finish();
} else if (response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
}
else if(response.code() == 403) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx);
} else if (response.code() == 403) {
enableProcessButton();
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
enableProcessButton();
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
} else if (response.code() == 404) {
enableProcessButton();
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
}
else if(response.code() == 422) {
enableProcessButton();
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
} else if (response.code() == 422) {
enableProcessButton();
Toasty.warning(ctx, ctx.getString(R.string.emailErrorInUse));
}
else {
enableProcessButton();
Toasty.warning(ctx, ctx.getString(R.string.emailErrorInUse));
} else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<List<Email>> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
enableProcessButton();
}
});
@Override
public void onFailure(@NonNull Call<List<Email>> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
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,51 +59,61 @@ 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) {
@Override
public void onResponse(
@NonNull Call<OrganizationPermissions> call,
@NonNull Response<OrganizationPermissions> response) {
if(response.isSuccessful()) {
permissions = response.body();
}
else {
permissions = null;
}
}
if (response.isSuccessful()) {
permissions = response.body();
} else {
permissions = null;
}
}
@Override
public void onFailure(@NonNull Call<OrganizationPermissions> call, @NonNull Throwable t) {
@Override
public void onFailure(
@NonNull Call<OrganizationPermissions> call,
@NonNull Throwable t) {
permissions = null;
}
});
}
else {
permissions = null;
}
});
} 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) {
isMember = response.code() != 404;
init();
}
@Override
public void onResponse(
@NonNull Call<Void> call, @NonNull Response<Void> response) {
isMember = response.code() != 404;
init();
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
isMember = false;
init();
}
});
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
isMember = false;
init();
}
});
}
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,67 +35,78 @@ 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
public Fragment createFragment(int position) {
switch(position) {
case 0:
return OrganizationTeamInfoReposFragment.newInstance(team);
case 1:
return OrganizationTeamInfoMembersFragment.newInstance(team);
case 2:
return OrganizationTeamInfoPermissionsFragment.newInstance(team);
}
return null;
}
@NonNull @Override
public Fragment createFragment(int position) {
switch (position) {
case 0:
return OrganizationTeamInfoReposFragment.newInstance(team);
case 1:
return OrganizationTeamInfoMembersFragment.newInstance(team);
case 2:
return OrganizationTeamInfoPermissionsFragment.newInstance(team);
}
return null;
}
@Override
public int getItemCount() {
return 3;
}
});
@Override
public int getItemCount() {
return 3;
}
});
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) {
case 0:
textView.setText(R.string.navRepos);
break;
case 1:
textView.setText(R.string.orgTabMembers);
break;
case 2:
textView.setText(R.string.teamPermissions);
break;
}
switch (position) {
case 0:
textView.setText(R.string.navRepos);
break;
case 1:
textView.setText(R.string.orgTabMembers);
break;
case 2:
textView.setText(R.string.teamPermissions);
break;
}
tab.setCustomView(textView);
}).attach();
tab.setCustomView(textView);
})
.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,76 +108,84 @@ 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) {
following = true;
}
else if(response.code() == 404) {
following = false;
}
else {
following = false;
}
}
@Override
public void onResponse(
@NonNull Call<Void> call, @NonNull Response<Void> response) {
if (response.code() == 204) {
following = true;
} else if (response.code() == 404) {
following = false;
} else {
following = false;
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
following = false;
}
});
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
following = false;
}
});
}
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()) {
following = !following;
if(following) {
Toasty.success(ProfileActivity.this, String.format(getString(R.string.nowFollowUser), username));
@Override
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));
} 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 {
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));
}
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
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 {
Toasty.error(ProfileActivity.this, getString(R.string.followingFailed));
}
}
});
}
@Override
@ -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

@ -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,30 +58,38 @@ 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(() -> {
pageSize = 1;
activityRepoForksBinding.pullToRefresh.setRefreshing(false);
loadInitial(repoOwner, repoName, pageSize, resultLimit);
adapter.notifyDataChanged();
}, 200));
activityRepoForksBinding.pullToRefresh.setOnRefreshListener(
() ->
new Handler(Looper.getMainLooper())
.postDelayed(
() -> {
pageSize = 1;
activityRepoForksBinding.pullToRefresh.setRefreshing(
false);
loadInitial(repoOwner, repoName, pageSize, resultLimit);
adapter.notifyDataChanged();
},
200));
adapter = new RepoForksAdapter(ctx, forksList);
adapter.setLoadMoreListener(() -> activityRepoForksBinding.recyclerView.post(() -> {
adapter.setLoadMoreListener(
() ->
activityRepoForksBinding.recyclerView.post(
() -> {
if (forksList.size() == resultLimit
|| pageSize == resultLimit) {
if(forksList.size() == resultLimit || pageSize == resultLimit) {
int page = (forksList.size() + resultLimit) / resultLimit;
loadMore(repoOwner, repoName, page, resultLimit);
}
}));
int page = (forksList.size() + resultLimit) / resultLimit;
loadMore(repoOwner, repoName, page, resultLimit);
}
}));
activityRepoForksBinding.recyclerView.setHasFixedSize(true);
activityRepoForksBinding.recyclerView.setLayoutManager(new LinearLayoutManager(ctx));
@ -93,85 +100,91 @@ 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) {
@Override
public void onResponse(
@NonNull Call<List<Repository>> call,
@NonNull Response<List<Repository>> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
assert response.body() != null;
assert response.body() != null;
if(response.body().size() > 0) {
forksList.clear();
forksList.addAll(response.body());
adapter.notifyDataChanged();
activityRepoForksBinding.noData.setVisibility(View.GONE);
}
else {
forksList.clear();
adapter.notifyDataChanged();
activityRepoForksBinding.noData.setVisibility(View.VISIBLE);
if (response.body().size() > 0) {
forksList.clear();
forksList.addAll(response.body());
adapter.notifyDataChanged();
activityRepoForksBinding.noData.setVisibility(View.GONE);
} else {
forksList.clear();
adapter.notifyDataChanged();
activityRepoForksBinding.noData.setVisibility(View.VISIBLE);
}
activityRepoForksBinding.progressBar.setVisibility(View.GONE);
} else {
Log.e(TAG, String.valueOf(response.code()));
}
}
activityRepoForksBinding.progressBar.setVisibility(View.GONE);
}
else {
Log.e(TAG, String.valueOf(response.code()));
}
}
@Override
public void onFailure(@NonNull Call<List<Repository>> call, @NonNull Throwable t) {
Log.e(TAG, t.toString());
}
});
@Override
public void onFailure(
@NonNull Call<List<Repository>> call, @NonNull Throwable t) {
Log.e(TAG, t.toString());
}
});
}
private void loadMore(String repoOwner, String repoName, int page, int resultLimit) {
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) {
@Override
public void onResponse(
@NonNull Call<List<Repository>> call,
@NonNull Response<List<Repository>> response) {
if(response.isSuccessful()) {
if (response.isSuccessful()) {
//remove loading view
forksList.remove(forksList.size() - 1);
// remove loading view
forksList.remove(forksList.size() - 1);
List<Repository> result = response.body();
assert result != null;
List<Repository> result = response.body();
assert result != null;
if(result.size() > 0) {
pageSize = result.size();
forksList.addAll(result);
}
else {
adapter.setMoreDataAvailable(false);
if (result.size() > 0) {
pageSize = result.size();
forksList.addAll(result);
} else {
adapter.setMoreDataAvailable(false);
}
adapter.notifyDataChanged();
activityRepoForksBinding.progressLoadMore.setVisibility(View.GONE);
} else {
Log.e(TAG, String.valueOf(response.code()));
}
}
adapter.notifyDataChanged();
activityRepoForksBinding.progressLoadMore.setVisibility(View.GONE);
}
else {
Log.e(TAG, String.valueOf(response.code()));
}
}
@Override
public void onFailure(@NonNull Call<List<Repository>> call, @NonNull Throwable t) {
Log.e(TAG, t.toString());
}
});
@Override
public void onFailure(
@NonNull Call<List<Repository>> call, @NonNull Throwable t) {
Log.e(TAG, t.toString());
}
});
}
@Override
@ -184,19 +197,20 @@ 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) {
return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
filter(newText);
return true;
}
});
@Override
public boolean onQueryTextChange(String newText) {
filter(newText);
return true;
}
});
return super.onCreateOptionsMenu(menu);
}
@ -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,27 +55,29 @@ public class RepoStargazersActivity extends BaseActivity {
private void fetchDataAsync(String repoOwner, String repoName) {
RepoStargazersViewModel repoStargazersModel = new ViewModelProvider(this).get(RepoStargazersViewModel.class);
RepoStargazersViewModel repoStargazersModel =
new ViewModelProvider(this).get(RepoStargazersViewModel.class);
repoStargazersModel.getRepoStargazers(repoOwner, repoName, ctx).observe(this, stargazersListMain -> {
repoStargazersModel
.getRepoStargazers(repoOwner, repoName, ctx)
.observe(
this,
stargazersListMain -> {
adapter = new UserGridAdapter(ctx, stargazersListMain);
adapter = new UserGridAdapter(ctx, stargazersListMain);
if (adapter.getCount() > 0) {
if(adapter.getCount() > 0) {
mGridView.setAdapter(adapter);
noDataStargazers.setVisibility(View.GONE);
} else {
mGridView.setAdapter(adapter);
noDataStargazers.setVisibility(View.GONE);
}
else {
adapter.notifyDataSetChanged();
mGridView.setAdapter(adapter);
noDataStargazers.setVisibility(View.VISIBLE);
}
mProgressBar.setVisibility(View.GONE);
});
adapter.notifyDataSetChanged();
mGridView.setAdapter(adapter);
noDataStargazers.setVisibility(View.VISIBLE);
}
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,27 +55,29 @@ public class RepoWatchersActivity extends BaseActivity {
private void fetchDataAsync(String repoOwner, String repoName) {
RepoWatchersViewModel repoWatchersModel = new ViewModelProvider(this).get(RepoWatchersViewModel.class);
RepoWatchersViewModel repoWatchersModel =
new ViewModelProvider(this).get(RepoWatchersViewModel.class);
repoWatchersModel.getRepoWatchers(repoOwner, repoName, ctx).observe(this, watchersListMain -> {
repoWatchersModel
.getRepoWatchers(repoOwner, repoName, ctx)
.observe(
this,
watchersListMain -> {
adapter = new UserGridAdapter(ctx, watchersListMain);
adapter = new UserGridAdapter(ctx, watchersListMain);
if (adapter.getCount() > 0) {
if(adapter.getCount() > 0) {
mGridView.setAdapter(adapter);
noDataWatchers.setVisibility(View.GONE);
} else {
mGridView.setAdapter(adapter);
noDataWatchers.setVisibility(View.GONE);
}
else {
adapter.notifyDataSetChanged();
mGridView.setAdapter(adapter);
noDataWatchers.setVisibility(View.VISIBLE);
}
mProgressBar.setVisibility(View.GONE);
});
adapter.notifyDataSetChanged();
mGridView.setAdapter(adapter);
noDataWatchers.setVisibility(View.VISIBLE);
}
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,40 +58,44 @@ 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("")) {
Toasty.error(ctx, getString(R.string.repoSettingsDeleteError));
}
else if(newOwner.matches("")) {
Toasty.error(ctx, getString(R.string.repoTransferOwnerError));
} else {
Toasty.error(ctx, getString(R.string.repoTransferOwnerError));
}
else {
transferRepository(newOwner);
}
});
transferRepository(newOwner);
}
});
dialogRepo = materialAlertDialogBuilder.show();
}
@ -102,49 +105,54 @@ 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) {
@Override
public void onResponse(
@NonNull Call<Repository> call,
@NonNull retrofit2.Response<Repository> response) {
transferRepoBinding.transfer.setVisibility(View.GONE);
transferRepoBinding.processingRequest.setVisibility(View.VISIBLE);
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));
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);
RepositorySettingsActivity.this.startActivity(intent);
finish();
}
else if(response.code() == 404) {
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) {
transferRepoBinding.transfer.setVisibility(View.VISIBLE);
transferRepoBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.repoTransferError));
}
else {
transferRepoBinding.transfer.setVisibility(View.VISIBLE);
transferRepoBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.repoTransferError));
} else {
transferRepoBinding.transfer.setVisibility(View.VISIBLE);
transferRepoBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.genericError));
}
transferRepoBinding.transfer.setVisibility(View.VISIBLE);
transferRepoBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.genericError));
}
}
}
@Override
public void onFailure(@NonNull Call<Repository> call, @NonNull Throwable t) {
@Override
public void onFailure(@NonNull Call<Repository> call, @NonNull Throwable t) {
transferRepoBinding.transfer.setVisibility(View.VISIBLE);
transferRepoBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
transferRepoBinding.transfer.setVisibility(View.VISIBLE);
transferRepoBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
}
private void showDeleteRepository() {
@ -154,60 +162,67 @@ public class RepositorySettingsActivity extends BaseActivity {
View view = deleteRepoBinding.getRoot();
materialAlertDialogBuilder.setView(view);
deleteRepoBinding.delete.setOnClickListener(deleteRepo -> {
deleteRepoBinding.delete.setOnClickListener(
deleteRepo -> {
if (!repository
.getName()
.equals(
String.valueOf(
deleteRepoBinding.repoNameForDeletion.getText()))) {
if(!repository.getName().equals(String.valueOf(deleteRepoBinding.repoNameForDeletion.getText()))) {
Toasty.error(ctx, getString(R.string.repoSettingsDeleteError));
} else {
Toasty.error(ctx, getString(R.string.repoSettingsDeleteError));
}
else {
deleteRepository();
}
});
deleteRepository();
}
});
dialogRepo = materialAlertDialogBuilder.show();
}
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) {
@Override
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
deleteRepoBinding.delete.setVisibility(View.GONE);
deleteRepoBinding.processingRequest.setVisibility(View.VISIBLE);
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));
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);
RepositorySettingsActivity.this.startActivity(intent);
finish();
}
else {
Objects.requireNonNull(BaseApi.getInstance(ctx, RepositoriesApi.class))
.deleteRepository(repository.getRepositoryId());
Intent intent =
new Intent(RepositorySettingsActivity.this, MainActivity.class);
RepositorySettingsActivity.this.startActivity(intent);
finish();
} else {
deleteRepoBinding.delete.setVisibility(View.VISIBLE);
deleteRepoBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.genericError));
}
deleteRepoBinding.delete.setVisibility(View.VISIBLE);
deleteRepoBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.genericError));
}
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
deleteRepoBinding.delete.setVisibility(View.VISIBLE);
deleteRepoBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
deleteRepoBinding.delete.setVisibility(View.VISIBLE);
deleteRepoBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
}
private void showRepositoryProperties() {
@ -231,21 +246,20 @@ public class RepositorySettingsActivity extends BaseActivity {
propBinding.repoEnableIssues.setChecked(repoInfo.isHasIssues());
propBinding.repoEnableIssues.setOnCheckedChangeListener((buttonView, isChecked) -> {
propBinding.repoEnableIssues.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
if (isChecked) {
propBinding.repoEnableTimer.setVisibility(View.VISIBLE);
} else {
propBinding.repoEnableTimer.setVisibility(View.GONE);
}
});
if(isChecked) {
propBinding.repoEnableTimer.setVisibility(View.VISIBLE);
}
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(),
propBinding.repoEnableForceMerge.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,47 +321,56 @@ 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) {
@Override
public void onResponse(
@NonNull Call<Repository> call,
@NonNull retrofit2.Response<Repository> response) {
propBinding.save.setVisibility(View.GONE);
propBinding.processingRequest.setVisibility(View.VISIBLE);
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());
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());
Intent result = new Intent();
result.putExtra("nameChanged", true);
setResult(200, result);
finish();
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 {
propBinding.save.setVisibility(View.VISIBLE);
propBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.genericError));
}
}
}
else {
propBinding.save.setVisibility(View.VISIBLE);
propBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Repository> call, @NonNull Throwable t) {
@Override
public void onFailure(@NonNull Call<Repository> call, @NonNull Throwable t) {
propBinding.save.setVisibility(View.VISIBLE);
propBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
propBinding.save.setVisibility(View.VISIBLE);
propBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
}
private void initCloseListener() {
@ -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,114 +103,146 @@ public class SettingsAppearanceActivity extends BaseActivity {
counterBadgesSwitch.setChecked(tinyDB.getBoolean("enableCounterBadges", true));
// counter badge switcher
counterBadgesSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
tinyDB.putBoolean("enableCounterBadges", isChecked);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
});
activitySettingsAppearanceBinding.counterBadgeFrame.setOnClickListener(v -> counterBadgesSwitch.setChecked(!counterBadgesSwitch.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()));
// show labels in lists(issues, pr) - default is color dots
activitySettingsAppearanceBinding.switchLabelsInListBadge.setChecked(tinyDB.getBoolean("showLabelsInList", false));
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.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 -> {
themeFrame.setOnClickListener(
view -> {
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(R.string.themeSelectorDialogTitle)
.setSingleChoiceItems(
themeList,
themeSelectedChoice,
(dialogInterfaceTheme, i) -> {
themeSelectedChoice = i;
activitySettingsAppearanceBinding.themeSelected
.setText(themeList[i]);
tinyDB.putInt("themeId", i);
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(R.string.themeSelectorDialogTitle)
.setSingleChoiceItems(themeList, themeSelectedChoice, (dialogInterfaceTheme, i) -> {
SettingsFragment.refreshParent = true;
this.recreate();
this.overridePendingTransition(0, 0);
dialogInterfaceTheme.dismiss();
Toasty.success(
appCtx,
getResources()
.getString(R.string.settingsSave));
});
themeSelectedChoice = 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));
materialAlertDialogBuilder.create().show();
});
materialAlertDialogBuilder.create().show();
});
lightTimeFrame.setOnClickListener(
view -> {
LightTimePicker timePicker = new LightTimePicker();
timePicker.show(getSupportFragmentManager(), "timePicker");
});
lightTimeFrame.setOnClickListener(view -> {
LightTimePicker timePicker = new LightTimePicker();
timePicker.show(getSupportFragmentManager(), "timePicker");
});
darkTimeFrame.setOnClickListener(view -> {
DarkTimePicker timePicker = new DarkTimePicker();
timePicker.show(getSupportFragmentManager(), "timePicker");
});
darkTimeFrame.setOnClickListener(
view -> {
DarkTimePicker timePicker = new DarkTimePicker();
timePicker.show(getSupportFragmentManager(), "timePicker");
});
// custom font dialog
customFontFrame.setOnClickListener(view -> {
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]);
tinyDB.putInt("customFontId", i);
AppUtil.typeface = null; // reset typeface
FontsOverride.setDefaultFont(this);
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(R.string.settingsCustomFontSelectorDialogTitle).setCancelable(customFontSelectedChoice != -1)
.setSingleChoiceItems(customFontList, customFontSelectedChoice, (dialogInterfaceCustomFont, i) -> {
SettingsFragment.refreshParent = true;
this.recreate();
this.overridePendingTransition(0, 0);
dialogInterfaceCustomFont.dismiss();
Toasty.success(
appCtx,
appCtx.getResources()
.getString(R.string.settingsSave));
});
customFontSelectedChoice = i;
activitySettingsAppearanceBinding.customFontSelected.setText(customFontList[i]);
tinyDB.putInt("customFontId", i);
AppUtil.typeface = null; // reset typeface
FontsOverride.setDefaultFont(this);
SettingsFragment.refreshParent = true;
this.recreate();
this.overridePendingTransition(0, 0);
dialogInterfaceCustomFont.dismiss();
Toasty.success(appCtx, appCtx.getResources().getString(R.string.settingsSave));
materialAlertDialogBuilder.create().show();
});
materialAlertDialogBuilder.create().show();
});
// time and date dialog
timeFrame.setOnClickListener(view -> {
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]);
tinyDB.putInt("timeId", i);
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(R.string.settingsTimeSelectorDialogTitle).setCancelable(timeSelectedChoice != -1)
.setSingleChoiceItems(timeList, timeSelectedChoice, (dialogInterfaceTime, i) -> {
switch (i) {
case 0:
tinyDB.putString("dateFormat", "pretty");
break;
case 1:
tinyDB.putString("dateFormat", "normal");
break;
}
timeSelectedChoice = i;
activitySettingsAppearanceBinding.tvDateTimeSelected.setText(timeList[i]);
tinyDB.putInt("timeId", i);
dialogInterfaceTime.dismiss();
Toasty.success(
appCtx,
getResources()
.getString(R.string.settingsSave));
});
switch(i) {
case 0:
tinyDB.putString("dateFormat", "pretty");
break;
case 1:
tinyDB.putString("dateFormat", "normal");
break;
}
dialogInterfaceTime.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
materialAlertDialogBuilder.create().show();
});
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) -> {
tinyDB.putBoolean("draftsCommentsDeletionEnabled", isChecked);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
});
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,121 +36,139 @@ 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 -> {
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]);
tinyDB.putInt("homeScreenId", i);
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(R.string.settingsHomeScreenSelectorDialogTitle).setCancelable(homeScreenSelectedChoice != -1)
.setSingleChoiceItems(homeScreenArray, homeScreenSelectedChoice, (dialogInterfaceHomeScreen, i) -> {
dialogInterfaceHomeScreen.dismiss();
Toasty.success(
appCtx,
getResources()
.getString(R.string.settingsSave));
});
homeScreenSelectedChoice = i;
viewBinding.homeScreenSelected.setText(homeScreenArray[i]);
tinyDB.putInt("homeScreenId", i);
dialogInterfaceHomeScreen.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
materialAlertDialogBuilder.create().show();
});
materialAlertDialogBuilder.create().show();
});
// 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.generalDeepLinkSelected.setText(
linksArray[defaultLinkHandlerScreenSelectedChoice]);
viewBinding.setDefaultLinkHandler.setOnClickListener(setDefaultLinkHandler -> {
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]);
tinyDB.putInt("defaultScreenId", i);
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(R.string.linkSelectorDialogTitle).setCancelable(defaultLinkHandlerScreenSelectedChoice != -1)
.setSingleChoiceItems(linksArray, defaultLinkHandlerScreenSelectedChoice, (dialogInterfaceHomeScreen, i) -> {
dialogInterfaceHomeScreen.dismiss();
Toasty.success(
appCtx,
getResources()
.getString(R.string.settingsSave));
});
defaultLinkHandlerScreenSelectedChoice = i;
viewBinding.generalDeepLinkSelected.setText(linksArray[i]);
tinyDB.putInt("defaultScreenId", i);
dialogInterfaceHomeScreen.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
materialAlertDialogBuilder.create().show();
});
materialAlertDialogBuilder.create().show();
});
// link handler
// custom tabs
viewBinding.switchTabs.setChecked(tinyDB.getBoolean("useCustomTabs"));
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.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()));
// 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,106 +33,150 @@ 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);
tinyDB.putBoolean("notificationsEnabled", isChecked);
if (isChecked) {
Notifications.startWorker(ctx);
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);
}
if(isChecked) {
Notifications.startWorker(ctx);
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);
}
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
});
viewBinding.enableNotificationsFrame.setOnClickListener(v -> viewBinding.enableNotificationsMode.setChecked(!viewBinding.enableNotificationsMode.isChecked()));
// polling delay
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.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());
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.enableNotificationsFrame.setOnClickListener(
v ->
viewBinding.enableNotificationsMode.setChecked(
!viewBinding.enableNotificationsMode.isChecked()));
materialAlertDialogBuilder.setView(numberPicker);
materialAlertDialogBuilder.create().show();
});
// polling delay
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.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());
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));
});
materialAlertDialogBuilder.setView(numberPicker);
materialAlertDialogBuilder.create().show();
});
// lights switcher
viewBinding.enableLightsMode.setOnCheckedChangeListener((buttonView, isChecked) -> {
viewBinding.enableLightsMode.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
if (!isChecked) {
viewBinding.chooseColorFrame.setVisibility(View.GONE);
} else {
viewBinding.chooseColorFrame.setVisibility(View.VISIBLE);
}
if(!isChecked) {
viewBinding.chooseColorFrame.setVisibility(View.GONE);
}
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()));
tinyDB.putBoolean("notificationsEnableLights", isChecked);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
});
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 -> {
tinyDB.putInt("notificationsLightColor", color);
viewBinding.chooseColorState.setCardBackgroundColor(color);
colorPicker.dismiss();
Toasty.success(
appCtx, getResources().getString(R.string.settingsSave));
});
ColorPicker colorPicker = new ColorPicker(SettingsNotificationsActivity.this);
colorPicker.setColor(tinyDB.getInt("notificationsLightColor", Color.GREEN));
colorPicker.setCallback(color -> {
tinyDB.putInt("notificationsLightColor", color);
viewBinding.chooseColorState.setCardBackgroundColor(color);
colorPicker.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
});
colorPicker.show();
});
colorPicker.show();
});
// vibration switcher
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.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()));
}
}

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) -> {
tinyDB.putBoolean("crashReportingEnabled", isChecked);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
});
activitySettingsReportsBinding.enableSendReports.setOnClickListener(v -> activitySettingsReportsBinding.crashReportsSwitch.setChecked(!activitySettingsReportsBinding.crashReportsSwitch.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()));
}
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,140 +89,188 @@ public class SettingsSecurityActivity extends BaseActivity {
switchBiometric.setChecked(tinyDB.getBoolean("biometricStatus", false));
// biometric switcher
switchBiometric.setOnCheckedChangeListener((buttonView, isChecked) -> {
switchBiometric.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
if (isChecked) {
if(isChecked) {
BiometricManager biometricManager = BiometricManager.from(ctx);
KeyguardManager keyguardManager =
(KeyguardManager) ctx.getSystemService(Context.KEYGUARD_SERVICE);
BiometricManager biometricManager = BiometricManager.from(ctx);
KeyguardManager keyguardManager = (KeyguardManager) ctx.getSystemService(Context.KEYGUARD_SERVICE);
if (!keyguardManager.isDeviceSecure()) {
if(!keyguardManager.isDeviceSecure()) {
switch(biometricManager.canAuthenticate(BIOMETRIC_STRONG | DEVICE_CREDENTIAL)) {
case BiometricManager.BIOMETRIC_SUCCESS:
switch (biometricManager.canAuthenticate(
BIOMETRIC_STRONG | DEVICE_CREDENTIAL)) {
case BiometricManager.BIOMETRIC_SUCCESS:
tinyDB.putBoolean("biometricStatus", true);
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));
break;
case BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE:
tinyDB.putBoolean("biometricStatus", false);
switchBiometric.setChecked(false);
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));
break;
}
} else {
tinyDB.putBoolean("biometricStatus", true);
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:
}
} else {
tinyDB.putBoolean("biometricStatus", false);
switchBiometric.setChecked(false);
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));
break;
case BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED:
tinyDB.putBoolean("biometricStatus", false);
switchBiometric.setChecked(false);
Toasty.info(appCtx, getResources().getString(R.string.enrollBiometric));
break;
tinyDB.putBoolean("biometricStatus", false);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
}
}
else {
});
tinyDB.putBoolean("biometricStatus", true);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
}
}
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 -> {
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 {
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) -> {
FileUtils.deleteDirectory(cacheDir);
FileUtils.forceMkdir(cacheDir);
this.recreate();
this.overridePendingTransition(0, 0);
} catch (IOException e) {
try {
Log.e("SettingsSecurity", e.toString());
}
});
FileUtils.deleteDirectory(cacheDir);
FileUtils.forceMkdir(cacheDir);
this.recreate();
this.overridePendingTransition(0, 0);
}
catch(IOException e) {
Log.e("SettingsSecurity", e.toString());
}
materialAlertDialogBuilder.create().show();
});
materialAlertDialogBuilder.create().show();
});
// cache size images selection dialog
cacheSizeImagesFrame.setOnClickListener(view -> {
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]);
tinyDB.putInt("cacheSizeImagesId", i);
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(R.string.cacheSizeImagesDialogHeader).setCancelable(cacheSizeImagesSelectedChoice != -1)
.setSingleChoiceItems(cacheSizeImagesList, cacheSizeImagesSelectedChoice, (dialogInterfaceTheme, i) -> {
dialogInterfaceTheme.dismiss();
Toasty.success(
appCtx,
getResources()
.getString(R.string.settingsSave));
});
cacheSizeImagesSelectedChoice = i;
cacheSizeImagesSelected.setText(cacheSizeImagesList[i]);
tinyDB.putString("cacheSizeImagesStr", cacheSizeImagesList[i]);
tinyDB.putInt("cacheSizeImagesId", i);
dialogInterfaceTheme.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
materialAlertDialogBuilder.create().show();
});
materialAlertDialogBuilder.create().show();
});
// cache size data selection dialog
cacheSizeDataFrame.setOnClickListener(view -> {
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.putInt("cacheSizeId", i);
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(R.string.cacheSizeDataDialogHeader).setCancelable(cacheSizeDataSelectedChoice != -1)
.setSingleChoiceItems(cacheSizeDataList, cacheSizeDataSelectedChoice, (dialogInterfaceTheme, i) -> {
dialogInterfaceTheme.dismiss();
Toasty.success(
appCtx,
getResources()
.getString(R.string.settingsSave));
});
cacheSizeDataSelectedChoice = i;
cacheSizeDataSelected.setText(cacheSizeDataList[i]);
tinyDB.putString("cacheSizeStr", cacheSizeDataList[i]);
tinyDB.putInt("cacheSizeId", i);
dialogInterfaceTheme.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
materialAlertDialogBuilder.create().show();
});
materialAlertDialogBuilder.create().show();
});
// certs deletion
certsFrame.setOnClickListener(v1 -> {
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);
});
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);
materialAlertDialogBuilder.create().show();
});
materialAlertDialogBuilder.create().show();
});
}
private void initCloseListener() {
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,42 +50,54 @@ 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 -> {
AppUtil.openUrlInBrowser(this, getResources().getString(R.string.crowdInLink));
});
langSelectedChoice = tinyDB.getInt("langId");
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];
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));
this.recreate();
helpTranslate.setOnClickListener(
v12 -> {
AppUtil.openUrlInBrowser(this, getResources().getString(R.string.crowdInLink));
});
materialAlertDialogBuilder.create().show();
});
langSelectedChoice = tinyDB.getInt("langId");
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];
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));
this.recreate();
});
materialAlertDialogBuilder.create().show();
});
}
private void initCloseListener() {
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,46 +104,68 @@ 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) {
@Override
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 {
Toasty.success(ctx, getString(R.string.wikiCreated));
WikiFragment.resumeWiki = true;
finish();
} else {
switch(response.code()) {
case 401:
runOnUiThread(() -> AlertDialogs.authorizationTokenRevokedDialog(ctx));
break;
case 403:
runOnUiThread(() -> Toasty.error(ctx, ctx.getString(R.string.authorizeError)));
break;
case 404:
runOnUiThread(() -> Toasty.warning(ctx, ctx.getString(R.string.apiNotFound)));
break;
default:
runOnUiThread(() -> Toasty.error(ctx, getString(R.string.genericError)));
switch (response.code()) {
case 401:
runOnUiThread(
() ->
AlertDialogs
.authorizationTokenRevokedDialog(
ctx));
break;
case 403:
runOnUiThread(
() ->
Toasty.error(
ctx,
ctx.getString(
R.string.authorizeError)));
break;
case 404:
runOnUiThread(
() ->
Toasty.warning(
ctx,
ctx.getString(
R.string.apiNotFound)));
break;
default:
runOnUiThread(
() ->
Toasty.error(
ctx,
getString(R.string.genericError)));
}
}
}
}
}
}
@Override
public void onFailure(@NonNull Call<WikiPage> call, @NonNull Throwable t) {
@Override
public void onFailure(@NonNull Call<WikiPage> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
}
private void patchWiki(String wikiTitle, String wikiContent) {
@ -153,142 +174,222 @@ 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) {
@Override
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 {
Toasty.success(ctx, getString(R.string.wikiUpdated));
WikiFragment.resumeWiki = true;
finish();
} else {
switch(response.code()) {
case 401:
runOnUiThread(() -> AlertDialogs.authorizationTokenRevokedDialog(ctx));
break;
case 403:
runOnUiThread(() -> Toasty.error(ctx, ctx.getString(R.string.authorizeError)));
break;
case 404:
runOnUiThread(() -> Toasty.warning(ctx, ctx.getString(R.string.apiNotFound)));
break;
default:
runOnUiThread(() -> Toasty.error(ctx, getString(R.string.genericError)));
switch (response.code()) {
case 401:
runOnUiThread(
() ->
AlertDialogs
.authorizationTokenRevokedDialog(
ctx));
break;
case 403:
runOnUiThread(
() ->
Toasty.error(
ctx,
ctx.getString(
R.string.authorizeError)));
break;
case 404:
runOnUiThread(
() ->
Toasty.warning(
ctx,
ctx.getString(
R.string.apiNotFound)));
break;
default:
runOnUiThread(
() ->
Toasty.error(
ctx,
getString(R.string.genericError)));
}
}
}
}
}
}
@Override
public void onFailure(@NonNull Call<WikiPage> call, @NonNull Throwable t) {
@Override
public void onFailure(@NonNull Call<WikiPage> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
}
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) {
@Override
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();
WikiPage wikiPage = response.body();
runOnUiThread(() -> {
runOnUiThread(
() -> {
assert wikiPage != null;
String pageContents =
AppUtil.decodeBase64(
wikiPage.getContentBase64());
binding.contents.setContent(pageContents, "md");
assert wikiPage != null;
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 {
binding.markdownFrame.setVisibility(View.GONE);
binding.contents.setVisibility(View.VISIBLE);
}
binding.markdownFrame.setVisibility(View.VISIBLE);
binding.contents.setVisibility(View.GONE);
}
else {
binding.markdownFrame.setVisibility(View.GONE);
binding.contents.setVisibility(View.VISIBLE);
if (action.equalsIgnoreCase("edit")) {
binding.wikiContent.setText(pageContents);
}
});
} else {
switch (response.code()) {
case 401:
runOnUiThread(
() ->
AlertDialogs
.authorizationTokenRevokedDialog(
ctx));
break;
case 403:
runOnUiThread(
() ->
Toasty.error(
ctx,
ctx.getString(
R.string.authorizeError)));
break;
case 404:
runOnUiThread(
() ->
Toasty.warning(
ctx,
ctx.getString(
R.string.apiNotFound)));
break;
default:
runOnUiThread(
() ->
Toasty.error(
ctx,
getString(R.string.genericError)));
}
}
if(action.equalsIgnoreCase("edit")) {
binding.wikiContent.setText(pageContents);
}
});
}
else {
switch(response.code()) {
case 401:
runOnUiThread(() -> AlertDialogs.authorizationTokenRevokedDialog(ctx));
break;
case 403:
runOnUiThread(() -> Toasty.error(ctx, ctx.getString(R.string.authorizeError)));
break;
case 404:
runOnUiThread(() -> Toasty.warning(ctx, ctx.getString(R.string.apiNotFound)));
break;
default:
runOnUiThread(() -> Toasty.error(ctx, getString(R.string.genericError)));
binding.progressBar.setVisibility(View.GONE);
}
}
binding.progressBar.setVisibility(View.GONE);
}
}
@Override
public void onFailure(@NonNull Call<WikiPage> call, @NonNull Throwable t) {
@Override
public void onFailure(@NonNull Call<WikiPage> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
}
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) {
@Override
public void onResponse(
@NonNull Call<Void> call,
@NonNull Response<Void>
response) {
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));
}
}
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));
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
@Override
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));
}
}));
materialAlertDialogBuilder.create().show();
}
@ -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,58 +50,71 @@ 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 = "";
String nextRun = "";
String lastRun = "";
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.getNext() != null) {
nextRun = TimeHelper.formatTime(cronTasks.getNext(), 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);
TextView lastRunContent = view.findViewById(R.id.lastRunContent);
TextView execTimeContent = view.findViewById(R.id.execTimeContent);
TextView taskScheduleContent = view.findViewById(R.id.taskScheduleContent);
TextView nextRunContent = view.findViewById(R.id.nextRunContent);
TextView lastRunContent = view.findViewById(R.id.lastRunContent);
TextView execTimeContent = view.findViewById(R.id.execTimeContent);
taskScheduleContent.setText(cronTasks.getSchedule());
nextRunContent.setText(nextRun);
lastRunContent.setText(lastRun);
execTimeContent.setText(String.valueOf(cronTasks.getExecTimes()));
taskScheduleContent.setText(cronTasks.getSchedule());
nextRunContent.setText(nextRun);
lastRunContent.setText(lastRun);
execTimeContent.setText(String.valueOf(cronTasks.getExecTimes()));
MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(ctx)
.setTitle(
StringUtils.capitalize(
cronTasks.getName().replace("_", " ")))
.setView(view)
.setNeutralButton(ctx.getString(R.string.close), null);
MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(ctx).setTitle(StringUtils.capitalize(cronTasks.getName().replace("_", " "))).setView(view)
.setNeutralButton(ctx.getString(R.string.close), null);
materialAlertDialogBuilder.create().show();
});
materialAlertDialogBuilder.create().show();
});
cronTasksRun.setOnClickListener(taskInfo -> {
runCronTask(ctx, cronTasks.getName());
});
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,46 +126,47 @@ 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) {
@Override
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
switch(response.code()) {
switch (response.code()) {
case 204:
Toasty.success(
ctx,
ctx.getString(R.string.adminCronTaskSuccessMsg, taskName));
break;
case 204:
Toasty.success(ctx, ctx.getString(R.string.adminCronTaskSuccessMsg, taskName));
break;
case 401:
AlertDialogs.authorizationTokenRevokedDialog(ctx);
break;
case 401:
AlertDialogs.authorizationTokenRevokedDialog(ctx);
break;
case 403:
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
break;
case 403:
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
break;
case 404:
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
break;
case 404:
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
break;
default:
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
default:
Toasty.error(ctx, ctx.getString(R.string.genericError));
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
}
@Override
public int getItemCount() {
return tasksList.size();
}
}

View File

@ -15,58 +15,60 @@ 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() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<User> filteredList = new ArrayList<>();
private final Filter usersFilter =
new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<User> filteredList = new ArrayList<>();
if(constraint == null || constraint.length() == 0) {
filteredList.addAll(usersListFull);
}
else {
String filterPattern = constraint.toString().toLowerCase().trim();
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(usersListFull);
} 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)) {
filteredList.add(item);
for (User item : usersListFull) {
if (item.getEmail().toLowerCase().contains(filterPattern)
|| item.getFullName().toLowerCase().contains(filterPattern)
|| item.getLogin().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
usersList.clear();
usersList.addAll((List) results.values);
notifyDataChanged();
}
};
usersList.clear();
usersList.addAll((List) results.values);
notifyDataChanged();
}
};
public AdminGetUsersAdapter(List<User> usersListMain, Context ctx) {
this.context = ctx;
@ -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,16 +159,21 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter<RecyclerView.View
userEmail = itemView.findViewById(R.id.userEmail);
userRole = itemView.findViewById(R.id.userRole);
itemView.setOnClickListener(loginId -> {
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", userLoginId);
context.startActivity(intent);
});
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));
return true;
});
userAvatar.setOnLongClickListener(
loginId -> {
AppUtil.copyToClipboard(
context,
userLoginId,
context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
return true;
});
}
void bindData(User users) {
@ -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,91 +74,96 @@ 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) {
@Override
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
switch(response.code()) {
switch (response.code()) {
case 204:
updateList.run();
Toasty.success(ctx, ctx.getString(R.string.repoDeletionSuccess));
break;
case 204:
updateList.run();
Toasty.success(ctx, ctx.getString(R.string.repoDeletionSuccess));
break;
case 401:
AlertDialogs.authorizationTokenRevokedDialog(ctx);
break;
case 401:
AlertDialogs.authorizationTokenRevokedDialog(ctx);
break;
case 403:
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
break;
case 403:
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
break;
case 404:
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
break;
case 404:
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
break;
default:
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
default:
Toasty.error(ctx, ctx.getString(R.string.genericError));
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
}
private void adopt(final Context ctx, final String name, int position) {
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) {
@Override
public void onResponse(
@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
switch(response.code()) {
switch (response.code()) {
case 204:
updateAdapter(position);
if (getItemCount() == 0) {
activityAdminCronTasksBinding.noData.setVisibility(
View.VISIBLE);
}
Toasty.success(ctx, ctx.getString(R.string.repoAdopted, name));
break;
case 204:
updateAdapter(position);
if(getItemCount() == 0) {
activityAdminCronTasksBinding.noData.setVisibility(View.VISIBLE);
case 401:
AlertDialogs.authorizationTokenRevokedDialog(ctx);
break;
case 403:
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
break;
case 404:
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
break;
default:
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
Toasty.success(ctx, ctx.getString(R.string.repoAdopted, name));
break;
}
case 401:
AlertDialogs.authorizationTokenRevokedDialog(ctx);
break;
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
case 403:
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
break;
case 404:
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
break;
default:
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
}
@Override
@ -184,17 +194,32 @@ public class AdminUnadoptedReposAdapter extends RecyclerView.Adapter<AdminUnadop
name = itemView.findViewById(R.id.repo_name);
itemView.setOnClickListener(taskInfo -> {
String[] repoSplit = repoName.split("/");
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();
});
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()
.into(holder.assigneesAvatar);
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,19 +98,18 @@ public class AssigneesListAdapter extends RecyclerView.Adapter<AssigneesListAdap
assigneesListener.assigneesInterface(assigneesStrings);
holder.assigneesSelection.setOnCheckedChangeListener((buttonView, isChecked) -> {
holder.assigneesSelection.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
if (isChecked) {
if(isChecked) {
assigneesStrings.add(currentItem.getLogin());
} else {
assigneesStrings.add(currentItem.getLogin());
}
else {
assigneesStrings.remove(currentItem.getLogin());
}
assigneesStrings.remove(currentItem.getLogin());
}
assigneesListener.assigneesInterface(assigneesStrings);
});
assigneesListener.assigneesInterface(assigneesStrings);
});
assigneesStrings = new ArrayList<>(new LinkedHashSet<>(assigneesStrings));
}
@ -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,60 +64,74 @@ 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()
.into(holder.userAvatar);
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) {
@Override
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())) {
holder.addCollaboratorButtonRemove.setVisibility(View.VISIBLE);
if (response.code() == 204) {
if (!currentItem.getLogin().equals(loginUid)
&& !currentItem.getLogin().equals(repository.getOwner())) {
holder.addCollaboratorButtonRemove.setVisibility(View.VISIBLE);
} else {
holder.addCollaboratorButtonRemove.setVisibility(View.GONE);
}
} else if (response.code() == 404) {
if (!currentItem.getLogin().equals(loginUid)
&& !currentItem.getLogin().equals(repository.getOwner())) {
holder.addCollaboratorButtonAdd.setVisibility(View.VISIBLE);
} else {
holder.addCollaboratorButtonAdd.setVisibility(View.GONE);
}
} else {
holder.addCollaboratorButtonRemove.setVisibility(View.GONE);
holder.addCollaboratorButtonAdd.setVisibility(View.GONE);
}
}
else {
holder.addCollaboratorButtonRemove.setVisibility(View.GONE);
}
}
else if(response.code() == 404) {
if(!currentItem.getLogin().equals(loginUid) && !currentItem.getLogin().equals(repository.getOwner())) {
holder.addCollaboratorButtonAdd.setVisibility(View.VISIBLE);
}
else {
holder.addCollaboratorButtonAdd.setVisibility(View.GONE);
}
}
else {
holder.addCollaboratorButtonRemove.setVisibility(View.GONE);
holder.addCollaboratorButtonAdd.setVisibility(View.GONE);
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Log.i("onFailure", t.toString());
}
});
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Log.i("onFailure", t.toString());
}
});
}
}
@ -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) -> {
CollaboratorActions.addCollaborator(
context,
String.valueOf(checkedItem)
.toLowerCase(),
userInfo.getLogin(),
repository);
});
ListView lw = ((AlertDialog) dialog).getListView();
Object checkedItem = lw.getAdapter().getItem(lw.getCheckedItemPosition());
CollaboratorActions.addCollaborator(context, String.valueOf(checkedItem).toLowerCase(), userInfo.getLogin(), repository);
materialAlertDialogBuilder.create().show();
});
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);
intent.putExtra("username", userInfo.getLogin());
context.startActivity(intent);
});
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()));
return true;
});
}
}, 500);
userAvatar.setOnLongClickListener(
loginId -> {
AppUtil.copyToClipboard(
context,
userInfo.getLogin(),
context.getString(
R.string.copyLoginIdToClipBoard,
userInfo.getLogin()));
return true;
});
}
},
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()
.into(viewHolder.collaboratorAvatar);
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 -> {
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", userLoginId);
context.startActivity(intent);
});
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));
return true;
});
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)),
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)),
HtmlCompat.FROM_HTML_MODE_COMPACT));
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)),
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 -> {
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);
}
intent.putExtra("sha", commitsModel.getSha());
context.startActivity(intent);
});
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);
}
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,80 +76,82 @@ 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 (type.equalsIgnoreCase("pull")) {
convertView.setOnClickListener(
v -> {
if (selectedLines.contains(position)) {
if(selectedLines.contains(position)) {
selectedLines.remove((Object) position);
v.setBackgroundColor(getLineColor(lines.get(position)));
} else {
selectedLines.remove((Object) position);
v.setBackgroundColor(getLineColor(lines.get(position)));
}
else {
selectedLines.add(position);
v.setBackgroundColor(COLOR_SELECTED);
}
});
selectedLines.add(position);
v.setBackgroundColor(COLOR_SELECTED);
}
});
convertView.setOnLongClickListener(
v -> {
if (selectedLines.contains(position)) {
convertView.setOnLongClickListener(v -> {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("```\n");
if(selectedLines.contains(position)) {
for (Integer selectedLine :
selectedLines.stream().sorted().collect(Collectors.toList())) {
stringBuilder.append(lines.get(selectedLine));
stringBuilder.append("\n");
}
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("```\n");
stringBuilder.append("```\n\n");
selectedLines.clear();
for(Integer selectedLine : selectedLines.stream().sorted().collect(Collectors.toList())) {
stringBuilder.append(lines.get(selectedLine));
stringBuilder.append("\n");
}
Bundle bundle = new Bundle();
bundle.putString("commentBody", stringBuilder.toString());
bundle.putBoolean("cursorToEnd", true);
stringBuilder.append("```\n\n");
selectedLines.clear();
BottomSheetReplyFragment.newInstance(bundle, issue)
.show(fragmentManager, "replyBottomSheet");
}
Bundle bundle = new Bundle();
bundle.putString("commentBody", stringBuilder.toString());
bundle.putBoolean("cursorToEnd", true);
BottomSheetReplyFragment.newInstance(bundle, issue).show(fragmentManager, "replyBottomSheet");
}
return true;
});
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,15 +90,26 @@ 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();
}
else {
((DiffActivity) context).getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, DiffFragment.newInstance(diffFilesObject, issue)).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();
}
});
}
void bindData(FileDiffView fileDiffView) {
@ -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,44 +129,63 @@ 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());
int getDraftId = draftWithRepository.getDraftId();
deleteDraft(getBindingAdapterPosition());
DraftsApi draftsApi = BaseApi.getInstance(context, DraftsApi.class);
assert draftsApi != null;
draftsApi.deleteSingleDraft(getDraftId);
});
DraftsApi draftsApi = BaseApi.getInstance(context, DraftsApi.class);
assert draftsApi != null;
draftsApi.deleteSingleDraft(getDraftId);
});
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());
Bundle bundle = issue.getBundle();
itemView.setOnClickListener(itemEdit -> {
bundle.putString("commentBody", draftWithRepository.getDraftText());
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()));
RepositoryContext repository = new RepositoryContext(draftWithRepository.getRepositoryOwner(), draftWithRepository.getRepositoryName(), context);
repository.setRepositoryId(draftWithRepository.getRepositoryId());
IssueContext issue = new IssueContext(repository, draftWithRepository.getIssueId(), draftWithRepository.getIssueType());
Bundle bundle = issue.getBundle();
if (!draftWithRepository.getCommentId().isEmpty()) {
bundle.putString("commentAction", "edit");
}
bundle.putString("commentBody", draftWithRepository.getDraftText());
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()));
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);
i.putExtra("openedFromLink", "true");
context.startActivity(i);
});
bottomSheetReplyFragment.show(fragmentManager, "replyBottomSheet");
});
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,41 +143,56 @@ 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];
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);
intentIssueDetail.putExtra("openedFromLink", "true");
Intent intentIssueDetail = new IssueContext(issue, repo).getIntent(context, IssueDetailActivity.class);
intentIssueDetail.putExtra("openedFromLink", "true");
itemView.setOnClickListener(
v -> {
repo.saveToDB(context);
context.startActivity(intentIssueDetail);
});
frameLabels.setOnClickListener(
v -> {
repo.saveToDB(context);
context.startActivity(intentIssueDetail);
});
frameLabelsDots.setOnClickListener(
v -> {
repo.saveToDB(context);
context.startActivity(intentIssueDetail);
});
},
200);
itemView.setOnClickListener(v -> {
repo.saveToDB(context);
context.startActivity(intentIssueDetail);
});
frameLabels.setOnClickListener(v -> {
repo.saveToDB(context);
context.startActivity(intentIssueDetail);
});
frameLabelsDots.setOnClickListener(v -> {
repo.saveToDB(context);
context.startActivity(intentIssueDetail);
});
}, 200);
issueAssigneeAvatar.setOnClickListener(
v -> {
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", issue.getUser().getLogin());
context.startActivity(intent);
});
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()));
return true;
});
issueAssigneeAvatar.setOnLongClickListener(
loginId -> {
AppUtil.copyToClipboard(
context,
issue.getUser().getLogin(),
context.getString(
R.string.copyLoginIdToClipBoard,
issue.getUser().getLogin()));
return true;
});
}
void bindData(Issue issue) {
@ -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()
.into(issueAssigneeAvatar);
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": {
PrettyTime prettyTime = new PrettyTime(locale);
String createdTime = prettyTime.format(issue.getCreatedAt());
issueCreatedTime.setText(createdTime);
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);
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);
String createdTime = formatter.format(issue.getCreatedAt());
issueCreatedTime.setText(createdTime);
break;
}
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));
break;
}
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);
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,14 +118,15 @@ public class ExploreRepositoriesAdapter extends RecyclerView.Adapter<RecyclerVie
repoLastUpdated = itemView.findViewById(R.id.repoLastUpdated);
spacerView = itemView.findViewById(R.id.spacerView);
itemView.setOnClickListener(v -> {
Context context = v.getContext();
RepositoryContext repo = new RepositoryContext(userRepositories, context);
repo.saveToDB(context);
Intent intent = repo.getIntent(context, RepoDetailActivity.class);
itemView.setOnClickListener(
v -> {
Context context = v.getContext();
RepositoryContext repo = new RepositoryContext(userRepositories, context);
repo.saveToDB(context);
Intent intent = repo.getIntent(context, RepoDetailActivity.class);
context.startActivity(intent);
});
context.startActivity(intent);
});
}
@SuppressLint("SetTextI18n")
@ -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()
.into(image);
}
else {
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 {
image.setImageDrawable(drawable);
}
}
else {
} else {
image.setImageDrawable(drawable);
}
if(userRepositories.getUpdatedAt() != null) {
if (userRepositories.getUpdatedAt() != null) {
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));
break;
}
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));
break;
}
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));
break;
}
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));
break;
}
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));
break;
}
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));
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,44 +30,42 @@ 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) {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<ContentsResponse> filteredList = new ArrayList<>();
List<ContentsResponse> filteredList = new ArrayList<>();
if(constraint == null || constraint.length() == 0) {
filteredList.addAll(originalFiles);
}
else {
String filterPattern = constraint.toString().toLowerCase().trim();
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(originalFiles);
} else {
String filterPattern = constraint.toString().toLowerCase().trim();
for(ContentsResponse item : originalFiles) {
if(item.getName().toLowerCase().contains(filterPattern) || item.getPath().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
for (ContentsResponse item : originalFiles) {
if (item.getName().toLowerCase().contains(filterPattern)
|| item.getPath().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
return results;
alteredFiles.clear();
alteredFiles.addAll((List) results.values);
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
alteredFiles.clear();
alteredFiles.addAll((List) results.values);
notifyDataSetChanged();
}
};
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,73 +168,71 @@ 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
public void onClick(View v) {
/*filesDropdownMenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final Context context = v.getContext();
Context context_ = new ContextThemeWrapper(context, R.style.popupMenuStyle);
final Context context = v.getContext();
Context context_ = new ContextThemeWrapper(context, R.style.popupMenuStyle);
PopupMenu popupMenu = new PopupMenu(context_, v);
popupMenu.inflate(R.menu.files_dotted_list_menu);
PopupMenu popupMenu = new PopupMenu(context_, v);
popupMenu.inflate(R.menu.files_dotted_list_menu);
Object menuHelper;
Class[] argTypes;
try {
Object menuHelper;
Class[] argTypes;
try {
Field fMenuHelper = PopupMenu.class.getDeclaredField("mPopup");
fMenuHelper.setAccessible(true);
menuHelper = fMenuHelper.get(popupMenu);
argTypes = new Class[] { boolean.class };
menuHelper.getClass().getDeclaredMethod("setForceShowIcon",
argTypes).invoke(menuHelper, true);
Field fMenuHelper = PopupMenu.class.getDeclaredField("mPopup");
fMenuHelper.setAccessible(true);
menuHelper = fMenuHelper.get(popupMenu);
argTypes = new Class[] { boolean.class };
menuHelper.getClass().getDeclaredMethod("setForceShowIcon",
argTypes).invoke(menuHelper, true);
} catch (Exception e) {
} catch (Exception e) {
popupMenu.show();
return;
popupMenu.show();
return;
}
}
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.deleteFile:
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.deleteFile:
Intent intent = new Intent(context, DeleteFileActivity.class);
intent.putExtra("repoFullNameForDeleteFile", fullName.getText());
context.startActivity(intent);
break;
Intent intent = new Intent(context, DeleteFileActivity.class);
intent.putExtra("repoFullNameForDeleteFile", fullName.getText());
context.startActivity(intent);
break;
case R.id.editFile:
case R.id.editFile:
Intent intentW = new Intent(context, EditFileActivity.class);
intentW.putExtra("repoFullNameForEditFile", fullName.getText());
context.startActivity(intentW);
break;
Intent intentW = new Intent(context, EditFileActivity.class);
intentW.putExtra("repoFullNameForEditFile", fullName.getText());
context.startActivity(intentW);
break;
case R.id.openInBrowser:
case R.id.openInBrowser:
Intent intentOpenInBrowser = new Intent(context, OpenFileInBrowserActivity.class);
intentOpenInBrowser.putExtra("fileFullNameBrowser", fullName.getText());
context.startActivity(intentOpenInBrowser);
break;
Intent intentOpenInBrowser = new Intent(context, OpenFileInBrowserActivity.class);
intentOpenInBrowser.putExtra("fileFullNameBrowser", fullName.getText());
context.startActivity(intentOpenInBrowser);
break;
}
return false;
}
});
}
return false;
}
});
popupMenu.show();
popupMenu.show();
}
});*/
}
});*/
}
}
}

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()));
return true;
});
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());
context.startActivity(intent);
});
}
}, 500);
issueAssigneeAvatar.setOnClickListener(
v -> {
Intent intent =
new Intent(context, ProfileActivity.class);
intent.putExtra(
"username",
issueObject.getUser().getLogin());
context.startActivity(intent);
});
}
},
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()
.into(issueAssigneeAvatar);
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": {
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));
break;
}
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);
String createdTime = formatter.format(issue.getCreatedAt());
this.issueCreatedTime.setText(createdTime);
break;
}
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));
break;
}
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);
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,58 +94,76 @@ 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();
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);
TextView bottomSheetHeader = view.findViewById(R.id.bottomSheetHeader);
TextView labelMenuEdit = view.findViewById(R.id.labelMenuEdit);
TextView labelMenuDelete = view.findViewById(R.id.labelMenuDelete);
TextView bottomSheetHeader = view.findViewById(R.id.bottomSheetHeader);
bottomSheetHeader.setText(labels.getName());
BottomSheetDialog dialog = new BottomSheetDialog(context);
dialog.setContentView(view);
dialog.show();
bottomSheetHeader.setText(labels.getName());
BottomSheetDialog dialog = new BottomSheetDialog(context);
dialog.setContentView(view);
dialog.show();
labelMenuEdit.setOnClickListener(
editLabel -> {
Intent intent = new Intent(context, CreateLabelActivity.class);
intent.putExtra("labelId", String.valueOf(labels.getId()));
intent.putExtra("labelTitle", labels.getName());
intent.putExtra("labelColor", labels.getColor());
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);
}
context.startActivity(intent);
dialog.dismiss();
});
labelMenuEdit.setOnClickListener(editLabel -> {
Intent intent = new Intent(context, CreateLabelActivity.class);
intent.putExtra("labelId", String.valueOf(labels.getId()));
intent.putExtra("labelTitle", labels.getName());
intent.putExtra("labelColor", labels.getColor());
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);
}
context.startActivity(intent);
dialog.dismiss();
});
labelMenuDelete.setOnClickListener(deleteLabel -> {
RepositoryContext repo;
if(type.equals("repo")) {
repo = ((RepoDetailActivity) itemView.getContext()).repository;
}
else {
repo = null;
}
AlertDialogs.labelDeleteDialog(context, labels.getName(), String.valueOf(labels.getId()), type, orgName, repo);
dialog.dismiss();
});
});
labelMenuDelete.setOnClickListener(
deleteLabel -> {
RepositoryContext repo;
if (type.equals("repo")) {
repo =
((RepoDetailActivity) itemView.getContext())
.repository;
} else {
repo = null;
}
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,22 +78,21 @@ public class LabelsListAdapter extends RecyclerView.Adapter<LabelsListAdapter.La
labelsListener.labelsIdsInterface(labelsIds);
holder.labelSelection.setOnCheckedChangeListener((buttonView, isChecked) -> {
holder.labelSelection.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
if (isChecked) {
if(isChecked) {
labelsStrings.add(currentItem.getName());
labelsIds.add(currentItem.getId().intValue());
} else {
labelsStrings.add(currentItem.getName());
labelsIds.add(currentItem.getId().intValue());
}
else {
labelsStrings.remove(currentItem.getName());
labelsIds.remove(Integer.valueOf(currentItem.getId().intValue()));
}
labelsStrings.remove(currentItem.getName());
labelsIds.remove(Integer.valueOf(currentItem.getId().intValue()));
}
labelsListener.labelsInterface(labelsStrings);
labelsListener.labelsIdsInterface(labelsIds);
});
labelsListener.labelsInterface(labelsStrings);
labelsListener.labelsIdsInterface(labelsIds);
});
labelsIds = new ArrayList<>(new LinkedHashSet<>(labelsIds));
}
@ -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,50 +135,53 @@ 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()));
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);
TextView closeMilestone = view.findViewById(R.id.closeMilestone);
TextView openMilestone = view.findViewById(R.id.openMilestone);
BottomSheetDialog dialog = new BottomSheetDialog(ctx);
dialog.setContentView(view);
dialog.show();
BottomSheetDialog dialog = new BottomSheetDialog(ctx);
dialog.setContentView(view);
dialog.show();
if (milestones.getState().equals("open")) {
if(milestones.getState().equals("open")) {
closeMilestone.setVisibility(View.VISIBLE);
openMilestone.setVisibility(View.GONE);
} else {
closeMilestone.setVisibility(View.VISIBLE);
openMilestone.setVisibility(View.GONE);
}
else {
closeMilestone.setVisibility(View.GONE);
openMilestone.setVisibility(View.VISIBLE);
}
closeMilestone.setVisibility(View.GONE);
openMilestone.setVisibility(View.VISIBLE);
}
closeMilestone.setOnClickListener(v12 -> {
MilestoneActions.closeMilestone(ctx, milestoneId_, repository);
dialog.dismiss();
updateAdapter(getBindingAdapterPosition());
});
openMilestone.setOnClickListener(v12 -> {
MilestoneActions.openMilestone(ctx, milestoneId_, repository);
dialog.dismiss();
updateAdapter(getBindingAdapterPosition());
});
});
closeMilestone.setOnClickListener(
v12 -> {
MilestoneActions.closeMilestone(ctx, milestoneId_, repository);
dialog.dismiss();
updateAdapter(getBindingAdapterPosition());
});
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);
context.startActivity(intent);
});
Context context = v.getContext();
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);
resetCounter.setOnClickListener(itemDelete -> {
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());
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);
assert repositoriesApi != null;
repositoriesApi.updateRepositoryMostVisited(0, getRepositoryId);
}).setNeutralButton(R.string.cancelButton, null).show();
});
RepositoriesApi repositoriesApi =
BaseApi.getInstance(ctx, RepositoriesApi.class);
assert repositoriesApi != null;
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()
.into(holder.userAvatar);
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) {
@Override
public void onResponse(
@NonNull Call<User> call, @NonNull Response<User> response) {
if(response.code() == 200) {
if (response.code() == 200) {
if(!currentItem.getLogin().equals(loginUid)) {
holder.addMemberButtonRemove.setVisibility(View.VISIBLE);
}
else {
holder.addMemberButtonRemove.setVisibility(View.GONE);
if (!currentItem.getLogin().equals(loginUid)) {
holder.addMemberButtonRemove.setVisibility(View.VISIBLE);
} else {
holder.addMemberButtonRemove.setVisibility(View.GONE);
}
} else if (response.code() == 404) {
if (!currentItem.getLogin().equals(loginUid)) {
holder.addMemberButtonAdd.setVisibility(View.VISIBLE);
} else {
holder.addMemberButtonAdd.setVisibility(View.GONE);
}
} else {
holder.addMemberButtonRemove.setVisibility(View.GONE);
holder.addMemberButtonAdd.setVisibility(View.GONE);
}
}
}
else if(response.code() == 404) {
@Override
public void onFailure(@NonNull Call<User> call, @NonNull Throwable t) {
if(!currentItem.getLogin().equals(loginUid)) {
holder.addMemberButtonAdd.setVisibility(View.VISIBLE);
Toasty.error(
context,
context.getResources()
.getString(R.string.genericServerResponseError));
}
else {
holder.addMemberButtonAdd.setVisibility(View.GONE);
}
}
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));
}
});
});
}
}
@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);
intent.putExtra("username", userInfo.getLogin());
context.startActivity(intent);
});
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()));
return true;
});
}
}, 500);
userAvatar.setOnLongClickListener(
loginId -> {
AppUtil.copyToClipboard(
context,
userInfo.getLogin(),
context.getString(
R.string.copyLoginIdToClipBoard,
userInfo.getLogin()));
return true;
});
}
},
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(() -> {
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 {
addRepoButtonAdd.setVisibility(View.GONE);
}
}
} else {
addRepoButtonAdd.setVisibility(View.VISIBLE);
}
},
500);
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 {
addRepoButtonAdd.setVisibility(View.GONE);
}
}
}
else {
addRepoButtonAdd.setVisibility(View.VISIBLE);
}
}, 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()
.into(holder.repoAvatar);
}
else {
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 {
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<>() {
@Override
public void onResponse(@NonNull Call<List<Repository>> call, @NonNull Response<List<Repository>> response) {
call.enqueue(
new Callback<>() {
@Override
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++) {
reposArr.addAll(response.body());
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) {
}
});
@Override
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,23 +63,28 @@ 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 -> {
Context context = v.getContext();
itemView.setOnClickListener(
v -> {
Context context = v.getContext();
Intent intent = new Intent(context, OrganizationTeamInfoActivity.class);
intent.putExtra("team", team);
intent.putExtra("permissions", permissions);
intent.putExtra("orgName", orgName);
context.startActivity(intent);
});
Intent intent = new Intent(context, OrganizationTeamInfoActivity.class);
intent.putExtra("team", team);
intent.putExtra("permissions", permissions);
intent.putExtra("orgName", orgName);
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>>() {
@Override
public void onResponse(@NonNull Call<List<User>> call, @NonNull Response<List<User>> response) {
if(response.isSuccessful() && response.body() != null && response.body().size() > 0) {
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) {
holder.membersPreviewFrame.setVisibility(View.VISIBLE);
holder.userInfos.addAll(response.body().stream().limit(Math.min(response.body().size(), 6)).collect(Collectors.toList()));
holder.membersPreviewFrame.setVisibility(View.VISIBLE);
holder.userInfos.addAll(
response.body().stream()
.limit(Math.min(response.body().size(), 6))
.collect(Collectors.toList()));
holder.adapter.notifyDataSetChanged();
}
}
holder.adapter.notifyDataSetChanged();
}
}
@Override
public void onFailure(@NonNull Call<List<User>> call, @NonNull Throwable t) {
}
});
@Override
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,36 +162,38 @@ public class OrganizationTeamsAdapter extends RecyclerView.Adapter<OrganizationT
return orgTeamsFilter;
}
private final Filter orgTeamsFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<Team> filteredList = new ArrayList<>();
private final Filter orgTeamsFilter =
new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<Team> filteredList = new ArrayList<>();
if(constraint == null || constraint.length() == 0) {
filteredList.addAll(teamListFull);
}
else {
String filterPattern = constraint.toString().toLowerCase().trim();
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(teamListFull);
} else {
String filterPattern = constraint.toString().toLowerCase().trim();
for(Team item : teamListFull) {
if(item.getName().toLowerCase().contains(filterPattern) || item.getDescription().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
for (Team item : teamListFull) {
if (item.getName().toLowerCase().contains(filterPattern)
|| item.getDescription()
.toLowerCase()
.contains(filterPattern)) {
filteredList.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
teamList.clear();
teamList.addAll((List<Team>) results.values);
notifyDataSetChanged();
}
};
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
teamList.clear();
teamList.addAll((List<Team>) results.values);
notifyDataSetChanged();
}
};
}

View File

@ -12,62 +12,65 @@ 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) {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<Organization> filteredList = new ArrayList<>();
List<Organization> filteredList = new ArrayList<>();
if(constraint == null || constraint.length() == 0) {
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(orgListFull);
}
else {
filteredList.addAll(orgListFull);
} else {
String filterPattern = constraint.toString().toLowerCase().trim();
String filterPattern = constraint.toString().toLowerCase().trim();
for(Organization item : orgListFull) {
if(item.getUsername().toLowerCase().contains(filterPattern) || item.getDescription().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
for (Organization item : orgListFull) {
if (item.getUsername().toLowerCase().contains(filterPattern)
|| item.getDescription()
.toLowerCase()
.contains(filterPattern)) {
filteredList.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
orgList.clear();
orgList.addAll((List) results.values);
notifyDataChanged();
}
};
orgList.clear();
orgList.addAll((List) results.values);
notifyDataChanged();
}
};
public OrganizationsListAdapter(Context ctx, List<Organization> orgListMain) {
this.context = ctx;
@ -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,12 +157,13 @@ public class OrganizationsListAdapter extends RecyclerView.Adapter<RecyclerView.
orgDescription = itemView.findViewById(R.id.orgDescription);
image = itemView.findViewById(R.id.imageAvatar);
itemView.setOnClickListener(v -> {
Context context = v.getContext();
Intent intent = new Intent(context, OrganizationDetailActivity.class);
intent.putExtra("orgName", userOrganizations.getUsername());
context.startActivity(intent);
});
itemView.setOnClickListener(
v -> {
Context context = v.getContext();
Intent intent = new Intent(context, OrganizationDetailActivity.class);
intent.putExtra("orgName", userOrganizations.getUsername());
context.startActivity(intent);
});
}
void bindData(Organization org) {
@ -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,30 +128,51 @@ 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);
context.startActivity(intentPrDetail);
};
View.OnClickListener openPr =
v -> {
Intent intentPrDetail =
new IssueContext(
pullRequestObject,
((RepoDetailActivity) context).repository)
.getIntent(context, IssueDetailActivity.class);
context.startActivity(intentPrDetail);
};
itemView.setOnClickListener(openPr);
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());
context.startActivity(intent);
});
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()));
return true;
});
}
}, 500);
assigneeAvatar.setOnLongClickListener(
loginId -> {
AppUtil.copyToClipboard(
context,
pullRequestObject.getUser().getLogin(),
context.getString(
R.string.copyLoginIdToClipBoard,
pullRequestObject
.getUser()
.getLogin()));
return true;
});
}
},
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()
.into(this.assigneeAvatar);
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()
.into(holder.authorAvatar);
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 -> {
holder.downloadCopyFrame.setOnClickListener(
v -> {
if (holder.downloads.getVisibility() == View.GONE) {
if(holder.downloads.getVisibility() == View.GONE) {
holder.downloadDropdownIcon.setImageResource(R.drawable.ic_chevron_down);
holder.downloads.setVisibility(View.VISIBLE);
} else {
holder.downloadDropdownIcon.setImageResource(R.drawable.ic_chevron_down);
holder.downloads.setVisibility(View.VISIBLE);
}
else {
holder.downloadDropdownIcon.setImageResource(R.drawable.ic_chevron_right);
holder.downloads.setVisibility(View.GONE);
}
});
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) {
@Override
public void onResponse(
@NonNull Call<Void> call,
@NonNull Response<Void> response) {
if(response.isSuccessful()) {
updateAdapter(position);
Toasty.success(context, context.getString(R.string.releaseDeleted));
MainActivity.reloadRepos = true;
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));
}
}
if (response.isSuccessful()) {
updateAdapter(position);
Toasty.success(
context,
context.getString(
R.string
.releaseDeleted));
MainActivity.reloadRepos = true;
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));
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
@Override
public void onFailure(
@NonNull Call<Void> call,
@NonNull Throwable t) {
Toasty.error(context, context.getString(R.string.genericError));
}
})).setNeutralButton(R.string.cancelButton, null).show();
Toasty.error(
context,
context.getString(
R.string.genericError));
}
}))
.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,37 +328,55 @@ 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 -> {
Context context = loginId.getContext();
authorAvatar.setOnClickListener(
loginId -> {
Context context = loginId.getContext();
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", releases.getAuthor().getLogin());
context.startActivity(intent);
Intent intent =
new Intent(context, ProfileActivity.class);
intent.putExtra(
"username",
releases.getAuthor().getLogin());
context.startActivity(intent);
});
}
},
500);
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);
TextView deleteRelease = view.findViewById(R.id.deleteRelease);
BottomSheetDialog dialog = new BottomSheetDialog(context);
dialog.setContentView(view);
dialog.show();
deleteRelease.setOnClickListener(
v1 -> {
deleteRelease(
context,
releases.getName(),
releases.getId(),
repoOwner,
repoName,
getBindingAdapterPosition());
dialog.dismiss();
});
});
}
}, 500);
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);
TextView deleteRelease = view.findViewById(R.id.deleteRelease);
BottomSheetDialog dialog = new BottomSheetDialog(context);
dialog.setContentView(view);
dialog.show();
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,74 +136,104 @@ 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()
.into(image);
}
else {
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 {
image.setImageDrawable(drawable);
}
}
else {
} else {
image.setImageDrawable(drawable);
}
if(forksModel.getUpdatedAt() != null) {
if (forksModel.getUpdatedAt() != null) {
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));
break;
}
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));
break;
}
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));
break;
}
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));
break;
}
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));
break;
}
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));
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();
Context context = v.getContext();
RepositoryContext repo = new RepositoryContext(userRepositories, context);
repo.saveToDB(context);
Intent intent = repo.getIntent(context, RepoDetailActivity.class);
RepositoryContext repo = new RepositoryContext(userRepositories, context);
repo.saveToDB(context);
Intent intent = repo.getIntent(context, RepoDetailActivity.class);
context.startActivity(intent);
});
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,58 +45,65 @@ 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) {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<org.gitnex.tea4j.v2.models.Repository> filteredList = new ArrayList<>();
List<org.gitnex.tea4j.v2.models.Repository> filteredList = new ArrayList<>();
if(constraint == null || constraint.length() == 0) {
filteredList.addAll(reposListFull);
}
else {
String filterPattern = constraint.toString().toLowerCase().trim();
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(reposListFull);
} 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)) {
filteredList.add(item);
for (org.gitnex.tea4j.v2.models.Repository item : reposListFull) {
if (item.getFullName().toLowerCase().contains(filterPattern)
|| item.getDescription()
.toLowerCase()
.contains(filterPattern)) {
filteredList.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
return results;
}
reposList.clear();
reposList.addAll((List) results.values);
notifyDataChanged();
}
};
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
reposList.clear();
reposList.addAll((List) results.values);
notifyDataChanged();
}
};
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,16 +180,17 @@ public class ReposListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
repoLastUpdated = itemView.findViewById(R.id.repoLastUpdated);
spacerView = itemView.findViewById(R.id.spacerView);
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) {
intent.putExtra("openedFromUserOrg", true);
}
context.startActivity(intent);
});
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) {
intent.putExtra("openedFromUserOrg", true);
}
context.startActivity(intent);
});
}
@SuppressLint("SetTextI18n")
@ -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()
.into(image);
}
else {
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 {
image.setImageDrawable(drawable);
}
}
else {
} else {
image.setImageDrawable(drawable);
}
if(repositories.getUpdatedAt() != null) {
if (repositories.getUpdatedAt() != null) {
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));
break;
}
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));
break;
}
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));
break;
}
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));
break;
}
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));
break;
}
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));
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 -> {
holder.downloadCopyFrame.setOnClickListener(
v -> {
if (holder.downloads.getVisibility() == View.GONE) {
if(holder.downloads.getVisibility() == View.GONE) {
holder.downloadDropdownIcon.setImageResource(R.drawable.ic_chevron_down);
holder.downloads.setVisibility(View.VISIBLE);
} else {
holder.downloadDropdownIcon.setImageResource(R.drawable.ic_chevron_down);
holder.downloads.setVisibility(View.VISIBLE);
}
else {
holder.downloadDropdownIcon.setImageResource(R.drawable.ic_chevron_right);
holder.downloads.setVisibility(View.GONE);
}
});
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) {
@Override
public void onResponse(
@NonNull Call<Void> call,
@NonNull Response<Void>
response) {
if(response.isSuccessful()) {
updateAdapter(position);
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));
}
}
if (response.isSuccessful()) {
updateAdapter(position);
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));
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
@Override
public void onFailure(
@NonNull Call<Void> call,
@NonNull Throwable t) {
Toasty.error(context, context.getString(R.string.genericError));
}
})).setNeutralButton(R.string.cancelButton, null);
Toasty.error(
context,
context.getString(
R.string
.genericError));
}
}))
.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,24 +253,32 @@ public class TagsAdapter extends RecyclerView.Adapter<TagsAdapter.TagsViewHolder
downloadDropdownIcon = itemView.findViewById(R.id.downloadDropdownIcon);
options = itemView.findViewById(R.id.tagsOptionsMenu);
options.setOnClickListener(v -> {
final Context context = v.getContext();
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);
TextView delete = view.findViewById(R.id.tagMenuDelete);
BottomSheetDialog dialog = new BottomSheetDialog(context);
dialog.setContentView(view);
dialog.show();
BottomSheetDialog dialog = new BottomSheetDialog(context);
dialog.setContentView(view);
dialog.show();
delete.setOnClickListener(v1 -> {
tagDeleteDialog(context, tagsHolder.getName(), owner, repo, getBindingAdapterPosition());
dialog.dismiss();
});
});
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) {
@Override
public void onResponse(
@NonNull Call<NotificationCount> call,
@NonNull retrofit2.Response<NotificationCount> response) {
NotificationCount notificationCount = response.body();
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);
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);
}
}
}
}
}
@Override
public void onFailure(@NonNull Call<NotificationCount> call, @NonNull Throwable t) {
}
});
@Override
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()
.into(holder.repoAvatar);
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,73 +169,99 @@ public class UserAccountsAdapter extends RecyclerView.Adapter<UserAccountsAdapte
deleteAccount = itemView.findViewById(R.id.deleteAccount);
repoAvatar = itemView.findViewById(R.id.repoAvatar);
deleteAccount.setOnClickListener(itemDelete -> {
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)));
});
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)));
materialAlertDialogBuilder.create().show();
});
materialAlertDialogBuilder.create().show();
});
itemView.setOnClickListener(
switchAccount -> {
UserAccountsApi userAccountsApi =
BaseApi.getInstance(context, UserAccountsApi.class);
assert userAccountsApi != null;
UserAccount userAccount = userAccountsApi.getAccountByName(accountName);
itemView.setOnClickListener(switchAccount -> {
if (!userAccount.isLoggedIn()) {
UrlBuilder url =
UrlBuilder.fromString(userAccount.getInstanceUrl())
.withPath("/");
UserAccountsApi userAccountsApi = BaseApi.getInstance(context, UserAccountsApi.class);
assert userAccountsApi != null;
UserAccount userAccount = userAccountsApi.getAccountByName(accountName);
String host;
if (url.scheme.equals("http")) {
if (url.port == 80 || url.port == 0) {
host = url.hostName;
} else {
host = url.hostName + ":" + url.port;
}
} else {
if (url.port == 443 || url.port == 0) {
host = url.hostName;
} else {
host = url.hostName + ":" + url.port;
}
}
if(!userAccount.isLoggedIn()) {
UrlBuilder url = UrlBuilder.fromString(userAccount.getInstanceUrl()).withPath("/");
Toasty.warning(context, context.getString(R.string.logInAgain));
dialog.dismiss();
String host;
if(url.scheme.equals("http")) {
if(url.port == 80 || url.port == 0) {
host = url.hostName;
Intent i = new Intent(context, AddNewAccountActivity.class);
i.putExtra("instanceUrl", host);
i.putExtra("scheme", url.scheme);
i.putExtra("token", userAccount.getToken());
context.startActivity(i);
return;
}
else {
host = url.hostName + ":" + url.port;
if (tinyDB.getInt("currentActiveAccountId") != userAccount.getAccountId()) {
if (AppUtil.switchToAccount(context, userAccount)) {
String url =
UrlBuilder.fromString(userAccount.getInstanceUrl())
.withPath("/")
.toString();
Toasty.success(
context,
context.getResources()
.getString(
R.string.switchAccountSuccess,
userAccount.getUserName(),
url));
getNotificationsCount();
((Activity) context).recreate();
dialog.dismiss();
}
}
}
else {
if(url.port == 443 || url.port == 0) {
host = url.hostName;
}
else {
host = url.hostName + ":" + url.port;
}
}
Toasty.warning(context, context.getString(R.string.logInAgain));
dialog.dismiss();
Intent i = new Intent(context, AddNewAccountActivity.class);
i.putExtra("instanceUrl", host);
i.putExtra("scheme", url.scheme);
i.putExtra("token", userAccount.getToken());
context.startActivity(i);
return;
}
if(tinyDB.getInt("currentActiveAccountId") != userAccount.getAccountId()) {
if(AppUtil.switchToAccount(context, userAccount)) {
String url = UrlBuilder.fromString(userAccount.getInstanceUrl()).withPath("/").toString();
Toasty.success(context, context.getResources().getString(R.string.switchAccountSuccess, userAccount.getUserName(), url));
getNotificationsCount();
((Activity) context).recreate();
dialog.dismiss();
}
}
});
});
}
}
}

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,8 +63,14 @@ 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()
.into(holder.userAccountAvatar);
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);
}
@Override
@ -77,15 +87,15 @@ 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 -> {
context.startActivity(new Intent(context, AddNewAccountActivity.class));
dialog.dismiss();
});
newAccount.setOnClickListener(
item -> {
context.startActivity(new Intent(context, AddNewAccountActivity.class));
dialog.dismiss();
});
UserAccountsAdapter arrayAdapter = new UserAccountsAdapter(context, dialog);
listView.setLayoutManager(new LinearLayoutManager(context));
@ -103,12 +113,11 @@ public class UserAccountsNavAdapter extends RecyclerView.Adapter<UserAccountsNav
userAccountAvatar = itemView.findViewById(R.id.userAccountAvatar);
itemView.setOnClickListener(item -> {
customDialogUserAccountsList();
drawer.closeDrawers();
});
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 -> {
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", userLoginId);
context.startActivity(intent);
});
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));
return true;
});
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()
.into(viewHolder.memberAvatar);
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,39 +138,39 @@ public class UserGridAdapter extends BaseAdapter implements Filterable {
return membersFilter;
}
private final Filter membersFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<User> filteredList = new ArrayList<>();
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 {
filteredList.addAll(membersListFull);
} else {
String filterPattern = constraint.toString().toLowerCase().trim();
String filterPattern = constraint.toString().toLowerCase().trim();
for(User item : membersListFull) {
if(item.getFullName().toLowerCase().contains(filterPattern) || item.getLogin().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
for (User item : membersListFull) {
if (item.getFullName().toLowerCase().contains(filterPattern)
|| item.getLogin().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
membersList.clear();
membersList.addAll((List) results.values);
notifyDataSetChanged();
}
};
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
membersList.clear();
membersList.addAll((List) results.values);
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);
intent.putExtra("username", userInfo.getLogin());
context.startActivity(intent);
});
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()));
return true;
});
}
}, 500);
itemView.setOnLongClickListener(
loginId -> {
AppUtil.copyToClipboard(
context,
userInfo.getLogin(),
context.getString(
R.string.copyLoginIdToClipBoard,
userInfo.getLogin()));
return true;
});
}
},
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()
.into(userAvatar);
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) {
@Override
public void onResponse(
@NonNull Call<Void> call,
@NonNull Response<Void> response) {
if(response.isSuccessful()) {
updateAdapter(position);
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));
}
}
if (response.isSuccessful()) {
updateAdapter(position);
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));
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
@Override
public void onFailure(
@NonNull Call<Void> call,
@NonNull Throwable t) {
Toasty.error(context, context.getString(R.string.genericError));
}
})).setNeutralButton(R.string.cancelButton, null).show();
Toasty.error(
context,
context.getString(
R.string.genericError));
}
}))
.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,46 +206,61 @@ 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);
ctx.startActivity(intent);
});
Intent intent = new Intent(ctx, WikiActivity.class);
intent.putExtra("pageName", wikiPageMeta.getTitle());
intent.putExtra(RepositoryContext.INTENT_EXTRA, ((RepoDetailActivity) itemView.getContext()).repository);
ctx.startActivity(intent);
});
wikiMenu.setOnClickListener(
v -> {
Context ctx = v.getContext();
wikiMenu.setOnClickListener(v -> {
View view =
LayoutInflater.from(ctx)
.inflate(
R.layout.bottom_sheet_wiki_in_list,
itemView.findViewById(android.R.id.content),
false);
Context ctx = v.getContext();
TextView bottomSheetHeader = view.findViewById(R.id.bottom_sheet_header);
TextView editWiki = view.findViewById(R.id.edit_wiki);
TextView deleteWiki = view.findViewById(R.id.delete_wiki);
View view = LayoutInflater.from(ctx).inflate(R.layout.bottom_sheet_wiki_in_list, itemView.findViewById(android.R.id.content), false);
bottomSheetHeader.setText(wikiPageMeta.getTitle());
TextView bottomSheetHeader = view.findViewById(R.id.bottom_sheet_header);
TextView editWiki = view.findViewById(R.id.edit_wiki);
TextView deleteWiki = view.findViewById(R.id.delete_wiki);
BottomSheetDialog dialog = new BottomSheetDialog(ctx);
dialog.setContentView(view);
dialog.show();
bottomSheetHeader.setText(wikiPageMeta.getTitle());
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);
ctx.startActivity(intent);
dialog.dismiss();
});
BottomSheetDialog dialog = new BottomSheetDialog(ctx);
dialog.setContentView(view);
dialog.show();
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);
ctx.startActivity(intent);
dialog.dismiss();
});
deleteWiki.setOnClickListener(v12 -> {
deleteWiki(repoOwner, repoName, wikiPageMeta.getTitle(), getAbsoluteAdapterPosition(), ctx);
dialog.dismiss();
});
});
deleteWiki.setOnClickListener(
v12 -> {
deleteWiki(
repoOwner,
repoName,
wikiPageMeta.getTitle(),
getAbsoluteAdapterPosition(),
ctx);
dialog.dismiss();
});
});
}
@SuppressLint("SetTextI18n")
@ -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