Compare commits

...

55 Commits
2.0.0 ... 2.1.2

Author SHA1 Message Date
22b3802e73 Merge branch 'fixes-2.1.2' of mmarif/GitNex into release-2.1 2019-10-03 16:45:36 +00:00
07a1fa6aad Fix crashes on my repo, starred repos etc - 2.1.2 release 2019-10-03 21:43:33 +05:00
4904b5899f Merge branch 'fixes-2.1' of mmarif/GitNex into release-2.1 2019-10-02 17:26:30 +00:00
f19327431f fix bugs since 2.1.0 release 2019-10-02 22:24:02 +05:00
8b26355fc0 Merge branch 'prepare-release' of mmarif/GitNex into master 2019-10-01 15:35:05 +00:00
8effad46f8 app release 2.1.0 2019-10-01 20:31:01 +05:00
53efd8b777 Merge branch '79-repo-avatar' of mmarif/GitNex into master 2019-10-01 13:59:59 +00:00
19cd5b6c5e added repos avatars 2019-10-01 18:56:20 +05:00
69082b424a Merge branch '54-enable-disable-create-issue' of mmarif/GitNex into master 2019-10-01 13:07:58 +00:00
d8b3477940 check if repo issues is enalbed or disabled 2019-10-01 18:05:09 +05:00
34892e7f43 Merge branch 'fix-ms-bar' of mmarif/GitNex into master 2019-10-01 10:26:03 +00:00
d64b035d4a fix ms progress bar 2019-10-01 15:23:49 +05:00
e2fa79b2a9 Merge branch 'master' of gitea.com:mmarif/GitNex 2019-10-01 15:06:46 +05:00
9e658aa38c 63-ms-ui (#82) 2019-10-01 10:05:26 +00:00
e4700ffd69 Merge branch 'master' of gitea.com:mmarif/GitNex 2019-10-01 11:44:45 +05:00
e53ef41fc1 ui-improvements (#81) 2019-10-01 06:42:56 +00:00
c05e69cfe9 t 2019-10-01 10:23:50 +05:00
5c6d5177fb r 2019-10-01 10:14:54 +05:00
62a5452437 Merge branch 'master' of gitea.com:mmarif/GitNex
# Conflicts:
#	app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java
#	app/src/main/java/org/mian/gitnex/activities/MainActivity.java
#	app/src/main/java/org/mian/gitnex/adapters/AdminGetUsersAdapter.java
#	app/src/main/java/org/mian/gitnex/adapters/CollaboratorsAdapter.java
#	app/src/main/java/org/mian/gitnex/adapters/IssueCommentsAdapter.java
#	app/src/main/java/org/mian/gitnex/adapters/MembersByOrgAdapter.java
#	app/src/main/java/org/mian/gitnex/adapters/MyReposListAdapter.java
#	app/src/main/java/org/mian/gitnex/adapters/OrganizationsListAdapter.java
#	app/src/main/java/org/mian/gitnex/adapters/ProfileFollowersAdapter.java
#	app/src/main/java/org/mian/gitnex/adapters/ProfileFollowingAdapter.java
#	app/src/main/java/org/mian/gitnex/adapters/ReposListAdapter.java
#	app/src/main/java/org/mian/gitnex/adapters/RepositoriesByOrgAdapter.java
#	app/src/main/java/org/mian/gitnex/adapters/StarredReposListAdapter.java
#	app/src/main/java/org/mian/gitnex/adapters/TeamMembersByOrgAdapter.java
#	app/src/main/java/org/mian/gitnex/adapters/UserSearchAdapter.java
#	app/src/main/java/org/mian/gitnex/fragments/OrganizationInfoFragment.java
#	app/src/main/java/org/mian/gitnex/fragments/ProfileFragment.java
#	app/src/main/res/layout/activity_issue_detail.xml
#	app/src/main/res/layout/admin_users_list.xml
#	app/src/main/res/layout/fragment_profile.xml
#	app/src/main/res/layout/issue_comments.xml
#	app/src/main/res/layout/my_repos_list.xml
#	app/src/main/res/layout/nav_header.xml
#	app/src/main/res/layout/organizations_list.xml
#	app/src/main/res/layout/profile_followers_list.xml
#	app/src/main/res/layout/profile_following_list.xml
#	app/src/main/res/layout/repos_list.xml
#	app/src/main/res/layout/repositories_by_org_list.xml
#	app/src/main/res/layout/starred_repos_list.xml
2019-10-01 10:14:45 +05:00
5f402c2c60 merge 2019-10-01 10:12:18 +05:00
85140fbee0 Merge branch '77-ui-changes' of mmarif/GitNex into master 2019-09-30 18:16:24 +00:00
d350fe96d9 Merge branch 'master' into 77-ui-changes 2019-09-30 23:14:04 +05:00
61a1a4446f Merge branch '62-improve-issues-ui' of mmarif/GitNex into master 2019-09-30 18:09:47 +00:00
c1e27c9776 Merge branch 'issue-copy-nr' of 6543/GitNex into master 2019-09-30 18:07:25 +00:00
03ec591643 more ui changes 2019-09-30 22:48:52 +05:00
3ebc1ae3e0 avatars improvements 2019-09-30 22:39:33 +05:00
3c8fb5bc60 markdown code cleanup 2019-09-30 21:21:51 +05:00
5503fe9951 Redid the issues list ui and some clean up 2019-09-30 21:12:45 +05:00
7f417da6b3 update libs, switch to io.notis for md. refactor all the markdown code 2019-09-29 21:44:42 +05:00
4e8a961643 copyIssue -> copyIssueUrl 2019-09-29 00:56:48 +02:00
bf5527a82d issue -> issueUrl 2019-09-29 00:10:28 +02:00
c31cf53023 Merge branch 'milestoneProgress' of 6543/GitNex into master 2019-09-28 18:15:41 +00:00
0ac2a27549 all milestones look similar 2019-09-27 23:58:23 +02:00
dcabfa4f14 add Progress Bar function 2019-09-27 23:32:31 +02:00
9688c75106 add progress bar to layout 2019-09-27 22:52:29 +02:00
71bb8cc75d add copy function 2019-09-27 21:17:28 +02:00
dcd28e845a add Copy to Clipboard String 2019-09-27 19:12:19 +02:00
b3e88b0a9d add content copy icon 2019-09-27 18:50:05 +02:00
ce67f59753 Merge branch '67-filter-icon' of mmarif/GitNex into master 2019-09-26 19:09:16 +00:00
d0b6730de4 change search icon/text to filter 2019-09-26 23:58:36 +05:00
f5e18ed5cc Merge branch 'dl-apk-buton' of 6543/GitNex into master 2019-09-23 18:38:31 +00:00
88394e1c25 Merge branch 'translate_german' of IndeedNotJames/GitNex into master 2019-09-23 18:19:01 +00:00
a9030eb8c9 Bump requred Gitea Version 2019-09-22 18:05:54 +02:00
fff307d45a test look 2019-09-22 17:48:41 +02:00
b64ee37edd add release badge 2019-09-22 17:40:18 +02:00
b4b3c2f5ee add download apk sing from website 2019-09-22 16:49:07 +02:00
8f3ef29f44 complete german translation 2019-09-21 20:50:33 +02:00
d00691d71b Merge branch 'new-font-testing' of mmarif/GitNex into master 2019-09-19 06:35:28 +00:00
4867524b4f Merge branch 'master' into new-font-testing 2019-09-19 11:28:07 +05:00
a59e818aa2 Merge branch 'master' into new-font-testing 2019-09-19 11:27:09 +05:00
aeca4a0edb Merge branch 'fix-open-issue-tab' of mmarif/GitNex into master 2019-09-19 06:22:57 +00:00
2c60f092f1 Fix open issues tab color bug, dim color for info tab headers 2019-09-19 11:21:15 +05:00
fe0b3a77cc Merge branch 'minor-enhancements' of mmarif/GitNex into master 2019-09-19 05:38:26 +00:00
43c014948a Repo label and info tabs fixes 2019-09-19 10:36:55 +05:00
a497e0a284 new font 2019-09-19 10:10:12 +05:00
78 changed files with 1237 additions and 851 deletions

View File

@ -1,6 +1,8 @@
[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) [![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
[![Release](https://img.shields.io/badge/dynamic/json.svg?label=release&url=https://gitea.com/api/v1/repos/mmarif/GitNex/releases&query=$[0].tag_name)](https://gitea.com/mmarif/GitNex/releases)
[<img alt="Become a Patroen" src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" height="40"/>](https://www.patreon.com/mmarif) [<img alt="Donate using Liberapay" src="https://liberapay.com/assets/widgets/donate.svg"/>](https://liberapay.com/mmarif/donate) [<img alt="Become a Patroen" src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" height="40"/>](https://www.patreon.com/mmarif)
[<img alt="Donate using Liberapay" src="https://liberapay.com/assets/widgets/donate.svg" height="40"/>](https://liberapay.com/mmarif/donate)
# GitNex - Android client for Gitea # GitNex - Android client for Gitea
@ -10,10 +12,12 @@ GitNex is licensed under GPLv3 License. See the LICENSE file for the full licens
No trackers are used and source code is available here for anyone to audit. No trackers are used and source code is available here for anyone to audit.
## Downloads ## Downloads
[<img alt='Get it on F-droid' src='https://gitlab.com/fdroid/artwork/raw/master/badge/get-it-on.png' height="80"/>](https://f-droid.org/en/packages/org.mian.gitnex/) [<img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png' height="80"/>](https://play.google.com/store/apps/details?id=org.mian.gitnex) [Download APK](https://gitea.com/mmarif/GitNex/releases) [<img alt='Get it on F-droid' src='https://gitlab.com/fdroid/artwork/raw/master/badge/get-it-on.png' height="80"/>](https://f-droid.org/en/packages/org.mian.gitnex/)
[<img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png' height="80"/>](https://play.google.com/store/apps/details?id=org.mian.gitnex)
[<img alt='Download APK' src='https://gitnex.com/img/download-apk.png' height="80"/>](https://gitea.com/mmarif/GitNex/releases)
## Note about Gitea version ## Note about Gitea version
Please make sure that you are on Gitea **1.7.x** stable release or later. Below this may not work as one would expect because of the newly added objects to the API at later versions. Please consider updating your Gitea server. Please make sure that you are on Gitea **1.9.x** stable release or later. Below this may not work as one would expect because of the newly added objects to the API at later versions. Please consider updating your Gitea server.
Check the versions [compatibility page](https://gitea.com/mmarif/GitNex/wiki/Compatibility) which lists all the supported versions with compatibility ratio. Check the versions [compatibility page](https://gitea.com/mmarif/GitNex/wiki/Compatibility) which lists all the supported versions with compatibility ratio.

View File

@ -6,8 +6,8 @@ android {
applicationId "org.mian.gitnex" applicationId "org.mian.gitnex"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 28 targetSdkVersion 28
versionCode 55 versionCode 62
versionName "2.0.0" versionName "2.1.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }
buildTypes { buildTypes {
@ -23,8 +23,8 @@ android {
} }
dependencies { dependencies {
def lifecycle_version = "2.2.0-alpha04" def lifecycle_version = "2.2.0-alpha05"
final def markwon_version = "3.0.0" final def markwon_version = "4.1.1"
implementation fileTree(include: ['*.jar'], dir: 'libs') implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.appcompat:appcompat:1.1.0'
@ -47,17 +47,21 @@ dependencies {
implementation "com.vdurmont:emoji-java:4.0.0" implementation "com.vdurmont:emoji-java:4.0.0"
implementation "com.pes.materialcolorpicker:library:1.2.5" implementation "com.pes.materialcolorpicker:library:1.2.5"
implementation "ru.noties.markwon:core:$markwon_version" implementation "io.noties.markwon:core:$markwon_version"
implementation "ru.noties.markwon:ext-strikethrough:$markwon_version" implementation "io.noties.markwon:ext-latex:$markwon_version"
implementation "ru.noties.markwon:ext-tables:$markwon_version" implementation "io.noties.markwon:ext-strikethrough:$markwon_version"
implementation "ru.noties.markwon:ext-tasklist:$markwon_version" implementation "io.noties.markwon:ext-tables:$markwon_version"
implementation "ru.noties.markwon:syntax-highlight:$markwon_version" implementation "io.noties.markwon:ext-tasklist:$markwon_version"
implementation "ru.noties.markwon:image-okhttp:$markwon_version" implementation "io.noties.markwon:html:$markwon_version"
implementation "ru.noties.markwon:html:$markwon_version" implementation "io.noties.markwon:image:$markwon_version"
implementation "ru.noties.markwon:recycler:$markwon_version" implementation "io.noties.markwon:image-picasso:$markwon_version"
implementation "ru.noties.markwon:recycler-table:$markwon_version" implementation "io.noties.markwon:linkify:$markwon_version"
implementation "ru.noties.markwon:image-gif:$markwon_version" implementation "io.noties.markwon:recycler:$markwon_version"
implementation "ru.noties.markwon:image-svg:$markwon_version" implementation "io.noties.markwon:recycler-table:$markwon_version"
implementation "io.noties.markwon:simple-ext:$markwon_version"
implementation "io.noties.markwon:syntax-highlight:$markwon_version"
implementation "com.caverock:androidsvg:1.4"
implementation "pl.droidsonroids.gif:android-gif-drawable:1.2.14"
implementation "com.hendraanggrian.appcompat:socialview:0.2" implementation "com.hendraanggrian.appcompat:socialview:0.2"
implementation "com.hendraanggrian.appcompat:socialview-commons:0.2" implementation "com.hendraanggrian.appcompat:socialview-commons:0.2"

View File

@ -323,10 +323,11 @@ public class CreateIssueActivity extends AppCompatActivity implements View.OnCli
private void getMilestones(String instanceUrl, String instanceToken, String repoOwner, String repoName, String loginUid) { private void getMilestones(String instanceUrl, String instanceToken, String repoOwner, String repoName, String loginUid) {
String msState = "open";
Call<List<Milestones>> call = RetrofitClient Call<List<Milestones>> call = RetrofitClient
.getInstance(instanceUrl) .getInstance(instanceUrl)
.getApiInterface() .getApiInterface()
.getMilestones(Authorization.returnAuthentication(getApplicationContext(), loginUid, instanceToken), repoOwner, repoName); .getMilestones(Authorization.returnAuthentication(getApplicationContext(), loginUid, instanceToken), repoOwner, repoName, msState);
call.enqueue(new Callback<List<Milestones>>() { call.enqueue(new Callback<List<Milestones>>() {

View File

@ -56,6 +56,8 @@ public class EditIssueActivity extends AppCompatActivity implements View.OnClick
private Button editIssueButton; private Button editIssueButton;
private Spinner editIssueMilestoneSpinner; private Spinner editIssueMilestoneSpinner;
private String msState = "open";
List<Milestones> milestonesList = new ArrayList<>(); List<Milestones> milestonesList = new ArrayList<>();
private ArrayAdapter<Mention> defaultMentionAdapter; private ArrayAdapter<Mention> defaultMentionAdapter;
@ -331,7 +333,7 @@ public class EditIssueActivity extends AppCompatActivity implements View.OnClick
Call<List<Milestones>> call_ = RetrofitClient Call<List<Milestones>> call_ = RetrofitClient
.getInstance(instanceUrl) .getInstance(instanceUrl)
.getApiInterface() .getApiInterface()
.getMilestones(Authorization.returnAuthentication(getApplicationContext(), loginUid, instanceToken), repoOwner, repoName); .getMilestones(Authorization.returnAuthentication(getApplicationContext(), loginUid, instanceToken), repoOwner, repoName, msState);
final int finalMsId = msId; final int finalMsId = msId;

View File

@ -10,26 +10,33 @@ import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import okhttp3.OkHttpClient; import io.noties.markwon.AbstractMarkwonPlugin;
import io.noties.markwon.Markwon;
import io.noties.markwon.core.CorePlugin;
import io.noties.markwon.core.MarkwonTheme;
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
import io.noties.markwon.ext.tables.TablePlugin;
import io.noties.markwon.ext.tasklist.TaskListPlugin;
import io.noties.markwon.html.HtmlPlugin;
import io.noties.markwon.image.AsyncDrawable;
import io.noties.markwon.image.DefaultMediaDecoder;
import io.noties.markwon.image.ImageItem;
import io.noties.markwon.image.ImagesPlugin;
import io.noties.markwon.image.SchemeHandler;
import io.noties.markwon.image.gif.GifMediaDecoder;
import io.noties.markwon.image.svg.SvgMediaDecoder;
import io.noties.markwon.linkify.LinkifyPlugin;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
import retrofit2.Response; import retrofit2.Response;
import ru.noties.markwon.AbstractMarkwonPlugin;
import ru.noties.markwon.Markwon;
import ru.noties.markwon.core.CorePlugin;
import ru.noties.markwon.core.MarkwonTheme;
import ru.noties.markwon.ext.strikethrough.StrikethroughPlugin;
import ru.noties.markwon.ext.tables.TablePlugin;
import ru.noties.markwon.ext.tasklist.TaskListPlugin;
import ru.noties.markwon.html.HtmlPlugin;
import ru.noties.markwon.image.ImagesPlugin;
import ru.noties.markwon.image.gif.GifPlugin;
import ru.noties.markwon.image.okhttp.OkHttpImagesPlugin;
import android.content.Context; import android.content.Context;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.text.Spanned;
import android.util.Log; import android.util.Log;
import android.view.Gravity; import android.view.Gravity;
import android.view.Menu; import android.view.Menu;
@ -63,6 +70,8 @@ import org.mian.gitnex.viewmodels.IssueCommentsViewModel;
import org.ocpsoft.prettytime.PrettyTime; import org.ocpsoft.prettytime.PrettyTime;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects; import java.util.Objects;
@ -286,22 +295,60 @@ public class IssueDetailActivity extends AppCompatActivity {
final Markwon markwon = Markwon.builder(Objects.requireNonNull(getApplicationContext())) final Markwon markwon = Markwon.builder(Objects.requireNonNull(getApplicationContext()))
.usePlugin(CorePlugin.create()) .usePlugin(CorePlugin.create())
.usePlugin(OkHttpImagesPlugin.create(new OkHttpClient())) .usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
.usePlugin(ImagesPlugin.createWithAssets(getApplicationContext())) @Override
public void configureImages(@NonNull ImagesPlugin plugin) {
plugin.addSchemeHandler(new SchemeHandler() {
@NonNull
@Override
public ImageItem handle(@NonNull String raw, @NonNull Uri uri) {
final int resourceId = getApplicationContext().getResources().getIdentifier(
raw.substring("drawable://".length()),
"drawable",
getApplicationContext().getPackageName());
final Drawable drawable = getApplicationContext().getDrawable(resourceId);
assert drawable != null;
return ImageItem.withResult(drawable);
}
@NonNull
@Override
public Collection<String> supportedSchemes() {
return Collections.singleton("drawable");
}
});
plugin.placeholderProvider(new ImagesPlugin.PlaceholderProvider() {
@Nullable
@Override
public Drawable providePlaceholder(@NonNull AsyncDrawable drawable) {
return null;
}
});
plugin.addMediaDecoder(GifMediaDecoder.create(false));
plugin.addMediaDecoder(SvgMediaDecoder.create(getApplicationContext().getResources()));
plugin.addMediaDecoder(SvgMediaDecoder.create());
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(getApplicationContext().getResources()));
plugin.defaultMediaDecoder(DefaultMediaDecoder.create());
}
}))
.usePlugin(new AbstractMarkwonPlugin() { .usePlugin(new AbstractMarkwonPlugin() {
@Override @Override
public void configureTheme(@NonNull MarkwonTheme.Builder builder) { public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
builder builder
.codeTextColor(tinyDb.getInt("codeBlockColor")) .codeTextColor(tinyDb.getInt("codeBlockColor"))
.codeBackgroundColor(tinyDb.getInt("codeBlockBackground")) .codeBackgroundColor(tinyDb.getInt("codeBlockBackground"))
.linkColor(getApplicationContext().getResources().getColor(R.color.lightBlue)); .linkColor(getResources().getColor(R.color.lightBlue));
} }
}) })
.usePlugin(TablePlugin.create(getApplicationContext())) .usePlugin(TablePlugin.create(getApplicationContext()))
.usePlugin(TaskListPlugin.create(getApplicationContext())) .usePlugin(TaskListPlugin.create(getApplicationContext()))
.usePlugin(HtmlPlugin.create()) .usePlugin(HtmlPlugin.create())
.usePlugin(GifPlugin.create())
.usePlugin(StrikethroughPlugin.create()) .usePlugin(StrikethroughPlugin.create())
.usePlugin(LinkifyPlugin.create())
.build(); .build();
TinyDB tinyDb = new TinyDB(getApplicationContext()); TinyDB tinyDb = new TinyDB(getApplicationContext());
@ -310,11 +357,11 @@ public class IssueDetailActivity extends AppCompatActivity {
tinyDb.putString("issueState", singleIssue.getState()); tinyDb.putString("issueState", singleIssue.getState());
tinyDb.putString("issueTitle", singleIssue.getTitle()); tinyDb.putString("issueTitle", singleIssue.getTitle());
Picasso.get().load(singleIssue.getUser().getAvatar_url()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(assigneeAvatar); Picasso.get().load(singleIssue.getUser().getAvatar_url()).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(assigneeAvatar);
issueTitle.setText(getString(R.string.issueTitleWithId, singleIssue.getNumber(), singleIssue.getTitle())); issueTitle.setText(getString(R.string.issueTitleWithId, singleIssue.getNumber(), singleIssue.getTitle()));
String cleanIssueDescription = singleIssue.getBody().trim(); String cleanIssueDescription = singleIssue.getBody().trim();
final CharSequence bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(cleanIssueDescription)); Spanned bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(cleanIssueDescription));
issueDescription.setText(UserMentions.UserMentionsFunc(getApplicationContext(), bodyWithMD, cleanIssueDescription)); markwon.setParsedMarkdown(issueDescription, UserMentions.UserMentionsFunc(getApplicationContext(), bodyWithMD, cleanIssueDescription));
RelativeLayout.LayoutParams paramsDesc = (RelativeLayout.LayoutParams)issueDescription.getLayoutParams(); RelativeLayout.LayoutParams paramsDesc = (RelativeLayout.LayoutParams)issueDescription.getLayoutParams();
@ -327,7 +374,7 @@ public class IssueDetailActivity extends AppCompatActivity {
ImageView assigneesView = new ImageView(getApplicationContext()); ImageView assigneesView = new ImageView(getApplicationContext());
Picasso.get().load(singleIssue.getAssignees().get(i).getAvatar_url()).transform(new RoundedTransformation(100, 0)).resize(80, 80).centerCrop().into(assigneesView); Picasso.get().load(singleIssue.getAssignees().get(i).getAvatar_url()).transform(new RoundedTransformation(8, 0)).resize(100, 100).centerCrop().into(assigneesView);
assigneesLayout.addView(assigneesView); assigneesLayout.addView(assigneesView);
assigneesView.setLayoutParams(params1); assigneesView.setLayoutParams(params1);
@ -431,7 +478,7 @@ public class IssueDetailActivity extends AppCompatActivity {
case "pretty": { case "pretty": {
PrettyTime prettyTime = new PrettyTime(new Locale(locale)); PrettyTime prettyTime = new PrettyTime(new Locale(locale));
String createdTime = prettyTime.format(singleIssue.getCreated_at()); String createdTime = prettyTime.format(singleIssue.getCreated_at());
issueCreatedTime.setText(getString(R.string.createdTime, createdTime)); issueCreatedTime.setText(createdTime);
issueCreatedTime.setVisibility(View.VISIBLE); issueCreatedTime.setVisibility(View.VISIBLE);
issueCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(singleIssue.getCreated_at()), getApplicationContext())); issueCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(singleIssue.getCreated_at()), getApplicationContext()));
break; break;
@ -439,14 +486,14 @@ public class IssueDetailActivity extends AppCompatActivity {
case "normal": { case "normal": {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
String createdTime = formatter.format(singleIssue.getCreated_at()); String createdTime = formatter.format(singleIssue.getCreated_at());
issueCreatedTime.setText(getString(R.string.createdTime, createdTime)); issueCreatedTime.setText(createdTime);
issueCreatedTime.setVisibility(View.VISIBLE); issueCreatedTime.setVisibility(View.VISIBLE);
break; break;
} }
case "normal1": { case "normal1": {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
String createdTime = formatter.format(singleIssue.getCreated_at()); String createdTime = formatter.format(singleIssue.getCreated_at());
issueCreatedTime.setText(getString(R.string.createdTime, createdTime)); issueCreatedTime.setText(createdTime);
issueCreatedTime.setVisibility(View.VISIBLE); issueCreatedTime.setVisibility(View.VISIBLE);
break; break;
} }

View File

@ -148,7 +148,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
userAvatar = hView.findViewById(R.id.userAvatar); userAvatar = hView.findViewById(R.id.userAvatar);
if (!userAvatarNav.equals("")) { if (!userAvatarNav.equals("")) {
Picasso.get().load(userAvatarNav).networkPolicy(NetworkPolicy.OFFLINE).transform(new RoundedTransformation(100, 0)).resize(180, 180).centerCrop().into(userAvatar); Picasso.get().load(userAvatarNav).networkPolicy(NetworkPolicy.OFFLINE).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(userAvatar);
} }
} else { } else {
@ -354,7 +354,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
userAvatar = hView.findViewById(R.id.userAvatar); userAvatar = hView.findViewById(R.id.userAvatar);
if (!Objects.requireNonNull(userDetails).getAvatar().equals("")) { if (!Objects.requireNonNull(userDetails).getAvatar().equals("")) {
Picasso.get().load(userDetails.getAvatar()).transform(new RoundedTransformation(100, 0)).resize(180, 180).centerCrop().into(userAvatar); Picasso.get().load(userDetails.getAvatar()).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(userAvatar);
} else { } else {
userAvatar.setImageResource(R.mipmap.ic_launcher_round); userAvatar.setImageResource(R.mipmap.ic_launcher_round);
} }

View File

@ -10,7 +10,9 @@ import androidx.fragment.app.FragmentStatePagerAdapter;
import androidx.viewpager.widget.ViewPager; import androidx.viewpager.widget.ViewPager;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
import android.annotation.SuppressLint;
import android.content.Intent; import android.content.Intent;
import android.content.res.ColorStateList;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -80,13 +82,19 @@ public class RepoDetailActivity extends AppCompatActivity implements RepoBottomS
if(tinyDb.getBoolean("enableCounterIssueBadge")) { if(tinyDb.getBoolean("enableCounterIssueBadge")) {
View tabHeader = LayoutInflater.from(this).inflate(R.layout.badge, null); @SuppressLint("InflateParams") View tabHeader = LayoutInflater.from(this).inflate(R.layout.badge, null);
textViewBadge = tabHeader.findViewById(R.id.counterBadge); textViewBadge = tabHeader.findViewById(R.id.counterBadge);
if(!tinyDb.getString("issuesCounter").isEmpty()) { if(!tinyDb.getString("issuesCounter").isEmpty()) {
getRepoInfo(instanceUrl, Authorization.returnAuthentication(getApplicationContext(), loginUid, instanceToken), repoOwner, repoName1); getRepoInfo(instanceUrl, Authorization.returnAuthentication(getApplicationContext(), loginUid, instanceToken), repoOwner, repoName1);
} }
Objects.requireNonNull(tabLayout.getTabAt(1)).setCustomView(tabHeader); Objects.requireNonNull(tabLayout.getTabAt(1)).setCustomView(tabHeader);
TabLayout.Tab tabOpenIssues = tabLayout.getTabAt(1);
ColorStateList textColor = tabLayout.getTabTextColors();
assert tabOpenIssues != null;
TextView openIssueTabView = Objects.requireNonNull(tabOpenIssues.getCustomView()).findViewById(R.id.counterBadgeText);
openIssueTabView.setTextColor(textColor);
} }
} }

View File

@ -98,7 +98,7 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter<AdminGetUsersAdap
holder.userRole.setVisibility(View.GONE); holder.userRole.setVisibility(View.GONE);
} }
Picasso.get().load(currentItem.getAvatar()).transform(new RoundedTransformation(100, 0)).resize(140, 140).centerCrop().into(holder.userAvatar); Picasso.get().load(currentItem.getAvatar()).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(holder.userAvatar);
} }
@Override @Override

View File

@ -3,22 +3,21 @@ package org.mian.gitnex.adapters;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Color; import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Filter; import android.widget.Filter;
import android.widget.Filterable; import android.widget.Filterable;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import com.squareup.picasso.Picasso; import com.squareup.picasso.Picasso;
import com.vdurmont.emoji.EmojiParser;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.IssueDetailActivity; import org.mian.gitnex.activities.IssueDetailActivity;
import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.ClickListener;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.UserMentions;
import org.mian.gitnex.models.Issues; import org.mian.gitnex.models.Issues;
import org.mian.gitnex.util.TinyDB; import org.mian.gitnex.util.TinyDB;
import org.ocpsoft.prettytime.PrettyTime; import org.ocpsoft.prettytime.PrettyTime;
@ -27,22 +26,8 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import okhttp3.OkHttpClient;
import ru.noties.markwon.AbstractMarkwonPlugin;
import ru.noties.markwon.Markwon;
import ru.noties.markwon.core.CorePlugin;
import ru.noties.markwon.core.MarkwonTheme;
import ru.noties.markwon.ext.strikethrough.StrikethroughPlugin;
import ru.noties.markwon.ext.tables.TablePlugin;
import ru.noties.markwon.ext.tables.TableTheme;
import ru.noties.markwon.ext.tasklist.TaskListPlugin;
import ru.noties.markwon.html.HtmlPlugin;
import ru.noties.markwon.image.ImagesPlugin;
import ru.noties.markwon.image.gif.GifPlugin;
import ru.noties.markwon.image.okhttp.OkHttpImagesPlugin;
/** /**
* Author M M Arif * Author M M Arif
@ -122,8 +107,6 @@ public class ClosedIssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
private TextView issueNumber; private TextView issueNumber;
private ImageView issueAssigneeAvatar; private ImageView issueAssigneeAvatar;
private TextView issueTitle; private TextView issueTitle;
private TextView issueDescription;
//private ImageView issueState;
private TextView issueCreatedTime; private TextView issueCreatedTime;
private TextView issueCommentsCount; private TextView issueCommentsCount;
private ImageView issueType; private ImageView issueType;
@ -135,9 +118,8 @@ public class ClosedIssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
issueNumber = itemView.findViewById(R.id.issueNumber); issueNumber = itemView.findViewById(R.id.issueNumber);
issueAssigneeAvatar = itemView.findViewById(R.id.assigneeAvatar); issueAssigneeAvatar = itemView.findViewById(R.id.assigneeAvatar);
issueTitle = itemView.findViewById(R.id.issueTitle); issueTitle = itemView.findViewById(R.id.issueTitle);
issueDescription = itemView.findViewById(R.id.issueDescription);
issueCommentsCount = itemView.findViewById(R.id.issueCommentsCount); issueCommentsCount = itemView.findViewById(R.id.issueCommentsCount);
//issueState = itemView.findViewById(R.id.issueStatus); LinearLayout frameCommentsCount = itemView.findViewById(R.id.frameCommentsCount);
issueCreatedTime = itemView.findViewById(R.id.issueCreatedTime); issueCreatedTime = itemView.findViewById(R.id.issueCreatedTime);
issueType = itemView.findViewById(R.id.issueType); issueType = itemView.findViewById(R.id.issueType);
@ -157,7 +139,7 @@ public class ClosedIssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
} }
}); });
issueDescription.setOnClickListener(new View.OnClickListener() { frameCommentsCount.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
@ -183,26 +165,6 @@ public class ClosedIssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
final String locale = tinyDb.getString("locale"); final String locale = tinyDb.getString("locale");
final String timeFormat = tinyDb.getString("dateFormat"); final String timeFormat = tinyDb.getString("dateFormat");
final Markwon markwon = Markwon.builder(Objects.requireNonNull(context))
.usePlugin(CorePlugin.create())
.usePlugin(OkHttpImagesPlugin.create(new OkHttpClient()))
.usePlugin(ImagesPlugin.createWithAssets(context))
.usePlugin(new AbstractMarkwonPlugin() {
@Override
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
builder
.codeTextColor(tinyDb.getInt("codeBlockColor"))
.codeBackgroundColor(tinyDb.getInt("codeBlockBackground"))
.linkColor(context.getResources().getColor(R.color.lightBlue));
}
})
.usePlugin(TablePlugin.create(context))
.usePlugin(TaskListPlugin.create(context))
.usePlugin(HtmlPlugin.create())
.usePlugin(GifPlugin.create())
.usePlugin(StrikethroughPlugin.create())
.build();
if (!issuesModel.getUser().getFull_name().equals("")) { if (!issuesModel.getUser().getFull_name().equals("")) {
issueAssigneeAvatar.setOnClickListener(new ClickListener(context.getResources().getString(R.string.issueCreator) + issuesModel.getUser().getFull_name(), context)); issueAssigneeAvatar.setOnClickListener(new ClickListener(context.getResources().getString(R.string.issueCreator) + issuesModel.getUser().getFull_name(), context));
} else { } else {
@ -210,9 +172,9 @@ public class ClosedIssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
} }
if (issuesModel.getUser().getAvatar_url() != null) { if (issuesModel.getUser().getAvatar_url() != null) {
Picasso.get().load(issuesModel.getUser().getAvatar_url()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(issueAssigneeAvatar); Picasso.get().load(issuesModel.getUser().getAvatar_url()).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(issueAssigneeAvatar);
} else { } else {
Picasso.get().load(issuesModel.getUser().getAvatar_url()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(issueAssigneeAvatar); Picasso.get().load(issuesModel.getUser().getAvatar_url()).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(issueAssigneeAvatar);
} }
if (issuesModel.getPull_request() == null) { if (issuesModel.getPull_request() == null) {
@ -223,28 +185,12 @@ public class ClosedIssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
issueType.setOnClickListener(new ClickListener(context.getResources().getString(R.string.issueTypePullRequest), context)); issueType.setOnClickListener(new ClickListener(context.getResources().getString(R.string.issueTypePullRequest), context));
} }
issueTitle.setText(context.getResources().getString(R.string.hash) + issuesModel.getNumber() + " " + issuesModel.getTitle()); String issueNumber_ = "<font color='" + context.getResources().getColor(R.color.lightGray) + "'>" + context.getResources().getString(R.string.hash) + issuesModel.getNumber() + "</font>";
issueTitle.setText(Html.fromHtml(issueNumber_ + " " + issuesModel.getTitle()));
issueNumber.setText(String.valueOf(issuesModel.getNumber())); issueNumber.setText(String.valueOf(issuesModel.getNumber()));
issueCommentsCount.setText(String.valueOf(issuesModel.getComments())); issueCommentsCount.setText(String.valueOf(issuesModel.getComments()));
if (!issuesModel.getBody().equals("")) {
String cleanIssueDescription = issuesModel.getBody().trim();
issueDescription.setVisibility(View.VISIBLE);
final CharSequence bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(cleanIssueDescription));
issueDescription.setText(UserMentions.UserMentionsFunc(context, bodyWithMD, cleanIssueDescription));
}
else {
issueDescription.setText("");
issueDescription.setVisibility(View.GONE);
}
/*if (issuesModel.getState().equals("open")) {
issueState.setImageResource(R.drawable.ic_issue_open);
issueState.setOnClickListener(new ClickListener(context.getResources().getString(R.string.issueStatusTextOpen), context));
} else {
issueState.setImageResource(R.drawable.ic_issue_closed);
issueState.setOnClickListener(new ClickListener(context.getResources().getString(R.string.issueStatusTextClosed), context));
}*/
switch (timeFormat) { switch (timeFormat) {
case "pretty": { case "pretty": {
PrettyTime prettyTime = new PrettyTime(new Locale(locale)); PrettyTime prettyTime = new PrettyTime(new Locale(locale));

View File

@ -77,7 +77,7 @@ public class CollaboratorsAdapter extends BaseAdapter {
private void initData(ViewHolder viewHolder, int position) { private void initData(ViewHolder viewHolder, int position) {
Collaborators currentItem = collaboratorsList.get(position); Collaborators currentItem = collaboratorsList.get(position);
Picasso.get().load(currentItem.getAvatar_url()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(viewHolder.collaboratorAvatar); Picasso.get().load(currentItem.getAvatar_url()).transform(new RoundedTransformation(8, 0)).resize(180, 180).centerCrop().into(viewHolder.collaboratorAvatar);
if(!currentItem.getFull_name().equals("")) { if(!currentItem.getFull_name().equals("")) {
viewHolder.collaboratorName.setText(currentItem.getFull_name()); viewHolder.collaboratorName.setText(currentItem.getFull_name());

View File

@ -3,7 +3,9 @@ package org.mian.gitnex.adapters;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Color; import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.text.Spanned;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
@ -14,8 +16,8 @@ import com.squareup.picasso.Picasso;
import com.vdurmont.emoji.EmojiParser; import com.vdurmont.emoji.EmojiParser;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.ReplyToIssueActivity; import org.mian.gitnex.activities.ReplyToIssueActivity;
import org.mian.gitnex.helpers.UserMentions;
import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.UserMentions;
import org.mian.gitnex.models.IssueComments; import org.mian.gitnex.models.IssueComments;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.util.TinyDB; import org.mian.gitnex.util.TinyDB;
@ -24,26 +26,32 @@ import org.ocpsoft.prettytime.PrettyTime;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects; import java.util.Objects;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.view.ContextThemeWrapper; import androidx.appcompat.view.ContextThemeWrapper;
import androidx.appcompat.widget.PopupMenu; import androidx.appcompat.widget.PopupMenu;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import okhttp3.OkHttpClient; import io.noties.markwon.AbstractMarkwonPlugin;
import ru.noties.markwon.AbstractMarkwonPlugin; import io.noties.markwon.Markwon;
import ru.noties.markwon.Markwon; import io.noties.markwon.core.CorePlugin;
import ru.noties.markwon.core.CorePlugin; import io.noties.markwon.core.MarkwonTheme;
import ru.noties.markwon.core.MarkwonTheme; import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
import ru.noties.markwon.ext.strikethrough.StrikethroughPlugin; import io.noties.markwon.ext.tables.TablePlugin;
import ru.noties.markwon.ext.tables.TablePlugin; import io.noties.markwon.ext.tasklist.TaskListPlugin;
import ru.noties.markwon.ext.tables.TableTheme; import io.noties.markwon.html.HtmlPlugin;
import ru.noties.markwon.ext.tasklist.TaskListPlugin; import io.noties.markwon.image.AsyncDrawable;
import ru.noties.markwon.html.HtmlPlugin; import io.noties.markwon.image.DefaultMediaDecoder;
import ru.noties.markwon.image.ImagesPlugin; import io.noties.markwon.image.ImageItem;
import ru.noties.markwon.image.gif.GifPlugin; import io.noties.markwon.image.ImagesPlugin;
import ru.noties.markwon.image.okhttp.OkHttpImagesPlugin; import io.noties.markwon.image.SchemeHandler;
import io.noties.markwon.image.gif.GifMediaDecoder;
import io.noties.markwon.image.svg.SvgMediaDecoder;
import io.noties.markwon.linkify.LinkifyPlugin;
/** /**
* Author M M Arif * Author M M Arif
@ -171,34 +179,72 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
} }
if (currentItem.getUser().getAvatar_url() != null) { if (currentItem.getUser().getAvatar_url() != null) {
Picasso.get().load(currentItem.getUser().getAvatar_url()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(holder.issueCommenterAvatar); Picasso.get().load(currentItem.getUser().getAvatar_url()).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(holder.issueCommenterAvatar);
} else { } else {
Picasso.get().load(currentItem.getUser().getAvatar_url()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(holder.issueCommenterAvatar); Picasso.get().load(currentItem.getUser().getAvatar_url()).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(holder.issueCommenterAvatar);
} }
String cleanIssueComments = currentItem.getBody().trim(); String cleanIssueComments = currentItem.getBody().trim();
final Markwon markwon = Markwon.builder(Objects.requireNonNull(mCtx)) final Markwon markwon = Markwon.builder(Objects.requireNonNull(mCtx))
.usePlugin(CorePlugin.create()) .usePlugin(CorePlugin.create())
.usePlugin(OkHttpImagesPlugin.create(new OkHttpClient())) .usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
.usePlugin(ImagesPlugin.create(mCtx)) @Override
public void configureImages(@NonNull ImagesPlugin plugin) {
plugin.addSchemeHandler(new SchemeHandler() {
@NonNull
@Override
public ImageItem handle(@NonNull String raw, @NonNull Uri uri) {
final int resourceId = mCtx.getResources().getIdentifier(
raw.substring("drawable://".length()),
"drawable",
mCtx.getPackageName());
final Drawable drawable = mCtx.getDrawable(resourceId);
assert drawable != null;
return ImageItem.withResult(drawable);
}
@NonNull
@Override
public Collection<String> supportedSchemes() {
return Collections.singleton("drawable");
}
});
plugin.placeholderProvider(new ImagesPlugin.PlaceholderProvider() {
@Nullable
@Override
public Drawable providePlaceholder(@NonNull AsyncDrawable drawable) {
return null;
}
});
plugin.addMediaDecoder(GifMediaDecoder.create(false));
plugin.addMediaDecoder(SvgMediaDecoder.create(mCtx.getResources()));
plugin.addMediaDecoder(SvgMediaDecoder.create());
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(mCtx.getResources()));
plugin.defaultMediaDecoder(DefaultMediaDecoder.create());
}
}))
.usePlugin(new AbstractMarkwonPlugin() { .usePlugin(new AbstractMarkwonPlugin() {
@Override @Override
public void configureTheme(@NonNull MarkwonTheme.Builder builder) { public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
builder builder
.codeTextColor(tinyDb.getInt("codeBlockColor")) .codeTextColor(tinyDb.getInt("codeBlockColor"))
.codeBackgroundColor(tinyDb.getInt("codeBlockBackground")); .codeBackgroundColor(tinyDb.getInt("codeBlockBackground"))
.linkColor(mCtx.getResources().getColor(R.color.lightBlue));
} }
}) })
.usePlugin(TablePlugin.create(mCtx)) .usePlugin(TablePlugin.create(mCtx))
.usePlugin(TaskListPlugin.create(mCtx)) .usePlugin(TaskListPlugin.create(mCtx))
.usePlugin(HtmlPlugin.create()) .usePlugin(HtmlPlugin.create())
.usePlugin(GifPlugin.create())
.usePlugin(StrikethroughPlugin.create()) .usePlugin(StrikethroughPlugin.create())
.usePlugin(LinkifyPlugin.create())
.build(); .build();
final CharSequence bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(cleanIssueComments)); Spanned bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(cleanIssueComments));
holder.issueComment.setText(UserMentions.UserMentionsFunc(mCtx, bodyWithMD, cleanIssueComments)); markwon.setParsedMarkdown(holder.issueComment, UserMentions.UserMentionsFunc(mCtx, bodyWithMD, cleanIssueComments));
String edited; String edited;

View File

@ -3,22 +3,21 @@ package org.mian.gitnex.adapters;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Color; import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Filter; import android.widget.Filter;
import android.widget.Filterable; import android.widget.Filterable;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import com.squareup.picasso.Picasso; import com.squareup.picasso.Picasso;
import com.vdurmont.emoji.EmojiParser;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.IssueDetailActivity; import org.mian.gitnex.activities.IssueDetailActivity;
import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.ClickListener;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.UserMentions;
import org.mian.gitnex.models.Issues; import org.mian.gitnex.models.Issues;
import org.mian.gitnex.util.TinyDB; import org.mian.gitnex.util.TinyDB;
import org.ocpsoft.prettytime.PrettyTime; import org.ocpsoft.prettytime.PrettyTime;
@ -27,22 +26,8 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import okhttp3.OkHttpClient;
import ru.noties.markwon.AbstractMarkwonPlugin;
import ru.noties.markwon.Markwon;
import ru.noties.markwon.core.CorePlugin;
import ru.noties.markwon.core.MarkwonTheme;
import ru.noties.markwon.ext.strikethrough.StrikethroughPlugin;
import ru.noties.markwon.ext.tables.TablePlugin;
import ru.noties.markwon.ext.tables.TableTheme;
import ru.noties.markwon.ext.tasklist.TaskListPlugin;
import ru.noties.markwon.html.HtmlPlugin;
import ru.noties.markwon.image.ImagesPlugin;
import ru.noties.markwon.image.gif.GifPlugin;
import ru.noties.markwon.image.okhttp.OkHttpImagesPlugin;
/** /**
* Author M M Arif * Author M M Arif
@ -122,8 +107,6 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
private TextView issueNumber; private TextView issueNumber;
private ImageView issueAssigneeAvatar; private ImageView issueAssigneeAvatar;
private TextView issueTitle; private TextView issueTitle;
private TextView issueDescription;
//private ImageView issueState;
private TextView issueCreatedTime; private TextView issueCreatedTime;
private TextView issueCommentsCount; private TextView issueCommentsCount;
private ImageView issueType; private ImageView issueType;
@ -135,9 +118,8 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
issueNumber = itemView.findViewById(R.id.issueNumber); issueNumber = itemView.findViewById(R.id.issueNumber);
issueAssigneeAvatar = itemView.findViewById(R.id.assigneeAvatar); issueAssigneeAvatar = itemView.findViewById(R.id.assigneeAvatar);
issueTitle = itemView.findViewById(R.id.issueTitle); issueTitle = itemView.findViewById(R.id.issueTitle);
issueDescription = itemView.findViewById(R.id.issueDescription);
issueCommentsCount = itemView.findViewById(R.id.issueCommentsCount); issueCommentsCount = itemView.findViewById(R.id.issueCommentsCount);
//issueState = itemView.findViewById(R.id.issueStatus); LinearLayout frameCommentsCount = itemView.findViewById(R.id.frameCommentsCount);
issueCreatedTime = itemView.findViewById(R.id.issueCreatedTime); issueCreatedTime = itemView.findViewById(R.id.issueCreatedTime);
issueType = itemView.findViewById(R.id.issueType); issueType = itemView.findViewById(R.id.issueType);
@ -157,7 +139,7 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
} }
}); });
issueDescription.setOnClickListener(new View.OnClickListener() { frameCommentsCount.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
@ -183,26 +165,6 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
final String locale = tinyDb.getString("locale"); final String locale = tinyDb.getString("locale");
final String timeFormat = tinyDb.getString("dateFormat"); final String timeFormat = tinyDb.getString("dateFormat");
final Markwon markwon = Markwon.builder(Objects.requireNonNull(context))
.usePlugin(CorePlugin.create())
.usePlugin(OkHttpImagesPlugin.create(new OkHttpClient()))
.usePlugin(ImagesPlugin.createWithAssets(context))
.usePlugin(new AbstractMarkwonPlugin() {
@Override
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
builder
.codeTextColor(tinyDb.getInt("codeBlockColor"))
.codeBackgroundColor(tinyDb.getInt("codeBlockBackground"))
.linkColor(context.getResources().getColor(R.color.lightBlue));
}
})
.usePlugin(TablePlugin.create(context))
.usePlugin(TaskListPlugin.create(context))
.usePlugin(HtmlPlugin.create())
.usePlugin(GifPlugin.create())
.usePlugin(StrikethroughPlugin.create())
.build();
if (!issuesModel.getUser().getFull_name().equals("")) { if (!issuesModel.getUser().getFull_name().equals("")) {
issueAssigneeAvatar.setOnClickListener(new ClickListener(context.getResources().getString(R.string.issueCreator) + issuesModel.getUser().getFull_name(), context)); issueAssigneeAvatar.setOnClickListener(new ClickListener(context.getResources().getString(R.string.issueCreator) + issuesModel.getUser().getFull_name(), context));
} else { } else {
@ -210,9 +172,9 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
} }
if (issuesModel.getUser().getAvatar_url() != null) { if (issuesModel.getUser().getAvatar_url() != null) {
Picasso.get().load(issuesModel.getUser().getAvatar_url()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(issueAssigneeAvatar); Picasso.get().load(issuesModel.getUser().getAvatar_url()).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(issueAssigneeAvatar);
} else { } else {
Picasso.get().load(issuesModel.getUser().getAvatar_url()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(issueAssigneeAvatar); Picasso.get().load(issuesModel.getUser().getAvatar_url()).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(issueAssigneeAvatar);
} }
if (issuesModel.getPull_request() == null) { if (issuesModel.getPull_request() == null) {
@ -223,28 +185,12 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
issueType.setOnClickListener(new ClickListener(context.getResources().getString(R.string.issueTypePullRequest), context)); issueType.setOnClickListener(new ClickListener(context.getResources().getString(R.string.issueTypePullRequest), context));
} }
issueTitle.setText(context.getResources().getString(R.string.hash) + issuesModel.getNumber() + " " + issuesModel.getTitle()); String issueNumber_ = "<font color='" + context.getResources().getColor(R.color.lightGray) + "'>" + context.getResources().getString(R.string.hash) + issuesModel.getNumber() + "</font>";
issueTitle.setText(Html.fromHtml(issueNumber_ + " " + issuesModel.getTitle()));
issueNumber.setText(String.valueOf(issuesModel.getNumber())); issueNumber.setText(String.valueOf(issuesModel.getNumber()));
issueCommentsCount.setText(String.valueOf(issuesModel.getComments())); issueCommentsCount.setText(String.valueOf(issuesModel.getComments()));
if (!issuesModel.getBody().equals("")) {
String cleanIssueDescription = issuesModel.getBody().trim();
issueDescription.setVisibility(View.VISIBLE);
final CharSequence bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(cleanIssueDescription));
issueDescription.setText(UserMentions.UserMentionsFunc(context, bodyWithMD, cleanIssueDescription));
}
else {
issueDescription.setText("");
issueDescription.setVisibility(View.GONE);
}
/*if (issuesModel.getState().equals("open")) {
issueState.setImageResource(R.drawable.ic_issue_open);
issueState.setOnClickListener(new ClickListener(context.getResources().getString(R.string.issueStatusTextOpen), context));
} else {
issueState.setImageResource(R.drawable.ic_issue_closed);
issueState.setOnClickListener(new ClickListener(context.getResources().getString(R.string.issueStatusTextClosed), context));
}*/
switch (timeFormat) { switch (timeFormat) {
case "pretty": { case "pretty": {
PrettyTime prettyTime = new PrettyTime(new Locale(locale)); PrettyTime prettyTime = new PrettyTime(new Locale(locale));

View File

@ -3,7 +3,6 @@ package org.mian.gitnex.adapters;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Color; import android.graphics.Color;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
@ -42,13 +41,12 @@ public class LabelsAdapter extends RecyclerView.Adapter<LabelsAdapter.LabelsView
private TextView labelId; private TextView labelId;
private TextView labelColor; private TextView labelColor;
private ImageView labelsView; private ImageView labelsView;
private ImageView labelsOptionsMenu;
private LabelsViewHolder(View itemView) { private LabelsViewHolder(View itemView) {
super(itemView); super(itemView);
labelsView = itemView.findViewById(R.id.labelsView); labelsView = itemView.findViewById(R.id.labelsView);
labelsOptionsMenu = itemView.findViewById(R.id.labelsOptionsMenu); ImageView labelsOptionsMenu = itemView.findViewById(R.id.labelsOptionsMenu);
labelTitle = itemView.findViewById(R.id.labelTitle); labelTitle = itemView.findViewById(R.id.labelTitle);
labelId = itemView.findViewById(R.id.labelId); labelId = itemView.findViewById(R.id.labelId);
labelColor = itemView.findViewById(R.id.labelColor); labelColor = itemView.findViewById(R.id.labelColor);
@ -146,6 +144,7 @@ public class LabelsAdapter extends RecyclerView.Adapter<LabelsAdapter.LabelsView
TextDrawable drawable = TextDrawable.builder() TextDrawable drawable = TextDrawable.builder()
.beginConfig() .beginConfig()
//.useFont(Typeface.DEFAULT) //.useFont(Typeface.DEFAULT)
.bold()
.textColor(new ColorInverter().getContrastColor(color)) .textColor(new ColorInverter().getContrastColor(color))
.fontSize(36) .fontSize(36)
.width(LabelWidthCalculator.customWidth(getMaxLabelLength())) .width(LabelWidthCalculator.customWidth(getMaxLabelLength()))

View File

@ -83,7 +83,7 @@ public class MembersByOrgAdapter extends BaseAdapter implements Filterable {
private void initData(MembersByOrgAdapter.ViewHolder viewHolder, int position) { private void initData(MembersByOrgAdapter.ViewHolder viewHolder, int position) {
UserInfo currentItem = membersList.get(position); UserInfo currentItem = membersList.get(position);
Picasso.get().load(currentItem.getAvatar()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(viewHolder.memberAvatar); Picasso.get().load(currentItem.getAvatar()).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(viewHolder.memberAvatar);
if(!currentItem.getFullname().equals("")) { if(!currentItem.getFullname().equals("")) {
viewHolder.memberName.setText(currentItem.getFullname()); viewHolder.memberName.setText(currentItem.getFullname());

View File

@ -3,12 +3,16 @@ package org.mian.gitnex.adapters;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.text.Spanned;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Filter; import android.widget.Filter;
import android.widget.Filterable; import android.widget.Filterable;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.TextDrawable;
import com.vdurmont.emoji.EmojiParser; import com.vdurmont.emoji.EmojiParser;
@ -21,25 +25,31 @@ import java.text.DateFormat;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects; import java.util.Objects;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import okhttp3.OkHttpClient; import io.noties.markwon.AbstractMarkwonPlugin;
import ru.noties.markwon.AbstractMarkwonPlugin; import io.noties.markwon.Markwon;
import ru.noties.markwon.Markwon; import io.noties.markwon.core.CorePlugin;
import ru.noties.markwon.core.CorePlugin; import io.noties.markwon.core.MarkwonTheme;
import ru.noties.markwon.core.MarkwonTheme; import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
import ru.noties.markwon.ext.strikethrough.StrikethroughPlugin; import io.noties.markwon.ext.tables.TablePlugin;
import ru.noties.markwon.ext.tables.TablePlugin; import io.noties.markwon.ext.tasklist.TaskListPlugin;
import ru.noties.markwon.ext.tables.TableTheme; import io.noties.markwon.html.HtmlPlugin;
import ru.noties.markwon.ext.tasklist.TaskListPlugin; import io.noties.markwon.image.AsyncDrawable;
import ru.noties.markwon.html.HtmlPlugin; import io.noties.markwon.image.DefaultMediaDecoder;
import ru.noties.markwon.image.ImagesPlugin; import io.noties.markwon.image.ImageItem;
import ru.noties.markwon.image.gif.GifPlugin; import io.noties.markwon.image.ImagesPlugin;
import ru.noties.markwon.image.okhttp.OkHttpImagesPlugin; import io.noties.markwon.image.SchemeHandler;
import io.noties.markwon.image.gif.GifMediaDecoder;
import io.noties.markwon.image.svg.SvgMediaDecoder;
import io.noties.markwon.linkify.LinkifyPlugin;
/** /**
* Author M M Arif * Author M M Arif
@ -59,6 +69,7 @@ public class MilestonesAdapter extends RecyclerView.Adapter<MilestonesAdapter.Mi
private TextView msClosedIssues; private TextView msClosedIssues;
private TextView msDueDate; private TextView msDueDate;
private ImageView msStatus; private ImageView msStatus;
private ProgressBar msProgress;
private MilestonesViewHolder(View itemView) { private MilestonesViewHolder(View itemView) {
super(itemView); super(itemView);
@ -69,8 +80,9 @@ public class MilestonesAdapter extends RecyclerView.Adapter<MilestonesAdapter.Mi
msOpenIssues = itemView.findViewById(R.id.milestoneIssuesOpen); msOpenIssues = itemView.findViewById(R.id.milestoneIssuesOpen);
msClosedIssues = itemView.findViewById(R.id.milestoneIssuesClosed); msClosedIssues = itemView.findViewById(R.id.milestoneIssuesClosed);
msDueDate = itemView.findViewById(R.id.milestoneDueDate); msDueDate = itemView.findViewById(R.id.milestoneDueDate);
msProgress = itemView.findViewById(R.id.milestoneProgress);
/*issueTitle.setOnClickListener(new View.OnClickListener() { /*msTitle.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
@ -113,8 +125,45 @@ public class MilestonesAdapter extends RecyclerView.Adapter<MilestonesAdapter.Mi
final Markwon markwon = Markwon.builder(Objects.requireNonNull(mCtx)) final Markwon markwon = Markwon.builder(Objects.requireNonNull(mCtx))
.usePlugin(CorePlugin.create()) .usePlugin(CorePlugin.create())
.usePlugin(OkHttpImagesPlugin.create(new OkHttpClient())) .usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
.usePlugin(ImagesPlugin.createWithAssets(mCtx)) @Override
public void configureImages(@NonNull ImagesPlugin plugin) {
plugin.addSchemeHandler(new SchemeHandler() {
@NonNull
@Override
public ImageItem handle(@NonNull String raw, @NonNull Uri uri) {
final int resourceId = mCtx.getResources().getIdentifier(
raw.substring("drawable://".length()),
"drawable",
mCtx.getPackageName());
final Drawable drawable = mCtx.getDrawable(resourceId);
assert drawable != null;
return ImageItem.withResult(drawable);
}
@NonNull
@Override
public Collection<String> supportedSchemes() {
return Collections.singleton("drawable");
}
});
plugin.placeholderProvider(new ImagesPlugin.PlaceholderProvider() {
@Nullable
@Override
public Drawable providePlaceholder(@NonNull AsyncDrawable drawable) {
return null;
}
});
plugin.addMediaDecoder(GifMediaDecoder.create(false));
plugin.addMediaDecoder(SvgMediaDecoder.create(mCtx.getResources()));
plugin.addMediaDecoder(SvgMediaDecoder.create());
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(mCtx.getResources()));
plugin.defaultMediaDecoder(DefaultMediaDecoder.create());
}
}))
.usePlugin(new AbstractMarkwonPlugin() { .usePlugin(new AbstractMarkwonPlugin() {
@Override @Override
public void configureTheme(@NonNull MarkwonTheme.Builder builder) { public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
@ -127,11 +176,12 @@ public class MilestonesAdapter extends RecyclerView.Adapter<MilestonesAdapter.Mi
.usePlugin(TablePlugin.create(mCtx)) .usePlugin(TablePlugin.create(mCtx))
.usePlugin(TaskListPlugin.create(mCtx)) .usePlugin(TaskListPlugin.create(mCtx))
.usePlugin(HtmlPlugin.create()) .usePlugin(HtmlPlugin.create())
.usePlugin(GifPlugin.create())
.usePlugin(StrikethroughPlugin.create()) .usePlugin(StrikethroughPlugin.create())
.usePlugin(LinkifyPlugin.create())
.build(); .build();
holder.msTitle.setText(currentItem.getTitle()); Spanned msTitle = markwon.toMarkdown(currentItem.getTitle());
markwon.setParsedMarkdown(holder.msTitle, msTitle);
//holder.msStatus.setText(currentItem.getState()); //holder.msStatus.setText(currentItem.getState());
if(currentItem.getState().equals("open")) { if(currentItem.getState().equals("open")) {
@ -183,6 +233,24 @@ public class MilestonesAdapter extends RecyclerView.Adapter<MilestonesAdapter.Mi
holder.msClosedIssues.setText(String.valueOf(currentItem.getClosed_issues())); holder.msClosedIssues.setText(String.valueOf(currentItem.getClosed_issues()));
holder.msClosedIssues.setOnClickListener(new ClickListener(mCtx.getResources().getString(R.string.milestoneClosedIssues, currentItem.getClosed_issues()), mCtx)); holder.msClosedIssues.setOnClickListener(new ClickListener(mCtx.getResources().getString(R.string.milestoneClosedIssues, currentItem.getClosed_issues()), mCtx));
if ((currentItem.getOpen_issues() + currentItem.getClosed_issues()) > 0) {
if (currentItem.getOpen_issues() == 0) {
holder.msProgress.setProgress(100);
holder.msProgress.setOnClickListener(new ClickListener(mCtx.getResources().getString(R.string.milestoneCompletion, 100), mCtx));
}
else {
int msCompletion = 100 * currentItem.getClosed_issues() / (currentItem.getOpen_issues() + currentItem.getClosed_issues());
holder.msProgress.setOnClickListener(new ClickListener(mCtx.getResources().getString(R.string.milestoneCompletion, msCompletion), mCtx));
holder.msProgress.setProgress(msCompletion);
}
}
else {
holder.msProgress.setProgress(0);
holder.msProgress.setOnClickListener(new ClickListener(mCtx.getResources().getString(R.string.milestoneCompletion, 0), mCtx));
}
if(currentItem.getDue_on() != null) { if(currentItem.getDue_on() != null) {
if (timeFormat.equals("normal") || timeFormat.equals("pretty")) { if (timeFormat.equals("normal") || timeFormat.equals("pretty")) {
@ -216,7 +284,7 @@ public class MilestonesAdapter extends RecyclerView.Adapter<MilestonesAdapter.Mi
} }
else { else {
holder.msDueDate.setVisibility(View.INVISIBLE); holder.msDueDate.setVisibility(View.GONE);
} }
} }

View File

@ -13,11 +13,13 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator; import com.amulyakhare.textdrawable.util.ColorGenerator;
import com.squareup.picasso.Picasso;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.OpenRepoInBrowserActivity; import org.mian.gitnex.activities.OpenRepoInBrowserActivity;
import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.activities.RepoDetailActivity;
import org.mian.gitnex.activities.RepoStargazersActivity; import org.mian.gitnex.activities.RepoStargazersActivity;
import org.mian.gitnex.activities.RepoWatchersActivity; import org.mian.gitnex.activities.RepoWatchersActivity;
import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.models.UserRepositories; import org.mian.gitnex.models.UserRepositories;
import org.mian.gitnex.util.TinyDB; import org.mian.gitnex.util.TinyDB;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@ -46,7 +48,7 @@ public class MyReposListAdapter extends RecyclerView.Adapter<MyReposListAdapter.
private TextView fullNameMy; private TextView fullNameMy;
private ImageView repoPrivatePublicMy; private ImageView repoPrivatePublicMy;
private TextView repoStarsMy; private TextView repoStarsMy;
private TextView repoWatchersMy; private TextView repoForksMy;
private TextView repoOpenIssuesCountMy; private TextView repoOpenIssuesCountMy;
private MyReposViewHolder(View itemView) { private MyReposViewHolder(View itemView) {
@ -57,7 +59,7 @@ public class MyReposListAdapter extends RecyclerView.Adapter<MyReposListAdapter.
fullNameMy = itemView.findViewById(R.id.repoFullNameMy); fullNameMy = itemView.findViewById(R.id.repoFullNameMy);
repoPrivatePublicMy = itemView.findViewById(R.id.imageRepoTypeMy); repoPrivatePublicMy = itemView.findViewById(R.id.imageRepoTypeMy);
repoStarsMy = itemView.findViewById(R.id.repoStarsMy); repoStarsMy = itemView.findViewById(R.id.repoStarsMy);
repoWatchersMy = itemView.findViewById(R.id.repoWatchersMy); repoForksMy = itemView.findViewById(R.id.repoForksMy);
repoOpenIssuesCountMy = itemView.findViewById(R.id.repoOpenIssuesCountMy); repoOpenIssuesCountMy = itemView.findViewById(R.id.repoOpenIssuesCountMy);
ImageView reposDropdownMenu = itemView.findViewById(R.id.reposDropdownMenu); ImageView reposDropdownMenu = itemView.findViewById(R.id.reposDropdownMenu);
@ -165,19 +167,29 @@ public class MyReposListAdapter extends RecyclerView.Adapter<MyReposListAdapter.
ColorGenerator generator = ColorGenerator.MATERIAL; ColorGenerator generator = ColorGenerator.MATERIAL;
int color = generator.getColor(currentItem.getName()); int color = generator.getColor(currentItem.getName());
String charac = String.valueOf(currentItem.getName().charAt(0)); String firstCharacter = String.valueOf(currentItem.getName().charAt(0));
TextDrawable drawable = TextDrawable.builder() TextDrawable drawable = TextDrawable.builder()
.beginConfig() .beginConfig()
.useFont(Typeface.DEFAULT) .useFont(Typeface.DEFAULT)
.fontSize(16) .fontSize(18)
.toUpperCase() .toUpperCase()
.width(28) .width(28)
.height(28) .height(28)
.endConfig() .endConfig()
.buildRound(charac, color); .buildRoundRect(firstCharacter, color, 3);
if (currentItem.getAvatar_url() != null) {
if (!currentItem.getAvatar_url().equals("")) {
Picasso.get().load(currentItem.getAvatar_url()).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(holder.imageMy);
} else {
holder.imageMy.setImageDrawable(drawable); holder.imageMy.setImageDrawable(drawable);
}
}
else {
holder.imageMy.setImageDrawable(drawable);
}
holder.mTextView1My.setText(currentItem.getName()); holder.mTextView1My.setText(currentItem.getName());
if (!currentItem.getDescription().equals("")) { if (!currentItem.getDescription().equals("")) {
holder.mTextView2My.setVisibility(View.VISIBLE); holder.mTextView2My.setVisibility(View.VISIBLE);
@ -191,7 +203,7 @@ public class MyReposListAdapter extends RecyclerView.Adapter<MyReposListAdapter.
holder.repoPrivatePublicMy.setImageResource(R.drawable.ic_public); holder.repoPrivatePublicMy.setImageResource(R.drawable.ic_public);
} }
holder.repoStarsMy.setText(currentItem.getStars_count()); holder.repoStarsMy.setText(currentItem.getStars_count());
holder.repoWatchersMy.setText(currentItem.getWatchers_count()); holder.repoForksMy.setText(currentItem.getForks_count());
holder.repoOpenIssuesCountMy.setText(currentItem.getOpen_issues_count()); holder.repoOpenIssuesCountMy.setText(currentItem.getOpen_issues_count());
} }

View File

@ -79,7 +79,7 @@ public class OrganizationsListAdapter extends RecyclerView.Adapter<Organizations
UserOrganizations currentItem = orgList.get(position); UserOrganizations currentItem = orgList.get(position);
holder.mTextView2.setVisibility(View.GONE); holder.mTextView2.setVisibility(View.GONE);
Picasso.get().load(currentItem.getAvatar_url()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(holder.image); Picasso.get().load(currentItem.getAvatar_url()).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(holder.image);
holder.mTextView1.setText(currentItem.getUsername()); holder.mTextView1.setText(currentItem.getUsername());
if (!currentItem.getDescription().equals("")) { if (!currentItem.getDescription().equals("")) {
holder.mTextView2.setVisibility(View.VISIBLE); holder.mTextView2.setVisibility(View.VISIBLE);

View File

@ -65,7 +65,7 @@ public class ProfileFollowersAdapter extends RecyclerView.Adapter<ProfileFollowe
holder.userName.setVisibility(View.GONE); holder.userName.setVisibility(View.GONE);
} }
Picasso.get().load(currentItem.getAvatar()).transform(new RoundedTransformation(100, 0)).resize(140, 140).centerCrop().into(holder.userAvatar); Picasso.get().load(currentItem.getAvatar()).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(holder.userAvatar);
} }
@Override @Override

View File

@ -65,7 +65,7 @@ public class ProfileFollowingAdapter extends RecyclerView.Adapter<ProfileFollowi
holder.userName.setVisibility(View.GONE); holder.userName.setVisibility(View.GONE);
} }
Picasso.get().load(currentItem.getAvatar()).transform(new RoundedTransformation(100, 0)).resize(140, 140).centerCrop().into(holder.userAvatar); Picasso.get().load(currentItem.getAvatar()).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(holder.userAvatar);
} }
@Override @Override

View File

@ -1,8 +1,10 @@
package org.mian.gitnex.adapters; package org.mian.gitnex.adapters;
import android.content.Context; import android.content.Context;
import android.graphics.Color; import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.text.Html; import android.text.Html;
import android.text.Spanned;
import android.text.method.LinkMovementMethod; import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -13,22 +15,30 @@ import com.amulyakhare.textdrawable.TextDrawable;
import com.vdurmont.emoji.EmojiParser; import com.vdurmont.emoji.EmojiParser;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.models.Releases; import org.mian.gitnex.models.Releases;
import org.mian.gitnex.util.TinyDB;
import java.util.Collection;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import okhttp3.OkHttpClient; import io.noties.markwon.AbstractMarkwonPlugin;
import ru.noties.markwon.AbstractMarkwonPlugin; import io.noties.markwon.Markwon;
import ru.noties.markwon.Markwon; import io.noties.markwon.core.CorePlugin;
import ru.noties.markwon.core.CorePlugin; import io.noties.markwon.core.MarkwonTheme;
import ru.noties.markwon.core.MarkwonTheme; import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
import ru.noties.markwon.ext.strikethrough.StrikethroughPlugin; import io.noties.markwon.ext.tables.TablePlugin;
import ru.noties.markwon.ext.tables.TablePlugin; import io.noties.markwon.ext.tasklist.TaskListPlugin;
import ru.noties.markwon.ext.tasklist.TaskListPlugin; import io.noties.markwon.html.HtmlPlugin;
import ru.noties.markwon.html.HtmlPlugin; import io.noties.markwon.image.AsyncDrawable;
import ru.noties.markwon.image.ImagesPlugin; import io.noties.markwon.image.DefaultMediaDecoder;
import ru.noties.markwon.image.gif.GifPlugin; import io.noties.markwon.image.ImageItem;
import ru.noties.markwon.image.okhttp.OkHttpImagesPlugin; import io.noties.markwon.image.ImagesPlugin;
import io.noties.markwon.image.SchemeHandler;
import io.noties.markwon.image.gif.GifMediaDecoder;
import io.noties.markwon.image.svg.SvgMediaDecoder;
import io.noties.markwon.linkify.LinkifyPlugin;
/** /**
* Author M M Arif * Author M M Arif
@ -77,6 +87,8 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
@Override @Override
public void onBindViewHolder(@NonNull ReleasesAdapter.ReleasesViewHolder holder, int position) { public void onBindViewHolder(@NonNull ReleasesAdapter.ReleasesViewHolder holder, int position) {
final TinyDB tinyDb = new TinyDB(mCtx);
Releases currentItem = releasesList.get(position); Releases currentItem = releasesList.get(position);
holder.releaseTitle.setText(currentItem.getName()); holder.releaseTitle.setText(currentItem.getName());
@ -115,28 +127,65 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
final Markwon markwon = Markwon.builder(Objects.requireNonNull(mCtx)) final Markwon markwon = Markwon.builder(Objects.requireNonNull(mCtx))
.usePlugin(CorePlugin.create()) .usePlugin(CorePlugin.create())
.usePlugin(OkHttpImagesPlugin.create(new OkHttpClient())) .usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
.usePlugin(ImagesPlugin.createWithAssets(mCtx)) @Override
public void configureImages(@NonNull ImagesPlugin plugin) {
plugin.addSchemeHandler(new SchemeHandler() {
@NonNull
@Override
public ImageItem handle(@NonNull String raw, @NonNull Uri uri) {
final int resourceId = mCtx.getResources().getIdentifier(
raw.substring("drawable://".length()),
"drawable",
mCtx.getPackageName());
final Drawable drawable = mCtx.getDrawable(resourceId);
assert drawable != null;
return ImageItem.withResult(drawable);
}
@NonNull
@Override
public Collection<String> supportedSchemes() {
return Collections.singleton("drawable");
}
});
plugin.placeholderProvider(new ImagesPlugin.PlaceholderProvider() {
@Nullable
@Override
public Drawable providePlaceholder(@NonNull AsyncDrawable drawable) {
return null;
}
});
plugin.addMediaDecoder(GifMediaDecoder.create(false));
plugin.addMediaDecoder(SvgMediaDecoder.create(mCtx.getResources()));
plugin.addMediaDecoder(SvgMediaDecoder.create());
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(mCtx.getResources()));
plugin.defaultMediaDecoder(DefaultMediaDecoder.create());
}
}))
.usePlugin(new AbstractMarkwonPlugin() { .usePlugin(new AbstractMarkwonPlugin() {
@Override @Override
public void configureTheme(@NonNull MarkwonTheme.Builder builder) { public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
builder builder
.codeTextColor(Color.GREEN) .codeTextColor(tinyDb.getInt("codeBlockColor"))
.codeBackgroundColor(Color.BLACK) .codeBackgroundColor(tinyDb.getInt("codeBlockBackground"))
.linkColor(mCtx.getResources().getColor(R.color.lightBlue)); .linkColor(mCtx.getResources().getColor(R.color.lightBlue));
} }
}) })
.usePlugin(TablePlugin.create(mCtx)) .usePlugin(TablePlugin.create(mCtx))
.usePlugin(TaskListPlugin.create(mCtx)) .usePlugin(TaskListPlugin.create(mCtx))
.usePlugin(HtmlPlugin.create()) .usePlugin(HtmlPlugin.create())
.usePlugin(GifPlugin.create())
.usePlugin(StrikethroughPlugin.create()) .usePlugin(StrikethroughPlugin.create())
.usePlugin(LinkifyPlugin.create())
.build(); .build();
final CharSequence bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(currentItem.getBody())); Spanned bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(currentItem.getBody()));
if(!currentItem.getBody().equals("")) { if(!currentItem.getBody().equals("")) {
holder.releaseDescription.setText(bodyWithMD); markwon.setParsedMarkdown(holder.releaseDescription, bodyWithMD);
} }
else { else {
holder.releaseDescription.setVisibility(View.GONE); holder.releaseDescription.setVisibility(View.GONE);

View File

@ -17,11 +17,13 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator; import com.amulyakhare.textdrawable.util.ColorGenerator;
import com.squareup.picasso.Picasso;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.OpenRepoInBrowserActivity; import org.mian.gitnex.activities.OpenRepoInBrowserActivity;
import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.activities.RepoDetailActivity;
import org.mian.gitnex.activities.RepoStargazersActivity; import org.mian.gitnex.activities.RepoStargazersActivity;
import org.mian.gitnex.activities.RepoWatchersActivity; import org.mian.gitnex.activities.RepoWatchersActivity;
import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.models.UserRepositories; import org.mian.gitnex.models.UserRepositories;
import org.mian.gitnex.util.TinyDB; import org.mian.gitnex.util.TinyDB;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@ -46,7 +48,7 @@ public class ReposListAdapter extends RecyclerView.Adapter<ReposListAdapter.Repo
private TextView fullName; private TextView fullName;
private ImageView repoPrivatePublic; private ImageView repoPrivatePublic;
private TextView repoStars; private TextView repoStars;
private TextView repoWatchers; private TextView repoForks;
private TextView repoOpenIssuesCount; private TextView repoOpenIssuesCount;
private ReposViewHolder(View itemView) { private ReposViewHolder(View itemView) {
@ -58,7 +60,7 @@ public class ReposListAdapter extends RecyclerView.Adapter<ReposListAdapter.Repo
fullName = itemView.findViewById(R.id.repoFullName); fullName = itemView.findViewById(R.id.repoFullName);
repoPrivatePublic = itemView.findViewById(R.id.imageRepoType); repoPrivatePublic = itemView.findViewById(R.id.imageRepoType);
repoStars = itemView.findViewById(R.id.repoStars); repoStars = itemView.findViewById(R.id.repoStars);
repoWatchers = itemView.findViewById(R.id.repoWatchers); repoForks = itemView.findViewById(R.id.repoForks);
repoOpenIssuesCount = itemView.findViewById(R.id.repoOpenIssuesCount); repoOpenIssuesCount = itemView.findViewById(R.id.repoOpenIssuesCount);
ImageView reposDropdownMenu = itemView.findViewById(R.id.reposDropdownMenu); ImageView reposDropdownMenu = itemView.findViewById(R.id.reposDropdownMenu);
@ -167,19 +169,29 @@ public class ReposListAdapter extends RecyclerView.Adapter<ReposListAdapter.Repo
ColorGenerator generator = ColorGenerator.MATERIAL; ColorGenerator generator = ColorGenerator.MATERIAL;
int color = generator.getColor(currentItem.getName()); int color = generator.getColor(currentItem.getName());
String charac = String.valueOf(currentItem.getName().charAt(0)); String firstCharacter = String.valueOf(currentItem.getName().charAt(0));
TextDrawable drawable = TextDrawable.builder() TextDrawable drawable = TextDrawable.builder()
.beginConfig() .beginConfig()
.useFont(Typeface.DEFAULT) .useFont(Typeface.DEFAULT)
.fontSize(16) .fontSize(18)
.toUpperCase() .toUpperCase()
.width(28) .width(28)
.height(28) .height(28)
.endConfig() .endConfig()
.buildRound(charac, color); .buildRoundRect(firstCharacter, color, 3);
if (currentItem.getAvatar_url() != null) {
if (!currentItem.getAvatar_url().equals("")) {
Picasso.get().load(currentItem.getAvatar_url()).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(holder.image);
} else {
holder.image.setImageDrawable(drawable); holder.image.setImageDrawable(drawable);
}
}
else {
holder.image.setImageDrawable(drawable);
}
holder.mTextView1.setText(currentItem.getName()); holder.mTextView1.setText(currentItem.getName());
if (!currentItem.getDescription().equals("")) { if (!currentItem.getDescription().equals("")) {
holder.mTextView2.setVisibility(View.VISIBLE); holder.mTextView2.setVisibility(View.VISIBLE);
@ -193,7 +205,7 @@ public class ReposListAdapter extends RecyclerView.Adapter<ReposListAdapter.Repo
holder.repoPrivatePublic.setImageResource(R.drawable.ic_public); holder.repoPrivatePublic.setImageResource(R.drawable.ic_public);
} }
holder.repoStars.setText(currentItem.getStars_count()); holder.repoStars.setText(currentItem.getStars_count());
holder.repoWatchers.setText(currentItem.getWatchers_count()); holder.repoForks.setText(currentItem.getForks_count());
holder.repoOpenIssuesCount.setText(currentItem.getOpen_issues_count()); holder.repoOpenIssuesCount.setText(currentItem.getOpen_issues_count());
} }

View File

@ -13,11 +13,13 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator; import com.amulyakhare.textdrawable.util.ColorGenerator;
import com.squareup.picasso.Picasso;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.OpenRepoInBrowserActivity; import org.mian.gitnex.activities.OpenRepoInBrowserActivity;
import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.activities.RepoDetailActivity;
import org.mian.gitnex.activities.RepoStargazersActivity; import org.mian.gitnex.activities.RepoStargazersActivity;
import org.mian.gitnex.activities.RepoWatchersActivity; import org.mian.gitnex.activities.RepoWatchersActivity;
import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.models.UserRepositories; import org.mian.gitnex.models.UserRepositories;
import org.mian.gitnex.util.TinyDB; import org.mian.gitnex.util.TinyDB;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@ -46,7 +48,7 @@ public class RepositoriesByOrgAdapter extends RecyclerView.Adapter<RepositoriesB
private TextView fullName; private TextView fullName;
private ImageView repoPrivatePublic; private ImageView repoPrivatePublic;
private TextView repoStars; private TextView repoStars;
private TextView repoWatchers; private TextView repoForks;
private TextView repoOpenIssuesCount; private TextView repoOpenIssuesCount;
private OrgReposViewHolder(View itemView) { private OrgReposViewHolder(View itemView) {
@ -57,7 +59,7 @@ public class RepositoriesByOrgAdapter extends RecyclerView.Adapter<RepositoriesB
fullName = itemView.findViewById(R.id.repoFullName); fullName = itemView.findViewById(R.id.repoFullName);
repoPrivatePublic = itemView.findViewById(R.id.imageRepoType); repoPrivatePublic = itemView.findViewById(R.id.imageRepoType);
repoStars = itemView.findViewById(R.id.repoStars); repoStars = itemView.findViewById(R.id.repoStars);
repoWatchers = itemView.findViewById(R.id.repoWatchers); repoForks = itemView.findViewById(R.id.repoForks);
repoOpenIssuesCount = itemView.findViewById(R.id.repoOpenIssuesCount); repoOpenIssuesCount = itemView.findViewById(R.id.repoOpenIssuesCount);
ImageView reposDropdownMenu = itemView.findViewById(R.id.reposDropdownMenu); ImageView reposDropdownMenu = itemView.findViewById(R.id.reposDropdownMenu);
@ -166,19 +168,29 @@ public class RepositoriesByOrgAdapter extends RecyclerView.Adapter<RepositoriesB
ColorGenerator generator = ColorGenerator.MATERIAL; ColorGenerator generator = ColorGenerator.MATERIAL;
int color = generator.getColor(currentItem.getName()); int color = generator.getColor(currentItem.getName());
String charac = String.valueOf(currentItem.getName().charAt(0)); String firstCharacter = String.valueOf(currentItem.getName().charAt(0));
TextDrawable drawable = TextDrawable.builder() TextDrawable drawable = TextDrawable.builder()
.beginConfig() .beginConfig()
.useFont(Typeface.DEFAULT) .useFont(Typeface.DEFAULT)
.fontSize(16) .fontSize(18)
.toUpperCase() .toUpperCase()
.width(28) .width(28)
.height(28) .height(28)
.endConfig() .endConfig()
.buildRound(charac, color); .buildRoundRect(firstCharacter, color, 3);
if (currentItem.getAvatar_url() != null) {
if (!currentItem.getAvatar_url().equals("")) {
Picasso.get().load(currentItem.getAvatar_url()).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(holder.image);
} else {
holder.image.setImageDrawable(drawable); holder.image.setImageDrawable(drawable);
}
}
else {
holder.image.setImageDrawable(drawable);
}
holder.mTextView1.setText(currentItem.getName()); holder.mTextView1.setText(currentItem.getName());
if (!currentItem.getDescription().equals("")) { if (!currentItem.getDescription().equals("")) {
holder.mTextView2.setVisibility(View.VISIBLE); holder.mTextView2.setVisibility(View.VISIBLE);
@ -192,7 +204,7 @@ public class RepositoriesByOrgAdapter extends RecyclerView.Adapter<RepositoriesB
holder.repoPrivatePublic.setImageResource(R.drawable.ic_public); holder.repoPrivatePublic.setImageResource(R.drawable.ic_public);
} }
holder.repoStars.setText(currentItem.getStars_count()); holder.repoStars.setText(currentItem.getStars_count());
holder.repoWatchers.setText(currentItem.getWatchers_count()); holder.repoForks.setText(currentItem.getForks_count());
holder.repoOpenIssuesCount.setText(currentItem.getOpen_issues_count()); holder.repoOpenIssuesCount.setText(currentItem.getOpen_issues_count());
} }

View File

@ -13,11 +13,13 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator; import com.amulyakhare.textdrawable.util.ColorGenerator;
import com.squareup.picasso.Picasso;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.OpenRepoInBrowserActivity; import org.mian.gitnex.activities.OpenRepoInBrowserActivity;
import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.activities.RepoDetailActivity;
import org.mian.gitnex.activities.RepoStargazersActivity; import org.mian.gitnex.activities.RepoStargazersActivity;
import org.mian.gitnex.activities.RepoWatchersActivity; import org.mian.gitnex.activities.RepoWatchersActivity;
import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.models.UserRepositories; import org.mian.gitnex.models.UserRepositories;
import org.mian.gitnex.util.TinyDB; import org.mian.gitnex.util.TinyDB;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@ -46,7 +48,7 @@ public class StarredReposListAdapter extends RecyclerView.Adapter<StarredReposLi
private TextView fullName; private TextView fullName;
private ImageView repoPrivatePublic; private ImageView repoPrivatePublic;
private TextView repoStars; private TextView repoStars;
private TextView repoWatchers; private TextView repoForks;
private TextView repoOpenIssuesCount; private TextView repoOpenIssuesCount;
private StarredReposViewHolder(View itemView) { private StarredReposViewHolder(View itemView) {
@ -57,7 +59,7 @@ public class StarredReposListAdapter extends RecyclerView.Adapter<StarredReposLi
fullName = itemView.findViewById(R.id.repoFullName); fullName = itemView.findViewById(R.id.repoFullName);
repoPrivatePublic = itemView.findViewById(R.id.imageRepoType); repoPrivatePublic = itemView.findViewById(R.id.imageRepoType);
repoStars = itemView.findViewById(R.id.repoStars); repoStars = itemView.findViewById(R.id.repoStars);
repoWatchers = itemView.findViewById(R.id.repoWatchers); repoForks = itemView.findViewById(R.id.repoForks);
repoOpenIssuesCount = itemView.findViewById(R.id.repoOpenIssuesCount); repoOpenIssuesCount = itemView.findViewById(R.id.repoOpenIssuesCount);
ImageView reposDropdownMenu = itemView.findViewById(R.id.reposDropdownMenu); ImageView reposDropdownMenu = itemView.findViewById(R.id.reposDropdownMenu);
@ -166,19 +168,29 @@ public class StarredReposListAdapter extends RecyclerView.Adapter<StarredReposLi
ColorGenerator generator = ColorGenerator.MATERIAL; ColorGenerator generator = ColorGenerator.MATERIAL;
int color = generator.getColor(currentItem.getName()); int color = generator.getColor(currentItem.getName());
String charac = String.valueOf(currentItem.getName().charAt(0)); String firstCharacter = String.valueOf(currentItem.getName().charAt(0));
TextDrawable drawable = TextDrawable.builder() TextDrawable drawable = TextDrawable.builder()
.beginConfig() .beginConfig()
.useFont(Typeface.DEFAULT) .useFont(Typeface.DEFAULT)
.fontSize(16) .fontSize(18)
.toUpperCase() .toUpperCase()
.width(28) .width(28)
.height(28) .height(28)
.endConfig() .endConfig()
.buildRound(charac, color); .buildRoundRect(firstCharacter, color, 3);
if (currentItem.getAvatar_url() != null) {
if (!currentItem.getAvatar_url().equals("")) {
Picasso.get().load(currentItem.getAvatar_url()).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(holder.image);
} else {
holder.image.setImageDrawable(drawable); holder.image.setImageDrawable(drawable);
}
}
else {
holder.image.setImageDrawable(drawable);
}
holder.mTextView1.setText(currentItem.getName()); holder.mTextView1.setText(currentItem.getName());
if (!currentItem.getDescription().equals("")) { if (!currentItem.getDescription().equals("")) {
holder.mTextView2.setVisibility(View.VISIBLE); holder.mTextView2.setVisibility(View.VISIBLE);
@ -192,7 +204,7 @@ public class StarredReposListAdapter extends RecyclerView.Adapter<StarredReposLi
holder.repoPrivatePublic.setImageResource(R.drawable.ic_public); holder.repoPrivatePublic.setImageResource(R.drawable.ic_public);
} }
holder.repoStars.setText(currentItem.getStars_count()); holder.repoStars.setText(currentItem.getStars_count());
holder.repoWatchers.setText(currentItem.getWatchers_count()); holder.repoForks.setText(currentItem.getForks_count());
holder.repoOpenIssuesCount.setText(currentItem.getOpen_issues_count()); holder.repoOpenIssuesCount.setText(currentItem.getOpen_issues_count());
} }

View File

@ -78,7 +78,7 @@ public class TeamMembersByOrgAdapter extends BaseAdapter {
private void initData(TeamMembersByOrgAdapter.ViewHolder viewHolder, int position) { private void initData(TeamMembersByOrgAdapter.ViewHolder viewHolder, int position) {
UserInfo currentItem = teamMembersList.get(position); UserInfo currentItem = teamMembersList.get(position);
Picasso.get().load(currentItem.getAvatar()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(viewHolder.memberAvatar); Picasso.get().load(currentItem.getAvatar()).transform(new RoundedTransformation(8, 0)).resize(180, 180).centerCrop().into(viewHolder.memberAvatar);
if(!currentItem.getFullname().equals("")) { if(!currentItem.getFullname().equals("")) {
viewHolder.memberName.setText(currentItem.getFullname()); viewHolder.memberName.setText(currentItem.getFullname());

View File

@ -141,7 +141,7 @@ public class UserSearchAdapter extends RecyclerView.Adapter<UserSearchAdapter.Us
} }
if (!currentItem.getAvatar().equals("")) { if (!currentItem.getAvatar().equals("")) {
Picasso.get().load(currentItem.getAvatar()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(holder.userAvatar); Picasso.get().load(currentItem.getAvatar()).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(holder.userAvatar);
} }
if(getItemCount() > 0) { if(getItemCount() > 0) {

View File

@ -263,6 +263,7 @@ public class ClosedIssuesFragment extends Fragment {
MenuItem searchItem = menu.findItem(R.id.action_search); 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.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setQueryHint(getContext().getString(R.string.strFilter));
if(!connToInternet) { if(!connToInternet) {
return; return;

View File

@ -262,6 +262,7 @@ public class IssuesFragment extends Fragment {
MenuItem searchItem = menu.findItem(R.id.action_search); 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.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setQueryHint(getContext().getString(R.string.strFilter));
if(!connToInternet) { if(!connToInternet) {
return; return;

View File

@ -112,6 +112,7 @@ public class MembersByOrgFragment extends Fragment {
MenuItem searchItem = menu.findItem(R.id.action_search); 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.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setQueryHint(getContext().getString(R.string.strFilter));
if(!connToInternet) { if(!connToInternet) {
return; return;

View File

@ -46,6 +46,7 @@ public class MilestonesFragment extends Fragment {
private String repoName; private String repoName;
private String repoOwner; private String repoOwner;
private String msState = "all";
private OnFragmentInteractionListener mListener; private OnFragmentInteractionListener mListener;
@ -103,7 +104,7 @@ public class MilestonesFragment extends Fragment {
@Override @Override
public void run() { public void run() {
swipeRefresh.setRefreshing(false); swipeRefresh.setRefreshing(false);
MilestonesViewModel.loadMilestonesList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), repoOwner, repoName); MilestonesViewModel.loadMilestonesList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), repoOwner, repoName, msState);
} }
}, 50); }, 50);
} }
@ -127,7 +128,7 @@ public class MilestonesFragment extends Fragment {
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
if(tinyDb.getBoolean("milestoneCreated")) { if(tinyDb.getBoolean("milestoneCreated")) {
MilestonesViewModel.loadMilestonesList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), repoOwner, repoName); MilestonesViewModel.loadMilestonesList(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), repoOwner, repoName, msState);
tinyDb.putBoolean("milestoneCreated", false); tinyDb.putBoolean("milestoneCreated", false);
} }
} }
@ -152,7 +153,7 @@ public class MilestonesFragment extends Fragment {
MilestonesViewModel msModel = new ViewModelProvider(this).get(MilestonesViewModel.class); MilestonesViewModel msModel = new ViewModelProvider(this).get(MilestonesViewModel.class);
msModel.getMilestonesList(instanceUrl, instanceToken, owner, repo).observe(this, new Observer<List<Milestones>>() { msModel.getMilestonesList(instanceUrl, instanceToken, owner, repo, msState).observe(this, new Observer<List<Milestones>>() {
@Override @Override
public void onChanged(@Nullable List<Milestones> msListMain) { public void onChanged(@Nullable List<Milestones> msListMain) {
adapter = new MilestonesAdapter(getContext(), msListMain); adapter = new MilestonesAdapter(getContext(), msListMain);
@ -182,6 +183,7 @@ public class MilestonesFragment extends Fragment {
MenuItem searchItem = menu.findItem(R.id.action_search); 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.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setQueryHint(getContext().getString(R.string.strFilter));
if(!connToInternet) { if(!connToInternet) {
return; return;

View File

@ -203,6 +203,7 @@ public class MyRepositoriesFragment extends Fragment {
MenuItem searchItem = menu.findItem(R.id.action_search); 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.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setQueryHint(getContext().getString(R.string.strFilter));
if(!connToInternet) { if(!connToInternet) {
return; return;

View File

@ -104,7 +104,7 @@ public class OrganizationInfoFragment extends Fragment {
if (response.code() == 200) { if (response.code() == 200) {
assert orgInfo != null; assert orgInfo != null;
Picasso.get().load(orgInfo.getAvatar_url()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(orgAvatar); Picasso.get().load(orgInfo.getAvatar_url()).transform(new RoundedTransformation(8, 0)).resize(180, 180).centerCrop().into(orgAvatar);
orgDescInfo.setText(orgInfo.getDescription()); orgDescInfo.setText(orgInfo.getDescription());
orgWebsiteInfo.setText(orgInfo.getWebsite()); orgWebsiteInfo.setText(orgInfo.getWebsite());
orgLocationInfo.setText(orgInfo.getLocation()); orgLocationInfo.setText(orgInfo.getLocation());

View File

@ -173,6 +173,7 @@ public class OrganizationsFragment extends Fragment {
MenuItem searchItem = menu.findItem(R.id.action_search); 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.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setQueryHint(getContext().getString(R.string.strFilter));
if(!connToInternet) { if(!connToInternet) {
return; return;

View File

@ -48,7 +48,7 @@ public class ProfileFragment extends Fragment {
TextView userEmail = v.findViewById(R.id.userEmail); TextView userEmail = v.findViewById(R.id.userEmail);
userFullName.setText(tinyDb.getString("userFullname")); userFullName.setText(tinyDb.getString("userFullname"));
Picasso.get().load(tinyDb.getString("userAvatar")).transform(new RoundedTransformation(100, 0)).resize(180, 180).centerCrop().into(userAvatar); Picasso.get().load(tinyDb.getString("userAvatar")).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(userAvatar);
userLogin.setText(getString(R.string.usernameWithAt, tinyDb.getString("userLogin"))); userLogin.setText(getString(R.string.usernameWithAt, tinyDb.getString("userLogin")));
userEmail.setText(tinyDb.getString("userEmail")); userEmail.setText(tinyDb.getString("userEmail"));

View File

@ -8,6 +8,7 @@ import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.util.TinyDB;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@ -24,6 +25,8 @@ public class RepoBottomSheetFragment extends BottomSheetDialogFragment {
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.repo_bottom_sheet_layout, container, false); View v = inflater.inflate(R.layout.repo_bottom_sheet_layout, container, false);
final TinyDB tinyDb = new TinyDB(getContext());
TextView createLabel = v.findViewById(R.id.createLabel); TextView createLabel = v.findViewById(R.id.createLabel);
TextView createIssue = v.findViewById(R.id.createNewIssue); TextView createIssue = v.findViewById(R.id.createNewIssue);
TextView createMilestone = v.findViewById(R.id.createNewMilestone); TextView createMilestone = v.findViewById(R.id.createNewMilestone);
@ -40,6 +43,8 @@ public class RepoBottomSheetFragment extends BottomSheetDialogFragment {
} }
}); });
if(tinyDb.getBoolean("hasIssues")) {
createIssue.setVisibility(View.VISIBLE);
createIssue.setOnClickListener(new View.OnClickListener() { createIssue.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
@ -47,6 +52,10 @@ public class RepoBottomSheetFragment extends BottomSheetDialogFragment {
dismiss(); dismiss();
} }
}); });
}
else {
createIssue.setVisibility(View.GONE);
}
createMilestone.setOnClickListener(new View.OnClickListener() { createMilestone.setOnClickListener(new View.OnClickListener() {
@Override @Override

View File

@ -1,24 +1,31 @@
package org.mian.gitnex.fragments; package org.mian.gitnex.fragments;
import android.content.Context; import android.content.Context;
import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import okhttp3.OkHttpClient; import io.noties.markwon.AbstractMarkwonPlugin;
import io.noties.markwon.Markwon;
import io.noties.markwon.core.CorePlugin;
import io.noties.markwon.core.MarkwonTheme;
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
import io.noties.markwon.ext.tables.TablePlugin;
import io.noties.markwon.ext.tasklist.TaskListPlugin;
import io.noties.markwon.html.HtmlPlugin;
import io.noties.markwon.image.AsyncDrawable;
import io.noties.markwon.image.DefaultMediaDecoder;
import io.noties.markwon.image.ImageItem;
import io.noties.markwon.image.ImagesPlugin;
import io.noties.markwon.image.SchemeHandler;
import io.noties.markwon.image.gif.GifMediaDecoder;
import io.noties.markwon.image.svg.SvgMediaDecoder;
import io.noties.markwon.linkify.LinkifyPlugin;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
import ru.noties.markwon.AbstractMarkwonPlugin; import android.text.Spanned;
import ru.noties.markwon.Markwon;
import ru.noties.markwon.core.CorePlugin;
import ru.noties.markwon.core.MarkwonTheme;
import ru.noties.markwon.ext.strikethrough.StrikethroughPlugin;
import ru.noties.markwon.ext.tables.TablePlugin;
import ru.noties.markwon.ext.tasklist.TaskListPlugin;
import ru.noties.markwon.html.HtmlPlugin;
import ru.noties.markwon.image.ImagesPlugin;
import ru.noties.markwon.image.gif.GifPlugin;
import ru.noties.markwon.image.okhttp.OkHttpImagesPlugin;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -40,6 +47,8 @@ import org.mian.gitnex.util.TinyDB;
import org.ocpsoft.prettytime.PrettyTime; import org.ocpsoft.prettytime.PrettyTime;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Collections;
import java.util.Locale; import java.util.Locale;
import java.util.Objects; import java.util.Objects;
@ -206,6 +215,8 @@ public class RepoInfoFragment extends Fragment {
private void getRepoInfo(String instanceUrl, String token, final String owner, String repo, final String locale, final String timeFormat) { private void getRepoInfo(String instanceUrl, String token, final String owner, String repo, final String locale, final String timeFormat) {
final TinyDB tinyDb = new TinyDB(getContext());
Call<UserRepositories> call = RetrofitClient Call<UserRepositories> call = RetrofitClient
.getInstance(instanceUrl) .getInstance(instanceUrl)
.getApiInterface() .getApiInterface()
@ -236,6 +247,8 @@ public class RepoInfoFragment extends Fragment {
repoRepoUrlInfo.setText(repoInfo.getHtml_url()); repoRepoUrlInfo.setText(repoInfo.getHtml_url());
repoForksCountInfo.setText(repoInfo.getForks_count()); repoForksCountInfo.setText(repoInfo.getForks_count());
tinyDb.putBoolean("hasIssues", repoInfo.getHas_issues());
switch (timeFormat) { switch (timeFormat) {
case "pretty": { case "pretty": {
PrettyTime prettyTime = new PrettyTime(new Locale(locale)); PrettyTime prettyTime = new PrettyTime(new Locale(locale));
@ -300,8 +313,45 @@ public class RepoInfoFragment extends Fragment {
final Markwon markwon = Markwon.builder(Objects.requireNonNull(getContext())) final Markwon markwon = Markwon.builder(Objects.requireNonNull(getContext()))
.usePlugin(CorePlugin.create()) .usePlugin(CorePlugin.create())
.usePlugin(OkHttpImagesPlugin.create(new OkHttpClient())) .usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
.usePlugin(ImagesPlugin.createWithAssets(getContext())) @Override
public void configureImages(@NonNull ImagesPlugin plugin) {
plugin.addSchemeHandler(new SchemeHandler() {
@NonNull
@Override
public ImageItem handle(@NonNull String raw, @NonNull Uri uri) {
final int resourceId = getContext().getResources().getIdentifier(
raw.substring("drawable://".length()),
"drawable",
getContext().getPackageName());
final Drawable drawable = getContext().getDrawable(resourceId);
assert drawable != null;
return ImageItem.withResult(drawable);
}
@NonNull
@Override
public Collection<String> supportedSchemes() {
return Collections.singleton("drawable");
}
});
plugin.placeholderProvider(new ImagesPlugin.PlaceholderProvider() {
@Nullable
@Override
public Drawable providePlaceholder(@NonNull AsyncDrawable drawable) {
return null;
}
});
plugin.addMediaDecoder(GifMediaDecoder.create(false));
plugin.addMediaDecoder(SvgMediaDecoder.create(getContext().getResources()));
plugin.addMediaDecoder(SvgMediaDecoder.create());
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(getContext().getResources()));
plugin.defaultMediaDecoder(DefaultMediaDecoder.create());
}
}))
.usePlugin(new AbstractMarkwonPlugin() { .usePlugin(new AbstractMarkwonPlugin() {
@Override @Override
public void configureTheme(@NonNull MarkwonTheme.Builder builder) { public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
@ -314,15 +364,16 @@ public class RepoInfoFragment extends Fragment {
.usePlugin(TablePlugin.create(getContext())) .usePlugin(TablePlugin.create(getContext()))
.usePlugin(TaskListPlugin.create(getContext())) .usePlugin(TaskListPlugin.create(getContext()))
.usePlugin(HtmlPlugin.create()) .usePlugin(HtmlPlugin.create())
.usePlugin(GifPlugin.create())
.usePlugin(StrikethroughPlugin.create()) .usePlugin(StrikethroughPlugin.create())
.usePlugin(LinkifyPlugin.create())
.build(); .build();
CharSequence bodyWithMD = null; Spanned bodyWithMD = null;
if (response.body() != null) { if (response.body() != null) {
bodyWithMD = markwon.toMarkdown(response.body()); bodyWithMD = markwon.toMarkdown(response.body());
} }
repoFileContents.setText(bodyWithMD); assert bodyWithMD != null;
markwon.setParsedMarkdown(repoFileContents, bodyWithMD);
} else if (response.code() == 401) { } else if (response.code() == 401) {

View File

@ -155,6 +155,7 @@ public class RepositoriesByOrgFragment extends Fragment {
MenuItem searchItem = menu.findItem(R.id.action_search); 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.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setQueryHint(getContext().getString(R.string.strFilter));
if(!connToInternet) { if(!connToInternet) {
return; return;

View File

@ -176,6 +176,7 @@ public class RepositoriesFragment extends Fragment {
MenuItem searchItem = menu.findItem(R.id.action_search); 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.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setQueryHint(getContext().getString(R.string.strFilter));
if(!connToInternet) { if(!connToInternet) {
return; return;

View File

@ -13,9 +13,12 @@ import org.mian.gitnex.activities.AddRemoveAssigneesActivity;
import org.mian.gitnex.activities.AddRemoveLabelsActivity; import org.mian.gitnex.activities.AddRemoveLabelsActivity;
import org.mian.gitnex.activities.EditIssueActivity; import org.mian.gitnex.activities.EditIssueActivity;
import org.mian.gitnex.activities.ReplyToIssueActivity; import org.mian.gitnex.activities.ReplyToIssueActivity;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.util.TinyDB; import org.mian.gitnex.util.TinyDB;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import android.content.ClipboardManager;
import android.content.ClipData;
/** /**
* Author M M Arif * Author M M Arif
@ -37,6 +40,7 @@ public class SingleIssueBottomSheetFragment extends BottomSheetDialogFragment {
TextView closeIssue = v.findViewById(R.id.closeIssue); TextView closeIssue = v.findViewById(R.id.closeIssue);
TextView reOpenIssue = v.findViewById(R.id.reOpenIssue); TextView reOpenIssue = v.findViewById(R.id.reOpenIssue);
TextView addRemoveAssignees = v.findViewById(R.id.addRemoveAssignees); TextView addRemoveAssignees = v.findViewById(R.id.addRemoveAssignees);
TextView copyIssueUrl = v.findViewById(R.id.copyIssueUrl);
replyToIssue.setOnClickListener(new View.OnClickListener() { replyToIssue.setOnClickListener(new View.OnClickListener() {
@Override @Override
@ -78,6 +82,32 @@ public class SingleIssueBottomSheetFragment extends BottomSheetDialogFragment {
} }
}); });
copyIssueUrl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// get url of repo
String repoFullName = tinyDB.getString("repoFullName");
String instanceUrlWithProtocol = "https://" + tinyDB.getString("instanceUrlRaw");
if(!tinyDB.getString("instanceUrlWithProtocol").isEmpty()) {
instanceUrlWithProtocol = tinyDB.getString("instanceUrlWithProtocol");
}
// get issue Url
String issueUrl = instanceUrlWithProtocol + "/" + repoFullName + "/issues/" + tinyDB.getString("issueNumber");
// copy to clipboard
ClipboardManager clipboard = (ClipboardManager) getContext().getSystemService(android.content.Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("issueUrl", issueUrl);
clipboard.setPrimaryClip(clip);
dismiss();
Toasty.info(getContext(), getContext().getString(R.string.copyIssueUrlToastMsg));
}
});
if(tinyDB.getString("issueState").equals("open")) { // close issue if(tinyDB.getString("issueState").equals("open")) { // close issue
reOpenIssue.setVisibility(View.GONE); reOpenIssue.setVisibility(View.GONE);

View File

@ -198,6 +198,7 @@ public class StarredRepositoriesFragment extends Fragment {
MenuItem searchItem = menu.findItem(R.id.action_search); 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.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setQueryHint(getContext().getString(R.string.strFilter));
if(!connToInternet) { if(!connToInternet) {
return; return;

View File

@ -156,6 +156,7 @@ public class TeamsByOrgFragment extends Fragment {
MenuItem searchItem = menu.findItem(R.id.action_search); 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.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setQueryHint(getContext().getString(R.string.strFilter));
if(!connToInternet) { if(!connToInternet) {
return; return;

View File

@ -99,7 +99,7 @@ public interface ApiInterface {
Call<Issues> replyCommentToIssue(@Header("Authorization") String token, @Path("owner") String ownerName, @Path("repo") String repoName, @Path("index") int issueIndex, @Body Issues jsonStr); Call<Issues> replyCommentToIssue(@Header("Authorization") String token, @Path("owner") String ownerName, @Path("repo") String repoName, @Path("index") int issueIndex, @Body Issues jsonStr);
@GET("repos/{owner}/{repo}/milestones") // get milestones by repo @GET("repos/{owner}/{repo}/milestones") // get milestones by repo
Call<List<Milestones>> getMilestones(@Header("Authorization") String token, @Path("owner") String ownerName, @Path("repo") String repoName); Call<List<Milestones>> getMilestones(@Header("Authorization") String token, @Path("owner") String ownerName, @Path("repo") String repoName, @Query("state") String state);
@GET("repos/{owner}/{repo}/branches") // get branches @GET("repos/{owner}/{repo}/branches") // get branches
Call<List<Branches>> getBranches(@Header("Authorization") String token, @Path("owner") String ownerName, @Path("repo") String repoName); Call<List<Branches>> getBranches(@Header("Authorization") String token, @Path("owner") String ownerName, @Path("repo") String repoName);

View File

@ -27,7 +27,8 @@ public class UserRepositories {
private String ssh_url; private String ssh_url;
private String website; private String website;
private String forks_count; private String forks_count;
private Boolean has_issues;
private String avatar_url;
public int getId() { public int getId() {
return id; return id;
@ -96,4 +97,12 @@ public class UserRepositories {
public String getForks_count() { public String getForks_count() {
return forks_count; return forks_count;
} }
public Boolean getHas_issues() {
return has_issues;
}
public String getAvatar_url() {
return avatar_url;
}
} }

View File

@ -20,20 +20,20 @@ public class MilestonesViewModel extends ViewModel {
private static MutableLiveData<List<Milestones>> milestonesList; private static MutableLiveData<List<Milestones>> milestonesList;
public LiveData<List<Milestones>> getMilestonesList(String instanceUrl, String token, String owner, String repo) { public LiveData<List<Milestones>> getMilestonesList(String instanceUrl, String token, String owner, String repo, String msState) {
milestonesList = new MutableLiveData<>(); milestonesList = new MutableLiveData<>();
loadMilestonesList(instanceUrl, token, owner, repo); loadMilestonesList(instanceUrl, token, owner, repo, msState);
return milestonesList; return milestonesList;
} }
public static void loadMilestonesList(String instanceUrl, String token, String owner, String repo) { public static void loadMilestonesList(String instanceUrl, String token, String owner, String repo, String msState) {
Call<List<Milestones>> call = RetrofitClient Call<List<Milestones>> call = RetrofitClient
.getInstance(instanceUrl) .getInstance(instanceUrl)
.getApiInterface() .getApiInterface()
.getMilestones(token, owner, repo); .getMilestones(token, owner, repo, msState);
call.enqueue(new Callback<List<Milestones>>() { call.enqueue(new Callback<List<Milestones>>() {

View File

@ -0,0 +1,5 @@
<vector android:height="16dp" android:tint="#FFFFFF"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="16dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M21.99,4c0,-1.1 -0.89,-2 -1.99,-2H4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h14l4,4 -0.01,-18z"/>
</vector>

View File

@ -0,0 +1,5 @@
<vector android:height="20dp" android:tint="#FFFFFF"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="20dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M21.99,4c0,-1.1 -0.89,-2 -1.99,-2H4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h14l4,4 -0.01,-18z"/>
</vector>

View File

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M16,1L4,1c-1.1,0 -2,0.9 -2,2v14h2L4,3h12L16,1zM19,5L8,5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h11c1.1,0 2,-0.9 2,-2L21,7c0,-1.1 -0.9,-2 -2,-2zM19,21L8,21L8,7h11v14z"/>
</vector>

View File

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M10,18h4v-2h-4v2zM3,6v2h18L21,6L3,6zM6,13h12v-2L6,11v2z"/>
</vector>

View File

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M14,4l2.29,2.29 -2.88,2.88 1.42,1.42 2.88,-2.88L20,10L20,4zM10,4L4,4v6l2.29,-2.29 4.71,4.7L11,20h2v-8.41l-5.29,-5.3z"/>
</vector>

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@android:id/background"
android:top="2dp"
android:bottom="2dp"
android:right="1dp"
android:left="1dp">
<shape>
<corners android:radius="15dp"/>
<solid android:color="@color/divider"/>
</shape>
</item>
<item
android:id="@android:id/progress"
android:top="3dp"
android:bottom="3dp"
android:left="1dp"
android:right="1dp">
<scale android:scaleWidth="100%">
<shape>
<corners android:radius="15dp" />
</shape>
</scale>
</item>
</layer-list>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" > android:shape="rectangle" >
<corners android:radius="35dp"/> <corners android:radius="5dp"/>
</shape> </shape>

Binary file not shown.

Binary file not shown.

View File

@ -182,7 +182,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="1dp" android:layout_height="1dp"
android:id="@+id/divider" android:id="@+id/divider"
android:layout_marginTop="10dp" android:layout_marginTop="15dp"
android:background="@color/divider" /> android:background="@color/divider" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView

View File

@ -30,7 +30,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:scaleType="fitCenter" android:scaleType="fitCenter"
android:layout_marginTop="5dp"
android:contentDescription="@string/userRoleAdmin" android:contentDescription="@string/userRoleAdmin"
android:src="@drawable/ic_android" /> android:src="@drawable/ic_android" />

View File

@ -13,7 +13,7 @@
android:textSize="16sp" android:textSize="16sp"
app:textAllCaps="true" app:textAllCaps="true"
android:text="@string/tab_text_issues" android:text="@string/tab_text_issues"
android:textColor="@color/white" /> android:textColor="@color/lightGray" />
<TextView <TextView
android:id="@+id/counterBadge" android:id="@+id/counterBadge"

View File

@ -13,7 +13,6 @@
android:layout_width="40dp" android:layout_width="40dp"
android:layout_height="40dp" android:layout_height="40dp"
android:layout_marginEnd="15dp" android:layout_marginEnd="15dp"
android:layout_marginTop="5dp"
android:contentDescription="@string/generalImgContentText" android:contentDescription="@string/generalImgContentText"
android:src="@drawable/ic_android" /> android:src="@drawable/ic_android" />

View File

@ -37,7 +37,7 @@
android:paddingBottom="10dp" android:paddingBottom="10dp"
android:paddingStart="0dp" android:paddingStart="0dp"
android:paddingEnd="0dp" android:paddingEnd="0dp"
android:textColor="@color/white"/> android:textColor="@color/lightGray"/>
<ImageView <ImageView
android:id="@+id/repoMetaDataExpandCollapse" android:id="@+id/repoMetaDataExpandCollapse"
@ -69,7 +69,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:text="@string/infoTabRepoBlank" android:text="@string/infoTabRepoBlank"
android:textIsSelectable="true" android:textIsSelectable="true"
android:textSize="16sp" android:textSize="14sp"
android:paddingTop="5dp" android:paddingTop="5dp"
android:textColor="@color/colorWhite"/> android:textColor="@color/colorWhite"/>
@ -87,7 +87,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:text="@string/infoTabRepoBlank" android:text="@string/infoTabRepoBlank"
android:textIsSelectable="true" android:textIsSelectable="true"
android:textSize="16sp" android:textSize="14sp"
android:paddingTop="5dp" android:paddingTop="5dp"
android:textColor="@color/colorWhite"/> android:textColor="@color/colorWhite"/>
@ -105,7 +105,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:text="@string/infoTabRepoBlank" android:text="@string/infoTabRepoBlank"
android:textIsSelectable="true" android:textIsSelectable="true"
android:textSize="16sp" android:textSize="14sp"
android:paddingTop="5dp" android:paddingTop="5dp"
android:autoLink="web" android:autoLink="web"
android:textColor="@color/colorWhite"/> android:textColor="@color/colorWhite"/>
@ -124,9 +124,10 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:text="@string/infoTabRepoBlank" android:text="@string/infoTabRepoBlank"
android:textIsSelectable="true" android:textIsSelectable="true"
android:textSize="16sp" android:textSize="14sp"
android:paddingTop="5dp" android:paddingTop="5dp"
android:autoLink="web" android:autoLink="web"
android:textColorLink="@color/lightBlue"
android:textColor="@color/colorWhite"/> android:textColor="@color/colorWhite"/>
<TextView <TextView
@ -143,7 +144,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:text="@string/infoTabRepoZero" android:text="@string/infoTabRepoZero"
android:textIsSelectable="true" android:textIsSelectable="true"
android:textSize="16sp" android:textSize="14sp"
android:paddingTop="5dp" android:paddingTop="5dp"
android:textColor="@color/colorWhite"/> android:textColor="@color/colorWhite"/>
@ -161,7 +162,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:text="@string/infoTabRepoDefaultBranchText" android:text="@string/infoTabRepoDefaultBranchText"
android:textIsSelectable="true" android:textIsSelectable="true"
android:textSize="16sp" android:textSize="14sp"
android:paddingTop="5dp" android:paddingTop="5dp"
android:textColor="@color/colorWhite"/> android:textColor="@color/colorWhite"/>
@ -179,7 +180,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:text="@string/infoTabRepoBlank" android:text="@string/infoTabRepoBlank"
android:textIsSelectable="true" android:textIsSelectable="true"
android:textSize="16sp" android:textSize="14sp"
android:paddingTop="5dp" android:paddingTop="5dp"
android:autoLink="web" android:autoLink="web"
android:textColorLink="@color/lightBlue" android:textColorLink="@color/lightBlue"
@ -199,7 +200,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:text="@string/infoTabRepoBlank" android:text="@string/infoTabRepoBlank"
android:textIsSelectable="true" android:textIsSelectable="true"
android:textSize="16sp" android:textSize="14sp"
android:paddingTop="5dp" android:paddingTop="5dp"
android:autoLink="web" android:autoLink="web"
android:textColorLink="@color/lightBlue" android:textColorLink="@color/lightBlue"
@ -219,7 +220,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:text="@string/infoTabRepoBlank" android:text="@string/infoTabRepoBlank"
android:textIsSelectable="true" android:textIsSelectable="true"
android:textSize="16sp" android:textSize="14sp"
android:paddingTop="5dp" android:paddingTop="5dp"
android:autoLink="web" android:autoLink="web"
android:textColorLink="@color/lightBlue" android:textColorLink="@color/lightBlue"
@ -239,7 +240,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:text="@string/infoTabRepoZero" android:text="@string/infoTabRepoZero"
android:textIsSelectable="true" android:textIsSelectable="true"
android:textSize="16sp" android:textSize="14sp"
android:paddingTop="5dp" android:paddingTop="5dp"
android:textColor="@color/colorWhite"/> android:textColor="@color/colorWhite"/>
@ -256,7 +257,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:text="@string/infoTabRepoDummyTime" android:text="@string/infoTabRepoDummyTime"
android:textSize="16sp" android:textSize="14sp"
android:paddingTop="5dp" android:paddingTop="5dp"
android:textColor="@color/colorWhite"/> android:textColor="@color/colorWhite"/>
@ -284,7 +285,7 @@
android:paddingEnd="0dp" android:paddingEnd="0dp"
android:autoLink="web" android:autoLink="web"
android:textColorLink="@color/lightBlue" android:textColorLink="@color/lightBlue"
android:textColor="@color/white"/> android:textColor="@color/lightGray"/>
<ImageView <ImageView
android:id="@+id/repoFilenameExpandCollapse" android:id="@+id/repoFilenameExpandCollapse"

View File

@ -1,16 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/relativeLayoutMainFrame"
android:background="@color/backgroundColor">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="15dp" android:layout_margin="15dp"
android:id="@+id/milestoneFrame" android:id="@+id/milestoneFrame"
android:background="@color/backgroundColor"
android:orientation="vertical"> android:orientation="vertical">
<LinearLayout <LinearLayout
@ -48,54 +43,63 @@
android:text="@string/repoDescription" android:text="@string/repoDescription"
android:textIsSelectable="true" android:textIsSelectable="true"
android:textColor="@color/colorWhite" android:textColor="@color/colorWhite"
android:textSize="16sp" /> android:textSize="14sp" />
<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="12dp" android:layout_marginTop="10dp"
android:layout_marginBottom="5dp" android:layout_marginBottom="5dp"
android:orientation="horizontal"> android:orientation="horizontal">
<TextView
android:id="@+id/milestoneIssuesOpen"
android:layout_width="0dp"
android:layout_height="24dp"
android:layout_weight=".25"
android:drawableStart="@drawable/ic_issues"
android:drawablePadding="6dp"
android:text="@string/repoStars"
android:gravity="start"
android:textColor="@color/colorWhite"
android:textSize="16sp" />
<TextView <TextView
android:id="@+id/milestoneIssuesClosed" android:id="@+id/milestoneIssuesClosed"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="24dp" android:layout_height="wrap_content"
android:layout_weight=".25" android:layout_weight="8"
android:drawableStart="@drawable/ic_issue_closed"
android:drawablePadding="6dp"
android:text="@string/repoWatchers" android:text="@string/repoWatchers"
android:gravity="start" android:gravity="start"
android:textColor="@color/colorWhite" android:textColor="@color/colorWhite"
android:textSize="16sp" /> android:textSize="14sp" />
<ProgressBar
android:id="@+id/milestoneProgress"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="80"
android:progress="50"
android:layout_marginTop="2dp"
android:progressDrawable="@drawable/progress_bar"
android:progressTint="@color/colorLightGreen" />
<TextView
android:id="@+id/milestoneIssuesOpen"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="8"
android:text="@string/repoStars"
android:gravity="end"
android:textColor="@color/colorWhite"
android:textSize="14sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView <TextView
android:id="@+id/milestoneDueDate" android:id="@+id/milestoneDueDate"
android:layout_width="0dp" android:layout_width="wrap_content"
android:layout_height="24dp" android:layout_height="wrap_content"
android:layout_weight=".50"
android:drawableStart="@drawable/ic_calendar"
android:drawablePadding="06dp"
android:text="@string/repoWatchers" android:text="@string/repoWatchers"
android:gravity="start" android:gravity="start"
android:layout_marginTop="5dp"
android:textColor="@color/colorWhite" android:textColor="@color/colorWhite"
android:textSize="16sp" /> android:textSize="16sp" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</RelativeLayout>

View File

@ -52,7 +52,7 @@
android:layout_weight=".05" android:layout_weight=".05"
android:id="@+id/imageRepoTypeMy" android:id="@+id/imageRepoTypeMy"
android:layout_width="10dp" android:layout_width="10dp"
android:layout_height="18dp" android:layout_height="20dp"
android:layout_gravity="end" android:layout_gravity="end"
android:contentDescription="@string/privateAvatar" android:contentDescription="@string/privateAvatar"
android:src="@drawable/ic_lock_bold" /> android:src="@drawable/ic_lock_bold" />
@ -112,11 +112,11 @@
android:textSize="16sp" /> android:textSize="16sp" />
<TextView <TextView
android:id="@+id/repoWatchersMy" android:id="@+id/repoForksMy"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="20dp" android:layout_height="20dp"
android:layout_weight=".25" android:layout_weight=".25"
android:drawableStart="@drawable/ic_watchers" android:drawableStart="@drawable/ic_forks_24"
android:drawablePadding="6dp" android:drawablePadding="6dp"
android:gravity="center_vertical" android:gravity="center_vertical"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"

View File

@ -14,7 +14,6 @@
android:src="@drawable/ic_android" android:src="@drawable/ic_android"
android:maxHeight="24dp" android:maxHeight="24dp"
android:maxWidth="24dp" android:maxWidth="24dp"
android:layout_marginTop="5dp"
android:paddingStart="20dp" android:paddingStart="20dp"
android:paddingEnd="5dp" android:paddingEnd="5dp"
android:contentDescription="@string/app_name"/> android:contentDescription="@string/app_name"/>

View File

@ -22,6 +22,7 @@
android:layout_width="40dp" android:layout_width="40dp"
android:layout_height="40dp" android:layout_height="40dp"
android:layout_marginEnd="15dp" android:layout_marginEnd="15dp"
android:layout_marginBottom="5dp"
android:src="@drawable/ic_android" android:src="@drawable/ic_android"
android:contentDescription="@string/orgContentAvatar"/> android:contentDescription="@string/orgContentAvatar"/>

View File

@ -1,16 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/relativeLayoutMainFrame"
android:background="@color/backgroundColor">
<RelativeLayout <RelativeLayout
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/relativeLayoutFrame" android:id="@+id/relativeLayoutFrame"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_margin="15dp" android:layout_margin="15dp"
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
tools:context=".activities.RepoDetailActivity"> tools:context=".activities.RepoDetailActivity">
@ -29,20 +23,6 @@
android:contentDescription="@string/generalImgContentText" android:contentDescription="@string/generalImgContentText"
android:src="@drawable/ic_android" /> android:src="@drawable/ic_android" />
<TextView
android:layout_marginTop="10dp"
android:id="@+id/issueCommentsCount"
android:layout_width="48dp"
android:layout_height="50dp"
android:width="16dp"
android:height="16dp"
android:layout_marginEnd="15dp"
android:layout_below="@+id/assigneeAvatar"
android:drawableTop="@drawable/ic_comment"
android:gravity="center"
android:textColor="@color/colorWhite"
android:textSize="14sp" />
<LinearLayout <LinearLayout
android:id="@+id/infoSection" android:id="@+id/infoSection"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -60,60 +40,67 @@
<TextView <TextView
android:id="@+id/issueTitle" android:id="@+id/issueTitle"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_weight=".82"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight=".65"
android:gravity="top|center_vertical"
android:textAlignment="gravity"
android:text="@string/strFilter"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="18sp" /> android:textSize="18sp" />
<TextView <TextView
android:layout_width="0dp" android:layout_width="0dp"
android:layout_weight=".08" android:layout_weight=".08"
android:layout_height="wrap_content" /> android:layout_height="match_parent" />
<ImageView <ImageView
android:id="@+id/issueType" android:id="@+id/issueType"
android:layout_width="24dp" android:layout_width="20dp"
android:layout_height="24dp" android:layout_height="20dp"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
android:contentDescription="@string/generalImgContentText" android:contentDescription="@string/generalImgContentText"
android:src="@drawable/ic_issues" /> android:src="@drawable/ic_issues" />
</LinearLayout> </LinearLayout>
<TextView
android:id="@+id/issueDescription"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:textColor="@color/colorWhite"
android:textSize="16sp"
android:visibility="gone" />
<LinearLayout <LinearLayout
android:id="@+id/frameCreatedDate" android:id="@+id/frameCreatedDate"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/frameCommentsCount"
android:layout_width="0dp"
android:layout_weight=".25"
android:layout_height="wrap_content"
android:orientation="horizontal"> android:orientation="horizontal">
<TextView <TextView
android:id="@+id/issueCreatedAtText" android:id="@+id/issueCommentsCount"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/createdText" android:gravity="start"
android:drawablePadding="5dp"
android:drawableStart="@drawable/ic_comment_20"
android:layout_gravity="center_horizontal"
android:textColor="@color/colorWhite" android:textColor="@color/colorWhite"
android:textSize="12sp" /> android:textSize="14sp" />
</LinearLayout>
<TextView <TextView
android:id="@+id/issueCreatedTime" android:id="@+id/issueCreatedTime"
android:layout_width="wrap_content" android:layout_width="0dp"
android:layout_weight=".15"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="end"
android:textColor="@color/colorWhite" android:textColor="@color/colorWhite"
android:textSize="12sp" /> android:textSize="14sp" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</RelativeLayout> </RelativeLayout>
</RelativeLayout>

View File

@ -52,7 +52,7 @@
android:layout_weight=".05" android:layout_weight=".05"
android:id="@+id/imageRepoType" android:id="@+id/imageRepoType"
android:layout_width="10dp" android:layout_width="10dp"
android:layout_height="18dp" android:layout_height="20dp"
android:layout_gravity="end" android:layout_gravity="end"
android:contentDescription="@string/privateAvatar" android:contentDescription="@string/privateAvatar"
android:src="@drawable/ic_lock_24dp" /> android:src="@drawable/ic_lock_24dp" />
@ -112,11 +112,11 @@
android:textSize="14sp" /> android:textSize="14sp" />
<TextView <TextView
android:id="@+id/repoWatchers" android:id="@+id/repoForks"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="20dp" android:layout_height="20dp"
android:layout_weight=".25" android:layout_weight=".25"
android:drawableStart="@drawable/ic_watchers" android:drawableStart="@drawable/ic_forks_24"
android:drawablePadding="6dp" android:drawablePadding="6dp"
android:gravity="center_vertical" android:gravity="center_vertical"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"

View File

@ -1,20 +1,17 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/backgroundColor" >
<RelativeLayout <RelativeLayout
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linearLayoutFrame" android:id="@+id/linearLayoutFrame"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:layout_marginTop="0dp" android:layout_marginTop="0dp"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
android:orientation="vertical" android:orientation="vertical"
android:layout_margin="10dp" android:layout_margin="10dp"
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
android:background="@color/backgroundColor"
tools:context=".activities.MainActivity"> tools:context=".activities.MainActivity">
<ImageView <ImageView
@ -52,7 +49,7 @@
android:layout_weight=".05" android:layout_weight=".05"
android:id="@+id/imageRepoType" android:id="@+id/imageRepoType"
android:layout_width="10dp" android:layout_width="10dp"
android:layout_height="18dp" android:layout_height="20dp"
android:layout_gravity="end" android:layout_gravity="end"
android:contentDescription="@string/privateAvatar" android:contentDescription="@string/privateAvatar"
android:src="@drawable/ic_lock_24dp" /> android:src="@drawable/ic_lock_24dp" />
@ -112,11 +109,11 @@
android:textSize="14sp" /> android:textSize="14sp" />
<TextView <TextView
android:id="@+id/repoWatchers" android:id="@+id/repoForks"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="20dp" android:layout_height="20dp"
android:layout_weight=".25" android:layout_weight=".25"
android:drawableStart="@drawable/ic_watchers" android:drawableStart="@drawable/ic_forks_24"
android:drawablePadding="6dp" android:drawablePadding="6dp"
android:gravity="center_vertical" android:gravity="center_vertical"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
@ -140,4 +137,3 @@
</RelativeLayout> </RelativeLayout>
</RelativeLayout>

View File

@ -79,4 +79,16 @@
android:textSize="16sp" android:textSize="16sp"
android:padding="16dp" /> android:padding="16dp" />
<TextView
android:id="@+id/copyIssueUrl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:drawableStart="@drawable/ic_content_copy"
android:drawablePadding="24dp"
android:padding="16dp"
android:text="@string/copyIssueUrl"
android:textColor="@color/white"
android:textSize="16sp" />
</LinearLayout> </LinearLayout>

View File

@ -1,11 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/backgroundColor" >
<RelativeLayout <RelativeLayout
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linearLayoutFrame" android:id="@+id/linearLayoutFrame"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -15,6 +12,7 @@
android:orientation="vertical" android:orientation="vertical"
android:padding="10dp" android:padding="10dp"
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
android:background="@color/backgroundColor"
tools:context=".activities.MainActivity"> tools:context=".activities.MainActivity">
<ImageView <ImageView
@ -52,7 +50,7 @@
android:layout_weight=".05" android:layout_weight=".05"
android:id="@+id/imageRepoType" android:id="@+id/imageRepoType"
android:layout_width="10dp" android:layout_width="10dp"
android:layout_height="18dp" android:layout_height="20dp"
android:layout_gravity="end" android:layout_gravity="end"
android:contentDescription="@string/privateAvatar" android:contentDescription="@string/privateAvatar"
android:src="@drawable/ic_lock_24dp" /> android:src="@drawable/ic_lock_24dp" />
@ -112,11 +110,11 @@
android:textSize="14sp" /> android:textSize="14sp" />
<TextView <TextView
android:id="@+id/repoWatchers" android:id="@+id/repoForks"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="20dp" android:layout_height="20dp"
android:layout_weight=".25" android:layout_weight=".25"
android:drawableStart="@drawable/ic_watchers" android:drawableStart="@drawable/ic_forks_24"
android:drawablePadding="6dp" android:drawablePadding="6dp"
android:gravity="center_vertical" android:gravity="center_vertical"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
@ -139,5 +137,3 @@
</LinearLayout> </LinearLayout>
</RelativeLayout> </RelativeLayout>
</RelativeLayout>

View File

@ -5,8 +5,8 @@
<item <item
android:id="@+id/action_search" android:id="@+id/action_search"
android:icon="@drawable/ic_search" android:icon="@drawable/ic_filter"
android:title="@string/search" android:title="@string/strFilter"
app:actionViewClass="androidx.appcompat.widget.SearchView" app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="ifRoom|collapseActionView" /> app:showAsAction="ifRoom|collapseActionView" />

View File

@ -2,7 +2,7 @@
<!-- menu items --> <!-- menu items -->
<string name="navMyRepos">Meine Repositories</string> <string name="navMyRepos">Meine Repositories</string>
<string name="navStarredRepos">Starred Repositories</string> <string name="navStarredRepos">Favoriten</string>
<string name="navRepos">Repositories</string> <string name="navRepos">Repositories</string>
<string name="navProfile">Profil</string> <string name="navProfile">Profil</string>
<string name="navSettings">Einstellungen</string> <string name="navSettings">Einstellungen</string>
@ -17,25 +17,26 @@
<string name="pageTitleHome">Startseite</string> <string name="pageTitleHome">Startseite</string>
<string name="pageTitleMyRepos">Meine Repositories</string> <string name="pageTitleMyRepos">Meine Repositories</string>
<string name="pageTitleRepositories">Repositories</string> <string name="pageTitleRepositories">Repositories</string>
<string name="pageTitleProfile">Profile</string> <string name="pageTitleProfile">Profil</string>
<string name="pageTitleNewRepo">Repository erstellen</string> <string name="pageTitleNewRepo">Repository erstellen</string>
<string name="pageTitleOrganizations">Organisationen</string> <string name="pageTitleOrganizations">Organisationen</string>
<string name="pageTitleIssues">Probleme</string> <string name="pageTitleIssues">Issues</string>
<string name="pageTitleSettings">Einstellungen</string> <string name="pageTitleSettings">Einstellungen</string>
<string name="pageTitleCreateOrganization">Organisation erstellen</string> <string name="pageTitleCreateOrganization">Organisation erstellen</string>
<string name="pageTitleCreateMilestone">Meilenstein Erstellen</string> <string name="pageTitleCreateMilestone">Meilenstein erstellen</string>
<string name="pageTitleCreateNewIssue">Issue Erstellen</string> <string name="pageTitleCreateNewIssue">Issue erstellen</string>
<string name="pageTitleCreateLabel">Label Erstellen</string> <string name="pageTitleCreateLabel">Label erstellen</string>
<string name="pageTitleCredits">Credits</string> <string name="pageTitleCredits">Credits</string>
<string name="pageTitleLabelUpdate">Label Aktualisieren</string> <string name="pageTitleLabelUpdate">Label aktualisieren</string>
<string name="pageTitleSponsors">Sponsoren</string> <string name="pageTitleSponsors">Sponsoren</string>
<string name="pageTitleStarredRepos">Starred Repositories</string> <string name="pageTitleStarredRepos">Favoriten</string>
<string name="pageTitleCreateTeam">Team Erstellen</string> <string name="pageTitleCreateTeam">Team erstellen</string>
<string name="pageTitleAddEmail">E-Mail Adresse Hinzufügen</string> <string name="pageTitleAddEmail">E-Mail Adresse hinzufügen</string>
<string name="pageTitleNewFile">New File</string>
<!-- page titles --> <!-- page titles -->
<string name="appVersion">Version\u0020:\u0020</string> <string name="appVersion">Version\u0020:\u0020</string>
<string name="appBuild">Build No.\u0020:\u0020</string> <string name="appBuild">Build Nr.\u0020:\u0020</string>
<string name="repoName">Demo Repo</string> <string name="repoName">Demo Repo</string>
<string name="repoFullname">Repo mit ORG</string> <string name="repoFullname">Repo mit ORG</string>
@ -49,15 +50,15 @@
<string name="newCreateButtonCopy">Erstellen</string> <string name="newCreateButtonCopy">Erstellen</string>
<string name="newUpdateButtonCopy">Aktualisieren</string> <string name="newUpdateButtonCopy">Aktualisieren</string>
<string name="newRepoTintCopy">Name der Repo</string> <string name="newRepoTintCopy">Name des Repositories</string>
<string name="newRepoDescTintCopy">Beschreibung der Repo</string> <string name="newRepoDescTintCopy">Beschreibung des Repositories</string>
<string name="newRepoPrivateCopy">Privat</string> <string name="newRepoPrivateCopy">Privat</string>
<string name="newRepoDescInfo">255 Zeichen Maximal</string> <string name="newRepoDescInfo">maximal 255 Zeichen</string>
<string name="newRepoOwner">Eigentümer</string> <string name="newRepoOwner">Eigentümer</string>
<string name="newOrgTintCopy">Name der Organisation</string> <string name="newOrgTintCopy">Name der Organisation</string>
<string name="newOrgDescTintCopy">Beschreibung der Organisation</string> <string name="newOrgDescTintCopy">Beschreibung der Organisation</string>
<string name="newOrgDescInfo">255 Zeichen Maximal</string> <string name="newOrgDescInfo">maximal 255 Zeichen</string>
<string name="userName">Benutzername</string> <string name="userName">Benutzername</string>
<string name="passWord">Passwort</string> <string name="passWord">Passwort</string>
@ -66,16 +67,16 @@
<string name="navigation_drawer_open">Navigationsleiste öffnen</string> <string name="navigation_drawer_open">Navigationsleiste öffnen</string>
<string name="navigation_drawer_close">Navigationsleiste schließen</string> <string name="navigation_drawer_close">Navigationsleiste schließen</string>
<string name="logo">In Gitea anmelden</string> <string name="logo">In Gitea anmelden</string>
<string name="urlInfoTooltip">1- Wählen Sie das richtige Protokoll (https oder http) \ N2- Geben Sie die Gitea-URL ein, z.B. try.gitea.io \n3- For 2FA enter USERNAME:CODE in the Username field \n4- For HTTP basic auth use USERNAME@DOMAIN.COM in the URL field</string> <string name="urlInfoTooltip">1- Wähle das richtige Protokoll (https oder http) \ N2- Gebe die Gitea-URL ein, z.B. try.gitea.io \n3- Falls du 2FA aktiviert hast, gib den Code in das OTP-Code Feld ein. \n4- Für HTTP basic auth nutze BENUTZERNAME@DOMAIN.COM im URL Feld</string>
<string name="loginFailed">Falscher Benutzername/Passwort </string> <string name="loginFailed">Falscher Benutzername/Passwort </string>
<string name="protocolDelimiter">://</string> <string name="protocolDelimiter">://</string>
<string name="protocolError">Es wird nicht empfohlen, das HTTP-Protokoll zu verwenden, es sei denn, Sie testen in einem lokalen Netzwerk.</string> <string name="protocolError">Es wird nicht empfohlen, das HTTP-Protokoll zu verwenden, es sei denn, du testest in einem lokalen Netzwerk.</string>
<string name="malformedJson">Fehlgestaltete JSON erhalten, Serveranfrage war nicht erfolgreich.</string> <string name="malformedJson">Fehlerhaftes JSON erhalten. Serveranfrage war nicht erfolgreich.</string>
<string name="emptyFieldURL">Instance URL is required</string> <string name="emptyFieldURL">Instanzen-URL ist erforderlich</string>
<string name="emptyFieldUsername">Username is required</string> <string name="emptyFieldUsername">Benutzername ist erforderlich</string>
<string name="emptyFieldPassword">Password is required</string> <string name="emptyFieldPassword">Passwort ist erforderlich</string>
<string name="checkNetConnection">Kann nicht auf das Netzwerk zugreifen, überprüfen Sie Ihre Internetverbindung</string> <string name="checkNetConnection">Kann nicht auf das Netzwerk zugreifen. Bitte überprüfe die Internetverbindung</string>
<string name="emptyFields">Es sind alle Felder erforderlich</string> <string name="emptyFields">Es sind alle Felder erforderlich</string>
<string name="repoNameErrorEmpty">Der Repository Name ist leer.</string> <string name="repoNameErrorEmpty">Der Repository Name ist leer.</string>
@ -83,7 +84,7 @@
<string name="repoDescError">Die Repositorybeschreibung überschreitet die maximale Anzahl von 255 Zeichen</string> <string name="repoDescError">Die Repositorybeschreibung überschreitet die maximale Anzahl von 255 Zeichen</string>
<string name="repoCreated">Repository erfolgreich erstellt!</string> <string name="repoCreated">Repository erfolgreich erstellt!</string>
<string name="repoCreatedError">Etwas ist schief gelaufen. Bitte versuche es erneut</string> <string name="repoCreatedError">Etwas ist schief gelaufen. Bitte versuche es erneut</string>
<string name="repoExistsError">Repository of this name already exists under selected Owner</string> <string name="repoExistsError">Ein Repository mit diesem Namen existiert bereits unter dem ausgewählten Besitzer</string>
<string name="orgNameErrorEmpty">Organisationsname ist leer</string> <string name="orgNameErrorEmpty">Organisationsname ist leer</string>
<string name="orgNameErrorInvalid">Organisationsname ist nicht gültig, [a&#8211;z A&#8211;Z 0&#8211;9 &#8211; _]</string> <string name="orgNameErrorInvalid">Organisationsname ist nicht gültig, [a&#8211;z A&#8211;Z 0&#8211;9 &#8211; _]</string>
@ -92,7 +93,7 @@
<string name="orgCreatedError">Etwas ist schief gelaufen. Bitte versuche es erneut</string> <string name="orgCreatedError">Etwas ist schief gelaufen. Bitte versuche es erneut</string>
<string name="orgExistsError">Organisation existiert bereits</string> <string name="orgExistsError">Organisation existiert bereits</string>
<string name="processingText">wird bearbeitet</string> <string name="processingText">verarbeite</string>
<string name="search">Suche</string> <string name="search">Suche</string>
<string name="wip">In Arbeit</string> <string name="wip">In Arbeit</string>
@ -108,7 +109,7 @@
<string name="genericApiStatusError">Die Gitea Instanz hat einen Fehler zurückgegeben. Code\u0020</string> <string name="genericApiStatusError">Die Gitea Instanz hat einen Fehler zurückgegeben. Code\u0020</string>
<string name="title_activity_repo_detail">Repo-Details Aktivität</string> <string name="title_activity_repo_detail">Repo-Details Aktivität</string>
<string name="tab_text_info">Information</string> <string name="tab_text_info">Details</string>
<string name="tab_text_issues">Offene Issues</string> <string name="tab_text_issues">Offene Issues</string>
<string name="tabItemCloseIssues">Geschlossene Issues</string> <string name="tabItemCloseIssues">Geschlossene Issues</string>
<string name="tab_text_ml">Meilensteine</string> <string name="tab_text_ml">Meilensteine</string>
@ -118,7 +119,7 @@
<string name="action_settings">Einstellungen</string> <string name="action_settings">Einstellungen</string>
<string name="tab_text_collaborators">Mitarbeiter</string> <string name="tab_text_collaborators">Mitarbeiter</string>
<string name="noDataIssueTab">Keine Probleme gefunden!</string> <string name="noDataIssueTab">Keine Issues gefunden!</string>
<string name="infoTabRepoName1">Repository</string> <string name="infoTabRepoName1">Repository</string>
<string name="infoTabRepoOwner1">Eigentümer</string> <string name="infoTabRepoOwner1">Eigentümer</string>
@ -127,9 +128,9 @@
<string name="infoTabRepoSize">Größe</string> <string name="infoTabRepoSize">Größe</string>
<string name="infoTabRepoDefaultBranch">Standard Branch</string> <string name="infoTabRepoDefaultBranch">Standard Branch</string>
<string name="infoTabRepoSshUrl">SSH URL</string> <string name="infoTabRepoSshUrl">SSH URL</string>
<string name="infoTabRepoCloneUrl">Clone URL</string> <string name="infoTabRepoCloneUrl">Klon URL</string>
<string name="infoTabRepoRepoUrl">Repo URL</string> <string name="infoTabRepoRepoUrl">Repo URL</string>
<string name="infoTabRepoForksCount">Azahl an Forks</string> <string name="infoTabRepoForksCount">Anzahl an Forks</string>
<string name="infoTabRepoCreatedAt">Erstellt</string> <string name="infoTabRepoCreatedAt">Erstellt</string>
<string name="infoTabRepoUpdatedAt">Letzte Aktualisierung</string> <string name="infoTabRepoUpdatedAt">Letzte Aktualisierung</string>
<string name="infoTabRepoDummyTime">2018&#8211;10&#8211;30 08:25:25</string> <string name="infoTabRepoDummyTime">2018&#8211;10&#8211;30 08:25:25</string>
@ -257,7 +258,7 @@
<string name="creditsLogoDesign">Design</string> <string name="creditsLogoDesign">Design</string>
<string name="alertDialogTokenRevokedTitle">Autorisierungsfehler</string> <string name="alertDialogTokenRevokedTitle">Autorisierungsfehler</string>
<string name="alertDialogTokenRevokedMessage">Es scheint, dass das Access Token widerrufen wurde ODER Sie diese Inhalte nicht sehen dürfen. Falls das Token wiederrufen wurde, melden Sie sich bitte ab und wieder an.</string> <string name="alertDialogTokenRevokedMessage">Es scheint, dass der Access Token widerrufen wurde ODER du diese Inhalte nicht sehen darfst. Falls der Token wiederrufen wurde, melde dich bitte ab und wieder an.</string>
<string name="alertDialogTokenRevokedCopyNegativeButton">Abbrechen</string> <string name="alertDialogTokenRevokedCopyNegativeButton">Abbrechen</string>
<string name="alertDialogTokenRevokedCopyPositiveButton">Abmelden</string> <string name="alertDialogTokenRevokedCopyPositiveButton">Abmelden</string>
@ -277,7 +278,7 @@
<string name="teamDescription">Beschrebung des Teams</string> <string name="teamDescription">Beschrebung des Teams</string>
<string name="teamPermission">Berechtigung: %1$s</string> <string name="teamPermission">Berechtigung: %1$s</string>
<string name="noDataMembers">Keine Mitglieder gefunden!</string> <string name="noDataMembers">Keine Mitglieder gefunden!</string>
<string name="orgMember">Org members</string> <string name="orgMember">Org Mitglied</string>
<string name="orgTeamMembers">Mitglieder der Organization</string> <string name="orgTeamMembers">Mitglieder der Organization</string>
<!-- org tabbed layout str --> <!-- org tabbed layout str -->
@ -291,7 +292,7 @@
<string name="newTeamPermissionAdmin">Mitglieder können zu Team-Repositories pushen und pullen und Mitarbeiter zu ihnen hinzufügen</string> <string name="newTeamPermissionAdmin">Mitglieder können zu Team-Repositories pushen und pullen und Mitarbeiter zu ihnen hinzufügen</string>
<string name="teamNameEmpty">Bitte gib den Namen des Teams ein.</string> <string name="teamNameEmpty">Bitte gib den Namen des Teams ein.</string>
<string name="teamNameError">Der Name des Teams sollte nur Alphanumerische Zeichen, Bindestriche (-), Unterstriche (_) und Punkte (.) enthalten.</string> <string name="teamNameError">Der Name des Teams sollte nur Alphanumerische Zeichen, Bindestriche (-), Unterstriche (_) und Punkte (.) enthalten.</string>
<string name="teamPermissionEmpty">Bitte wählen sie die Rechte aus.</string> <string name="teamPermissionEmpty">Bitte wähle die Rechte aus.</string>
<string name="teamDescError">Die Beschreibung des Teams hat verbotene Zeichen.</string> <string name="teamDescError">Die Beschreibung des Teams hat verbotene Zeichen.</string>
<string name="teamDescLimit">Die Team Beschreibung überschreitet das Maximum von 100 Zeichen.</string> <string name="teamDescLimit">Die Team Beschreibung überschreitet das Maximum von 100 Zeichen.</string>
<string name="teamCreated">Team erfolgreich erstellt.</string> <string name="teamCreated">Team erfolgreich erstellt.</string>
@ -312,7 +313,7 @@
<string name="removeCollaboratorMessage">Möchtest du den Nutzer wirklich von dieser Repository entfernen?</string> <string name="removeCollaboratorMessage">Möchtest du den Nutzer wirklich von dieser Repository entfernen?</string>
<string name="removeCollaboratorToastText">Benuter von der Repository entfernt.</string> <string name="removeCollaboratorToastText">Benuter von der Repository entfernt.</string>
<string name="addCollaboratorToastText">Benutzer zu der Repository hinzugefügt.</string> <string name="addCollaboratorToastText">Benutzer zu der Repository hinzugefügt.</string>
<string name="openWebRepo">Öfne mit Browser</string> <string name="openWebRepo">Öffne mit Browser</string>
<!-- add collaborator --> <!-- add collaborator -->
<!-- profile section --> <!-- profile section -->
@ -322,7 +323,7 @@
<string name="profileEmailButton">Speichern</string> <string name="profileEmailButton">Speichern</string>
<string name="profileEmailTitle">E-Mail Adresse</string> <string name="profileEmailTitle">E-Mail Adresse</string>
<string name="emailAddedText">Neue E-Mail Adresse erfolgreich hinzugefügt.</string> <string name="emailAddedText">Neue E-Mail Adresse erfolgreich hinzugefügt.</string>
<string name="emailErrorEmpty">E-Mail Adresse is leer.</string> <string name="emailErrorEmpty">E-Mail Adresse ist leer.</string>
<string name="emailErrorInvalid">E-Mail Adresse ist nicht gültig.</string> <string name="emailErrorInvalid">E-Mail Adresse ist nicht gültig.</string>
<string name="emailErrorInUse">Die E-Mail Adresse wird bereits verwendet.</string> <string name="emailErrorInUse">Die E-Mail Adresse wird bereits verwendet.</string>
<string name="emailTypeText">Primär</string> <string name="emailTypeText">Primär</string>
@ -330,7 +331,7 @@
<!-- profile section --> <!-- profile section -->
<!-- single issue section --> <!-- single issue section -->
<string name="singleIssueEditLabels">Labels Hinzufügen / Entfernen</string> <string name="singleIssueEditLabels">Labels hinzufügen/entfernen</string>
<string name="labelsUpdated">Labels aktualisiert</string> <string name="labelsUpdated">Labels aktualisiert</string>
<string name="closeIssue">Issue schließen</string> <string name="closeIssue">Issue schließen</string>
<string name="replyToIssue">Kommentar hinzufügen</string> <string name="replyToIssue">Kommentar hinzufügen</string>
@ -339,8 +340,8 @@
<string name="issueStateClosed">Issue geschlossen</string> <string name="issueStateClosed">Issue geschlossen</string>
<string name="issueStateReopened">Issue neu geöffnet</string> <string name="issueStateReopened">Issue neu geöffnet</string>
<string name="addRemoveAssignees2">Füge Zuständige hinzu</string> <string name="addRemoveAssignees2">Füge Zuständige hinzu</string>
<string name="addRemoveAssignees">Zuständige Hinzufügen / Entfernen</string> <string name="addRemoveAssignees">Zuständige hinzufügen/entfernen</string>
<string name="assigneesUpdated">Zuständoge aktualisiert</string> <string name="assigneesUpdated">Zuständige aktualisiert</string>
<!-- single issue section --> <!-- single issue section -->
<!-- multi select dialog --> <!-- multi select dialog -->
@ -350,7 +351,7 @@
<string name="you_can_only_select_upto">Du kannst höchstens so viele auswählen: </string> <string name="you_can_only_select_upto">Du kannst höchstens so viele auswählen: </string>
<string name="option"> Option</string> <string name="option"> Option</string>
<string name="options"> Optionen</string> <string name="options"> Optionen</string>
<string name="select_all">Alle Auswählen</string> <string name="select_all">Alle auswählen</string>
<string name="de_select_all">Die Auswahl aufheben</string> <string name="de_select_all">Die Auswahl aufheben</string>
<!-- multi select dialog --> <!-- multi select dialog -->
@ -380,7 +381,7 @@
<!-- edit issue --> <!-- edit issue -->
<!-- release --> <!-- release -->
<string name="createRelease">Release Erstellen</string> <string name="createRelease">Release erstellen</string>
<string name="releaseTagNameText">Tag</string> <string name="releaseTagNameText">Tag</string>
<string name="releaseTitleText">Titel</string> <string name="releaseTitleText">Titel</string>
<string name="releaseContentText">Inhalt</string> <string name="releaseContentText">Inhalt</string>
@ -389,40 +390,47 @@
<string name="releaseDraftText">Entwurf</string> <string name="releaseDraftText">Entwurf</string>
<string name="tagNameErrorEmpty">Der Tag ist leer</string> <string name="tagNameErrorEmpty">Der Tag ist leer</string>
<string name="titleErrorEmpty">Der Titel ist leer</string> <string name="titleErrorEmpty">Der Titel ist leer</string>
<string name="releaseCreatedText">Neuer release erstellt</string> <string name="releaseCreatedText">Neuer Release erstellt</string>
<!-- release --> <!-- release -->
<string name="loginOTPError">Bitte gib den OTP code ein</string> <string name="loginOTPError">Bitte gib den OTP code ein</string>
<string name="loginOTPTypeError">Der OTP code muss aus Zahlen bestehen.</string> <string name="loginOTPTypeError">Der OTP code muss aus Zahlen bestehen.</string>
<string name="loginOTP">OTP Code (Optional)</string> <string name="loginOTP">OTP Code (Optional)</string>
<string name="otpMessage">Gebe den otp code ein wenn 2FA eingeschaltet ist</string> <string name="otpMessage">Gib den otp code ein, wenn 2FA eingeschaltet ist</string>
<string name="repoStargazersInMenu">Stargazers</string> <string name="repoStargazersInMenu">Favorisierer</string>
<string name="repoWatchersInMenu">Watchers</string> <string name="repoWatchersInMenu">Beobachter</string>
<string name="noDataStargazers">No stars found</string> <string name="noDataStargazers">Keine Favorisierer gefunden</string>
<string name="noDataWatchers">No watchers found</string> <string name="noDataWatchers">Keine Beobachter gefunden</string>
<string name="starMember">Star</string> <string name="starMember">Favorisierer</string>
<string name="watcherMember">Watcher</string> <string name="watcherMember">Beobachter</string>
<string name="commitLinkBranchesTab">Commit</string> <string name="commitLinkBranchesTab">Commit</string>
<string name="zipArchiveDownloadReleasesTab">Zip Archive</string> <string name="zipArchiveDownloadReleasesTab">Zip Archiv</string>
<string name="tarArchiveDownloadReleasesTab">Tar Archive</string> <string name="tarArchiveDownloadReleasesTab">Tar Archiv</string>
<!-- new file --> <!-- new file -->
<string name="newFileNameTintCopy">File Name</string> <string name="newFileNameTintCopy">Dateiname</string>
<string name="newFileBranchTintCopy">Branch Name</string> <string name="newFileBranchTintCopy">neuer Branch-Name</string>
<string name="newFileContentTintCopy">File Content</string> <string name="newFileContentTintCopy">Dateiinhalt</string>
<string name="newFileButtonCopy">Create New File</string> <string name="newFileButtonCopy">Erstelle neue Datei</string>
<string name="newFileNameHintMessage">with folder: app/test.md</string> <string name="newFileNameHintMessage">mit Ordner: app/test.md</string>
<string name="newFileMessageTintCopy">Commit Message</string> <string name="newFileMessageTintCopy">Commit-Nachricht</string>
<string name="newFileInvalidBranchName">Invalid branch name, may only contain &#8211;, a&#8211;z, 0&#8211;9</string> <string name="newFileInvalidBranchName">Der Branch-Name ist ungültig und sollte nur folgendes beinhalten &#8211;, a&#8211;z, 0&#8211;9</string>
<string name="newFileCommitMessageError">Commit message is too long</string> <string name="newFileCommitMessageError">Commit-Nachricht ist zu lang</string>
<string name="newFileSuccessMessage">New file created</string> <string name="newFileSuccessMessage">Neue Datei erstellt</string>
<string name="newFileOldBranches">Current Branches</string> <string name="newFileOldBranches">Derzeitige Branches</string>
<string name="newFileRequiredFields">Fields like filename, contents and commit message are required.</string> <string name="newFileRequiredFields">Felder wie Dateiname, Inhalt und Commit-Nachricht sind erforderlich.</string>
<string name="newFileCurrentBranchMessage">Selecting current branch will disable new branch</string> <string name="newFileCurrentBranchMessage">Das Auswählen des derzeitigen Branches wird "neuer Branch-Name" deaktivieren</string>
<string name="newFileNewBranchMessage">e.g: new-branch</string> <string name="newFileNewBranchMessage">z.B.: neuer-branch</string>
<string name="newFileRequiredFieldNewBranchName">New branch name cannot be empty if current branch is not selected</string> <string name="newFileRequiredFieldNewBranchName">Neuer Branch-Name kann nicht leer sein, wenn der derzeitige Branch nicht ausgewählt ist</string>
<string name="strFilter">Filter</string>
<string name="copyIssueUrl">Issue URL kopieren</string>
<string name="copyIssueUrlToastMsg">Issue URL copied to clipboard</string>
<string name="milestoneCompletion">%1$d\uFF05 abgeschlossen</string>
<!-- generic copy --> <!-- generic copy -->
<string name="okButton">OK</string> <string name="okButton">OK</string>
@ -433,7 +441,7 @@
<string name="noDataFound">Keine Daten gefunden</string> <string name="noDataFound">Keine Daten gefunden</string>
<string name="addButton">Hinzufügen</string> <string name="addButton">Hinzufügen</string>
<string name="removeButton">Entfernen</string> <string name="removeButton">Entfernen</string>
<string name="authorizeError">Sie sind nicht berechtigt, diese Aktion durchzuführen.</string> <string name="authorizeError">Du bist nicht berechtigt, diese Aktion durchzuführen.</string>
<string name="menuContentDesc">Menü</string> <string name="menuContentDesc">Menü</string>
<string name="menuEditText">Bearbeiten</string> <string name="menuEditText">Bearbeiten</string>
<string name="menuDeleteText">Entfernen</string> <string name="menuDeleteText">Entfernen</string>
@ -443,7 +451,7 @@
<string name="descriptionText">Beschreibung</string> <string name="descriptionText">Beschreibung</string>
<string name="websiteText">Website</string> <string name="websiteText">Website</string>
<string name="locationText">Standort</string> <string name="locationText">Standort</string>
<string name="characters255Limit">Max 255 characters</string> <string name="characters255Limit">maximal 255 Zeichen</string>
<!-- generic copy --> <!-- generic copy -->
</resources> </resources>

View File

@ -33,6 +33,7 @@
<string name="pageTitleStarredRepos">Starred Repositories</string> <string name="pageTitleStarredRepos">Starred Repositories</string>
<string name="pageTitleCreateTeam">Create Team</string> <string name="pageTitleCreateTeam">Create Team</string>
<string name="pageTitleAddEmail">Add Email Address</string> <string name="pageTitleAddEmail">Add Email Address</string>
<string name="pageTitleNewFile">New File</string>
<!-- page titles --> <!-- page titles -->
<string name="appVersion">Version\u0020:\u0020</string> <string name="appVersion">Version\u0020:\u0020</string>
@ -109,7 +110,7 @@
<string name="genericApiStatusError">L\'instance a renvoyé une erreur. Code\u0020</string> <string name="genericApiStatusError">L\'instance a renvoyé une erreur. Code\u0020</string>
<string name="title_activity_repo_detail">RepoDetailActivity</string> <string name="title_activity_repo_detail">RepoDetailActivity</string>
<string name="tab_text_info">Info</string> <string name="tab_text_info">Détails</string>
<string name="tab_text_issues">Open Issues</string> <string name="tab_text_issues">Open Issues</string>
<string name="tabItemCloseIssues">Closed Issues</string> <string name="tabItemCloseIssues">Closed Issues</string>
<string name="tab_text_ml">Milestones</string> <string name="tab_text_ml">Milestones</string>
@ -424,6 +425,13 @@
<string name="newFileNewBranchMessage">e.g: new-branch</string> <string name="newFileNewBranchMessage">e.g: new-branch</string>
<string name="newFileRequiredFieldNewBranchName">New branch name cannot be empty if current branch is not selected</string> <string name="newFileRequiredFieldNewBranchName">New branch name cannot be empty if current branch is not selected</string>
<string name="strFilter">Filter</string>
<string name="copyIssueUrl">Copier l Issue URL</string>
<string name="copyIssueUrlToastMsg">Issue URL copied to clipboard</string>
<string name="milestoneCompletion">%1$d\uFF05 terminé</string>
<!-- generic copy --> <!-- generic copy -->
<string name="okButton">OK</string> <string name="okButton">OK</string>
<string name="doneButton">Done</string> <string name="doneButton">Done</string>

View File

@ -33,6 +33,7 @@
<string name="pageTitleStarredRepos">Избранные репозитории</string> <string name="pageTitleStarredRepos">Избранные репозитории</string>
<string name="pageTitleCreateTeam">Создать команду</string> <string name="pageTitleCreateTeam">Создать команду</string>
<string name="pageTitleAddEmail">Добавить адрес эл. почты</string> <string name="pageTitleAddEmail">Добавить адрес эл. почты</string>
<string name="pageTitleNewFile">New File</string>
<!-- page titles --> <!-- page titles -->
<string name="appVersion">Версия\u0020:\u0020</string> <string name="appVersion">Версия\u0020:\u0020</string>
@ -109,7 +110,7 @@
<string name="genericApiStatusError">Инстанция вернула ошибку. Код\u0020</string> <string name="genericApiStatusError">Инстанция вернула ошибку. Код\u0020</string>
<string name="title_activity_repo_detail">Активность</string> <string name="title_activity_repo_detail">Активность</string>
<string name="tab_text_info">Информация</string> <string name="tab_text_info">Детали</string>
<string name="tab_text_issues">Открытые задачи</string> <string name="tab_text_issues">Открытые задачи</string>
<string name="tabItemCloseIssues">Закрытые задачи</string> <string name="tabItemCloseIssues">Закрытые задачи</string>
<string name="tab_text_ml">Вехи</string> <string name="tab_text_ml">Вехи</string>
@ -424,6 +425,13 @@
<string name="newFileNewBranchMessage">e.g: new-branch</string> <string name="newFileNewBranchMessage">e.g: new-branch</string>
<string name="newFileRequiredFieldNewBranchName">New branch name cannot be empty if current branch is not selected</string> <string name="newFileRequiredFieldNewBranchName">New branch name cannot be empty if current branch is not selected</string>
<string name="strFilter">Filter</string>
<string name="copyIssueUrl">Copy Issue URL</string>
<string name="copyIssueUrlToastMsg">Issue URL copied to clipboard</string>
<string name="milestoneCompletion">%1$d\uFF05 выполненный</string>
<!-- generic copy --> <!-- generic copy -->
<string name="okButton">OK</string> <string name="okButton">OK</string>
<string name="doneButton">Готово</string> <string name="doneButton">Готово</string>

View File

@ -5,7 +5,7 @@
<item name="android:statusBarColor">@color/colorPrimary</item> <item name="android:statusBarColor">@color/colorPrimary</item>
<item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimary</item>
<item name="android:fontFamily">@font/opensanssemibold</item> <item name="android:fontFamily">@font/roboto</item>
<item name="android:windowBackground">@color/colorPrimary</item> <item name="android:windowBackground">@color/colorPrimary</item>
</style> </style>

View File

@ -23,5 +23,6 @@
<color name="colorDarkGreen">#009486</color> <color name="colorDarkGreen">#009486</color>
<color name="darkRed">#e74c3c</color> <color name="darkRed">#e74c3c</color>
<color name="lightBlue">#3faef7</color> <color name="lightBlue">#3faef7</color>
<color name="lightGray">#b6bbbf</color>
</resources> </resources>

View File

@ -130,7 +130,7 @@
<string name="genericApiStatusError">Instance has returned an error. Code\u0020</string> <string name="genericApiStatusError">Instance has returned an error. Code\u0020</string>
<string name="title_activity_repo_detail">RepoDetailActivity</string> <string name="title_activity_repo_detail">RepoDetailActivity</string>
<string name="tab_text_info">Information</string> <string name="tab_text_info">Details</string>
<string name="tab_text_issues">Open Issues</string> <string name="tab_text_issues">Open Issues</string>
<string name="tabItemCloseIssues">Closed Issues</string> <string name="tabItemCloseIssues">Closed Issues</string>
<string name="tab_text_ml">Milestones</string> <string name="tab_text_ml">Milestones</string>
@ -151,7 +151,7 @@
<string name="infoTabRepoSshUrl">SSH URL</string> <string name="infoTabRepoSshUrl">SSH URL</string>
<string name="infoTabRepoCloneUrl">Clone URL</string> <string name="infoTabRepoCloneUrl">Clone URL</string>
<string name="infoTabRepoRepoUrl">Repo URL</string> <string name="infoTabRepoRepoUrl">Repo URL</string>
<string name="infoTabRepoForksCount">Forks Count</string> <string name="infoTabRepoForksCount">Forks</string>
<string name="infoTabRepoCreatedAt">Created</string> <string name="infoTabRepoCreatedAt">Created</string>
<string name="infoTabRepoUpdatedAt">Last Updated</string> <string name="infoTabRepoUpdatedAt">Last Updated</string>
<string name="infoTabRepoDummyTime">2018&#8211;10&#8211;30 08:25:25</string> <string name="infoTabRepoDummyTime">2018&#8211;10&#8211;30 08:25:25</string>
@ -161,7 +161,7 @@
<string name="timeAtText">at</string> <string name="timeAtText">at</string>
<string name="hash">#</string> <string name="hash">#</string>
<string name="createdText">Created\u0020</string> <string name="createdText">Opened\u0020</string>
<string name="dueDateText">Due Date</string> <string name="dueDateText">Due Date</string>
<string name="issueStatusTextOpen">Status: open</string> <string name="issueStatusTextOpen">Status: open</string>
<string name="issueStatusOpen">open</string> <string name="issueStatusOpen">open</string>
@ -175,7 +175,7 @@
<string name="issueTitleWithId">#%1$d %2$s</string> <string name="issueTitleWithId">#%1$d %2$s</string>
<string name="issueMilestone">Milestone %1$s</string> <string name="issueMilestone">Milestone %1$s</string>
<string name="dueDate">Due %1$s</string> <string name="dueDate">Due %1$s</string>
<string name="createdTime">Created %1$s</string> <string name="createdTime">Opened %1$s</string>
<string name="assignedTo">Assigned to: %1$s</string> <string name="assignedTo">Assigned to: %1$s</string>
<string name="commentButtonText">Comment</string> <string name="commentButtonText">Comment</string>
<string name="commentEmptyError">Please write your comment</string> <string name="commentEmptyError">Please write your comment</string>
@ -462,6 +462,13 @@
<string name="newFileNewBranchMessage">e.g: new-branch</string> <string name="newFileNewBranchMessage">e.g: new-branch</string>
<string name="newFileRequiredFieldNewBranchName">New branch name cannot be empty if current branch is not selected</string> <string name="newFileRequiredFieldNewBranchName">New branch name cannot be empty if current branch is not selected</string>
<string name="strFilter">Filter</string>
<string name="copyIssueUrl">Copy Issue URL</string>
<string name="copyIssueUrlToastMsg">Issue URL copied to clipboard</string>
<string name="milestoneCompletion">%1$d\uFF05 completed</string>
<!-- generic copy --> <!-- generic copy -->
<string name="okButton">OK</string> <string name="okButton">OK</string>
<string name="doneButton">Done</string> <string name="doneButton">Done</string>

View File

@ -4,7 +4,7 @@
<item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item> <item name="colorAccent">@color/colorAccent</item>
<item name="android:fontFamily">@font/opensanssemibold</item> <item name="android:fontFamily">@font/roboto</item>
<item name="drawerArrowStyle">@style/DrawerIcon</item> <item name="drawerArrowStyle">@style/DrawerIcon</item>
<item name="colorControlHighlight">#123456</item> <item name="colorControlHighlight">#123456</item>
</style> </style>

View File

@ -0,0 +1,16 @@
- New: Font - roboto
- New: Milestone progress bar @6543
- New: Redesign issues list
- New: Copy issue URL to clipboard @6543
- New: Redesign milestones list
- New: Added repository avatars
- Improvement: Repo info tab enhancements
- Improvement: Bold font for labels
- Improvement: Change search icon and text to filter
- Improvement: Refactor markdown code to load images
- Improvement: UI improvements for avatars and alignments
- Improvement: Enable/disable create issue based on repo settings
- Bugfix: Open issues tab color scheme
For more, check the release notes.
https://gitea.com/mmarif/GitNex/releases

View File

@ -0,0 +1,6 @@
Bugfix: crash when repo avatar in not present in api nodes. old Gitea instances
Bugfix: Milestone progress bar fix
Bugfix: Create new issue enable/disable fix
For more, check the release notes.
https://gitea.com/mmarif/GitNex/releases

View File

@ -0,0 +1,4 @@
Bugfix: crash when my repo, starred repos are accessed without repo avatar. old Gitea instances
For more, check the release notes.
https://gitea.com/mmarif/GitNex/releases