Bug fixes and improvements (#1360)

Fixes #1361

Fixes #1363

Closes #1376

Fixes #1374

Fixes #1375

Closes #1371

Closes #1369

Closes #1367

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/1360
This commit is contained in:
M M Arif 2024-09-19 17:18:28 +00:00
parent 51a4d1ec85
commit 13d68b9408
55 changed files with 602 additions and 180 deletions

1
.gitignore vendored
View File

@ -10,6 +10,7 @@
# Release dir # Release dir
app/release/* app/release/*
app/free/*
# Pro dir # Pro dir
app/pro/* app/pro/*

View File

@ -1,6 +1,6 @@
[![License: GPL v3](https://codeberg.org/gitnex/GitNex/raw/branch/main/assets/license.svg)](https://www.gnu.org/licenses/gpl-3.0) [![Pipeline status](https://ci.codeberg.org/api/badges/gitnex/GitNex/status.svg)](https://ci.codeberg.org/gitnex/GitNex) [![Release](https://img.shields.io/badge/dynamic/json.svg?label=release&url=https://codeberg.org/api/v1/repos/gitnex/GitNex/releases&query=$[0].tag_name)](https://codeberg.org/gitnex/GitNex/releases) [![Crowdin](https://badges.crowdin.net/gitnex/localized.svg)](https://crowdin.com/project/gitnex) [![Join the Discord chat at https://discord.gg/FbSS4rf](https://img.shields.io/discord/632219664587685908.svg)](https://discord.gg/FbSS4rf) [![License: GPL v3](https://codeberg.org/gitnex/GitNex/raw/branch/main/assets/license.svg)](https://www.gnu.org/licenses/gpl-3.0) [![Pipeline status](https://ci.codeberg.org/api/badges/gitnex/GitNex/status.svg)](https://ci.codeberg.org/gitnex/GitNex) [![Release](https://img.shields.io/badge/dynamic/json.svg?label=release&url=https://codeberg.org/api/v1/repos/gitnex/GitNex/releases&query=$[0].tag_name)](https://codeberg.org/gitnex/GitNex/releases) [![Crowdin](https://badges.crowdin.net/gitnex/localized.svg)](https://crowdin.com/project/gitnex) [![Join the Discord chat at https://discord.gg/FbSS4rf](https://img.shields.io/discord/632219664587685908.svg)](https://discord.gg/FbSS4rf)
[<img alt="Become a Patreon" src="https://codeberg.org/gitnex/GitNex/raw/branch/main/assets/patreon.png" height="40"/>](https://www.patreon.com/mmarif) [<img alt="Buy me a coffee" src="https://codeberg.org/gitnex/GitNex/raw/branch/main/assets/buy-me-a-coffee.png" height="40"/>](https://www.buymeacoffee.com/mmarif) [<img alt="Become a Patreon" src="https://codeberg.org/gitnex/GitNex/raw/branch/main/assets/patreon.png" height="40"/>](https://www.patreon.com/mmarif)
# GitNex - Android client for Forgejo and Gitea # GitNex - Android client for Forgejo and Gitea

View File

@ -1,5 +1,5 @@
plugins { plugins {
id "com.diffplug.spotless" version "6.11.0" id "com.diffplug.spotless" version "6.25.0"
} }
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
@ -8,8 +8,8 @@ android {
applicationId "org.mian.gitnex" applicationId "org.mian.gitnex"
minSdkVersion 23 minSdkVersion 23
targetSdkVersion 34 targetSdkVersion 34
versionCode 550 versionCode 595
versionName "5.5.0" versionName "6.0.0-dev"
multiDexEnabled true multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
compileSdk 34 compileSdk 34
@ -56,25 +56,25 @@ configurations {
dependencies { dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs') implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'com.google.android.material:material:1.12.0' implementation 'com.google.android.material:material:1.12.0'
implementation 'androidx.compose.material3:material3:1.2.1' implementation 'androidx.compose.material3:material3:1.3.0'
implementation 'androidx.compose.material3:material3-window-size-class:1.2.1' implementation 'androidx.compose.material3:material3-window-size-class:1.3.0'
implementation 'androidx.viewpager2:viewpager2:1.1.0' implementation 'androidx.viewpager2:viewpager2:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation "androidx.legacy:legacy-support-v4:1.0.0" implementation "androidx.legacy:legacy-support-v4:1.0.0"
implementation "androidx.lifecycle:lifecycle-viewmodel:2.7.0" implementation "androidx.lifecycle:lifecycle-viewmodel:2.7.0"
testImplementation 'junit:junit:4.13.2' testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.ext:junit:1.2.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.12' implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.14'
implementation 'com.google.code.gson:gson:2.10.1' implementation 'com.google.code.gson:gson:2.11.0'
implementation "com.squareup.picasso:picasso:2.71828" implementation "com.squareup.picasso:picasso:2.71828"
implementation 'com.github.ramseth001:TextDrawable:1.1.3' implementation 'com.github.ramseth001:TextDrawable:1.1.3'
implementation 'com.squareup.retrofit2:retrofit:2.11.0' implementation 'com.squareup.retrofit2:retrofit:2.11.0'
implementation 'com.squareup.retrofit2:converter-gson:2.11.0' implementation 'com.squareup.retrofit2:converter-gson:2.11.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.11.0' implementation 'com.squareup.retrofit2:converter-scalars:2.11.0'
implementation 'com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.12' implementation 'com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.14'
implementation 'org.ocpsoft.prettytime:prettytime:5.0.7.Final' implementation 'org.ocpsoft.prettytime:prettytime:5.0.7.Final'
implementation "com.github.skydoves:colorpickerview:2.3.0" implementation "com.github.skydoves:colorpickerview:2.3.0"
implementation "io.noties.markwon:core:4.6.2" implementation "io.noties.markwon:core:4.6.2"
@ -89,8 +89,7 @@ dependencies {
implementation "io.noties.markwon:recycler:4.6.2" implementation "io.noties.markwon:recycler:4.6.2"
implementation "io.noties.markwon:recycler-table:4.6.2" implementation "io.noties.markwon:recycler-table:4.6.2"
implementation "io.noties.markwon:simple-ext:4.6.2" implementation "io.noties.markwon:simple-ext:4.6.2"
implementation 'com.google.guava:guava:32.1.2-jre' implementation 'com.google.guava:guava:32.1.3-jre'
implementation "io.noties.markwon:image-picasso:4.6.2"
implementation "com.github.HamidrezaAmz:BreadcrumbsView:0.2.9" implementation "com.github.HamidrezaAmz:BreadcrumbsView:0.2.9"
//noinspection GradleDependency //noinspection GradleDependency
implementation 'commons-io:commons-io:2.5' implementation 'commons-io:commons-io:2.5'
@ -101,7 +100,7 @@ dependencies {
implementation 'ch.acra:acra-notification:5.11.3' implementation 'ch.acra:acra-notification:5.11.3'
implementation 'androidx.room:room-runtime:2.6.1' implementation 'androidx.room:room-runtime:2.6.1'
annotationProcessor 'androidx.room:room-compiler:2.6.1' annotationProcessor 'androidx.room:room-compiler:2.6.1'
implementation "androidx.work:work-runtime:2.9.0" implementation "androidx.work:work-runtime:2.9.1"
implementation "io.mikael:urlbuilder:2.0.9" implementation "io.mikael:urlbuilder:2.0.9"
implementation "org.codeberg.gitnex-garage:emoji-java:v5.1.2" implementation "org.codeberg.gitnex-garage:emoji-java:v5.1.2"
//noinspection GradleDependency //noinspection GradleDependency

View File

@ -4,6 +4,7 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.biometric.BiometricManager;
import java.util.Locale; import java.util.Locale;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.core.MainApplication; import org.mian.gitnex.core.MainApplication;
@ -118,15 +119,20 @@ public abstract class BaseActivity extends AppCompatActivity {
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
if (Boolean.parseBoolean( if (BiometricManager.from(ctx)
AppDatabaseSettings.getSettingsValue( .canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK)
ctx, AppDatabaseSettings.APP_BIOMETRIC_KEY)) == BiometricManager.BIOMETRIC_SUCCESS) {
&& !Boolean.parseBoolean(
AppDatabaseSettings.getSettingsValue(
ctx, AppDatabaseSettings.APP_BIOMETRIC_LIFE_CYCLE_KEY))) {
Intent unlockIntent = new Intent(ctx, BiometricUnlock.class); if (Boolean.parseBoolean(
ctx.startActivity(unlockIntent); AppDatabaseSettings.getSettingsValue(
ctx, AppDatabaseSettings.APP_BIOMETRIC_KEY))
&& !Boolean.parseBoolean(
AppDatabaseSettings.getSettingsValue(
ctx, AppDatabaseSettings.APP_BIOMETRIC_LIFE_CYCLE_KEY))) {
Intent unlockIntent = new Intent(ctx, BiometricUnlock.class);
ctx.startActivity(unlockIntent);
}
} }
} }

View File

@ -45,7 +45,7 @@ public class BiometricUnlock extends AppCompatActivity {
super.onAuthenticationError(errorCode, errString); super.onAuthenticationError(errorCode, errString);
// Authentication error, close the app MainActivity.closeActivity = true;
finish(); finish();
} }

View File

@ -507,6 +507,8 @@ public class CreateIssueActivity extends BaseActivity
String newIssueTitleForm, String newIssueTitleForm,
String newIssueDueDateForm) { String newIssueDueDateForm) {
viewBinding.topAppBar.getMenu().getItem(2).setVisible(false);
ArrayList<Long> labelIds = new ArrayList<>(); ArrayList<Long> labelIds = new ArrayList<>();
for (Integer i : labelsIds) { for (Integer i : labelsIds) {
labelIds.add((long) i); labelIds.add((long) i);
@ -562,9 +564,11 @@ public class CreateIssueActivity extends BaseActivity
} else if (response2.code() == 401) { } else if (response2.code() == 401) {
viewBinding.topAppBar.getMenu().getItem(2).setVisible(true);
AlertDialogs.authorizationTokenRevokedDialog(ctx); AlertDialogs.authorizationTokenRevokedDialog(ctx);
} else { } else {
viewBinding.topAppBar.getMenu().getItem(2).setVisible(true);
SnackBar.error( SnackBar.error(
ctx, ctx,
findViewById(android.R.id.content), findViewById(android.R.id.content),
@ -575,6 +579,7 @@ public class CreateIssueActivity extends BaseActivity
@Override @Override
public void onFailure(@NonNull Call<Issue> call, @NonNull Throwable t) { public void onFailure(@NonNull Call<Issue> call, @NonNull Throwable t) {
viewBinding.topAppBar.getMenu().getItem(2).setVisible(true);
SnackBar.error( SnackBar.error(
ctx, ctx,
findViewById(android.R.id.content), findViewById(android.R.id.content),

View File

@ -414,6 +414,8 @@ public class CreatePullRequestActivity extends BaseActivity
List<String> assignees, List<String> assignees,
String prDueDate) { String prDueDate) {
viewBinding.topAppBar.getMenu().getItem(2).setVisible(false);
ArrayList<Long> labelIds = new ArrayList<>(); ArrayList<Long> labelIds = new ArrayList<>();
for (Integer i : labelsIds) { for (Integer i : labelsIds) {
labelIds.add((long) i); labelIds.add((long) i);
@ -470,18 +472,21 @@ public class CreatePullRequestActivity extends BaseActivity
} else if (response.code() == 409 } else if (response.code() == 409
|| response.message().equals("Conflict")) { || response.message().equals("Conflict")) {
viewBinding.topAppBar.getMenu().getItem(2).setVisible(false);
SnackBar.error( SnackBar.error(
ctx, ctx,
findViewById(android.R.id.content), findViewById(android.R.id.content),
getString(R.string.prAlreadyExists)); getString(R.string.prAlreadyExists));
} else if (response.code() == 404) { } else if (response.code() == 404) {
viewBinding.topAppBar.getMenu().getItem(2).setVisible(false);
SnackBar.error( SnackBar.error(
ctx, ctx,
findViewById(android.R.id.content), findViewById(android.R.id.content),
getString(R.string.apiNotFound)); getString(R.string.apiNotFound));
} else { } else {
viewBinding.topAppBar.getMenu().getItem(2).setVisible(false);
SnackBar.error( SnackBar.error(
ctx, ctx,
findViewById(android.R.id.content), findViewById(android.R.id.content),
@ -492,6 +497,7 @@ public class CreatePullRequestActivity extends BaseActivity
@Override @Override
public void onFailure(@NonNull Call<PullRequest> call, @NonNull Throwable t) { public void onFailure(@NonNull Call<PullRequest> call, @NonNull Throwable t) {
viewBinding.topAppBar.getMenu().getItem(2).setVisible(false);
SnackBar.error( SnackBar.error(
ctx, ctx,
findViewById(android.R.id.content), findViewById(android.R.id.content),

View File

@ -119,10 +119,9 @@ public class DeepLinksActivity extends BaseActivity {
finish(); finish();
} else if (Objects.equals( } else if (Objects.equals(
data.getLastPathSegment(), data.getLastPathSegment(),
getAccount().getAccount().getUserName())) { // your user profile getAccount().getAccount().getUserName())) { // user profile
mainIntent.putExtra("launchFragmentByLinkHandler", "profile"); new Handler(Looper.getMainLooper())
ctx.startActivity(mainIntent); .postDelayed(() -> getUserOrOrg(data.getLastPathSegment()), 500);
finish();
} else if (Objects.equals(data.getLastPathSegment(), "admin")) { } else if (Objects.equals(data.getLastPathSegment(), "admin")) {
mainIntent.putExtra("launchFragmentByLinkHandler", "admin"); mainIntent.putExtra("launchFragmentByLinkHandler", "admin");
ctx.startActivity(mainIntent); ctx.startActivity(mainIntent);
@ -577,7 +576,9 @@ public class DeepLinksActivity extends BaseActivity {
public void onResponse( public void onResponse(
@NonNull Call<Organization> call, @NonNull Call<Organization> call,
@NonNull Response<Organization> response) { @NonNull Response<Organization> response) {
if (response.code() == 404) { // org doesn't exist or it's a user user if (response.code() == 404
|| response.code()
== 504) { // org doesn't exist or it's a user user
Log.d("getUserOrOrg-404", String.valueOf(response.code())); Log.d("getUserOrOrg-404", String.valueOf(response.code()));
getUser(userOrgName); getUser(userOrgName);
} else if (response.code() == 200) { // org } else if (response.code() == 200) { // org

View File

@ -373,8 +373,6 @@ public class IssueDetailActivity extends BaseActivity
.setSoftInputMode( .setSoftInputMode(
WindowManager.LayoutParams WindowManager.LayoutParams
.SOFT_INPUT_STATE_ALWAYS_VISIBLE); .SOFT_INPUT_STATE_ALWAYS_VISIBLE);
viewBinding.commentReply.setSelection(
viewBinding.commentReply.length());
viewBinding.send.setAlpha(buttonAlphaStatEnabled); viewBinding.send.setAlpha(buttonAlphaStatEnabled);
viewBinding.send.setEnabled(true); viewBinding.send.setEnabled(true);
} else { } else {

View File

@ -60,7 +60,6 @@ import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppDatabaseSettings; import org.mian.gitnex.helpers.AppDatabaseSettings;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.ChangeLog; import org.mian.gitnex.helpers.ChangeLog;
import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.structs.BottomSheetListener; import org.mian.gitnex.structs.BottomSheetListener;
import org.mian.gitnex.structs.FragmentRefreshListener; import org.mian.gitnex.structs.FragmentRefreshListener;
@ -87,6 +86,7 @@ public class MainActivity extends BaseActivity
private BottomSheetListener profileInitListener; private BottomSheetListener profileInitListener;
private FragmentRefreshListener fragmentRefreshListenerMyIssues; private FragmentRefreshListener fragmentRefreshListenerMyIssues;
private String username; private String username;
public static boolean closeActivity = false;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
@ -168,11 +168,11 @@ public class MainActivity extends BaseActivity
Menu menu = navigationView.getMenu(); Menu menu = navigationView.getMenu();
navNotifications = menu.findItem(R.id.nav_notifications); navNotifications = menu.findItem(R.id.nav_notifications);
MenuItem navDashboard = menu.findItem(R.id.nav_dashboard); /*MenuItem navDashboard = menu.findItem(R.id.nav_dashboard);
navDashboard.getActionView().findViewById(R.id.betaBadge).setVisibility(View.VISIBLE); navDashboard.getActionView().findViewById(R.id.betaBadge).setVisibility(View.VISIBLE);
TextView dashboardBetaView = navDashboard.getActionView().findViewById(R.id.betaBadge); TextView dashboardBetaView = navDashboard.getActionView().findViewById(R.id.betaBadge);
dashboardBetaView.setText(R.string.beta); dashboardBetaView.setText(R.string.beta);*/
navigationView navigationView
.getViewTreeObserver() .getViewTreeObserver()
@ -250,8 +250,16 @@ public class MainActivity extends BaseActivity
String userFullNameNav = getAccount().getFullName(); String userFullNameNav = getAccount().getFullName();
String userAvatarNav = getAccount().getUserInfo().getAvatarUrl(); String userAvatarNav = getAccount().getUserInfo().getAvatarUrl();
if (!userEmailNav.isEmpty()) { if (Boolean.parseBoolean(
userEmail.setText(userEmailNav); AppDatabaseSettings.getSettingsValue(
ctx,
AppDatabaseSettings.APP_USER_HIDE_EMAIL_IN_NAV_KEY))) {
userEmail.setVisibility(View.GONE);
} else {
userEmail.setVisibility(View.VISIBLE);
if (!userEmailNav.isEmpty()) {
userEmail.setText(userEmailNav);
}
} }
if (!userFullNameNav.isEmpty()) { if (!userFullNameNav.isEmpty()) {
@ -260,13 +268,10 @@ public class MainActivity extends BaseActivity
if (!userAvatarNav.isEmpty()) { if (!userAvatarNav.isEmpty()) {
int avatarRadius = AppUtil.getPixelsFromDensity(ctx, 60);
PicassoService.getInstance(ctx) PicassoService.getInstance(ctx)
.get() .get()
.load(userAvatarNav) .load(userAvatarNav)
.placeholder(R.drawable.loader_animated) .placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(avatarRadius, 0))
.resize(160, 160) .resize(160, 160)
.centerCrop() .centerCrop()
.into(userAvatar); .into(userAvatar);
@ -582,6 +587,11 @@ public class MainActivity extends BaseActivity
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
if (closeActivity) {
finishAndRemoveTask();
closeActivity = false;
}
if (refActivity) { if (refActivity) {
this.recreate(); this.recreate();
this.overridePendingTransition(0, 0); this.overridePendingTransition(0, 0);

View File

@ -126,7 +126,7 @@ public class ProfileActivity extends BaseActivity implements BottomSheetListener
RetrofitClient.getApiInterface(this) RetrofitClient.getApiInterface(this)
.userCurrentCheckFollowing(username) .userCurrentCheckFollowing(username)
.enqueue( .enqueue(
new Callback<Void>() { new Callback<>() {
@Override @Override
public void onResponse( public void onResponse(

View File

@ -141,6 +141,53 @@ public class SettingsAppearanceActivity extends BaseActivity {
activitySettingsAppearanceBinding.switchCounterBadge.setChecked( activitySettingsAppearanceBinding.switchCounterBadge.setChecked(
!activitySettingsAppearanceBinding.switchCounterBadge.isChecked())); !activitySettingsAppearanceBinding.switchCounterBadge.isChecked()));
// hide email and language in user profile screen switcher
activitySettingsAppearanceBinding.switchHideEmailLangInProfile.setChecked(
Boolean.parseBoolean(
AppDatabaseSettings.getSettingsValue(
ctx,
AppDatabaseSettings.APP_USER_PROFILE_HIDE_EMAIL_LANGUAGE_KEY)));
activitySettingsAppearanceBinding.switchHideEmailLangInProfile.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
AppDatabaseSettings.updateSettingsValue(
ctx,
String.valueOf(isChecked),
AppDatabaseSettings.APP_USER_PROFILE_HIDE_EMAIL_LANGUAGE_KEY);
SnackBar.success(
ctx,
findViewById(android.R.id.content),
getString(R.string.settingsSave));
});
activitySettingsAppearanceBinding.hideEmailLangInProfileFrame.setOnClickListener(
v ->
activitySettingsAppearanceBinding.switchHideEmailLangInProfile.setChecked(
!activitySettingsAppearanceBinding.switchHideEmailLangInProfile
.isChecked()));
// hide email in app navigation drawer switcher
activitySettingsAppearanceBinding.switchHideEmailNavDrawer.setChecked(
Boolean.parseBoolean(
AppDatabaseSettings.getSettingsValue(
ctx, AppDatabaseSettings.APP_USER_HIDE_EMAIL_IN_NAV_KEY)));
activitySettingsAppearanceBinding.switchHideEmailNavDrawer.setOnCheckedChangeListener(
(buttonView, isChecked) -> {
AppDatabaseSettings.updateSettingsValue(
ctx,
String.valueOf(isChecked),
AppDatabaseSettings.APP_USER_HIDE_EMAIL_IN_NAV_KEY);
SnackBar.success(
ctx,
findViewById(android.R.id.content),
getString(R.string.settingsSave));
});
activitySettingsAppearanceBinding.hideEmailNavDrawerFrame.setOnClickListener(
v ->
activitySettingsAppearanceBinding.switchHideEmailNavDrawer.setChecked(
!activitySettingsAppearanceBinding.switchHideEmailNavDrawer
.isChecked()));
// show labels in lists(issues, pr) - default is color dots // show labels in lists(issues, pr) - default is color dots
activitySettingsAppearanceBinding.switchLabelsInListBadge.setChecked( activitySettingsAppearanceBinding.switchLabelsInListBadge.setChecked(
Boolean.parseBoolean( Boolean.parseBoolean(

View File

@ -29,7 +29,7 @@ public class AdminCronTasksAdapter
private final List<Cron> tasksList; private final List<Cron> tasksList;
static class CronTasksViewHolder extends RecyclerView.ViewHolder { public static class CronTasksViewHolder extends RecyclerView.ViewHolder {
private Cron cronTasks; private Cron cronTasks;

View File

@ -181,7 +181,7 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter<RecyclerView.View
userLoginId = users.getLogin(); userLoginId = users.getLogin();
if (!users.getFullName().equals("")) { if (!users.getFullName().isEmpty()) {
userFullName.setText(Html.fromHtml(users.getFullName())); userFullName.setText(Html.fromHtml(users.getFullName()));
userName.setText( userName.setText(
@ -195,7 +195,7 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter<RecyclerView.View
userName.setVisibility(View.GONE); userName.setVisibility(View.GONE);
} }
if (!users.getEmail().equals("")) { if (!users.getEmail().isEmpty()) {
userEmail.setText(users.getEmail()); userEmail.setText(users.getEmail());
} else { } else {
userEmail.setVisibility(View.GONE); userEmail.setVisibility(View.GONE);

View File

@ -182,7 +182,7 @@ public class AdminUnadoptedReposAdapter
isLoading = false; isLoading = false;
} }
class UnadoptedViewHolder extends RecyclerView.ViewHolder { public class UnadoptedViewHolder extends RecyclerView.ViewHolder {
private final TextView name; private final TextView name;
private String repoName; private String repoName;

View File

@ -61,7 +61,7 @@ public class AssigneesListAdapter
User currentItem = assigneesList.get(position); User currentItem = assigneesList.get(position);
int imgRadius = AppUtil.getPixelsFromDensity(context, 90); int imgRadius = AppUtil.getPixelsFromDensity(context, 90);
if (currentItem.getFullName().equals("")) { if (currentItem.getFullName().isEmpty()) {
holder.assigneesName.setText(currentItem.getLogin()); holder.assigneesName.setText(currentItem.getLogin());
} else { } else {
@ -132,7 +132,7 @@ public class AssigneesListAdapter
void assigneesInterface(List<String> data); void assigneesInterface(List<String> data);
} }
static class AssigneesViewHolder extends RecyclerView.ViewHolder { public static class AssigneesViewHolder extends RecyclerView.ViewHolder {
private final CheckBox assigneesSelection; private final CheckBox assigneesSelection;
private final TextView assigneesName; private final TextView assigneesName;

View File

@ -64,7 +64,7 @@ public class CollaboratorSearchAdapter
int imgRadius = AppUtil.getPixelsFromDensity(context, 60); int imgRadius = AppUtil.getPixelsFromDensity(context, 60);
holder.userInfo = currentItem; holder.userInfo = currentItem;
if (!currentItem.getFullName().equals("")) { if (!currentItem.getFullName().isEmpty()) {
holder.userFullName.setText(Html.fromHtml(currentItem.getFullName())); holder.userFullName.setText(Html.fromHtml(currentItem.getFullName()));
} else { } else {
@ -77,7 +77,7 @@ public class CollaboratorSearchAdapter
holder.userName.setText( holder.userName.setText(
context.getResources().getString(R.string.usernameWithAt, currentItem.getLogin())); context.getResources().getString(R.string.usernameWithAt, currentItem.getLogin()));
if (!currentItem.getAvatarUrl().equals("")) { if (!currentItem.getAvatarUrl().isEmpty()) {
PicassoService.getInstance(context) PicassoService.getInstance(context)
.get() .get()
.load(currentItem.getAvatarUrl()) .load(currentItem.getAvatarUrl())
@ -140,7 +140,7 @@ public class CollaboratorSearchAdapter
return usersSearchList.size(); return usersSearchList.size();
} }
class CollaboratorSearchViewHolder extends RecyclerView.ViewHolder { public class CollaboratorSearchViewHolder extends RecyclerView.ViewHolder {
private final ImageView userAvatar; private final ImageView userAvatar;
private final TextView userFullName; private final TextView userFullName;

View File

@ -83,7 +83,7 @@ public class CollaboratorsAdapter extends BaseAdapter {
viewHolder.userLoginId = currentItem.getLogin(); viewHolder.userLoginId = currentItem.getLogin();
if (!currentItem.getFullName().equals("")) { if (!currentItem.getFullName().isEmpty()) {
viewHolder.collaboratorName.setText(Html.fromHtml(currentItem.getFullName())); viewHolder.collaboratorName.setText(Html.fromHtml(currentItem.getFullName()));
viewHolder.userName.setText( viewHolder.userName.setText(

View File

@ -24,7 +24,7 @@ public class CommitStatusesAdapter
private final List<CommitStatus> statuses; private final List<CommitStatus> statuses;
static class CommitStatusesViewHolder extends RecyclerView.ViewHolder { public static class CommitStatusesViewHolder extends RecyclerView.ViewHolder {
private CommitStatus status; private CommitStatus status;
@ -44,7 +44,7 @@ public class CommitStatusesAdapter
} }
private void openUrl() { private void openUrl() {
if (status.getTargetUrl() != null && !status.getTargetUrl().equals("")) { if (status.getTargetUrl() != null && !status.getTargetUrl().isEmpty()) {
AppUtil.openUrlInBrowser(itemView.getContext(), status.getTargetUrl()); AppUtil.openUrlInBrowser(itemView.getContext(), status.getTargetUrl());
} else { } else {
Toasty.info( Toasty.info(

View File

@ -147,7 +147,7 @@ public class DiffAdapter extends BaseAdapter {
private int getLineColor(String line) { private int getLineColor(String line) {
if (line.length() == 0) { if (line.isEmpty()) {
return COLOR_NORMAL; return COLOR_NORMAL;
} }

View File

@ -113,7 +113,7 @@ public class DraftsAdapter extends RecyclerView.Adapter<DraftsAdapter.DraftsView
notifyDataChanged(); notifyDataChanged();
} }
class DraftsViewHolder extends RecyclerView.ViewHolder { public class DraftsViewHolder extends RecyclerView.ViewHolder {
private final TextView draftText; private final TextView draftText;
private final TextView repoInfo; private final TextView repoInfo;

View File

@ -152,7 +152,7 @@ public class ExploreRepositoriesAdapter extends RecyclerView.Adapter<RecyclerVie
.buildRoundRect(firstCharacter, color, 14); .buildRoundRect(firstCharacter, color, 14);
if (userRepositories.getAvatarUrl() != null) { if (userRepositories.getAvatarUrl() != null) {
if (!userRepositories.getAvatarUrl().equals("")) { if (!userRepositories.getAvatarUrl().isEmpty()) {
PicassoService.getInstance(context) PicassoService.getInstance(context)
.get() .get()
.load(userRepositories.getAvatarUrl()) .load(userRepositories.getAvatarUrl())
@ -182,7 +182,7 @@ public class ExploreRepositoriesAdapter extends RecyclerView.Adapter<RecyclerVie
repoLastUpdated.setVisibility(View.GONE); repoLastUpdated.setVisibility(View.GONE);
} }
if (!userRepositories.getDescription().equals("")) { if (!userRepositories.getDescription().isEmpty()) {
repoDescription.setVisibility(View.VISIBLE); repoDescription.setVisibility(View.VISIBLE);
repoDescription.setText(userRepositories.getDescription()); repoDescription.setText(userRepositories.getDescription());
spacerView.setVisibility(View.GONE); spacerView.setVisibility(View.GONE);

View File

@ -1,5 +1,6 @@
package org.mian.gitnex.adapters; package org.mian.gitnex.adapters;
import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -57,6 +58,7 @@ public class FilesAdapter extends RecyclerView.Adapter<FilesAdapter.FilesViewHol
return results; return results;
} }
@SuppressLint("NotifyDataSetChanged")
@Override @Override
protected void publishResults(CharSequence constraint, FilterResults results) { protected void publishResults(CharSequence constraint, FilterResults results) {
@ -77,6 +79,7 @@ public class FilesAdapter extends RecyclerView.Adapter<FilesAdapter.FilesViewHol
return originalFiles; return originalFiles;
} }
@SuppressLint("NotifyDataSetChanged")
public void notifyOriginalDataSetChanged() { public void notifyOriginalDataSetChanged() {
alteredFiles.clear(); alteredFiles.clear();
@ -150,7 +153,7 @@ public class FilesAdapter extends RecyclerView.Adapter<FilesAdapter.FilesViewHol
void onClickFile(ContentsResponse file); void onClickFile(ContentsResponse file);
} }
class FilesViewHolder extends RecyclerView.ViewHolder { public class FilesViewHolder extends RecyclerView.ViewHolder {
private final ImageView fileTypeIs; private final ImageView fileTypeIs;
private final TextView fileName; private final TextView fileName;

View File

@ -79,7 +79,7 @@ public class LabelsAdapter extends RecyclerView.Adapter<LabelsAdapter.LabelsView
notifyDataSetChanged(); notifyDataSetChanged();
} }
class LabelsViewHolder extends RecyclerView.ViewHolder { public class LabelsViewHolder extends RecyclerView.ViewHolder {
private final MaterialCardView labelView; private final MaterialCardView labelView;
private final ImageView labelIcon; private final ImageView labelIcon;

View File

@ -1,5 +1,6 @@
package org.mian.gitnex.adapters; package org.mian.gitnex.adapters;
import android.annotation.SuppressLint;
import android.graphics.Color; import android.graphics.Color;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -103,6 +104,7 @@ public class LabelsListAdapter extends RecyclerView.Adapter<LabelsListAdapter.La
return labels.size(); return labels.size();
} }
@SuppressLint("NotifyDataSetChanged")
public void updateList(List<Integer> list) { public void updateList(List<Integer> list) {
currentLabelsIds = list; currentLabelsIds = list;
@ -116,7 +118,7 @@ public class LabelsListAdapter extends RecyclerView.Adapter<LabelsListAdapter.La
void labelsIdsInterface(List<Integer> data); void labelsIdsInterface(List<Integer> data);
} }
static class LabelsViewHolder extends RecyclerView.ViewHolder { public static class LabelsViewHolder extends RecyclerView.ViewHolder {
private final CheckBox labelSelection; private final CheckBox labelSelection;
private final TextView labelText; private final TextView labelText;

View File

@ -34,7 +34,7 @@ public class MostVisitedReposAdapter
private List<Repository> mostVisitedReposList; private List<Repository> mostVisitedReposList;
private final Context ctx; private final Context ctx;
class MostVisitedViewHolder extends RecyclerView.ViewHolder { public class MostVisitedViewHolder extends RecyclerView.ViewHolder {
private Repository repository; private Repository repository;

View File

@ -63,7 +63,7 @@ public class OrganizationAddUserToTeamMemberAdapter
holder.userInfo = currentItem; holder.userInfo = currentItem;
int imgRadius = AppUtil.getPixelsFromDensity(context, 3); int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
if (!currentItem.getFullName().equals("")) { if (!currentItem.getFullName().isEmpty()) {
holder.userFullName.setText(Html.fromHtml(currentItem.getFullName())); holder.userFullName.setText(Html.fromHtml(currentItem.getFullName()));
} else { } else {
@ -76,7 +76,7 @@ public class OrganizationAddUserToTeamMemberAdapter
holder.userName.setText( holder.userName.setText(
context.getResources().getString(R.string.usernameWithAt, currentItem.getLogin())); context.getResources().getString(R.string.usernameWithAt, currentItem.getLogin()));
if (!currentItem.getAvatarUrl().equals("")) { if (!currentItem.getAvatarUrl().isEmpty()) {
PicassoService.getInstance(context) PicassoService.getInstance(context)
.get() .get()
.load(currentItem.getAvatarUrl()) .load(currentItem.getAvatarUrl())
@ -142,7 +142,7 @@ public class OrganizationAddUserToTeamMemberAdapter
return usersSearchList.size(); return usersSearchList.size();
} }
class UserSearchViewHolder extends RecyclerView.ViewHolder { public class UserSearchViewHolder extends RecyclerView.ViewHolder {
private final ImageView userAvatar; private final ImageView userAvatar;
private final TextView userFullName; private final TextView userFullName;

View File

@ -55,7 +55,7 @@ public class OrganizationTeamMembersPreviewAdapter
return userData.size(); return userData.size();
} }
static class ViewHolder extends RecyclerView.ViewHolder { public static class ViewHolder extends RecyclerView.ViewHolder {
private final ImageView avatar; private final ImageView avatar;

View File

@ -50,7 +50,7 @@ public class OrganizationTeamRepositoriesAdapter
reposArr = new ArrayList<>(); reposArr = new ArrayList<>();
} }
class TeamReposViewHolder extends RecyclerView.ViewHolder { public class TeamReposViewHolder extends RecyclerView.ViewHolder {
private Repository repoInfo; private Repository repoInfo;
@ -75,7 +75,7 @@ public class OrganizationTeamRepositoriesAdapter
new Handler(Looper.getMainLooper()) new Handler(Looper.getMainLooper())
.postDelayed( .postDelayed(
() -> { () -> {
if (reposArr.size() > 0) { if (!reposArr.isEmpty()) {
for (int i = 0; i < reposArr.size(); i++) { for (int i = 0; i < reposArr.size(); i++) {
if (!reposArr.get(i).getName().equals(repoInfo.getName())) { if (!reposArr.get(i).getName().equals(repoInfo.getName())) {
addRepoButtonAdd.setVisibility(View.VISIBLE); addRepoButtonAdd.setVisibility(View.VISIBLE);
@ -144,7 +144,7 @@ public class OrganizationTeamRepositoriesAdapter
.getColor(currentItem.getName()), .getColor(currentItem.getName()),
14); 14);
if (currentItem.getAvatarUrl() != null && !currentItem.getAvatarUrl().equals("")) { if (currentItem.getAvatarUrl() != null && !currentItem.getAvatarUrl().isEmpty()) {
PicassoService.getInstance(context) PicassoService.getInstance(context)
.get() .get()
.load(currentItem.getAvatarUrl()) .load(currentItem.getAvatarUrl())

View File

@ -1,5 +1,6 @@
package org.mian.gitnex.adapters; package org.mian.gitnex.adapters;
import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -38,7 +39,7 @@ public class OrganizationTeamsAdapter
private final OrganizationPermissions permissions; private final OrganizationPermissions permissions;
private final String orgName; private final String orgName;
static class OrgTeamsViewHolder extends RecyclerView.ViewHolder { public static class OrgTeamsViewHolder extends RecyclerView.ViewHolder {
private Team team; private Team team;
@ -101,6 +102,7 @@ public class OrganizationTeamsAdapter
return new OrganizationTeamsAdapter.OrgTeamsViewHolder(v); return new OrganizationTeamsAdapter.OrgTeamsViewHolder(v);
} }
@SuppressLint("NotifyDataSetChanged")
@Override @Override
public void onBindViewHolder( public void onBindViewHolder(
@NonNull OrganizationTeamsAdapter.OrgTeamsViewHolder holder, int position) { @NonNull OrganizationTeamsAdapter.OrgTeamsViewHolder holder, int position) {
@ -126,7 +128,7 @@ public class OrganizationTeamsAdapter
@NonNull Response<List<User>> response) { @NonNull Response<List<User>> response) {
if (response.isSuccessful() if (response.isSuccessful()
&& response.body() != null && response.body() != null
&& response.body().size() > 0) { && !response.body().isEmpty()) {
holder.membersPreviewFrame.setVisibility(View.VISIBLE); holder.membersPreviewFrame.setVisibility(View.VISIBLE);
holder.userInfos.addAll( holder.userInfos.addAll(
@ -189,6 +191,7 @@ public class OrganizationTeamsAdapter
return results; return results;
} }
@SuppressLint("NotifyDataSetChanged")
@Override @Override
protected void publishResults(CharSequence constraint, FilterResults results) { protected void publishResults(CharSequence constraint, FilterResults results) {
teamList.clear(); teamList.clear();

View File

@ -182,7 +182,7 @@ public class OrganizationsListAdapter extends RecyclerView.Adapter<RecyclerView.
.centerCrop() .centerCrop()
.into(image); .into(image);
if (!org.getDescription().equals("")) { if (!org.getDescription().isEmpty()) {
orgDescription.setVisibility(View.VISIBLE); orgDescription.setVisibility(View.VISIBLE);
orgDescription.setText(org.getDescription()); orgDescription.setText(org.getDescription());
} else { } else {

View File

@ -64,7 +64,7 @@ public class ReactionAuthorsAdapter
return userInfos.size(); return userInfos.size();
} }
static class ViewHolder extends RecyclerView.ViewHolder { public static class ViewHolder extends RecyclerView.ViewHolder {
private final ImageView authorAvatar; private final ImageView authorAvatar;

View File

@ -125,7 +125,7 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
TimeHelper.customDateFormatForToastDateFormat(currentItem.getPublishedAt()), TimeHelper.customDateFormatForToastDateFormat(currentItem.getPublishedAt()),
context)); context));
if (!currentItem.getBody().equals("")) { if (!currentItem.getBody().isEmpty()) {
Markdown.render(context, currentItem.getBody(), holder.releaseBodyContent); Markdown.render(context, currentItem.getBody(), holder.releaseBodyContent);
} else { } else {
holder.releaseBodyContent.setText(R.string.noReleaseBodyContent); holder.releaseBodyContent.setText(R.string.noReleaseBodyContent);
@ -279,7 +279,7 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
void onLoadFinished(); void onLoadFinished();
} }
protected class ReleasesViewHolder extends RecyclerView.ViewHolder { public class ReleasesViewHolder extends RecyclerView.ViewHolder {
private final TextView releaseType; private final TextView releaseType;
private final TextView releaseName; private final TextView releaseName;

View File

@ -55,7 +55,7 @@ public class ReleasesDownloadsAdapter
return releasesDownloadsList.size(); return releasesDownloadsList.size();
} }
static class ReleasesDownloadsViewHolder extends RecyclerView.ViewHolder { public static class ReleasesDownloadsViewHolder extends RecyclerView.ViewHolder {
private final TextView downloadName; private final TextView downloadName;

View File

@ -155,7 +155,7 @@ public class RepoForksAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
void onLoadFinished(); void onLoadFinished();
} }
class ForksHolder extends RecyclerView.ViewHolder { public class ForksHolder extends RecyclerView.ViewHolder {
private final ImageView image; private final ImageView image;
private final TextView repoName; private final TextView repoName;
@ -206,7 +206,7 @@ public class RepoForksAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
.buildRoundRect(firstCharacter, color, 3); .buildRoundRect(firstCharacter, color, 3);
if (forksModel.getAvatarUrl() != null) { if (forksModel.getAvatarUrl() != null) {
if (!forksModel.getAvatarUrl().equals("")) { if (!forksModel.getAvatarUrl().isEmpty()) {
PicassoService.getInstance(context) PicassoService.getInstance(context)
.get() .get()
.load(forksModel.getAvatarUrl()) .load(forksModel.getAvatarUrl())
@ -236,7 +236,7 @@ public class RepoForksAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
repoLastUpdated.setVisibility(View.GONE); repoLastUpdated.setVisibility(View.GONE);
} }
if (!forksModel.getDescription().equals("")) { if (!forksModel.getDescription().isEmpty()) {
repoDescription.setText(forksModel.getDescription()); repoDescription.setText(forksModel.getDescription());
} else { } else {
repoDescription.setText(context.getString(R.string.noDataDescription)); repoDescription.setText(context.getString(R.string.noDataDescription));

View File

@ -153,7 +153,7 @@ public class ReposListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
void onLoadFinished(); void onLoadFinished();
} }
class ReposHolder extends RecyclerView.ViewHolder { public class ReposHolder extends RecyclerView.ViewHolder {
private final ImageView image; private final ImageView image;
private final TextView repoName; private final TextView repoName;
@ -217,7 +217,7 @@ public class ReposListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
.buildRoundRect(firstCharacter, color, 14); .buildRoundRect(firstCharacter, color, 14);
if (repositories.getAvatarUrl() != null) { if (repositories.getAvatarUrl() != null) {
if (!repositories.getAvatarUrl().equals("")) { if (!repositories.getAvatarUrl().isEmpty()) {
PicassoService.getInstance(context) PicassoService.getInstance(context)
.get() .get()
.load(repositories.getAvatarUrl()) .load(repositories.getAvatarUrl())
@ -244,7 +244,7 @@ public class ReposListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
repoLastUpdated.setVisibility(View.GONE); repoLastUpdated.setVisibility(View.GONE);
} }
if (!repositories.getDescription().equals("")) { if (!repositories.getDescription().isEmpty()) {
repoDescription.setVisibility(View.VISIBLE); repoDescription.setVisibility(View.VISIBLE);
repoDescription.setText(repositories.getDescription()); repoDescription.setText(repositories.getDescription());
spacerView.setVisibility(View.GONE); spacerView.setVisibility(View.GONE);

View File

@ -44,7 +44,7 @@ public class SSHKeysAdapter extends RecyclerView.Adapter<SSHKeysAdapter.KeysView
return keysList.size(); return keysList.size();
} }
static class KeysViewHolder extends RecyclerView.ViewHolder { public static class KeysViewHolder extends RecyclerView.ViewHolder {
private final TextView keyName; private final TextView keyName;
private final TextView key; private final TextView key;

View File

@ -99,8 +99,7 @@ public class UserAccountsAdapter
} }
@NonNull @Override @NonNull @Override
public UserAccountsAdapter.UserAccountsViewHolder onCreateViewHolder( public UserAccountsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@NonNull ViewGroup parent, int viewType) {
View v = View v =
LayoutInflater.from(parent.getContext()) LayoutInflater.from(parent.getContext())
@ -110,8 +109,7 @@ public class UserAccountsAdapter
@SuppressLint("DefaultLocale") @SuppressLint("DefaultLocale")
@Override @Override
public void onBindViewHolder( public void onBindViewHolder(@NonNull UserAccountsViewHolder holder, int position) {
@NonNull UserAccountsAdapter.UserAccountsViewHolder holder, int position) {
UserAccount currentItem = userAccountsList.get(position); UserAccount currentItem = userAccountsList.get(position);
@ -150,7 +148,7 @@ public class UserAccountsAdapter
return userAccountsList.size(); return userAccountsList.size();
} }
class UserAccountsViewHolder extends RecyclerView.ViewHolder { public class UserAccountsViewHolder extends RecyclerView.ViewHolder {
private final TextView accountUrl; private final TextView accountUrl;
private final TextView userId; private final TextView userId;

View File

@ -101,7 +101,7 @@ public class UserAccountsNavAdapter
dialog.show(); dialog.show();
} }
class UserAccountsViewHolder extends RecyclerView.ViewHolder { public class UserAccountsViewHolder extends RecyclerView.ViewHolder {
private final ImageView userAccountAvatar; private final ImageView userAccountAvatar;

View File

@ -120,7 +120,7 @@ public class UserGridAdapter extends BaseAdapter implements Filterable {
viewHolder.userLoginId = currentItem.getLogin(); viewHolder.userLoginId = currentItem.getLogin();
if (!currentItem.getFullName().equals("")) { if (!currentItem.getFullName().isEmpty()) {
viewHolder.memberName.setText(Html.fromHtml(currentItem.getFullName())); viewHolder.memberName.setText(Html.fromHtml(currentItem.getFullName()));
viewHolder.userName.setText( viewHolder.userName.setText(

View File

@ -129,7 +129,7 @@ public class UsersAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
this.userInfo = userInfo; this.userInfo = userInfo;
int imgRadius = AppUtil.getPixelsFromDensity(context, 3); int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
if (!userInfo.getFullName().equals("")) { if (!userInfo.getFullName().isEmpty()) {
userFullName.setText(Html.fromHtml(userInfo.getFullName())); userFullName.setText(Html.fromHtml(userInfo.getFullName()));
userName.setText( userName.setText(
context.getResources() context.getResources()

View File

@ -35,6 +35,7 @@ import org.mian.gitnex.databinding.CustomEditAvatarDialogBinding;
import org.mian.gitnex.databinding.CustomEditProfileBinding; import org.mian.gitnex.databinding.CustomEditProfileBinding;
import org.mian.gitnex.databinding.FragmentProfileDetailBinding; import org.mian.gitnex.databinding.FragmentProfileDetailBinding;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppDatabaseSettings;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.ClickListener;
import org.mian.gitnex.helpers.Markdown; import org.mian.gitnex.helpers.Markdown;
@ -62,6 +63,7 @@ public class DetailFragment extends Fragment {
private int imgRadius; private int imgRadius;
private static Uri avatarUri = null; private static Uri avatarUri = null;
public static boolean refProfile = false; public static boolean refProfile = false;
public boolean itsMe = false;
public DetailFragment() {} public DetailFragment() {}
@ -109,6 +111,7 @@ public class DetailFragment extends Fragment {
if (username.equals(((BaseActivity) context).getAccount().getAccount().getUserName())) { if (username.equals(((BaseActivity) context).getAccount().getAccount().getUserName())) {
binding.metaProfile.setVisibility(View.VISIBLE); binding.metaProfile.setVisibility(View.VISIBLE);
itsMe = true;
} else { } else {
binding.metaProfile.setVisibility(View.GONE); binding.metaProfile.setVisibility(View.GONE);
} }
@ -366,7 +369,19 @@ public class DetailFragment extends Fragment {
getString( getString(
R.string.usernameWithAt, R.string.usernameWithAt,
response.body().getLogin())); response.body().getLogin()));
binding.userEmail.setText(email);
if (Boolean.parseBoolean(
AppDatabaseSettings.getSettingsValue(
context,
AppDatabaseSettings
.APP_USER_PROFILE_HIDE_EMAIL_LANGUAGE_KEY))
&& itsMe) {
binding.userEmail.setText(
getString(R.string.strPrivate).toUpperCase());
binding.userEmail.setAlpha(.4F);
} else {
binding.userEmail.setText(email);
}
binding.userFollowersCount.setText( binding.userFollowersCount.setText(
String.format( String.format(
@ -389,13 +404,25 @@ public class DetailFragment extends Fragment {
String[] userLanguageCodes = String[] userLanguageCodes =
response.body().getLanguage().split("-"); response.body().getLanguage().split("-");
if (userLanguageCodes.length >= 2) { if (Boolean.parseBoolean(
Locale locale = AppDatabaseSettings.getSettingsValue(
new Locale( context,
userLanguageCodes[0], userLanguageCodes[1]); AppDatabaseSettings
binding.userLang.setText(locale.getDisplayLanguage()); .APP_USER_PROFILE_HIDE_EMAIL_LANGUAGE_KEY))
&& itsMe) {
binding.userLang.setText(
getString(R.string.strPrivate).toUpperCase());
binding.userLang.setAlpha(.4F);
} else { } else {
binding.userLang.setText(locale.getDisplayLanguage()); if (userLanguageCodes.length >= 2) {
Locale locale =
new Locale(
userLanguageCodes[0],
userLanguageCodes[1]);
binding.userLang.setText(locale.getDisplayLanguage());
} else {
binding.userLang.setText(locale.getDisplayLanguage());
}
} }
PicassoService.getInstance(context) PicassoService.getInstance(context)
@ -415,6 +442,30 @@ public class DetailFragment extends Fragment {
TimeHelper.customDateFormatForToastDateFormat( TimeHelper.customDateFormatForToastDateFormat(
response.body().getCreated()), response.body().getCreated()),
context)); context));
if (!response.body().getWebsite().isEmpty()) {
binding.website.setText(response.body().getWebsite());
} else {
binding.website.setText(R.string.noDataWebsite);
binding.website.setAlpha(.4F);
}
if (!response.body().getLocation().isEmpty()) {
binding.location.setText(response.body().getLocation());
} else {
binding.location.setText(R.string.noDataLocation);
binding.location.setAlpha(.4F);
}
if (!response.body().getDescription().isEmpty()) {
Markdown.render(
context,
response.body().getDescription(),
binding.bio);
} else {
binding.bio.setText(R.string.noDataBio);
binding.bio.setAlpha(.4F);
}
break; break;
case 401: case 401:

View File

@ -62,6 +62,11 @@ public class AppDatabaseSettings {
public static String APP_IMAGES_CACHE_DEFAULT = "1"; public static String APP_IMAGES_CACHE_DEFAULT = "1";
public static String APP_IMAGES_CACHE_SIZE_KEY = "app_images_cache_size"; public static String APP_IMAGES_CACHE_SIZE_KEY = "app_images_cache_size";
public static String APP_IMAGES_CACHE_SIZE_DEFAULT = "100 MB"; public static String APP_IMAGES_CACHE_SIZE_DEFAULT = "100 MB";
public static String APP_USER_PROFILE_HIDE_EMAIL_LANGUAGE_KEY =
"app_user_profile_hide_email_lang";
public static String APP_USER_PROFILE_HIDE_EMAIL_LANGUAGE_DEFAULT = "false";
public static String APP_USER_HIDE_EMAIL_IN_NAV_KEY = "app_user_hide_email_nav";
public static String APP_USER_HIDE_EMAIL_IN_NAV_DEFAULT = "false";
public static void initDefaultSettings(Context ctx) { public static void initDefaultSettings(Context ctx) {
@ -190,6 +195,18 @@ public class AppDatabaseSettings {
APP_IMAGES_CACHE_SIZE_DEFAULT, APP_IMAGES_CACHE_SIZE_DEFAULT,
APP_IMAGES_CACHE_SIZE_DEFAULT); APP_IMAGES_CACHE_SIZE_DEFAULT);
} }
if (appSettingsApi.fetchSettingCountByKey(APP_USER_PROFILE_HIDE_EMAIL_LANGUAGE_KEY) == 0) {
appSettingsApi.insertNewSetting(
APP_USER_PROFILE_HIDE_EMAIL_LANGUAGE_KEY,
APP_USER_PROFILE_HIDE_EMAIL_LANGUAGE_DEFAULT,
APP_USER_PROFILE_HIDE_EMAIL_LANGUAGE_DEFAULT);
}
if (appSettingsApi.fetchSettingCountByKey(APP_USER_HIDE_EMAIL_IN_NAV_KEY) == 0) {
appSettingsApi.insertNewSetting(
APP_USER_HIDE_EMAIL_IN_NAV_KEY,
APP_USER_HIDE_EMAIL_IN_NAV_DEFAULT,
APP_USER_HIDE_EMAIL_IN_NAV_DEFAULT);
}
if (appSettingsApi.fetchSettingCountByKey("prefsMigration") == 0) { if (appSettingsApi.fetchSettingCountByKey("prefsMigration") == 0) {
appSettingsApi.insertNewSetting("prefsMigration", "true", "true"); appSettingsApi.insertNewSetting("prefsMigration", "true", "true");

View File

@ -34,7 +34,7 @@ public class SnackBar {
View sbView = snackBar.getView(); View sbView = snackBar.getView();
TextView textView = sbView.findViewById(R.id.snackbar_text); TextView textView = sbView.findViewById(R.id.snackbar_text);
snackBar.setBackgroundTint(context.getColor(R.color.cardBackground)); snackBar.setBackgroundTint(context.getColor(R.color.cardBackground));
textView.setTextColor(context.getColor(R.color.warningColor)); textView.setTextColor(context.getColor(R.color.colorWhite));
snackBar.show(); snackBar.show();
} }
@ -43,7 +43,7 @@ public class SnackBar {
View sbView = snackBar.getView(); View sbView = snackBar.getView();
TextView textView = sbView.findViewById(R.id.snackbar_text); TextView textView = sbView.findViewById(R.id.snackbar_text);
snackBar.setBackgroundTint(context.getColor(R.color.cardBackground)); snackBar.setBackgroundTint(context.getColor(R.color.cardBackground));
textView.setTextColor(context.getColor(R.color.darkRed)); textView.setTextColor(context.getColor(R.color.colorWhite));
snackBar.show(); snackBar.show();
} }
} }

View File

@ -106,9 +106,17 @@ public class Notifications {
MaterialAlertDialogBuilder materialAlertDialogBuilder = MaterialAlertDialogBuilder materialAlertDialogBuilder =
new MaterialAlertDialogBuilder(context) new MaterialAlertDialogBuilder(context)
.setTitle(R.string.pageTitleNotifications) .setTitle(R.string.pageTitleNotifications)
.setCancelable(false)
.setMessage(context.getString(R.string.openAppSettings)) .setMessage(context.getString(R.string.openAppSettings))
.setNeutralButton( .setNeutralButton(
R.string.cancelButton, (dialog, which) -> dialog.dismiss()) R.string.cancelButton,
(dialog, which) -> {
dialog.dismiss();
AppDatabaseSettings.updateSettingsValue(
context,
"false",
AppDatabaseSettings.APP_NOTIFICATIONS_KEY);
})
.setPositiveButton( .setPositiveButton(
R.string.isOpen, R.string.isOpen,
(dialog, which) -> { (dialog, which) -> {

View File

@ -0,0 +1,34 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M14,3v4a1,1 0,0 0,1 1h4"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="?attr/iconsColor"
android:strokeLineCap="round"/>
<path
android:pathData="M17,21h-10a2,2 0,0 1,-2 -2v-14a2,2 0,0 1,2 -2h7l5,5v11a2,2 0,0 1,-2 2z"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="?attr/iconsColor"
android:strokeLineCap="round"/>
<path
android:pathData="M9,17h6"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="?attr/iconsColor"
android:strokeLineCap="round"/>
<path
android:pathData="M9,13h6"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="?attr/iconsColor"
android:strokeLineCap="round"/>
</vector>

View File

@ -90,7 +90,7 @@
android:paddingStart="@dimen/dimen8dp" android:paddingStart="@dimen/dimen8dp"
android:paddingTop="@dimen/dimen2dp" android:paddingTop="@dimen/dimen2dp"
android:paddingEnd="@dimen/dimen8dp" android:paddingEnd="@dimen/dimen8dp"
android:paddingBottom="@dimen/dimen104dp"> android:paddingBottom="@dimen/dimen120dp">
<com.google.android.material.card.MaterialCardView <com.google.android.material.card.MaterialCardView
android:id="@+id/titleCard" android:id="@+id/titleCard"
@ -391,6 +391,29 @@
android:background="?attr/primaryBackgroundColor" android:background="?attr/primaryBackgroundColor"
android:padding="@dimen/dimen8dp"> android:padding="@dimen/dimen8dp">
<com.google.android.material.card.MaterialCardView
style="?attr/materialCardViewFilledStyle"
android:id="@+id/attachmentsCard"
android:layout_width="@dimen/dimen38dp"
android:layout_height="@dimen/dimen38dp"
android:layout_gravity="center_vertical"
android:backgroundTint="?attr/fabColor"
android:layout_marginEnd="@dimen/dimen8dp"
app:cardCornerRadius="@dimen/dimen36dp">
<ImageView
android:id="@+id/attachments"
android:layout_width="@dimen/dimen24dp"
android:layout_height="@dimen/dimen24dp"
android:layout_gravity="center_vertical|center_horizontal"
android:contentDescription="@string/generalImgContentText"
app:tint="?attr/materialCardBackgroundColor"
android:clickable="true"
android:src="@drawable/ic_attachment"
android:focusable="true" />
</com.google.android.material.card.MaterialCardView>
<EditText <EditText
android:id="@+id/comment_reply" android:id="@+id/comment_reply"
android:layout_width="0dp" android:layout_width="0dp"
@ -420,8 +443,8 @@
<ImageView <ImageView
android:id="@+id/send" android:id="@+id/send"
android:layout_width="@dimen/dimen26dp" android:layout_width="@dimen/dimen24dp"
android:layout_height="@dimen/dimen26dp" android:layout_height="@dimen/dimen24dp"
android:layout_gravity="center_vertical|center_horizontal" android:layout_gravity="center_vertical|center_horizontal"
android:contentDescription="@string/generalImgContentText" android:contentDescription="@string/generalImgContentText"
app:tint="?attr/materialCardBackgroundColor" app:tint="?attr/materialCardBackgroundColor"

View File

@ -254,6 +254,102 @@
</LinearLayout> </LinearLayout>
<LinearLayout
android:id="@+id/hideEmailLangInProfileFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tvHideEmailLangInProfileHeader"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight=".90"
android:text="@string/hideEmailLangInProfileHeader"
android:layout_marginTop="@dimen/dimen4dp"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen18sp" />
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switchHideEmailLangInProfile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/hideEmailLangInProfileHeader"
android:layout_weight=".10" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dimen96dp"
android:text="@string/hideEmailLangInProfileHint"
android:textColor="?attr/hintColor"
android:textSize="@dimen/dimen12sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/hideEmailNavDrawerFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tvHideEmailNavDrawerHeader"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight=".90"
android:text="@string/hideEmailNavDrawerHeader"
android:layout_marginTop="@dimen/dimen4dp"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen18sp" />
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switchHideEmailNavDrawer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/hideEmailNavDrawerHeader"
android:layout_weight=".10" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dimen96dp"
android:text="@string/hideEmailNavDrawerHint"
android:textColor="?attr/hintColor"
android:textSize="@dimen/dimen12sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/langFrame" android:id="@+id/langFrame"
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -157,6 +157,7 @@
android:textColor="?attr/materialCardBackgroundColor" android:textColor="?attr/materialCardBackgroundColor"
app:iconTint="?attr/materialCardBackgroundColor" app:iconTint="?attr/materialCardBackgroundColor"
android:backgroundTint="?attr/fabColor" android:backgroundTint="?attr/fabColor"
android:visibility="gone"
app:icon="@drawable/ic_bmc" /> app:icon="@drawable/ic_bmc" />
</LinearLayout> </LinearLayout>

View File

@ -51,12 +51,12 @@
tools:ignore="UseCompoundDrawables"> tools:ignore="UseCompoundDrawables">
<com.google.android.material.card.MaterialCardView <com.google.android.material.card.MaterialCardView
android:layout_width="@dimen/dimen80dp" android:layout_width="@dimen/dimen96dp"
android:layout_height="@dimen/dimen80dp" android:layout_height="@dimen/dimen96dp"
style="?attr/materialCardViewFilledStyle" style="?attr/materialCardViewFilledStyle"
android:layout_marginBottom="@dimen/dimen8dp" android:layout_marginBottom="@dimen/dimen8dp"
app:cardElevation="@dimen/dimen0dp" app:cardElevation="@dimen/dimen0dp"
app:cardCornerRadius="@dimen/dimen40dp"> app:cardCornerRadius="@dimen/dimen16dp">
<ImageView <ImageView
android:id="@+id/userAvatar" android:id="@+id/userAvatar"
@ -178,8 +178,8 @@
<ImageView <ImageView
android:layout_gravity="center" android:layout_gravity="center"
android:layout_width="wrap_content" android:layout_width="@dimen/dimen24dp"
android:layout_height="wrap_content" android:layout_height="@dimen/dimen24dp"
android:contentDescription="@string/generalImgContentText" android:contentDescription="@string/generalImgContentText"
app:srcCompat="@drawable/ic_email" /> app:srcCompat="@drawable/ic_email" />
@ -203,6 +203,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:alpha="0.9" android:alpha="0.9"
android:textColor="?attr/primaryTextColor" android:textColor="?attr/primaryTextColor"
android:autoLink="email"
android:textSize="@dimen/dimen14sp" /> android:textSize="@dimen/dimen14sp" />
</LinearLayout> </LinearLayout>
@ -214,76 +215,191 @@
android:layout_marginTop="@dimen/dimen32dp" android:layout_marginTop="@dimen/dimen32dp"
android:orientation="horizontal"> android:orientation="horizontal">
<ImageView <ImageView
android:layout_gravity="center" android:layout_gravity="center"
android:layout_width="wrap_content" android:layout_width="@dimen/dimen24dp"
android:layout_height="wrap_content" android:layout_height="@dimen/dimen24dp"
android:contentDescription="@string/generalImgContentText" android:contentDescription="@string/generalImgContentText"
app:srcCompat="@drawable/ic_language"/> app:srcCompat="@drawable/ic_browser" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settingsLanguageSelectorHeader"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp" />
<TextView
android:id="@+id/userLang"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0.9"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp" android:layout_marginStart="@dimen/dimen16dp"
android:orientation="horizontal"> android:gravity="center_vertical"
android:orientation="vertical">
<ImageView <TextView
android:layout_gravity="center"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:contentDescription="@string/generalImgContentText" android:text="@string/websiteText"
app:srcCompat="@drawable/ic_calendar"/> android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp" />
<LinearLayout <TextView
android:id="@+id/website"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp" android:alpha="0.9"
android:gravity="center_vertical" android:textColor="?attr/primaryTextColor"
android:orientation="vertical"> android:autoLink="web"
android:textSize="@dimen/dimen14sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/joined"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp" />
<TextView
android:id="@+id/userJoinedOn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0.9"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
</LinearLayout> </LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:orientation="horizontal">
<ImageView
android:layout_gravity="center"
android:layout_width="@dimen/dimen24dp"
android:layout_height="@dimen/dimen24dp"
android:contentDescription="@string/generalImgContentText"
app:srcCompat="@drawable/ic_location" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/locationText"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp" />
<TextView
android:id="@+id/location"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0.9"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:orientation="horizontal">
<ImageView
android:layout_gravity="center"
android:layout_width="@dimen/dimen24dp"
android:layout_height="@dimen/dimen24dp"
android:contentDescription="@string/generalImgContentText"
app:srcCompat="@drawable/ic_language"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settingsLanguageSelectorHeader"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp" />
<TextView
android:id="@+id/userLang"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0.9"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:orientation="horizontal">
<ImageView
android:layout_gravity="center"
android:layout_width="@dimen/dimen24dp"
android:layout_height="@dimen/dimen24dp"
android:contentDescription="@string/generalImgContentText"
app:srcCompat="@drawable/ic_file_description" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bioText"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp" />
<TextView
android:id="@+id/bio"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0.9"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dimen32dp"
android:orientation="horizontal">
<ImageView
android:layout_gravity="center"
android:layout_width="@dimen/dimen24dp"
android:layout_height="@dimen/dimen24dp"
android:contentDescription="@string/generalImgContentText"
app:srcCompat="@drawable/ic_calendar"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dimen16dp"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/joined"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen16sp" />
<TextView
android:id="@+id/userJoinedOn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0.9"
android:textColor="?attr/primaryTextColor"
android:textSize="@dimen/dimen14sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout> </LinearLayout>
</com.google.android.material.card.MaterialCardView> </com.google.android.material.card.MaterialCardView>

View File

@ -30,7 +30,7 @@
style="?attr/materialCardViewElevatedStyle" style="?attr/materialCardViewElevatedStyle"
android:layout_width="@dimen/dimen60dp" android:layout_width="@dimen/dimen60dp"
android:layout_height="@dimen/dimen60dp" android:layout_height="@dimen/dimen60dp"
app:cardCornerRadius="@dimen/dimen32dp" app:cardCornerRadius="@dimen/dimen16dp"
app:cardElevation="@dimen/dimen0dp"> app:cardElevation="@dimen/dimen0dp">
<ImageView <ImageView
@ -57,7 +57,7 @@
android:layout_gravity="end" android:layout_gravity="end"
android:visibility="gone" android:visibility="gone"
app:cardBackgroundColor="?attr/materialCardBackgroundColor" app:cardBackgroundColor="?attr/materialCardBackgroundColor"
app:cardCornerRadius="@dimen/dimen20dp" app:cardCornerRadius="@dimen/dimen12dp"
app:cardElevation="@dimen/dimen0dp" app:cardElevation="@dimen/dimen0dp"
app:contentPaddingLeft="@dimen/dimen8dp" app:contentPaddingLeft="@dimen/dimen8dp"
app:contentPaddingRight="@dimen/dimen8dp" app:contentPaddingRight="@dimen/dimen8dp"

View File

@ -10,7 +10,6 @@
<item android:id="@+id/nav_dashboard" <item android:id="@+id/nav_dashboard"
android:icon="@drawable/ic_dashboard" android:icon="@drawable/ic_dashboard"
android:title="@string/dashboard" android:title="@string/dashboard"
app:actionLayout="@layout/badge_beta"
android:visible="false"/> android:visible="false"/>
<item android:id="@+id/nav_home" <item android:id="@+id/nav_home"
@ -35,8 +34,7 @@
<item android:id="@+id/nav_my_issues" <item android:id="@+id/nav_my_issues"
android:icon="@drawable/ic_issue" android:icon="@drawable/ic_issue"
android:title="@string/navMyIssues" android:title="@string/navMyIssues"/>
android:visible="false"/>
<item <item
android:id="@+id/nav_notifications" android:id="@+id/nav_notifications"

View File

@ -270,6 +270,10 @@
<string name="restoreError">An error occurred while restoring from the backup file.</string> <string name="restoreError">An error occurred while restoring from the backup file.</string>
<string name="restoreFromBackup">Restore from Backup</string> <string name="restoreFromBackup">Restore from Backup</string>
<string name="restoreFromBackupPopupText">You are about to restore from a GitNex-generated backup file. This will restore user accounts, settings, notes, and data related to repositories.\n\nClick Restore to start the process.</string> <string name="restoreFromBackupPopupText">You are about to restore from a GitNex-generated backup file. This will restore user accounts, settings, notes, and data related to repositories.\n\nClick Restore to start the process.</string>
<string name="hideEmailLangInProfileHeader">Set Email and Language as Private</string>
<string name="hideEmailLangInProfileHint">You can set your email and language to private to hide them on your profile screen</string>
<string name="hideEmailNavDrawerHeader">Hide Email in Drawer</string>
<string name="hideEmailNavDrawerHint">You can enable this option to hide your email in the app navigation drawer</string>
<!-- settings --> <!-- settings -->
<string name="noMoreData">No more data available</string> <string name="noMoreData">No more data available</string>
@ -452,6 +456,7 @@
<string name="repoWatchersInMenu">Watchers</string> <string name="repoWatchersInMenu">Watchers</string>
<string name="noDataWebsite">No website found</string> <string name="noDataWebsite">No website found</string>
<string name="noDataDescription">No description found</string> <string name="noDataDescription">No description found</string>
<string name="noDataBio">No bio found</string>
<string name="noDataLocation">No location found</string> <string name="noDataLocation">No location found</string>
<string name="starMember">Star</string> <string name="starMember">Star</string>
<string name="watcherMember">Watcher</string> <string name="watcherMember">Watcher</string>
@ -550,6 +555,7 @@
<string name="license">License</string> <string name="license">License</string>
<string name="title">Title</string> <string name="title">Title</string>
<string name="description">Description</string> <string name="description">Description</string>
<string name="bioText">Bio</string>
<!-- generic copy --> <!-- generic copy -->
<string name="exploreUsers">Explore users</string> <string name="exploreUsers">Explore users</string>

View File

@ -1,15 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<changelog> <changelog>
<release version="5.5.0" versioncode="550"> <release version="6.0.0-dev" versioncode="595">
<change>New: Update user avatar</change> <change>Under development</change>
<change>New: New popup screen to add email</change>
<change>New: Insert note to issue/pr/release description</change>
<change>New: New reply/comment UI</change>
<change>Improvement: Hide app contents when biometric is enabled</change>
<change>Bugfix: Fix back button closing the app</change>
<change>Bugfix: Fix profile fields data</change>
<change>Bugfix: Fix text color highlighting</change>
</release> </release>
</changelog> </changelog>

View File

@ -20,5 +20,5 @@ allprojects {
} }
tasks.register('clean', Delete) { tasks.register('clean', Delete) {
delete rootProject.buildDir delete rootProject.layout.buildDirectory
} }