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:
parent
3c65e95db3
commit
325560c08d
|
@ -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"/>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,5 +18,4 @@ public class MainActivityTest {
|
|||
ActivityScenario<MainActivity> a = ActivityScenario.launch(MainActivity.class);
|
||||
a.close();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -45,5 +45,4 @@ public class ToastyTest {
|
|||
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
|
||||
Toasty.success(context, "GitNex success test");
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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 {}
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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));
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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()));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
||||
}
|
||||
});*/
|
||||
}
|
||||
});*/
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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) {}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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
Loading…
Reference in New Issue