Compare commits

...

31 Commits

Author SHA1 Message Date
a31abf0974 3.2.0 rc1 release (#709)
prepare 3.2.0 rc1 release

RC1 release of 3.2.0

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/709
2020-09-26 20:51:12 +02:00
6d466e2542 Crowdin 2020-09-26 (#711)
Crowdin Update

Co-authored-by: 6543 <6543@obermui.de>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/711
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
2020-09-26 20:50:15 +02:00
01bd61ad8e Fixing CI (#710)
Fixing CI.

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/710
Reviewed-by: 6543 <6543@noreply.codeberg.org>
2020-09-26 20:21:29 +02:00
4031c32fc8 Introduce Pro version for play store (#708)
Introduce Pro version for play store

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/708
2020-09-26 17:05:51 +02:00
d51d2d5164 Android 11 support (#707)
update libs

Android 11 support

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/707
2020-09-26 15:55:30 +02:00
7b8bc21a83 Adjust logo with new colors (#706)
Adjust logo with new colors

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/706
2020-09-26 09:18:41 +02:00
1c1f73eafc Redo About screen UI and some refactors (#705)
Redo About screen UI and some refactors

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/705
2020-09-26 07:54:31 +02:00
02672aef3d Refactor: remove instanceUrlWithProtocol (#698)
Refactor: remove instanceUrlWithProtocol

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/698
2020-09-24 18:53:28 +02:00
23fb1ce71f Create PR (#689)
Merge branch 'master' into create-pr

consistent button height

implement create pr

Merge branch 'master' into create-pr

Remove save button for labels

minor improvements

new line

Implement interfaces for labels data

UI updates to labels dialog

Merge branch 'master' into create-pr

Merge branch 'master' of codeberg.org:gitnex/GitNex into master

Add labels list

Add ui elements, api calls for branches and milestone

Add activity, layout, click trigger and checks

Merge branch 'master' into create-pr

Merge branch 'master' of codeberg.org:gitnex/GitNex into master

Merge branch 'master' of codeberg.org:gitnex/GitNex into master

Add bs item

Merge branch 'master' of codeberg.org:gitnex/GitNex into master

Merge branch 'master' of codeberg.org:gitnex/GitNex into master

endline

Co-authored-by: 6543 <6543@noreply.codeberg.org>
Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/689
2020-09-24 18:51:20 +02:00
1f5eeb5632 Notification badge in navigation menu (#702)
Merge branch 'master' into 700-notifications-counter

Notification badge in navigation menu

Co-authored-by: 6543 <6543@noreply.codeberg.org>
Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/702
2020-09-18 06:51:41 +02:00
78782d159a UI improvements (#699)
UI improvements

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/699
2020-09-16 20:03:52 +02:00
a75ffe0381 Transfer repository ownership (#696)
simplify comments

Transfer repository ownership

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/696
2020-09-16 08:53:13 +02:00
c4279dcd77 Improve crash report notification string (#697)
Improve crash report notification string

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/697
2020-09-16 08:52:32 +02:00
14b1256ce1 Crowdin 2020-09-13 (#694)
Add Czech

Update 2020-09-13

Co-authored-by: 6543 <6543@obermui.de>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/694
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
2020-09-13 13:11:55 +02:00
7b72815bcb Add account new UI (#692)
Merge branch 'new-account-ui' of codeberg.org:gitnex/GitNex into new-account-ui

Merge branch 'master' into new-account-ui

Merge branch 'master' of codeberg.org:gitnex/GitNex into master

Merge branch 'master' into new-account-ui

Transition of adding account to new UI

Merge branch 'master' of codeberg.org:gitnex/GitNex into master

Merge branch 'master' of codeberg.org:gitnex/GitNex into master

endline

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/692
2020-09-13 06:57:04 +02:00
5e6c600e71 Repo settings (delete-edit) (#683)
better var names

remove migration

Merge branch 'repo-settings-delete-migrate-edit' of codeberg.org:gitnex/GitNex into repo-settings-delete-migrate-edit

delete repository

Merge branch 'master' into repo-settings-delete-migrate-edit

Can edit repo properties now

Add progress indicator, call for save

Pull repo info into dialog

Repo properties in custom dialog

settings activity with labels

Merge branch 'master' into repo-settings-delete-migrate-edit

Merge branch 'master' of codeberg.org:gitnex/GitNex into master

add bottom sheet entry

endline

Co-authored-by: M M Arif <mmarif@swatian.com>
Co-authored-by: 6543 <6543@noreply.codeberg.org>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/683
2020-09-13 06:54:05 +02:00
dbf5be25a5 Add stat indicator pr/issues (#686)
Merge branch 'master' into add-stat-indicator

Merge branch 'master' of codeberg.org:gitnex/GitNex into master

Show PR/Issue stat

Merge branch 'master' of codeberg.org:gitnex/GitNex into master

Merge branch 'master' of codeberg.org:gitnex/GitNex into master

endline

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/686
2020-09-13 06:52:30 +02:00
2bfe0b8d1a Fix create issue crash on label added and removed (#685)
Merge branch 'master' into fix-create-issue-crash

Merge branch 'master' of codeberg.org:gitnex/GitNex into master

Fix crash when label added and removed

Merge branch 'master' of codeberg.org:gitnex/GitNex into master

Merge branch 'master' of codeberg.org:gitnex/GitNex into master

endline

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/685
2020-09-13 06:50:06 +02:00
0c92eb3fa2 Fix active account selector (#687)
Merge branch 'master' into fix-active-account-selector

Merge branch 'master' of codeberg.org:gitnex/GitNex into master

Fix active account selector

Merge branch 'master' of codeberg.org:gitnex/GitNex into master

Merge branch 'master' of codeberg.org:gitnex/GitNex into master

endline

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/687
2020-09-13 06:48:30 +02:00
32f3080283 Fix fragments when view forks from repo info (#688)
Temp fix fragments forks

Merge branch 'master' of codeberg.org:gitnex/GitNex into master

Merge branch 'master' of codeberg.org:gitnex/GitNex into master

endline

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/688
2020-09-13 06:37:10 +02:00
7342668a1b Fixing gitlab ci releases (#690)
Fixing gitlab ci releases.

Co-authored-by: opyale <opyale@noreply.gitea.io>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/690
Reviewed-by: 6543 <6543@noreply.codeberg.org>
2020-09-08 20:44:12 +02:00
6f9bbe4c58 Optimizing user accounts list. (#684)
Optimizing user accounts list.

Co-authored-by: opyale <opyale@noreply.gitea.io>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/684
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
2020-09-07 16:29:04 +02:00
b2b42887f7 Move branch commits to files popup (#682)
Move commits to file sub menu

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/682
Reviewed-by: 6543 <6543@noreply.codeberg.org>
2020-09-05 15:43:29 +02:00
37f622b952 Update libs (#681)
Update libs

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/681
2020-09-04 16:33:59 +02:00
d677c90b01 helper Version: add valid() function (#670)
Merge branch 'master' into VersionValid

format code

introduce Version.valid()

Co-authored-by: 6543 <6543@obermui.de>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/670
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
2020-09-04 16:33:37 +02:00
23d3ba7f42 Fix crash on token logins with Require signin view enabled (#678)
Fix crash on token logins with Require signin view enabled

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/678
2020-09-03 19:26:24 +02:00
a42d888eb7 Share only stack trace (#675)
Share only stack trace

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/675
2020-09-03 18:12:53 +02:00
bbcffd67d6 Crowdin 2020-08-28 (#668)
Crowdin 2020-08-28

Co-authored-by: 6543 <6543@obermui.de>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/668
Reviewed-by: opyale <opyale@noreply.codeberg.org>
2020-09-02 21:08:23 +02:00
00eb9c9135 Fix edit comment draft (#661)
Fix edit comment draft

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/661
2020-08-24 12:03:16 +02:00
28a23d30f8 Fix crash on login (#662)
Fix crash on login

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/662
2020-08-24 12:02:45 +02:00
82f874dc37 Official start of 3.2 development (#660)
Official start of 3.2 development

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/660
2020-08-21 20:19:44 +02:00
118 changed files with 4694 additions and 1109 deletions

View File

@ -66,7 +66,7 @@ steps:
- name: build
image: nextcloudci/android:android-49
commands:
- ./gradlew build
- ./gradlew assembleFreeRelease
- name: sign
image: nextcloudci/android:android-49
@ -78,7 +78,7 @@ steps:
KEY_PASS:
from_secret: KEY_PASS
OUTPUT: signed.apk
GITEA: https://gitea.com
INSTANCE: https://codeberg.org
KS_FILE: ci_keystore.jks
KS_REPO:
from_secret: KS_REPO

3
.gitignore vendored
View File

@ -11,6 +11,9 @@
# Release dir
app/release/*
# Pro dir
app/pro/*
# Files for the ART/Dalvik VM
*.dex

View File

@ -7,6 +7,9 @@ stages:
test:
image: nextcloudci/android:android-49
stage: test
only:
- master
- tags
script:
- ./gradlew test
@ -15,8 +18,9 @@ build:
stage: build
only:
- master
- tags
script:
- ./gradlew build
- ./gradlew assembleFreeRelease
artifacts:
paths:
- app/build/outputs/
@ -27,9 +31,10 @@ sign:
stage: sign
only:
- master
- tags
variables:
OUTPUT: "signed.apk"
GITEA: "https://gitea.com"
INSTANCE: "https://codeberg.org"
KS_FILE: "ci_keystore.jks"
script:
- ./scripts/sign-build.sh

View File

@ -16,6 +16,24 @@
</value>
</option>
</JavaCodeStyleSettings>
<JetCodeStyleSettings>
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
<value>
<package name="java.util" alias="false" withSubpackages="false" />
<package name="kotlinx.android.synthetic" alias="false" withSubpackages="true" />
<package name="io.ktor" alias="false" withSubpackages="true" />
</value>
</option>
<option name="PACKAGES_IMPORT_LAYOUT">
<value>
<package name="" alias="false" withSubpackages="true" />
<package name="java" alias="false" withSubpackages="true" />
<package name="javax" alias="false" withSubpackages="true" />
<package name="kotlin" alias="false" withSubpackages="true" />
<package name="" alias="true" withSubpackages="true" />
</value>
</option>
</JetCodeStyleSettings>
<codeStyleSettings language="JAVA">
<option name="RIGHT_MARGIN" value="220" />
<option name="KEEP_LINE_BREAKS" value="false" />
@ -162,4 +180,4 @@
</arrangement>
</codeStyleSettings>
</code_scheme>
</component>
</component>

View File

@ -1,4 +1,4 @@
[![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://codeberg.org/api/v1/repos/gitnex/GitNex/releases&query=$[0].tag_name)](https://codeberg.org/gitnex/GitNex/releases) [![Crowdin](https://badges.crowdin.net/gitnex/localized.svg)](https://crowdin.com/project/gitnex) [![Join the Discord chat at https://discord.gg/FbSS4rf](https://img.shields.io/discord/632219664587685908.svg)](https://discord.gg/FbSS4rf)
[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) ![Pipeline status](https://img.shields.io/gitlab/pipeline/opyale/gitnex/master) [![Release](https://img.shields.io/badge/dynamic/json.svg?label=release&url=https://codeberg.org/api/v1/repos/gitnex/GitNex/releases&query=$[0].tag_name)](https://codeberg.org/gitnex/GitNex/releases) [![Crowdin](https://badges.crowdin.net/gitnex/localized.svg)](https://crowdin.com/project/gitnex) [![Join the Discord chat at https://discord.gg/FbSS4rf](https://img.shields.io/discord/632219664587685908.svg)](https://discord.gg/FbSS4rf)
[<img alt="Become a 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)
@ -21,11 +21,10 @@ Check the versions [compatibility page](https://codeberg.org/gitnex/GitNex/wiki/
## Build from source
Option 1 - Download the source code, open it in Android Studio and build it there.
Option 2 - Open terminal(Linux) and cd to the project dir. Run `./gradlew build`.
Option 2 - Open terminal(Linux) and cd to the project dir. Run `./gradlew assembleFree`.
## Features
- Multiple accounts support
- Repositories / issues/ org list
- File and directory browser
- File viewer
- Create files
@ -34,6 +33,7 @@ Option 2 - Open terminal(Linux) and cd to the project dir. Run `./gradlew build`
- Files diff for PRs
- Notifications
- Drafts
- Repositories / issues / org list
- [MANY MORE](https://codeberg.org/gitnex/GitNex/wiki/Features)
## Contributing

View File

@ -1,15 +1,28 @@
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
compileSdkVersion 30
defaultConfig {
applicationId "org.mian.gitnex"
minSdkVersion 21
targetSdkVersion 29
versionCode 310
versionName "3.1.0"
targetSdkVersion 30
versionCode 317
versionName "3.2.0-rc1"
multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
dexOptions {
javaMaxHeapSize "4g"
}
flavorDimensions "default"
productFlavors {
free {
applicationId "org.mian.gitnex"
}
pro {
applicationId "org.mian.gitnex.pro"
}
}
buildFeatures {
viewBinding = true
}
@ -39,29 +52,29 @@ configurations {
}
dependencies {
def lifecycle_version = "2.3.0-alpha06"
def markwon_version = "4.4.0"
def lifecycle_version = '2.3.0-alpha07'
def markwon_version = '4.6.0'
def work_version = "2.4.0"
def acra = "5.5.0"
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation "androidx.appcompat:appcompat:1.3.0-alpha01"
implementation 'androidx.appcompat:appcompat:1.3.0-alpha02'
implementation "com.google.android.material:material:1.3.0-alpha02"
implementation "androidx.constraintlayout:constraintlayout:1.1.3"
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
implementation "androidx.legacy:legacy-support-v4:1.0.0"
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
testImplementation "junit:junit:4.13"
androidTestImplementation "androidx.test:runner:1.2.0"
androidTestImplementation "androidx.test.espresso:espresso-core:3.2.0"
androidTestImplementation 'androidx.test:runner:1.3.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
implementation "com.github.vihtarb:tooltip:0.2.0"
implementation 'com.squareup.okhttp3:okhttp:4.8.0'
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
implementation "com.google.code.gson:gson:2.8.6"
implementation "com.squareup.picasso:picasso:2.71828"
implementation "com.amulyakhare:com.amulyakhare.textdrawable:1.0.1"
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.8.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0'
implementation 'org.ocpsoft.prettytime:prettytime:4.0.5.Final'
implementation "com.vdurmont:emoji-java:5.1.1"
implementation "com.pes.materialcolorpicker:library:1.2.5"

View File

@ -84,6 +84,8 @@
<activity android:name=".activities.SettingsDraftsActivity" />
<activity android:name=".activities.RepoForksActivity" />
<activity android:name=".activities.AddNewAccountActivity" />
<activity android:name=".activities.RepositorySettingsActivity" />
<activity android:name=".activities.CreatePullRequestActivity" />
<!-- Version < 3.0. DeX Mode and Screen Mirroring support -->
<meta-data android:name="com.samsung.android.keepalive.density" android:value="true"/>

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

View File

@ -144,5 +144,4 @@ public class AddCollaboratorToRepositoryActivity extends BaseActivity {
onClickListener = view -> finish();
}
}

View File

@ -40,9 +40,11 @@ public class AddNewAccountActivity extends BaseActivity {
private ActivityAddNewAccountBinding viewBinding;
private enum Protocol {HTTPS, HTTP}
private String spinnerSelectedValue;
@Override
protected int getLayoutResourceId(){
protected int getLayoutResourceId() {
return R.layout.activity_add_new_account;
}
@ -62,12 +64,12 @@ public class AddNewAccountActivity extends BaseActivity {
initCloseListener();
viewBinding.close.setOnClickListener(onClickListener);
ArrayAdapter<AddNewAccountActivity.Protocol> adapterProtocols = new ArrayAdapter<>(AddNewAccountActivity.this, R.layout.spinner_item, AddNewAccountActivity.Protocol.values());
adapterProtocols.setDropDownViewResource(R.layout.spinner_dropdown_item);
ArrayAdapter<Protocol> adapterProtocols = new ArrayAdapter<>(ctx, R.layout.list_spinner_items, Protocol.values());
viewBinding.protocolSpinner.setAdapter(adapterProtocols);
viewBinding.addNewAccount.setOnClickListener(login -> {
viewBinding.protocolSpinner.setOnItemClickListener((parent, view1, position, id) -> spinnerSelectedValue = String.valueOf(parent.getItemAtPosition(position)));
viewBinding.addNewAccount.setOnClickListener(login -> {
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
@ -80,7 +82,7 @@ public class AddNewAccountActivity extends BaseActivity {
processLogin();
}
});
});
}
@ -88,9 +90,15 @@ public class AddNewAccountActivity extends BaseActivity {
try {
String instanceUrlET = viewBinding.instanceUrl.getText().toString();
String loginToken = viewBinding.loginToken.getText().toString();
Protocol protocol = (Protocol) viewBinding.protocolSpinner.getSelectedItem();
String instanceUrlET = String.valueOf(viewBinding.instanceUrl.getText());
String loginToken = String.valueOf(viewBinding.loginToken.getText());
String protocol = spinnerSelectedValue;
if(protocol == null) {
Toasty.error(ctx, getResources().getString(R.string.protocolEmptyError));
return;
}
if(instanceUrlET.equals("")) {
@ -106,10 +114,7 @@ public class AddNewAccountActivity extends BaseActivity {
URI rawInstanceUrl = UrlBuilder.fromString(UrlHelper.fixScheme(instanceUrlET, "http")).toUri();
URI instanceUrlWithProtocol = UrlBuilder.fromUri(rawInstanceUrl).withPath(PathsHelper.join(rawInstanceUrl.getPath()))
.withScheme(protocol.name().toLowerCase()).toUri();
URI instanceUrl = UrlBuilder.fromUri(instanceUrlWithProtocol).withPath(PathsHelper.join(instanceUrlWithProtocol.getPath(), "/api/v1/"))
URI instanceUrl = UrlBuilder.fromUri(rawInstanceUrl).withScheme(protocol.toLowerCase()).withPath(PathsHelper.join(rawInstanceUrl.getPath(), "/api/v1/"))
.toUri();
versionCheck(instanceUrl.toString(), loginToken);
@ -127,7 +132,7 @@ public class AddNewAccountActivity extends BaseActivity {
Call<GiteaVersion> callVersion;
callVersion = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getGiteaVersionWithToken(loginToken);
callVersion = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getGiteaVersionWithToken("token " + loginToken);
callVersion.enqueue(new Callback<GiteaVersion>() {
@ -137,19 +142,16 @@ public class AddNewAccountActivity extends BaseActivity {
if(responseVersion.code() == 200) {
GiteaVersion version = responseVersion.body();
Version giteaVersion;
assert version != null;
try {
giteaVersion = new Version(version.getVersion());
}
catch(Exception e) {
if(!Version.valid(version.getVersion())) {
Toasty.error(ctx, getResources().getString(R.string.versionUnknown));
return;
}
tinyDB.putString("giteaVersion", version.getVersion());
Version giteaVersion = new Version(version.getVersion());
if(giteaVersion.less(getString(R.string.versionLow))) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ctx).setTitle(getString(R.string.versionAlertDialogHeader))
@ -159,7 +161,6 @@ public class AddNewAccountActivity extends BaseActivity {
alertDialogBuilder.setNegativeButton(getString(R.string.cancelButton), (dialog, which) -> {
dialog.dismiss();
//enableProcessButton();
});
alertDialogBuilder.setPositiveButton(getString(R.string.textContinue), (dialog, which) -> {
@ -239,12 +240,12 @@ public class AddNewAccountActivity extends BaseActivity {
case 401:
Toasty.error(ctx,getResources().getString(R.string.unauthorizedApiError));
Toasty.error(ctx, getResources().getString(R.string.unauthorizedApiError));
break;
default:
Toasty.error(ctx,getResources().getString(R.string.genericApiStatusError) + response.code());
Toasty.error(ctx, getResources().getString(R.string.genericApiStatusError) + response.code());
}
}
@ -253,7 +254,7 @@ public class AddNewAccountActivity extends BaseActivity {
public void onFailure(@NonNull Call<UserInfo> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
Toasty.error(ctx,getResources().getString(R.string.genericError));
Toasty.error(ctx, getResources().getString(R.string.genericError));
}
});

View File

@ -5,6 +5,7 @@ import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import org.acra.ACRA;
import org.acra.BuildConfig;
import org.acra.annotation.AcraCore;
import org.acra.annotation.AcraNotification;
import org.acra.config.CoreConfigurationBuilder;
import org.acra.config.LimiterConfigurationBuilder;
@ -16,6 +17,7 @@ import org.mian.gitnex.helpers.FontsOverride;
import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.notifications.NotificationsMaster;
import static org.acra.ReportField.*;
/**
* Author M M Arif
@ -25,6 +27,7 @@ import org.mian.gitnex.notifications.NotificationsMaster;
resTitle = R.string.crashTitle,
resChannelName = R.string.setCrashReports,
resText = R.string.crashMessage)
@AcraCore(reportContent = { ANDROID_VERSION, PHONE_MODEL, STACK_TRACE })
public abstract class BaseActivity extends AppCompatActivity {
@ -133,11 +136,6 @@ public abstract class BaseActivity extends AppCompatActivity {
tinyDb.putString("draftsCommentsDeletionEnabledInit", "yes");
}
if(!tinyDb.getString("instanceUrlWithProtocol").endsWith("/")) {
tinyDb.putString("instanceUrlWithProtocol", tinyDb.getString("instanceUrlWithProtocol") + "/");
}
if (tinyDb.getBoolean("crashReportingEnabled")) {
CoreConfigurationBuilder ACRABuilder = new CoreConfigurationBuilder(this);

View File

@ -94,8 +94,9 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
final String repoName = parts[1];
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
// if gitea is 1.12 or higher use the new limit
// require gitea 1.12 or higher
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) {
resultLimit = StaticGlobalVariables.resultLimitNewGiteaInstances;
}
@ -199,9 +200,9 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
}
int[] integers;
if (!newIssueLabelsIdHolderForm.equals("")) {
if (!newIssueLabelsIdHolderForm.equals("") && !newIssueLabelsIdHolderForm.equals("[]")) {
String[] items = newIssueLabelsIdHolderForm.replaceAll("\\[", "").replaceAll("\\]", "").replaceAll("\\s", "").split(",");
String[] items = newIssueLabelsIdHolderForm.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\\s", "").split(",");
integers = new int[items.length];
for (int i = 0; i < integers.length; i++) {
integers[i] = Integer.parseInt(items[i]);

View File

@ -0,0 +1,431 @@
package org.mian.gitnex.activities;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import org.mian.gitnex.R;
import org.mian.gitnex.adapters.LabelsListAdapter;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityCreatePrBinding;
import org.mian.gitnex.databinding.CustomLabelsSelectionDialogBinding;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.StaticGlobalVariables;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.models.Branches;
import org.mian.gitnex.models.CreatePullRequest;
import org.mian.gitnex.models.Labels;
import org.mian.gitnex.models.Milestones;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
/**
* Author M M Arif
*/
public class CreatePullRequestActivity extends BaseActivity implements LabelsListAdapter.LabelsListAdapterListener {
private View.OnClickListener onClickListener;
private Context ctx = this;
private Context appCtx;
private TinyDB tinyDb;
private ActivityCreatePrBinding viewBinding;
private CustomLabelsSelectionDialogBinding labelsBinding;
private int resultLimit = StaticGlobalVariables.resultLimitOldGiteaInstances;
private Dialog dialogLabels;
private String labelsSetter;
private ArrayList<Integer> labelsIds = new ArrayList<>();
private ArrayList<String> assignees = new ArrayList<>();
private int milestoneId;
private String instanceUrl;
private String loginUid;
private String instanceToken;
private String repoOwner;
private String repoName;
private LabelsListAdapter labelsAdapter;
List<Milestones> milestonesList = new ArrayList<>();
List<Branches> branchesList = new ArrayList<>();
List<Labels> labelsList = new ArrayList<>();
public CreatePullRequestActivity() {
}
@Override
protected int getLayoutResourceId(){
return R.layout.activity_create_pr;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
tinyDb = new TinyDB(appCtx);
viewBinding = ActivityCreatePrBinding.inflate(getLayoutInflater());
View view = viewBinding.getRoot();
setContentView(view);
instanceUrl = tinyDb.getString("instanceUrl");
loginUid = tinyDb.getString("loginUid");
String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/");
repoOwner = parts[0];
repoName = parts[1];
instanceToken = "token " + tinyDb.getString(loginUid + "-token");
// require gitea 1.12 or higher
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) {
resultLimit = StaticGlobalVariables.resultLimitNewGiteaInstances;
}
labelsAdapter = new LabelsListAdapter(labelsList, CreatePullRequestActivity.this);
ImageView closeActivity = findViewById(R.id.close);
initCloseListener();
closeActivity.setOnClickListener(onClickListener);
viewBinding.prDueDate.setOnClickListener(dueDate ->
setDueDate()
);
disableProcessButton();
getMilestones(instanceUrl, instanceToken, repoOwner, repoName, loginUid, resultLimit);
getBranches(instanceUrl, instanceToken, repoOwner, repoName, loginUid);
viewBinding.prLabels.setOnClickListener(prLabels ->
showLabels()
);
viewBinding.createPr.setOnClickListener(createPr ->
processPullRequest()
);
}
private void processPullRequest() {
String prTitle = String.valueOf(viewBinding.prTitle.getText());
String prDescription = String.valueOf(viewBinding.prBody.getText());
String mergeInto = viewBinding.mergeIntoBranchSpinner.getText().toString();
String pullFrom = viewBinding.pullFromBranchSpinner.getText().toString();
String dueDate = String.valueOf(viewBinding.prDueDate.getText());
assignees.add("");
if (labelsIds.size() == 0) {
labelsIds.add(0);
}
if (dueDate.matches("")) {
dueDate = null;
}
else {
dueDate = AppUtil.customDateCombine(AppUtil.customDateFormat(dueDate));
}
if(prTitle.matches("")) {
Toasty.error(ctx, getString(R.string.titleError));
}
else if(mergeInto.matches("")) {
Toasty.error(ctx, getString(R.string.mergeIntoError));
}
else if(pullFrom.matches("")) {
Toasty.error(ctx, getString(R.string.pullFromError));
}
else if(pullFrom.equals(mergeInto)) {
Toasty.error(ctx, getString(R.string.sameBranchesError));
}
else {
createPullRequest(prTitle, prDescription, mergeInto, pullFrom, milestoneId, dueDate, assignees);
}
//Log.e("processPullRequest", String.valueOf(milestoneId));
}
private void createPullRequest(String prTitle, String prDescription, String mergeInto, String pullFrom, int milestoneId, String dueDate, ArrayList<String> assignees) {
CreatePullRequest createPullRequest = new CreatePullRequest(prTitle, prDescription, loginUid, mergeInto, pullFrom, milestoneId, dueDate, assignees, labelsIds);
Call<ResponseBody> transferCall = RetrofitClient
.getInstance(instanceUrl, ctx)
.getApiInterface()
.createPullRequest(instanceToken, repoOwner, repoName, createPullRequest);
transferCall.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(@NonNull Call<ResponseBody> call, @NonNull retrofit2.Response<ResponseBody> response) {
disableProcessButton();
if (response.code() == 201) {
Toasty.success(ctx, getString(R.string.prCreateSuccess));
finish();
}
else if (response.code() == 409 && response.message().equals("Conflict")) {
enableProcessButton();
Toasty.error(ctx, getString(R.string.prAlreadyExists));
}
else if (response.code() == 404) {
enableProcessButton();
Toasty.error(ctx, getString(R.string.apiNotFound));
}
else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<ResponseBody> call, @NonNull Throwable t) {
enableProcessButton();
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
}
@Override
public void labelsStringData(ArrayList<String> data) {
labelsSetter = String.valueOf(data);
viewBinding.prLabels.setText(labelsSetter.replace("]", "").replace("[", ""));
}
@Override
public void labelsIdsData(ArrayList<Integer> data) {
labelsIds = data;
}
private void showLabels() {
dialogLabels = new Dialog(ctx, R.style.ThemeOverlay_MaterialComponents_Dialog_Alert);
if (dialogLabels.getWindow() != null) {
dialogLabels.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
labelsBinding = CustomLabelsSelectionDialogBinding.inflate(LayoutInflater.from(ctx));
View view = labelsBinding.getRoot();
dialogLabels.setContentView(view);
labelsBinding.cancel.setOnClickListener(editProperties ->
dialogLabels.dismiss()
);
Call<List<Labels>> call = RetrofitClient
.getInstance(instanceUrl, ctx)
.getApiInterface()
.getlabels(instanceToken, repoOwner, repoName);
call.enqueue(new Callback<List<Labels>>() {
@Override
public void onResponse(@NonNull Call<List<Labels>> call, @NonNull retrofit2.Response<List<Labels>> response) {
labelsList.clear();
List<Labels> labelsList_ = response.body();
labelsBinding.progressBar.setVisibility(View.GONE);
labelsBinding.dialogFrame.setVisibility(View.VISIBLE);
if (response.code() == 200) {
assert labelsList_ != null;
if(labelsList_.size() > 0) {
for (int i = 0; i < labelsList_.size(); i++) {
labelsList.add(new Labels(labelsList_.get(i).getId(), labelsList_.get(i).getName()));
}
}
else {
dialogLabels.dismiss();
Toasty.warning(ctx, getString(R.string.noLabelsFound));
}
labelsBinding.labelsRecyclerView.setAdapter(labelsAdapter);
}
else {
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<List<Labels>> call, @NonNull Throwable t) {
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
dialogLabels.show();
}
private void getBranches(String instanceUrl, String instanceToken, String repoOwner, String repoName, String loginUid) {
Call<List<Branches>> call = RetrofitClient
.getInstance(instanceUrl, ctx)
.getApiInterface()
.getBranches(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName);
call.enqueue(new Callback<List<Branches>>() {
@Override
public void onResponse(@NonNull Call<List<Branches>> call, @NonNull retrofit2.Response<List<Branches>> response) {
if(response.isSuccessful()) {
if(response.code() == 200) {
List<Branches> branchesList_ = response.body();
assert branchesList_ != null;
if(branchesList_.size() > 0) {
for (int i = 0; i < branchesList_.size(); i++) {
Branches data = new Branches(
branchesList_.get(i).getName()
);
branchesList.add(data);
}
}
ArrayAdapter<Branches> adapter = new ArrayAdapter<>(CreatePullRequestActivity.this,
R.layout.list_spinner_items, branchesList);
viewBinding.mergeIntoBranchSpinner.setAdapter(adapter);
viewBinding.pullFromBranchSpinner.setAdapter(adapter);
enableProcessButton();
}
}
}
@Override
public void onFailure(@NonNull Call<List<Branches>> call, @NonNull Throwable t) {
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
}
private void getMilestones(String instanceUrl, String instanceToken, String repoOwner, String repoName, String loginUid, int resultLimit) {
String msState = "open";
Call<List<Milestones>> call = RetrofitClient
.getInstance(instanceUrl, ctx)
.getApiInterface()
.getMilestones(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, 1, resultLimit, msState);
call.enqueue(new Callback<List<Milestones>>() {
@Override
public void onResponse(@NonNull Call<List<Milestones>> call, @NonNull retrofit2.Response<List<Milestones>> response) {
if(response.code() == 200) {
List<Milestones> milestonesList_ = response.body();
milestonesList.add(new Milestones(0,getString(R.string.issueCreatedNoMilestone)));
assert milestonesList_ != null;
if(milestonesList_.size() > 0) {
for (int i = 0; i < milestonesList_.size(); i++) {
//Don't translate "open" is a enum
if(milestonesList_.get(i).getState().equals("open")) {
Milestones data = new Milestones(
milestonesList_.get(i).getId(),
milestonesList_.get(i).getTitle()
);
milestonesList.add(data);
}
}
}
ArrayAdapter<Milestones> adapter = new ArrayAdapter<>(CreatePullRequestActivity.this,
R.layout.list_spinner_items, milestonesList);
viewBinding.milestonesSpinner.setAdapter(adapter);
enableProcessButton();
viewBinding.milestonesSpinner.setOnItemClickListener ((parent, view, position, id) ->
milestoneId = milestonesList.get(position).getId()
);
}
}
@Override
public void onFailure(@NonNull Call<List<Milestones>> call, @NonNull Throwable t) {
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
}
private void setDueDate() {
final Calendar c = Calendar.getInstance();
int mYear = c.get(Calendar.YEAR);
final int mMonth = c.get(Calendar.MONTH);
final int mDay = c.get(Calendar.DAY_OF_MONTH);
DatePickerDialog datePickerDialog = new DatePickerDialog(this,
(view, year, monthOfYear, dayOfMonth) -> viewBinding.prDueDate.setText(getString(R.string.setDueDate, year, (monthOfYear + 1), dayOfMonth)), mYear, mMonth, mDay);
datePickerDialog.show();
}
private void initCloseListener() {
onClickListener = view -> finish();
}
private void disableProcessButton() {
viewBinding.createPr.setEnabled(false);
}
private void enableProcessButton() {
viewBinding.createPr.setEnabled(true);
}
}

View File

@ -104,6 +104,7 @@ public class IssueDetailActivity extends BaseActivity {
private LinearLayout assigneesLayout;
private View divider;
private ProgressBar progressBar;
private ImageView issuePrState;
@Override
protected int getLayoutResourceId() {
@ -145,6 +146,7 @@ public class IssueDetailActivity extends BaseActivity {
assigneesLayout = findViewById(R.id.frameAssignees);
divider = findViewById(R.id.divider);
progressBar = findViewById(R.id.progressBar);
issuePrState = findViewById(R.id.issuePrState);
Toolbar toolbar = findViewById(R.id.toolbar);
TextView toolbarTitle = toolbar.findViewById(R.id.toolbar_title);
@ -351,6 +353,27 @@ public class IssueDetailActivity extends BaseActivity {
Issues singleIssue = response.body();
assert singleIssue != null;
issuePrState.setVisibility(View.VISIBLE);
if(singleIssue.getPull_request() != null) {
if(singleIssue.getPull_request().isMerged()) { // merged
issuePrState.setImageResource(R.drawable.ic_pull_request_merged);
}
else if(!singleIssue.getPull_request().isMerged() && singleIssue.getState().equals("closed")) { // closed
issuePrState.setImageResource(R.drawable.ic_pull_request_closed);
}
else { // open
issuePrState.setImageResource(R.drawable.ic_pull_request);
}
}
else if(singleIssue.getState().equals("closed")) { // issue closed
issuePrState.setImageResource(R.drawable.ic_issue_closed_red);
}
final Markwon markwon = Markwon.builder(Objects.requireNonNull(ctx)).usePlugin(CorePlugin.create())
.usePlugin(ImagesPlugin.create(plugin -> {
plugin.addSchemeHandler(new SchemeHandler() {

View File

@ -167,16 +167,12 @@ public class LoginActivity extends BaseActivity {
URI rawInstanceUrl = UrlBuilder.fromString(UrlHelper.fixScheme(instanceUrlET.getText().toString(), "http")).toUri();
URI instanceUrlWithProtocol = UrlBuilder.fromUri(rawInstanceUrl).withPath(PathsHelper.join(rawInstanceUrl.getPath()))
.withScheme(protocol.name().toLowerCase()).toUri();
URI instanceUrl = UrlBuilder.fromUri(instanceUrlWithProtocol).withPath(PathsHelper.join(instanceUrlWithProtocol.getPath(), "/api/v1/"))
URI instanceUrl = UrlBuilder.fromUri(rawInstanceUrl).withScheme(protocol.name().toLowerCase()).withPath(PathsHelper.join(rawInstanceUrl.getPath(), "/api/v1/"))
.toUri();
tinyDB.putString("loginType", loginType.name().toLowerCase());
tinyDB.putString("instanceUrlRaw", instanceUrlET.getText().toString());
tinyDB.putString("instanceUrl", instanceUrl.toString());
tinyDB.putString("instanceUrlWithProtocol", instanceUrlWithProtocol.toString());
if(instanceUrlET.getText().toString().equals("")) {
@ -256,7 +252,7 @@ public class LoginActivity extends BaseActivity {
if(!loginToken.equals("")) {
callVersion = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getGiteaVersionWithToken(loginToken);
callVersion = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getGiteaVersionWithToken("token " + loginToken);
}
else {
@ -276,20 +272,17 @@ public class LoginActivity extends BaseActivity {
if(responseVersion.code() == 200) {
GiteaVersion version = responseVersion.body();
Version gitea_version;
assert version != null;
try {
gitea_version = new Version(version.getVersion());
}
catch(Exception e) {
if(!Version.valid(version.getVersion())) {
Toasty.error(ctx, getResources().getString(R.string.versionUnknown));
enableProcessButton();
return;
}
tinyDB.putString("giteaVersion", version.getVersion());
Version gitea_version = new Version(version.getVersion());
if(gitea_version.less(getString(R.string.versionLow))) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ctx).setTitle(getString(R.string.versionAlertDialogHeader))
@ -570,7 +563,8 @@ public class LoginActivity extends BaseActivity {
if(checkAccount == 0) {
accountId = userAccountsApi.insertNewAccount(accountName, instanceUrl, userDetails.getUsername(), newToken.getSha1(), "");
accountId = userAccountsApi
.insertNewAccount(accountName, instanceUrl, userDetails.getUsername(), newToken.getSha1(), "");
tinyDB.putInt("currentActiveAccountId", (int) accountId);
}
else {

View File

@ -10,6 +10,7 @@ import android.graphics.Typeface;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
@ -55,6 +56,7 @@ import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.models.GiteaVersion;
import org.mian.gitnex.models.NotificationCount;
import org.mian.gitnex.models.UserInfo;
import java.util.ArrayList;
import java.util.List;
@ -82,6 +84,14 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
private Context appCtx;
private Typeface myTypeface;
private String instanceUrl;
private String loginUid;
private String instanceToken;
private View hView;
private MenuItem navNotifications;
private TextView notificationCounter;
@Override
protected int getLayoutResourceId() {
@ -100,9 +110,9 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
Intent mainIntent = getIntent();
String launchFragment = mainIntent.getStringExtra("launchFragment");
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
instanceUrl = tinyDb.getString("instanceUrl");
loginUid = tinyDb.getString("loginUid");
instanceToken = "token " + tinyDb.getString(loginUid + "-token");
if(tinyDb.getString("dateFormat").isEmpty()) {
tinyDb.putString("dateFormat", "pretty");
@ -191,10 +201,15 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
toolbarTitle.setText(getResources().getString(R.string.pageTitleUserAccounts));
}
getNotificationsCount(instanceUrl, instanceToken);
drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
final View hView = navigationView.getHeaderView(0);
hView = navigationView.getHeaderView(0);
Menu menu = navigationView.getMenu();
navNotifications = menu.findItem(R.id.nav_notifications);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
@ -204,6 +219,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
@Override
public void onDrawerOpened(@NonNull View drawerView) {
getNotificationsCount(instanceUrl, instanceToken);
}
@Override
@ -705,4 +721,31 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
}
private void getNotificationsCount(String instanceUrl, String token) {
Call<NotificationCount> call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().checkUnreadNotifications(token);
call.enqueue(new Callback<NotificationCount>() {
@Override
public void onResponse(@NonNull Call<NotificationCount> call, @NonNull retrofit2.Response<NotificationCount> response) {
NotificationCount notificationCount = response.body();
if(response.code() == 200) {
assert notificationCount != null;
notificationCounter = navNotifications.getActionView().findViewById(R.id.counterBadgeNotification);
notificationCounter.setText(String.valueOf(notificationCount.getCounter()));
}
}
@Override
public void onFailure(@NonNull Call<NotificationCount> call, @NonNull Throwable t) {
Log.e("onFailure-notification", t.toString());
}
});
}
}

View File

@ -104,7 +104,12 @@ public class ReplyToIssueActivity extends BaseActivity {
}
else {
draftIdOnCreate = returnDraftId();
if(getIntent().getStringExtra("commentBody") != null) {
draftIdOnCreate = returnDraftId(getIntent().getStringExtra("commentBody"));
}
else {
draftIdOnCreate = returnDraftId("");
}
}
replyButton = findViewById(R.id.replyButton);
@ -216,7 +221,7 @@ public class ReplyToIssueActivity extends BaseActivity {
}
private long returnDraftId() {
private long returnDraftId(String draftText) {
TinyDB tinyDb = new TinyDB(getApplicationContext());
@ -226,7 +231,7 @@ public class ReplyToIssueActivity extends BaseActivity {
DraftsApi draftsApi = new DraftsApi(appCtx);
return draftsApi.insertDraft(repositoryId, currentActiveAccountId, issueNumber, "", StaticGlobalVariables.draftTypeComment, "");
return draftsApi.insertDraft(repositoryId, currentActiveAccountId, issueNumber, draftText, StaticGlobalVariables.draftTypeComment, "");
}

View File

@ -33,7 +33,6 @@ import org.mian.gitnex.fragments.BottomSheetIssuesFilterFragment;
import org.mian.gitnex.fragments.BottomSheetMilestonesFilterFragment;
import org.mian.gitnex.fragments.BottomSheetPullRequestFilterFragment;
import org.mian.gitnex.fragments.BottomSheetRepoFragment;
import org.mian.gitnex.fragments.BranchesFragment;
import org.mian.gitnex.fragments.CollaboratorsFragment;
import org.mian.gitnex.fragments.FilesFragment;
import org.mian.gitnex.fragments.IssuesFragment;
@ -163,7 +162,7 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetRepoF
}
// Only show collaborators tab, if you have permission to
View collaboratorTab = viewGroup.getChildAt(8);
View collaboratorTab = viewGroup.getChildAt(7);
if(tinyDB.getBoolean("isRepoAdmin") || new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.0")) {
@ -229,8 +228,8 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetRepoF
if(textViewBadgeRelease.getText() != "") { // only show if API returned a number
Objects.requireNonNull(tabLayout.getTabAt(5)).setCustomView(tabHeader6);
TabLayout.Tab tabOpenRelease = tabLayout.getTabAt(5);
Objects.requireNonNull(tabLayout.getTabAt(4)).setCustomView(tabHeader6);
TabLayout.Tab tabOpenRelease = tabLayout.getTabAt(4);
assert tabOpenRelease != null; // FIXME This should be cleaned up
TextView openReleaseTabView = Objects.requireNonNull(tabOpenRelease.getCustomView()).findViewById(R.id.counterBadgeReleaseText);
openReleaseTabView.setTextColor(textColor);
@ -300,6 +299,12 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetRepoF
chooseBranch();
return true;
case R.id.branchCommits:
Intent intent = new Intent(ctx, CommitsActivity.class);
intent.putExtra("branchName", tinyDB.getString("repoBranch"));
ctx.startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
@ -397,6 +402,14 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetRepoF
}
break;
case "repoSettings":
startActivity(new Intent(RepoDetailActivity.this, RepositorySettingsActivity.class));
break;
case "newPullRequest":
startActivity(new Intent(RepoDetailActivity.this, CreatePullRequestActivity.class));
break;
}
}
@ -490,20 +503,17 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetRepoF
fragment = new PullRequestsFragment();
break;
case 4: // Branches
return BranchesFragment.newInstance(repositoryOwner, repositoryName);
case 5: // Releases
case 4: // Releases
return ReleasesFragment.newInstance(repositoryOwner, repositoryName);
case 6: // Milestones
case 5: // Milestones
fragment = new MilestonesFragment();
break;
case 7: // Labels
case 6: // Labels
return LabelsFragment.newInstance(repositoryOwner, repositoryName);
case 8: // Collaborators
case 7: // Collaborators
return CollaboratorsFragment.newInstance(repositoryOwner, repositoryName);
}

View File

@ -0,0 +1,435 @@
package org.mian.gitnex.activities;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import com.google.gson.JsonElement;
import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.database.api.RepositoriesApi;
import org.mian.gitnex.databinding.ActivityRepositorySettingsBinding;
import org.mian.gitnex.databinding.CustomRepositoryDeleteDialogBinding;
import org.mian.gitnex.databinding.CustomRepositoryEditPropertiesDialogBinding;
import org.mian.gitnex.databinding.CustomRepositoryTransferDialogBinding;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.models.RepositoryTransfer;
import org.mian.gitnex.models.UserRepositories;
import retrofit2.Call;
import retrofit2.Callback;
/**
* Author M M Arif
*/
public class RepositorySettingsActivity extends BaseActivity {
private ActivityRepositorySettingsBinding viewBinding;
private CustomRepositoryEditPropertiesDialogBinding propBinding;
private CustomRepositoryDeleteDialogBinding deleteRepoBinding;
private CustomRepositoryTransferDialogBinding transferRepoBinding;
private Dialog dialogProp;
private Dialog dialogDeleteRepository;
private Dialog dialogTransferRepository;
private View.OnClickListener onClickListener;
private Context ctx = this;
private Context appCtx;
private TinyDB tinyDb;
private String instanceUrl;
private String loginUid;
private String instanceToken;
private String repositoryOwner;
private String repositoryName;
@Override
protected int getLayoutResourceId(){
return R.layout.activity_repository_settings;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
tinyDb = new TinyDB(appCtx);
viewBinding = ActivityRepositorySettingsBinding.inflate(getLayoutInflater());
View view = viewBinding.getRoot();
setContentView(view);
instanceUrl = tinyDb.getString("instanceUrl");
loginUid = tinyDb.getString("loginUid");
String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/");
repositoryOwner = parts[0];
repositoryName = parts[1];
instanceToken = "token " + tinyDb.getString(loginUid + "-token");
ImageView closeActivity = findViewById(R.id.close);
initCloseListener();
closeActivity.setOnClickListener(onClickListener);
// require gitea 1.12 or higher
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) {
viewBinding.transferOwnerFrame.setVisibility(View.VISIBLE);
}
viewBinding.editProperties.setOnClickListener(editProperties -> {
showRepositoryProperties();
});
viewBinding.deleteRepository.setOnClickListener(deleteRepository -> {
showDeleteRepository();
});
viewBinding.transferOwnerFrame.setOnClickListener(transferRepositoryOwnership -> {
showTransferRepository();
});
}
private void showTransferRepository() {
dialogTransferRepository = new Dialog(ctx, R.style.ThemeOverlay_MaterialComponents_Dialog_Alert);
if (dialogTransferRepository.getWindow() != null) {
dialogTransferRepository.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
transferRepoBinding = CustomRepositoryTransferDialogBinding.inflate(LayoutInflater.from(ctx));
View view = transferRepoBinding.getRoot();
dialogTransferRepository.setContentView(view);
transferRepoBinding.cancel.setOnClickListener(editProperties -> {
dialogTransferRepository.dismiss();
});
transferRepoBinding.transfer.setOnClickListener(deleteRepo -> {
String newOwner = String.valueOf(transferRepoBinding.ownerNameForTransfer.getText());
String repoName = String.valueOf(transferRepoBinding.repoNameForTransfer.getText());
if(!repositoryName.equals(repoName)) {
Toasty.error(ctx, getString(R.string.repoSettingsDeleteError));
}
else if(newOwner.matches("")) {
Toasty.error(ctx, getString(R.string.repoTransferOwnerError));
}
else {
transferRepository(newOwner);
}
});
dialogTransferRepository.show();
}
private void transferRepository(String newOwner) {
RepositoryTransfer repositoryTransfer = new RepositoryTransfer(newOwner);
Call<JsonElement> transferCall = RetrofitClient
.getInstance(instanceUrl, ctx)
.getApiInterface()
.transferRepository(instanceToken, repositoryOwner, repositoryName, repositoryTransfer);
transferCall.enqueue(new Callback<JsonElement>() {
@Override
public void onResponse(@NonNull Call<JsonElement> call, @NonNull retrofit2.Response<JsonElement> response) {
transferRepoBinding.transfer.setVisibility(View.GONE);
transferRepoBinding.processingRequest.setVisibility(View.VISIBLE);
if (response.code() == 202) {
dialogTransferRepository.dismiss();
Toasty.success(ctx, getString(R.string.repoTransferSuccess));
finish();
RepositoriesApi.deleteRepository((int) tinyDb.getLong("repositoryId", 0));
Intent intent = new Intent(RepositorySettingsActivity.this, MainActivity.class);
RepositorySettingsActivity.this.startActivity(intent);
}
else if (response.code() == 404) {
transferRepoBinding.transfer.setVisibility(View.VISIBLE);
transferRepoBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.repoTransferError));
}
else {
transferRepoBinding.transfer.setVisibility(View.VISIBLE);
transferRepoBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<JsonElement> call, @NonNull Throwable t) {
transferRepoBinding.transfer.setVisibility(View.VISIBLE);
transferRepoBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
}
private void showDeleteRepository() {
dialogDeleteRepository = new Dialog(ctx, R.style.ThemeOverlay_MaterialComponents_Dialog_Alert);
if (dialogDeleteRepository.getWindow() != null) {
dialogDeleteRepository.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
deleteRepoBinding = CustomRepositoryDeleteDialogBinding.inflate(LayoutInflater.from(ctx));
View view = deleteRepoBinding.getRoot();
dialogDeleteRepository.setContentView(view);
deleteRepoBinding.cancel.setOnClickListener(editProperties -> {
dialogDeleteRepository.dismiss();
});
deleteRepoBinding.delete.setOnClickListener(deleteRepo -> {
if(!repositoryName.equals(String.valueOf(deleteRepoBinding.repoNameForDeletion.getText()))) {
Toasty.error(ctx, getString(R.string.repoSettingsDeleteError));
}
else {
deleteRepository();
}
});
dialogDeleteRepository.show();
}
private void deleteRepository() {
Call<JsonElement> deleteCall = RetrofitClient
.getInstance(instanceUrl, ctx)
.getApiInterface()
.deleteRepository(instanceToken, repositoryOwner, repositoryName);
deleteCall.enqueue(new Callback<JsonElement>() {
@Override
public void onResponse(@NonNull Call<JsonElement> call, @NonNull retrofit2.Response<JsonElement> response) {
deleteRepoBinding.delete.setVisibility(View.GONE);
deleteRepoBinding.processingRequest.setVisibility(View.VISIBLE);
if (response.code() == 204) {
dialogDeleteRepository.dismiss();
Toasty.success(ctx, getString(R.string.repoDeletionSuccess));
finish();
RepositoriesApi.deleteRepository((int) tinyDb.getLong("repositoryId", 0));
Intent intent = new Intent(RepositorySettingsActivity.this, MainActivity.class);
RepositorySettingsActivity.this.startActivity(intent);
}
else {
deleteRepoBinding.delete.setVisibility(View.VISIBLE);
deleteRepoBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<JsonElement> call, @NonNull Throwable t) {
deleteRepoBinding.delete.setVisibility(View.VISIBLE);
deleteRepoBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
}
private void showRepositoryProperties() {
dialogProp = new Dialog(ctx, R.style.ThemeOverlay_MaterialComponents_Dialog_Alert);
if (dialogProp.getWindow() != null) {
dialogProp.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
propBinding = CustomRepositoryEditPropertiesDialogBinding.inflate(LayoutInflater.from(ctx));
View view = propBinding.getRoot();
dialogProp.setContentView(view);
propBinding.cancel.setOnClickListener(editProperties -> {
dialogProp.dismiss();
});
Call<UserRepositories> call = RetrofitClient
.getInstance(instanceUrl, ctx)
.getApiInterface()
.getUserRepository(instanceToken, repositoryOwner, repositoryName);
call.enqueue(new Callback<UserRepositories>() {
@Override
public void onResponse(@NonNull Call<UserRepositories> call, @NonNull retrofit2.Response<UserRepositories> response) {
UserRepositories repoInfo = response.body();
propBinding.progressBar.setVisibility(View.GONE);
propBinding.mainView.setVisibility(View.VISIBLE);
if (response.code() == 200) {
assert repoInfo != null;
propBinding.repoName.setText(repoInfo.getName());
propBinding.repoWebsite.setText(repoInfo.getWebsite());
propBinding.repoDescription.setText(repoInfo.getDescription());
propBinding.repoPrivate.setChecked(repoInfo.getPrivateFlag());
propBinding.repoAsTemplate.setChecked(repoInfo.isTemplate());
propBinding.repoEnableIssues.setChecked(repoInfo.getHas_issues());
propBinding.repoEnableIssues.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked) {
propBinding.repoEnableTimer.setVisibility(View.VISIBLE);
}
else {
propBinding.repoEnableTimer.setVisibility(View.GONE);
}
});
if(repoInfo.getInternal_tracker() != null) {
propBinding.repoEnableTimer.setChecked(repoInfo.getInternal_tracker().isEnable_time_tracker());
}
else {
propBinding.repoEnableTimer.setVisibility(View.GONE);
}
propBinding.repoEnableWiki.setChecked(repoInfo.isHas_wiki());
propBinding.repoEnablePr.setChecked(repoInfo.isHas_pull_requests());
propBinding.repoEnableMerge.setChecked(repoInfo.isAllow_merge_commits());
propBinding.repoEnableRebase.setChecked(repoInfo.isAllow_rebase());
propBinding.repoEnableSquash.setChecked(repoInfo.isAllow_squash_merge());
propBinding.repoEnableForceMerge.setChecked(repoInfo.isAllow_rebase_explicit());
}
else {
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<UserRepositories> call, @NonNull Throwable t) {
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
propBinding.save.setOnClickListener(saveProperties -> saveRepositoryProperties(String.valueOf(propBinding.repoName.getText()),
String.valueOf(propBinding.repoWebsite.getText()),
String.valueOf(propBinding.repoDescription.getText()),
propBinding.repoPrivate.isChecked(), propBinding.repoAsTemplate.isChecked(),
propBinding.repoEnableIssues.isChecked(), propBinding.repoEnableWiki.isChecked(),
propBinding.repoEnablePr.isChecked(), propBinding.repoEnableTimer.isChecked(),
propBinding.repoEnableMerge.isChecked(), propBinding.repoEnableRebase.isChecked(),
propBinding.repoEnableSquash.isChecked(), propBinding.repoEnableForceMerge.isChecked()));
dialogProp.show();
}
private void saveRepositoryProperties(String repoName, String repoWebsite, String repoDescription,
boolean repoPrivate, boolean repoAsTemplate, boolean repoEnableIssues, boolean repoEnableWiki,
boolean repoEnablePr, boolean repoEnableTimer, boolean repoEnableMerge, boolean repoEnableRebase,
boolean repoEnableSquash, boolean repoEnableForceMerge) {
UserRepositories.internalTimeTrackerObject repoPropsTimeTracker = new UserRepositories.internalTimeTrackerObject(repoEnableTimer);
UserRepositories repoProps;
if(!repoEnableIssues) {
repoProps = new UserRepositories(repoName, repoWebsite, repoDescription, repoPrivate, repoAsTemplate, repoEnableIssues, repoEnableWiki, repoEnablePr, repoEnableMerge,
repoEnableRebase, repoEnableSquash, repoEnableForceMerge);
}
else {
repoProps = new UserRepositories(repoName, repoWebsite, repoDescription, repoPrivate, repoAsTemplate, repoEnableIssues, repoEnableWiki, repoEnablePr, repoPropsTimeTracker, repoEnableMerge,
repoEnableRebase, repoEnableSquash, repoEnableForceMerge);
}
Call<UserRepositories> propsCall = RetrofitClient
.getInstance(instanceUrl, ctx)
.getApiInterface()
.updateRepositoryProperties(instanceToken, repositoryOwner, repositoryName, repoProps);
propsCall.enqueue(new Callback<UserRepositories>() {
@Override
public void onResponse(@NonNull Call<UserRepositories> call, @NonNull retrofit2.Response<UserRepositories> response) {
propBinding.save.setVisibility(View.GONE);
propBinding.processingRequest.setVisibility(View.VISIBLE);
if (response.code() == 200) {
tinyDb.putBoolean("hasIssues", repoEnableIssues);
tinyDb.putBoolean("hasPullRequests", repoEnablePr);
dialogProp.dismiss();
Toasty.success(ctx, getString(R.string.repoPropertiesSaveSuccess));
if(!repositoryName.equals(repoName)) {
finish();
RepositoriesApi.updateRepositoryOwnerAndName(repositoryOwner, repoName, (int) tinyDb.getLong("repositoryId", 0));
Intent intent = new Intent(RepositorySettingsActivity.this, MainActivity.class);
RepositorySettingsActivity.this.startActivity(intent);
}
}
else {
propBinding.save.setVisibility(View.VISIBLE);
propBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<UserRepositories> call, @NonNull Throwable t) {
propBinding.save.setVisibility(View.VISIBLE);
propBinding.processingRequest.setVisibility(View.GONE);
Toasty.error(ctx, getString(R.string.genericServerResponseError));
}
});
}
private void initCloseListener() {
onClickListener = view -> finish();
}
}

View File

@ -22,8 +22,8 @@ public class SettingsTranslationActivity extends BaseActivity {
private Context appCtx;
private View.OnClickListener onClickListener;
private static String[] langList = {"English", "Arabic", "Chinese", "Finnish", "French", "German", "Italian", "Latvian", "Persian", "Polish", "Portuguese/Brazilian", "Russian", "Serbian", "Spanish", "Turkish",
"Ukrainian"};
private static String[] langList = {"English", "Arabic", "Chinese", "Czech", "Finnish", "French", "German", "Italian", "Latvian", "Persian",
"Polish", "Portuguese/Brazilian", "Russian", "Serbian", "Spanish", "Turkish", "Ukrainian"};
private static int langSelectedChoice = 0;
@Override
@ -95,6 +95,9 @@ public class SettingsTranslationActivity extends BaseActivity {
case "Chinese":
tinyDb.putString("locale", "zh");
break;
case "Czech":
tinyDb.putString("locale", "cs");
break;
case "Finnish":
tinyDb.putString("locale", "fi");
break;
@ -157,6 +160,7 @@ public class SettingsTranslationActivity extends BaseActivity {
}
private void initCloseListener() {
onClickListener = view -> finish();
}

View File

@ -1,90 +0,0 @@
package org.mian.gitnex.adapters;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.CommitsActivity;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.models.Branches;
import java.util.List;
import java.util.Objects;
/**
* Author M M Arif
*/
public class BranchesAdapter extends RecyclerView.Adapter<BranchesAdapter.BranchesViewHolder> {
private List<Branches> branchesList;
private Context mCtx;
static class BranchesViewHolder extends RecyclerView.ViewHolder {
private TextView branchNameTv;
private TextView branchCommitAuthor;
private BranchesViewHolder(View itemView) {
super(itemView);
branchNameTv = itemView.findViewById(R.id.branchName);
branchCommitAuthor = itemView.findViewById(R.id.branchCommitAuthor);
Button branchCommitHash = itemView.findViewById(R.id.branchCommitHash);
branchCommitHash.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(v.getContext(), CommitsActivity.class);
intent.putExtra("branchName", String.valueOf(branchNameTv.getText()));
Objects.requireNonNull(v.getContext()).startActivity(intent);
}
});
}
}
public BranchesAdapter(Context mCtx, List<Branches> branchesMain) {
this.mCtx = mCtx;
this.branchesList = branchesMain;
}
@NonNull
@Override
public BranchesAdapter.BranchesViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_branches, parent, false);
return new BranchesAdapter.BranchesViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull BranchesAdapter.BranchesViewHolder holder, int position) {
final TinyDB tinyDb = new TinyDB(mCtx);
final String instanceUrl = tinyDb.getString("instanceUrl");
Branches currentItem = branchesList.get(position);
holder.branchNameTv.setText(currentItem.getName());
if(currentItem.getCommit().getAuthor().getName() != null || !currentItem.getCommit().getAuthor().getName().equals("")) {
holder.branchCommitAuthor.setText(mCtx.getResources().getString(R.string.commitAuthor, currentItem.getCommit().getAuthor().getName()));
}
else {
holder.branchCommitAuthor.setText(mCtx.getResources().getString(R.string.commitAuthor, currentItem.getCommit().getAuthor().getUsername()));
}
}
@Override
public int getItemCount() {
return branchesList.size();
}
}

View File

@ -286,7 +286,7 @@ public class ExploreRepositoriesAdapter extends RecyclerView.Adapter<ExploreRepo
holder.repoDescription.setVisibility(View.VISIBLE);
holder.repoDescription.setText(currentItem.getDescription());
}
holder.fullName.setText(currentItem.getFullname());
holder.fullName.setText(currentItem.getFullName());
if(currentItem.getPrivateFlag()) {
holder.repoPrivatePublic.setImageResource(R.drawable.ic_lock);
holder.repoType.setText(R.string.strPrivate);

View File

@ -0,0 +1,95 @@
package org.mian.gitnex.adapters;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import org.mian.gitnex.R;
import org.mian.gitnex.models.Labels;
import java.util.ArrayList;
import java.util.List;
/**
* Author M M Arif
*/
public class LabelsListAdapter extends RecyclerView.Adapter<LabelsListAdapter.LabelsViewHolder> {
private List<Labels> labels;
private ArrayList<String> labelsStrings = new ArrayList<>();
private ArrayList<Integer> labelsIds = new ArrayList<>();
private LabelsListAdapterListener labelsListener;
public interface LabelsListAdapterListener {
void labelsStringData(ArrayList<String> data);
void labelsIdsData(ArrayList<Integer> data);
}
public LabelsListAdapter(List<Labels> labelsMain, LabelsListAdapterListener labelsListener) {
this.labels = labelsMain;
this.labelsListener = labelsListener;
}
static class LabelsViewHolder extends RecyclerView.ViewHolder {
private CheckBox labelSelection;
private LabelsViewHolder(View itemView) {
super(itemView);
labelSelection = itemView.findViewById(R.id.labelSelection);
}
}
@NonNull
@Override
public LabelsListAdapter.LabelsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_labels_list, parent, false);
return new LabelsListAdapter.LabelsViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull LabelsListAdapter.LabelsViewHolder holder, int position) {
Labels currentItem = labels.get(position);
holder.labelSelection.setText(currentItem.getName());
for(int i = 0; i < labelsIds.size(); i++) {
if(labelsStrings.contains(currentItem.getName())) {
holder.labelSelection.setChecked(true);
}
}
holder.labelSelection.setOnCheckedChangeListener((buttonView, isChecked) -> {
if(isChecked) {
labelsStrings.add(currentItem.getName());
labelsIds.add(currentItem.getId());
}
else {
labelsStrings.remove(currentItem.getName());
labelsIds.remove(Integer.valueOf(currentItem.getId()));
}
labelsListener.labelsStringData(labelsStrings);
labelsListener.labelsIdsData(labelsIds);
});
}
@Override
public int getItemCount() {
return labels.size();
}
}

View File

@ -291,7 +291,7 @@ public class MyReposListAdapter extends RecyclerView.Adapter<MyReposListAdapter.
holder.repoDescription.setVisibility(View.VISIBLE);
holder.repoDescription.setText(currentItem.getDescription());
}
holder.repoFullName.setText(currentItem.getFullname());
holder.repoFullName.setText(currentItem.getFullName());
if(currentItem.getPrivateFlag()) {
holder.repoPrivatePublic.setImageResource(R.drawable.ic_lock);
holder.repoType.setText(R.string.strPrivate);
@ -344,7 +344,7 @@ public class MyReposListAdapter extends RecyclerView.Adapter<MyReposListAdapter.
String filterPattern = constraint.toString().toLowerCase().trim();
for(UserRepositories item : reposListFull) {
if(item.getFullname().toLowerCase().contains(filterPattern) || item.getDescription().toLowerCase().contains(filterPattern)) {
if(item.getFullName().toLowerCase().contains(filterPattern) || item.getDescription().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}

View File

@ -85,7 +85,7 @@ public class NotificationsAdapter extends RecyclerView.Adapter<NotificationsAdap
.getString(R.string.hash) + url.substring(url.lastIndexOf("/") + 1) + "</font>";
holder.subject.setText(Html.fromHtml(subjectId + " " + notificationThread.getSubject().getTitle()));
holder.repository.setText(notificationThread.getRepository().getFullname());
holder.repository.setText(notificationThread.getRepository().getFullName());
if(notificationThread.isPinned()) {
holder.pinned.setVisibility(View.VISIBLE);
@ -120,7 +120,7 @@ public class NotificationsAdapter extends RecyclerView.Adapter<NotificationsAdap
onNotificationClickedListener.onNotificationClicked(notificationThread);
String[] parts = notificationThread.getRepository().getFullname().split("/");
String[] parts = notificationThread.getRepository().getFullName().split("/");
final String repoOwner = parts[0];
final String repoName = parts[1];

View File

@ -175,7 +175,7 @@ public class RepoForksAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
repoDescription.setVisibility(View.VISIBLE);
repoDescription.setText(forksModel.getDescription());
}
fullName.setText(forksModel.getFullname());
fullName.setText(forksModel.getFullName());
if(forksModel.getPrivateFlag()) {
repoPrivatePublic.setImageResource(R.drawable.ic_lock);

View File

@ -292,7 +292,7 @@ public class ReposListAdapter extends RecyclerView.Adapter<ReposListAdapter.Repo
holder.repoDescription.setVisibility(View.VISIBLE);
holder.repoDescription.setText(currentItem.getDescription());
}
holder.fullName.setText(currentItem.getFullname());
holder.fullName.setText(currentItem.getFullName());
if(currentItem.getPrivateFlag()) {
holder.repoPrivatePublic.setImageResource(R.drawable.ic_lock);
holder.repoType.setText(R.string.strPrivate);
@ -344,7 +344,7 @@ public class ReposListAdapter extends RecyclerView.Adapter<ReposListAdapter.Repo
String filterPattern = constraint.toString().toLowerCase().trim();
for(UserRepositories item : reposListFull) {
if(item.getFullname().toLowerCase().contains(filterPattern) || item.getDescription().toLowerCase().contains(filterPattern)) {
if(item.getFullName().toLowerCase().contains(filterPattern) || item.getDescription().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}

View File

@ -292,7 +292,7 @@ public class RepositoriesByOrgAdapter extends RecyclerView.Adapter<RepositoriesB
holder.repoDescription.setVisibility(View.VISIBLE);
holder.repoDescription.setText(currentItem.getDescription());
}
holder.fullName.setText(currentItem.getFullname());
holder.fullName.setText(currentItem.getFullName());
if(currentItem.getPrivateFlag()) {
holder.repoPrivatePublic.setImageResource(R.drawable.ic_lock);
holder.repoType.setText(R.string.strPrivate);
@ -340,7 +340,7 @@ public class RepositoriesByOrgAdapter extends RecyclerView.Adapter<RepositoriesB
String filterPattern = constraint.toString().toLowerCase().trim();
for (UserRepositories item : reposListFull) {
if (item.getFullname().toLowerCase().contains(filterPattern) || item.getDescription().toLowerCase().contains(filterPattern)) {
if (item.getFullName().toLowerCase().contains(filterPattern) || item.getDescription().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}

View File

@ -295,7 +295,7 @@ public class StarredReposListAdapter extends RecyclerView.Adapter<StarredReposLi
holder.repoDescription.setVisibility(View.VISIBLE);
holder.repoDescription.setText(currentItem.getDescription());
}
holder.fullName.setText(currentItem.getFullname());
holder.fullName.setText(currentItem.getFullName());
if(currentItem.getPrivateFlag()) {
holder.repoPrivatePublic.setImageResource(R.drawable.ic_lock);
holder.repoType.setText(R.string.strPrivate);
@ -342,7 +342,7 @@ public class StarredReposListAdapter extends RecyclerView.Adapter<StarredReposLi
String filterPattern = constraint.toString().toLowerCase().trim();
for (UserRepositories item : reposListFull) {
if (item.getFullname().toLowerCase().contains(filterPattern) || item.getDescription().toLowerCase().contains(filterPattern)) {
if (item.getFullName().toLowerCase().contains(filterPattern) || item.getDescription().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}

View File

@ -1,6 +1,5 @@
package org.mian.gitnex.adapters;
import android.annotation.SuppressLint;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
@ -25,32 +24,33 @@ import io.mikael.urlbuilder.UrlBuilder;
public class UserAccountsListDialogAdapter extends ArrayAdapter<UserAccount> {
private final Context mCtx;
private final List<UserAccount> userAccountsList;
private final TinyDB tinyDB;
private final List<UserAccount> userAccounts;
public UserAccountsListDialogAdapter(@NonNull Context mCtx, int resource, @NonNull List<UserAccount> objects) {
public UserAccountsListDialogAdapter(@NonNull Context mCtx, int resource, @NonNull List<UserAccount> userAccounts) {
super(mCtx, resource, objects);
userAccountsList = objects;
super(mCtx, resource, userAccounts);
tinyDB = new TinyDB(mCtx);
this.userAccounts = userAccounts;
this.mCtx = mCtx;
}
@SuppressLint("ViewHolder")
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) mCtx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
assert inflater != null;
View rowView = inflater.inflate(R.layout.custom_user_accounts_list, parent, false);
if(convertView == null) {
convertView = LayoutInflater.from(mCtx).inflate(R.layout.custom_user_accounts_list, parent, false);
}
TinyDB tinyDB = new TinyDB(mCtx);
ImageView profileImage = convertView.findViewById(R.id.profileImage);
TextView userName = convertView.findViewById(R.id.userName);
TextView accountUrl = convertView.findViewById(R.id.accountUrl);
ImageView activeAccount = convertView.findViewById(R.id.activeAccount);
ImageView profileImage = rowView.findViewById(R.id.profileImage);
TextView userName = rowView.findViewById(R.id.userName);
TextView accountUrl = rowView.findViewById(R.id.accountUrl);
ImageView activeAccount = rowView.findViewById(R.id.activeAccount);
UserAccount currentItem = userAccountsList.get(position);
UserAccount currentItem = userAccounts.get(position);
String url = UrlBuilder.fromString(currentItem.getInstanceUrl())
.withPath("/")
@ -62,11 +62,15 @@ public class UserAccountsListDialogAdapter extends ArrayAdapter<UserAccount> {
if(tinyDB.getInt("currentActiveAccountId") == currentItem.getAccountId()) {
activeAccount.setVisibility(View.VISIBLE);
}
else {
activeAccount.setVisibility(View.GONE);
}
PicassoService
.getInstance(mCtx).get().load(url + "img/favicon.png").placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(profileImage);
return rowView;
return convertView;
}
}

View File

@ -127,6 +127,11 @@ public class RepositoriesApi {
return repository;
}
public static void updateRepositoryOwnerAndName(String repositoryOwner, String repositoryName, int repositoryId) {
new Thread(() -> repositoriesDao.updateRepositoryOwnerAndName(repositoryOwner, repositoryName, repositoryId)).start();
}
public static void deleteRepositoriesByAccount(final int repoAccountId) {
new Thread(() -> repositoriesDao.deleteRepositoriesByAccount(repoAccountId)).start();

View File

@ -6,14 +6,12 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import org.mian.gitnex.R;
import org.mian.gitnex.databinding.FragmentAboutBinding;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.TinyDB;
import java.util.Objects;
/**
* Author M M Arif
@ -21,30 +19,17 @@ import java.util.Objects;
public class AboutFragment extends Fragment {
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_about, container, false);
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
FragmentAboutBinding viewBinding = FragmentAboutBinding.inflate(inflater, container, false);
TinyDB tinyDb = new TinyDB(getContext());
final TextView appVerBuild;
final TextView donationLink;
final TextView donationLinkPatreon;
final TextView translateLink;
final TextView appWebsite;
final TextView appRepo;
viewBinding.appVersion.setText(AppUtil.getAppVersion(requireContext()));
viewBinding.userServerVersion.setText(tinyDb.getString("giteaVersion"));
viewBinding.appBuild.setText(String.valueOf(AppUtil.getAppBuildNo(requireContext())));
appVerBuild = v.findViewById(R.id.appVerBuild);
TextView viewTextGiteaVersion = v.findViewById(R.id.giteaVersion);
donationLink = v.findViewById(R.id.donationLink);
donationLinkPatreon = v.findViewById(R.id.donationLinkPatreon);
translateLink = v.findViewById(R.id.translateLink);
appWebsite = v.findViewById(R.id.appWebsite);
appRepo = v.findViewById(R.id.appRepo);
appVerBuild.setText(getString(R.string.appVerBuild, AppUtil.getAppVersion(Objects.requireNonNull(getContext())), AppUtil.getAppBuildNo(getContext())));
donationLink.setOnClickListener(v1 -> {
viewBinding.donationLinkLiberapay.setOnClickListener(v1 -> {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
@ -53,7 +38,7 @@ public class AboutFragment extends Fragment {
startActivity(intent);
});
donationLinkPatreon.setOnClickListener(v12 -> {
viewBinding.donationLinkPatreon.setOnClickListener(v12 -> {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
@ -62,7 +47,7 @@ public class AboutFragment extends Fragment {
startActivity(intent);
});
translateLink.setOnClickListener(v13 -> {
viewBinding.translateLink.setOnClickListener(v13 -> {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
@ -71,7 +56,7 @@ public class AboutFragment extends Fragment {
startActivity(intent);
});
appWebsite.setOnClickListener(v14 -> {
viewBinding.appWebsite.setOnClickListener(v14 -> {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
@ -80,19 +65,15 @@ public class AboutFragment extends Fragment {
startActivity(intent);
});
appRepo.setOnClickListener(v15 -> {
if(AppUtil.isPro(requireContext())) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse(getResources().getString(R.string.appRepoLink)));
startActivity(intent);
});
viewBinding.supportHeader.setVisibility(View.GONE);
viewBinding.dividerSupport.setVisibility(View.GONE);
viewBinding.donationLinkLiberapay.setVisibility(View.GONE);
viewBinding.donationLinkPatreon.setVisibility(View.GONE);
}
String commit = getResources().getString(R.string.commitPage) + tinyDb.getString("giteaVersion");
viewTextGiteaVersion.setText(commit);
return v;
return viewBinding.getRoot();
}
}

View File

@ -41,6 +41,9 @@ public class BottomSheetRepoFragment extends BottomSheetDialogFragment {
TextView unWatchRepository = v.findViewById(R.id.unWatchRepository);
TextView shareRepository = v.findViewById(R.id.shareRepository);
TextView copyRepoUrl = v.findViewById(R.id.copyRepoUrl);
View repoSettingsDivider = v.findViewById(R.id.repoSettingsDivider);
TextView repoSettings = v.findViewById(R.id.repoSettings);
TextView createPullRequest = v.findViewById(R.id.createPullRequest);
createLabel.setOnClickListener(v112 -> {
@ -49,6 +52,7 @@ public class BottomSheetRepoFragment extends BottomSheetDialogFragment {
});
if(tinyDb.getBoolean("hasIssues")) {
createIssue.setVisibility(View.VISIBLE);
createIssue.setOnClickListener(v12 -> {
@ -57,9 +61,24 @@ public class BottomSheetRepoFragment extends BottomSheetDialogFragment {
});
}
else {
createIssue.setVisibility(View.GONE);
}
if(tinyDb.getBoolean("hasPullRequests")) {
createPullRequest.setVisibility(View.VISIBLE);
createPullRequest.setOnClickListener(vPr -> {
bmListener.onButtonClicked("newPullRequest");
dismiss();
});
}
else {
createPullRequest.setVisibility(View.GONE);
}
createMilestone.setOnClickListener(v13 -> {
bmListener.onButtonClicked("newMilestone");
@ -67,13 +86,24 @@ public class BottomSheetRepoFragment extends BottomSheetDialogFragment {
});
if (tinyDb.getBoolean("isRepoAdmin")) {
repoSettings.setOnClickListener(repoSettingsView -> {
bmListener.onButtonClicked("repoSettings");
dismiss();
});
addCollaborator.setOnClickListener(v1 -> {
bmListener.onButtonClicked("addCollaborator");
dismiss();
});
} else {
}
else {
addCollaborator.setVisibility(View.GONE);
repoSettingsDivider.setVisibility(View.GONE);
repoSettings.setVisibility(View.GONE);
}
createRelease.setOnClickListener(v14 -> {

View File

@ -1,149 +0,0 @@
package org.mian.gitnex.fragments;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import org.mian.gitnex.R;
import org.mian.gitnex.adapters.BranchesAdapter;
import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.models.Branches;
import org.mian.gitnex.viewmodels.BranchesViewModel;
import java.util.List;
/**
* Author M M Arif
*/
public class BranchesFragment extends Fragment {
private ProgressBar mProgressBar;
private BranchesAdapter adapter;
private RecyclerView mRecyclerView;
private TextView noDataBranches;
private static String repoNameF = "param2";
private static String repoOwnerF = "param1";
private String repoName;
private String repoOwner;
private OnFragmentInteractionListener mListener;
public BranchesFragment() {
}
public static BranchesFragment newInstance(String param1, String param2) {
BranchesFragment fragment = new BranchesFragment();
Bundle args = new Bundle();
args.putString(repoOwnerF, param1);
args.putString(repoNameF, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
repoName = getArguments().getString(repoNameF);
repoOwner = getArguments().getString(repoOwnerF);
}
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_branches, container, false);
TinyDB tinyDb = new TinyDB(getContext());
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
final String locale = tinyDb.getString("locale");
final String timeFormat = tinyDb.getString("dateFormat");
noDataBranches = v.findViewById(R.id.noDataBranches);
final SwipeRefreshLayout swipeRefresh = v.findViewById(R.id.pullToRefresh);
mRecyclerView = v.findViewById(R.id.recyclerView);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(),
DividerItemDecoration.VERTICAL);
mRecyclerView.addItemDecoration(dividerItemDecoration);
mProgressBar = v.findViewById(R.id.progress_bar);
swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
swipeRefresh.setRefreshing(false);
BranchesViewModel.loadBranchesList(instanceUrl, instanceToken, repoOwner, repoName, getContext());
}
}, 50);
}
});
fetchDataAsync(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), repoOwner, repoName);
return v;
}
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface OnFragmentInteractionListener {
void onFragmentInteraction(Uri uri);
}
private void fetchDataAsync(String instanceUrl, String instanceToken, String owner, String repo) {
BranchesViewModel branchesModel = new ViewModelProvider(this).get(BranchesViewModel.class);
branchesModel.getBranchesList(instanceUrl, instanceToken, owner, repo, getContext()).observe(getViewLifecycleOwner(), new Observer<List<Branches>>() {
@Override
public void onChanged(@Nullable List<Branches> branchesListMain) {
adapter = new BranchesAdapter(getContext(), branchesListMain);
if(adapter.getItemCount() > 0) {
mRecyclerView.setAdapter(adapter);
noDataBranches.setVisibility(View.GONE);
}
else {
adapter.notifyDataSetChanged();
mRecyclerView.setAdapter(adapter);
noDataBranches.setVisibility(View.VISIBLE);
}
mProgressBar.setVisibility(View.GONE);
}
});
}
}

View File

@ -30,7 +30,6 @@ import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.viewmodels.FilesViewModel;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Objects;
import moe.feng.common.view.breadcrumbs.BreadcrumbsView;
import moe.feng.common.view.breadcrumbs.DefaultBreadcrumbsCallback;
import moe.feng.common.view.breadcrumbs.model.BreadcrumbItem;
@ -111,7 +110,7 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter
mBreadcrumbsView = v.findViewById(R.id.breadcrumbs_view);
mBreadcrumbsView.setItems(new ArrayList<>(Collections.singletonList(BreadcrumbItem.createSimpleItem(getResources().getString(R.string.filesBreadcrumbRoot) + getResources().getString(R.string.colonDivider) + ref))));
((RepoDetailActivity) Objects.requireNonNull(getActivity())).setFragmentRefreshListenerFiles(repoBranch -> {
((RepoDetailActivity) requireActivity()).setFragmentRefreshListenerFiles(repoBranch -> {
fileStructure.setText("");
ref = repoBranch;
@ -198,7 +197,7 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter
intent.putExtra("singleFileName", fileName);
}
Objects.requireNonNull(getContext()).startActivity(intent);
requireContext().startActivity(intent);
}
private void fetchDataAsync(String instanceUrl, String instanceToken, String owner, String repo, String ref) {
@ -263,6 +262,7 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.search_menu, menu);
inflater.inflate(R.menu.files_switch_branches_menu, menu);
super.onCreateOptionsMenu(menu, inflater);

View File

@ -32,7 +32,6 @@ import org.mian.gitnex.interfaces.ApiInterface;
import org.mian.gitnex.models.Issues;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -112,7 +111,7 @@ public class IssuesFragment extends Fragment {
recyclerView.setLayoutManager(new LinearLayoutManager(context));
recyclerView.setAdapter(adapter);
((RepoDetailActivity) Objects.requireNonNull(getActivity())).setFragmentRefreshListener(issueState -> {
((RepoDetailActivity) requireActivity()).setFragmentRefreshListener(issueState -> {
if(issueState.equals("closed")) {
menu.getItem(1).setIcon(R.drawable.ic_filter_closed);

View File

@ -36,7 +36,6 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -79,7 +78,7 @@ public class NotificationsFragment extends Fragment implements NotificationsAdap
View v = inflater.inflate(R.layout.fragment_notifications, container, false);
setHasOptionsMenu(true);
activity = Objects.requireNonNull(getActivity());
activity = requireActivity();
context = getContext();
tinyDB = new TinyDB(context);
@ -337,7 +336,7 @@ public class NotificationsFragment extends Fragment implements NotificationsAdap
tinyDB.putString("issueNumber", issueUrl.substring(issueUrl.lastIndexOf("/") + 1));
tinyDB.putString("issueType", notificationThread.getSubject().getType());
tinyDB.putString("repoFullName", notificationThread.getRepository().getFullname());
tinyDB.putString("repoFullName", notificationThread.getRepository().getFullName());
startActivity(intent);

View File

@ -16,12 +16,10 @@ import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.RepoDetailActivity;
import org.mian.gitnex.activities.RepoForksActivity;
import org.mian.gitnex.activities.RepoStargazersActivity;
import org.mian.gitnex.activities.RepoWatchersActivity;
import org.mian.gitnex.clients.RetrofitClient;
@ -36,7 +34,6 @@ import org.mian.gitnex.models.UserRepositories;
import java.util.Collection;
import java.util.Collections;
import java.util.Locale;
import java.util.Objects;
import io.noties.markwon.AbstractMarkwonPlugin;
import io.noties.markwon.Markwon;
import io.noties.markwon.core.CorePlugin;
@ -45,7 +42,6 @@ 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;
@ -165,17 +161,9 @@ public class RepoInfoFragment extends Fragment {
toggleExpandViewMeta();
}
fileContentsFrameHeader.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
toggleExpandView();
}
});
fileContentsFrameHeader.setOnClickListener(v1 -> toggleExpandView());
repoMetaFrameHeader.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
toggleExpandViewMeta();
}
});
repoMetaFrameHeader.setOnClickListener(v12 -> toggleExpandViewMeta());
repoMetaStarsFrame.setOnClickListener(metaStars -> {
@ -184,13 +172,6 @@ public class RepoInfoFragment extends Fragment {
ctx.startActivity(intent);
});
repoMetaForksFrame.setOnClickListener(metaForks -> {
Intent intent = new Intent(ctx, RepoForksActivity.class);
intent.putExtra("repoFullNameForForks", repoOwner + "/" + repoName);
ctx.startActivity(intent);
});
repoMetaWatchersFrame.setOnClickListener(metaWatchers -> {
Intent intent = new Intent(ctx, RepoWatchersActivity.class);
@ -370,6 +351,13 @@ public class RepoInfoFragment extends Fragment {
tinyDb.putBoolean("hasIssues", true);
}
if(repoInfo.isHas_pull_requests()) {
tinyDb.putBoolean("hasPullRequests", repoInfo.isHas_pull_requests());
}
else {
tinyDb.putBoolean("hasPullRequests", false);
}
tinyDb.putString("repoHtmlUrl", repoInfo.getHtml_url());
mProgressBar.setVisibility(View.GONE);
@ -412,46 +400,37 @@ public class RepoInfoFragment extends Fragment {
if (response.code() == 200) {
final Markwon markwon = Markwon.builder(Objects.requireNonNull(getContext()))
final Markwon markwon = Markwon.builder(requireContext())
.usePlugin(CorePlugin.create())
.usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
@Override
public void configureImages(@NonNull ImagesPlugin plugin) {
plugin.addSchemeHandler(new SchemeHandler() {
@NonNull
@Override
public ImageItem handle(@NonNull String raw, @NonNull Uri uri) {
.usePlugin(ImagesPlugin.create(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 int resourceId = requireContext().getResources().getIdentifier(
raw.substring("drawable://".length()),
"drawable",
requireContext().getPackageName());
final Drawable drawable = getContext().getDrawable(resourceId);
final Drawable drawable = requireContext().getDrawable(resourceId);
assert drawable != null;
return ImageItem.withResult(drawable);
}
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());
}
@NonNull
@Override
public Collection<String> supportedSchemes() {
return Collections.singleton("drawable");
}
});
plugin.placeholderProvider(drawable -> null);
plugin.addMediaDecoder(GifMediaDecoder.create(false));
plugin.addMediaDecoder(SvgMediaDecoder.create(requireContext().getResources()));
plugin.addMediaDecoder(SvgMediaDecoder.create());
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(requireContext().getResources()));
plugin.defaultMediaDecoder(DefaultMediaDecoder.create());
}))
.usePlugin(new AbstractMarkwonPlugin() {
@Override
@ -462,8 +441,8 @@ public class RepoInfoFragment extends Fragment {
.linkColor(getResources().getColor(R.color.lightBlue));
}
})
.usePlugin(TablePlugin.create(getContext()))
.usePlugin(TaskListPlugin.create(getContext()))
.usePlugin(TablePlugin.create(requireContext()))
.usePlugin(TaskListPlugin.create(requireContext()))
.usePlugin(HtmlPlugin.create())
.usePlugin(StrikethroughPlugin.create())
.usePlugin(LinkifyPlugin.create())

View File

@ -76,6 +76,10 @@ public class AppUtil {
}
}
public static boolean isPro(Context context) {
return context.getPackageName().equals("org.mian.gitnex.pro");
}
public int charactersLength(String str) {
return str.length();

View File

@ -24,6 +24,21 @@ public class Version {
}
/**
* valid return true if string is a valid version
*
* @param value
* @return
*/
public static boolean valid(String value) {
if(value == null) {
return false;
}
final Pattern pattern_valid = Pattern.compile("^[v,V]?(\\d+)+(\\.(\\d+))*([_,\\-,+][\\w,\\d,_,\\-,+]*)?$");
return pattern_valid.matcher(value).find();
}
/**
* init parse and store values for other functions of an Version instance
* it use the raw variable as base
@ -32,10 +47,9 @@ public class Version {
*/
private void init() {
final Pattern pattern_valid = Pattern.compile("^[v,V]?(\\d+)+(\\.(\\d+))*([_,\\-,+][\\w,\\d,_,\\-,+]*)?$");
final Pattern pattern_number_dot_number = Pattern.compile("^\\d+(\\.(\\d)+)*");
if(!pattern_valid.matcher(raw).find()) {
if(!valid(raw)) {
throw new IllegalArgumentException("Invalid version format");
}

View File

@ -7,6 +7,7 @@ import org.mian.gitnex.models.Collaborators;
import org.mian.gitnex.models.Commits;
import org.mian.gitnex.models.CreateIssue;
import org.mian.gitnex.models.CreateLabel;
import org.mian.gitnex.models.CreatePullRequest;
import org.mian.gitnex.models.DeleteFile;
import org.mian.gitnex.models.EditFile;
import org.mian.gitnex.models.Emails;
@ -19,6 +20,7 @@ import org.mian.gitnex.models.Labels;
import org.mian.gitnex.models.MergePullRequest;
import org.mian.gitnex.models.Milestones;
import org.mian.gitnex.models.NewFile;
import org.mian.gitnex.models.NotificationCount;
import org.mian.gitnex.models.NotificationThread;
import org.mian.gitnex.models.OrgOwner;
import org.mian.gitnex.models.Organization;
@ -26,6 +28,7 @@ import org.mian.gitnex.models.OrganizationRepository;
import org.mian.gitnex.models.Permission;
import org.mian.gitnex.models.PullRequests;
import org.mian.gitnex.models.Releases;
import org.mian.gitnex.models.RepositoryTransfer;
import org.mian.gitnex.models.Teams;
import org.mian.gitnex.models.UpdateIssueAssignees;
import org.mian.gitnex.models.UpdateIssueState;
@ -92,7 +95,7 @@ public interface ApiInterface {
Call<ResponseBody> markNotificationThreadsAsRead(@Header("Authorization") String token, @Query("last_read_at") String last_read_at, @Query("all") Boolean all, @Query("status-types") String[] statusTypes, @Query("to-status") String toStatus);
@GET("notifications/new") // Check if unread notifications exist
Call<JsonElement> checkUnreadNotifications(@Header("Authorization") String token);
Call<NotificationCount> checkUnreadNotifications(@Header("Authorization") String token);
@GET("notifications/threads/{id}") // Get notification thread by ID
Call<NotificationThread> getNotificationThread(@Header("Authorization") String token, @Path("id") Integer id);
@ -127,6 +130,15 @@ public interface ApiInterface {
@GET("repos/{owner}/{repo}") // get repo information
Call<UserRepositories> getUserRepository(@Header("Authorization") String token, @Path("owner") String ownerName, @Path("repo") String repoName);
@PATCH("repos/{owner}/{repo}") // patch/update repository properties
Call<UserRepositories> updateRepositoryProperties(@Header("Authorization") String token, @Path("owner") String ownerName, @Path("repo") String repoName, @Body UserRepositories jsonStr);
@DELETE("repos/{owner}/{repo}") // delete repository
Call<JsonElement> deleteRepository(@Header("Authorization") String token, @Path("owner") String ownerName, @Path("repo") String repoName);
@POST("repos/{owner}/{repo}/transfer") // transfer repository
Call<JsonElement> transferRepository(@Header("Authorization") String token, @Path("owner") String ownerName, @Path("repo") String repoName, @Body RepositoryTransfer jsonStr);
@GET("repos/{owner}/{repo}/issues") // get issues by repo
Call<List<Issues>> getIssues(@Header("Authorization") String token, @Path("owner") String owner, @Path("repo") String repo, @Query("page") int page, @Query("limit") int limit, @Query("type") String requestType, @Query("state") String issueState);
@ -310,6 +322,9 @@ public interface ApiInterface {
@POST("repos/{owner}/{repo}/pulls/{index}/merge") // merge a pull request
Call<ResponseBody> mergePullRequest(@Header("Authorization") String token, @Path("owner") String ownerName, @Path("repo") String repoName, @Path("index") int index, @Body MergePullRequest jsonStr);
@POST("repos/{owner}/{repo}/pulls") // create a pull request
Call<ResponseBody> createPullRequest(@Header("Authorization") String token, @Path("owner") String ownerName, @Path("repo") String repoName, @Body CreatePullRequest jsonStr);
@GET("repos/{owner}/{repo}/commits") // get all commits
Call<List<Commits>> getRepositoryCommits(@Header("Authorization") String token, @Path("owner") String owner, @Path("repo") String repo, @Query("page") int page, @Query("sha") String branchName, @Query("limit") int limit);

View File

@ -0,0 +1,36 @@
package org.mian.gitnex.models;
import java.util.ArrayList;
/**
* Author M M Arif
*/
public class CreatePullRequest {
private String title;
private String body;
private String assignee;
private String base;
private String head;
private int milestone;
private String due_date;
private String message;
private ArrayList<String> assignees;
private ArrayList<Integer> labels;
public CreatePullRequest(String title, String body, String assignee, String base, String head, int milestone, String due_date, ArrayList<String> assignees, ArrayList<Integer> labels) {
this.title = title;
this.body = body;
this.assignee = assignee;
this.base = base; // merge into branch
this.head = head; // pull from branch
this.milestone = milestone;
this.due_date = due_date;
this.assignees = assignees;
this.labels = labels;
}
}

View File

@ -21,6 +21,11 @@ public class Labels {
this.labels = labels;
}
public Labels(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}

View File

@ -0,0 +1,19 @@
package org.mian.gitnex.models;
import com.google.gson.annotations.SerializedName;
/**
* Author M M Arif
*/
public class NotificationCount {
@SerializedName("new")
private int counter;
public int getCounter() {
return counter;
}
}

View File

@ -0,0 +1,20 @@
package org.mian.gitnex.models;
/**
* Author M M Arif
*/
public class RepositoryTransfer {
private String new_owner;
public RepositoryTransfer(String new_owner) {
this.new_owner = new_owner;
}
public String getNew_owner() {
return new_owner;
}
}

View File

@ -32,12 +32,134 @@ public class UserRepositories {
private Boolean has_issues;
private String avatar_url;
private boolean archived;
private boolean allow_merge_commits;
private boolean allow_rebase;
private boolean allow_rebase_explicit;
private boolean allow_squash_merge;
private boolean has_pull_requests;
private boolean has_wiki;
private boolean ignore_whitespace_conflicts;
private boolean template;
private permissionsObject permissions;
private externalIssueTrackerObject external_tracker;
private externalWikiObject external_wiki;
private internalTimeTrackerObject internal_tracker;
public UserRepositories(String body) {
this.name = name;
}
private permissionsObject permissions;
public UserRepositories(String name, String website, String description,
boolean repoPrivate, boolean repoAsTemplate, boolean repoEnableIssues,
boolean repoEnableWiki, boolean repoEnablePr,
boolean repoEnableMerge, boolean repoEnableRebase, boolean repoEnableSquash, boolean repoEnableForceMerge) {
this.name = name;
this.website = website;
this.description = description;
this.privateFlag = repoPrivate;
this.template = repoAsTemplate;
this.has_issues = repoEnableIssues;
this.has_wiki = repoEnableWiki;
this.has_pull_requests = repoEnablePr;
this.allow_merge_commits = repoEnableMerge;
this.allow_rebase = repoEnableRebase;
this.allow_squash_merge = repoEnableSquash;
this.allow_rebase_explicit = repoEnableForceMerge;
}
public UserRepositories(String name, String website, String description,
boolean repoPrivate, boolean repoAsTemplate, boolean repoEnableIssues,
boolean repoEnableWiki, boolean repoEnablePr, internalTimeTrackerObject repoEnableTimer,
boolean repoEnableMerge, boolean repoEnableRebase, boolean repoEnableSquash, boolean repoEnableForceMerge) {
this.name = name;
this.website = website;
this.description = description;
this.privateFlag = repoPrivate;
this.template = repoAsTemplate;
this.has_issues = repoEnableIssues;
this.has_wiki = repoEnableWiki;
this.has_pull_requests = repoEnablePr;
this.internal_tracker = repoEnableTimer;
this.allow_merge_commits = repoEnableMerge;
this.allow_rebase = repoEnableRebase;
this.allow_squash_merge = repoEnableSquash;
this.allow_rebase_explicit = repoEnableForceMerge;
}
public static class internalTimeTrackerObject {
private boolean allow_only_contributors_to_track_time;
private boolean enable_issue_dependencies;
private boolean enable_time_tracker;
public internalTimeTrackerObject(boolean enable_time_tracker) {
this.enable_time_tracker = enable_time_tracker;
}
public boolean isAllow_only_contributors_to_track_time() {
return allow_only_contributors_to_track_time;
}
public boolean isEnable_issue_dependencies() {
return enable_issue_dependencies;
}
public boolean isEnable_time_tracker() {
return enable_time_tracker;
}
}
public static class externalWikiObject {
private String external_wiki_url;
public externalWikiObject(String external_wiki_url) {
this.external_wiki_url = external_wiki_url;
}
public String getExternal_wiki_url() {
return external_wiki_url;
}
}
public static class externalIssueTrackerObject {
private String external_tracker_format;
private String external_tracker_style;
private String external_tracker_url;
public externalIssueTrackerObject(String external_tracker_url) {
this.external_tracker_url = external_tracker_url;
}
public String getExternal_tracker_format() {
return external_tracker_format;
}
public String getExternal_tracker_style() {
return external_tracker_style;
}
public String getExternal_tracker_url() {
return external_tracker_url;
}
}
public static class permissionsObject {
@ -72,7 +194,7 @@ public class UserRepositories {
return name;
}
public String getFullname() {
public String getFullName() {
return full_name;
}
@ -192,4 +314,64 @@ public class UserRepositories {
return archived;
}
public String getFull_name() {
return full_name;
}
public boolean isAllow_merge_commits() {
return allow_merge_commits;
}
public boolean isAllow_rebase() {
return allow_rebase;
}
public boolean isAllow_rebase_explicit() {
return allow_rebase_explicit;
}
public boolean isAllow_squash_merge() {
return allow_squash_merge;
}
public boolean isHas_pull_requests() {
return has_pull_requests;
}
public boolean isHas_wiki() {
return has_wiki;
}
public boolean isIgnore_whitespace_conflicts() {
return ignore_whitespace_conflicts;
}
public boolean isTemplate() {
return template;
}
public externalIssueTrackerObject getExternal_tracker() {
return external_tracker;
}
public externalWikiObject getExternal_wiki() {
return external_wiki;
}
public internalTimeTrackerObject getInternal_tracker() {
return internal_tracker;
}
}

View File

@ -1,46 +1,78 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="135.47"
android:viewportHeight="135.47">
<path
android:pathData="M68.02,66.305m-94.784,-6.397a94.999,94.999 48.861,1 1,189.567 12.793a94.999,94.999 48.861,1 1,-189.567 -12.793"
android:strokeWidth="1.40255427"
android:fillColor="#39404a"/>
<path
android:pathData="M31.738,45.193a9.139,9.151 63.873,1 0,12.769 -13.108a9.139,9.151 63.873,1 0,-12.769 13.108z"
android:strokeWidth="0.99999666"
android:fillColor="#609926"/>
<path
android:pathData="M31.875,115.115a9.139,9.151 63.873,1 0,12.769 -13.108a9.139,9.151 63.873,1 0,-12.769 13.108z"
android:strokeWidth="0.99999666"
android:fillColor="#609926"/>
<path
android:pathData="M61.361,80.42a9.139,9.151 63.873,1 0,12.769 -13.108a9.139,9.151 63.873,1 0,-12.769 13.108z"
android:strokeWidth="0.99999666"
android:fillColor="#609926"/>
<path
android:pathData="M34.37,18.911l7.038,0.003l-0.096,85.655l-7.038,-0.003z"
android:fillColor="#609926"/>
<path
android:pathData="m37.878,38.707c31.743,0.128 29.614,-4.427 29.723,36.496"
android:strokeWidth="8.72550011"
android:fillColor="#00000000"
android:strokeColor="#609926"/>
<path
android:pathData="m97.323,109.027c-31.743,-0.128 -29.614,4.427 -29.723,-36.496"
android:strokeWidth="8.72550011"
android:fillColor="#00000000"
android:strokeColor="#609926"/>
<path
android:pathData="M90.959,45.193a9.139,9.151 63.873,1 0,12.769 -13.108a9.139,9.151 63.873,1 0,-12.769 13.108z"
android:strokeWidth="0.99999666"
android:fillColor="#609926"/>
<path
android:pathData="M90.955,115.117a9.139,9.151 63.873,1 0,12.769 -13.108a9.139,9.151 63.873,1 0,-12.769 13.108z"
android:strokeWidth="0.99999666"
android:fillColor="#609926"/>
<path
android:pathData="M93.872,35.636l7.038,0.002l-0.096,68.927l-7.038,-0.002z"
android:fillColor="#609926"/>
android:viewportWidth="108"
android:viewportHeight="108">
<group android:scaleX="0"
android:scaleY="0"
android:translateX="54"
android:translateY="54">
<path android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z"/>
<path android:fillColor="#00000000" android:pathData="M9,0L9,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,0L19,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M29,0L29,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M39,0L39,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M49,0L49,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M59,0L59,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M69,0L69,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M79,0L79,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M89,0L89,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M99,0L99,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,9L108,9"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,19L108,19"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,29L108,29"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,39L108,39"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,49L108,49"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,59L108,59"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,69L108,69"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,79L108,79"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,89L108,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,99L108,99"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,29L89,29"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,39L89,39"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,49L89,49"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,59L89,59"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,69L89,69"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,79L89,79"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M29,19L29,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M39,19L39,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M49,19L49,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M59,19L59,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M69,19L69,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M79,19L79,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
</group>
</vector>

View File

@ -0,0 +1,27 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M12,12m-4,0a4,4 0,1 1,8 0a4,4 0,1 1,-8 0"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="?attr/iconsColor"
android:strokeLineCap="round"/>
<path
android:pathData="M1.05,12L7,12"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="?attr/iconsColor"
android:strokeLineCap="round"/>
<path
android:pathData="M17.01,12L22.96,12"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="?attr/iconsColor"
android:strokeLineCap="round"/>
</vector>

View File

@ -0,0 +1,20 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M22,11.08V12a10,10 0,1 1,-5.93 -9.14"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="@color/iconIssuePrClosedColor"
android:strokeLineCap="round"/>
<path
android:pathData="M22,4l-10,10.01l-3,-3"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="@color/iconIssuePrClosedColor"
android:strokeLineCap="round"/>
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="?attr/iconsColor"
android:pathData="M4.75,0A2.75,2.75 0,0 0,2 2.75v16.5A2.75,2.75 0,0 0,4.75 22h11a0.75,0.75 0,0 0,0 -1.5h-11c-0.69,0 -1.25,-0.56 -1.25,-1.25V18A1.5,1.5 0,0 1,5 16.5h7.25a0.75,0.75 0,0 0,0 -1.5H5c-0.546,0 -1.059,0.146 -1.5,0.401V2.75c0,-0.69 0.56,-1.25 1.25,-1.25H18.5v7a0.75,0.75 0,0 0,1.5 0V0.75a0.75,0.75 0,0 0,-0.75 -0.75H4.75z"/>
<path
android:fillColor="?attr/iconsColor"
android:pathData="M20,13.903l2.202,2.359a0.75,0.75 0,0 0,1.096 -1.024l-3.5,-3.75a0.75,0.75 0,0 0,-1.096 0l-3.5,3.75a0.75,0.75 0,1 0,1.096 1.024l2.202,-2.36v9.348a0.75,0.75 0,0 0,1.5 0v-9.347z"/>
</vector>

View File

@ -0,0 +1,34 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M18,18m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="@color/iconIssuePrClosedColor"
android:strokeLineCap="round"/>
<path
android:pathData="M6,6m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="@color/iconIssuePrClosedColor"
android:strokeLineCap="round"/>
<path
android:pathData="M13,6h3a2,2 0,0 1,2 2v7"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="@color/iconIssuePrClosedColor"
android:strokeLineCap="round"/>
<path
android:pathData="M6,9L6,21"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="@color/iconIssuePrClosedColor"
android:strokeLineCap="round"/>
</vector>

View File

@ -0,0 +1,34 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M18,18m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="@color/iconPrMergedColor"
android:strokeLineCap="round"/>
<path
android:pathData="M6,6m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="@color/iconPrMergedColor"
android:strokeLineCap="round"/>
<path
android:pathData="M13,6h3a2,2 0,0 1,2 2v7"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="@color/iconPrMergedColor"
android:strokeLineCap="round"/>
<path
android:pathData="M6,9L6,21"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="@color/iconPrMergedColor"
android:strokeLineCap="round"/>
</vector>

View File

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

View File

@ -55,65 +55,91 @@
android:padding="16dp"
app:layout_constraintTop_toTopOf="parent">
<RelativeLayout
android:layout_width="wrap_content"
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/protocolSpinnerLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:background="@drawable/shape_dropdown">
app:boxBackgroundColor="?attr/inputBackgroundColor"
android:textColorHint="?attr/hintColor"
app:hintTextColor="?attr/hintColor"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:hint="@string/protocol"
app:endIconTint="?attr/iconsColor"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.ExposedDropdownMenu">
<Spinner
<AutoCompleteTextView
android:id="@+id/protocolSpinner"
android:layout_width="120dp"
android:layout_height="44dp"
android:padding="10dp"
android:spinnerMode="dropdown" />
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none"
android:textColor="?attr/inputTextColor"
android:labelFor="@+id/protocolSpinner"
android:textSize="16sp" />
</RelativeLayout>
</com.google.android.material.textfield.TextInputLayout>
<EditText
android:id="@+id/instanceUrl"
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/instanceUrlLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:background="@drawable/shape_inputs"
android:drawableStart="@drawable/ic_link"
android:drawablePadding="10dp"
android:hint="@string/instanceUrl"
android:inputType="textUri"
android:padding="10dp"
android:textColor="?attr/inputTextColor"
android:textColorHighlight="?attr/hintColor"
app:boxBackgroundColor="?attr/inputBackgroundColor"
android:textColorHint="?attr/hintColor"
android:textSize="14sp"
android:autofillHints="@string/instanceUrl" />
app:hintTextColor="?attr/hintColor"
app:boxStrokeErrorColor="@color/darkRed"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
app:startIconDrawable="@drawable/ic_link"
app:startIconTint="?attr/iconsColor"
app:endIconMode="clear_text"
app:endIconTint="?attr/iconsColor"
android:hint="@string/instanceUrl">
<EditText
android:id="@+id/loginToken"
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/instanceUrl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?attr/inputTextColor"
android:textColorHighlight="?attr/hintColor"
android:textColorHint="?attr/hintColor"
android:maxLines="1"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/loginTokenLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:background="@drawable/shape_inputs"
android:drawableStart="@drawable/ic_lock"
android:drawablePadding="10dp"
android:hint="@string/copyToken"
android:inputType="text"
android:padding="10dp"
android:textColor="?attr/inputTextColor"
android:textColorHighlight="?attr/hintColor"
app:boxBackgroundColor="?attr/inputBackgroundColor"
android:textColorHint="?attr/hintColor"
android:textSize="14sp"
android:visibility="visible"
android:autofillHints="@string/copyToken" />
app:hintTextColor="?attr/hintColor"
app:boxStrokeErrorColor="@color/darkRed"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
app:startIconDrawable="@drawable/ic_lock"
app:startIconTint="?attr/iconsColor"
app:endIconMode="clear_text"
app:endIconTint="?attr/iconsColor"
android:hint="@string/copyToken">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/loginToken"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?attr/inputTextColor"
android:textColorHighlight="?attr/hintColor"
android:textColorHint="?attr/hintColor"
android:maxLines="1"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<Button
android:id="@+id/addNewAccount"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="10dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="15dp"
android:text="@string/addNewAccountText"
android:textColor="@color/btnTextColor"

View File

@ -0,0 +1,246 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
android:background="?attr/primaryBackgroundColor">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/Widget.AppCompat.SearchView">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/primaryBackgroundColor">
<ImageView
android:id="@+id/close"
android:layout_width="@dimen/close_button_size"
android:layout_height="@dimen/close_button_size"
android:layout_marginRight="15dp"
android:layout_marginLeft="15dp"
android:gravity="center_vertical"
android:contentDescription="@string/close"
android:src="@drawable/ic_arrow_back" />
<TextView
android:id="@+id/toolbarTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/pageTitleNewPullRequest"
android:textColor="?attr/primaryTextColor"
android:maxLines="1"
android:textSize="20sp" />
</com.google.android.material.appbar.MaterialToolbar>
</com.google.android.material.appbar.AppBarLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/primaryBackgroundColor">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:orientation="vertical">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/prTitleLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:boxBackgroundColor="?attr/inputBackgroundColor"
android:textColorHint="?attr/hintColor"
app:hintTextColor="?attr/hintColor"
app:boxStrokeErrorColor="@color/darkRed"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
app:endIconMode="clear_text"
app:endIconTint="?attr/iconsColor"
app:counterEnabled="true"
app:counterMaxLength="255"
app:counterTextColor="?attr/inputTextColor"
android:hint="@string/newIssueTitle">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/prTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?attr/inputTextColor"
android:textColorHighlight="?attr/hintColor"
android:textColorHint="?attr/hintColor"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/prBodyLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:boxBackgroundColor="?attr/inputBackgroundColor"
android:textColorHint="?attr/hintColor"
app:hintTextColor="?attr/hintColor"
app:boxStrokeErrorColor="@color/darkRed"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
app:endIconMode="clear_text"
app:endIconTint="?attr/iconsColor"
android:hint="@string/newIssueDescriptionTitle">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/prBody"
android:layout_width="match_parent"
android:layout_height="140dp"
android:textColor="?attr/inputTextColor"
android:textColorHighlight="?attr/hintColor"
android:textColorHint="?attr/hintColor"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/mergeIntoBranchSpinnerLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:boxBackgroundColor="?attr/inputBackgroundColor"
android:textColorHint="?attr/hintColor"
app:hintTextColor="?attr/hintColor"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:hint="@string/mergeIntoBranch"
app:endIconTint="?attr/iconsColor"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.ExposedDropdownMenu">
<AutoCompleteTextView
android:id="@+id/mergeIntoBranchSpinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none"
android:textColor="?attr/inputTextColor"
android:labelFor="@+id/mergeIntoBranchSpinner"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/pullFromBranchSpinnerLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:boxBackgroundColor="?attr/inputBackgroundColor"
android:textColorHint="?attr/hintColor"
app:hintTextColor="?attr/hintColor"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:hint="@string/pullFromBranch"
app:endIconTint="?attr/iconsColor"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.ExposedDropdownMenu">
<AutoCompleteTextView
android:id="@+id/pullFromBranchSpinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none"
android:textColor="?attr/inputTextColor"
android:labelFor="@+id/pullFromBranchSpinner"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/milestonesSpinnerLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:boxBackgroundColor="?attr/inputBackgroundColor"
android:textColorHint="?attr/hintColor"
app:hintTextColor="?attr/hintColor"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:hint="@string/newIssueMilestoneTitle"
app:endIconTint="?attr/iconsColor"
android:visibility="gone"
style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox.ExposedDropdownMenu">
<AutoCompleteTextView
android:id="@+id/milestonesSpinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none"
android:textColor="?attr/inputTextColor"
android:labelFor="@+id/milestonesSpinner"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/prLabelsLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:boxBackgroundColor="?attr/inputBackgroundColor"
android:textColorHint="?attr/hintColor"
app:hintTextColor="?attr/hintColor"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:hint="@string/newIssueLabelsTitle">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/prLabels"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?attr/inputTextColor"
android:textColorHighlight="?attr/hintColor"
android:textColorHint="?attr/hintColor"
android:focusable="false"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/prDueDateLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:boxBackgroundColor="?attr/inputBackgroundColor"
android:textColorHint="?attr/hintColor"
app:hintTextColor="?attr/hintColor"
app:boxStrokeErrorColor="@color/darkRed"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
app:endIconMode="clear_text"
app:endIconTint="?attr/iconsColor"
android:hint="@string/newIssueDueDateTitle">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/prDueDate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?attr/inputTextColor"
android:textColorHighlight="?attr/hintColor"
android:textColorHint="?attr/hintColor"
android:maxLines="1"
android:focusable="false"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<Button
android:id="@+id/createPr"
android:gravity="center"
android:layout_gravity="end"
android:layout_marginTop="8dp"
android:layout_width="wrap_content"
android:layout_height="60dp"
android:text="@string/newCreateButtonCopy"
android:textColor="@color/btnTextColor" />
</LinearLayout>
</ScrollView>
</LinearLayout>

View File

@ -19,6 +19,16 @@
android:layout_height="wrap_content"
android:background="?attr/primaryBackgroundColor">
<ImageView
android:id="@+id/issuePrState"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_issue"
android:paddingStart="0dp"
android:paddingEnd="8dp"
android:visibility="gone"
android:contentDescription="@string/generalImgContentText" />
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"

View File

@ -68,12 +68,6 @@
android:layout_height="wrap_content"
android:text="@string/tabPullRequests" />
<com.google.android.material.tabs.TabItem
android:id="@+id/tabItem5_branches"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tab_text_branches" />
<com.google.android.material.tabs.TabItem
android:id="@+id/tabItem6_releases"
android:layout_width="wrap_content"

View File

@ -0,0 +1,149 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
android:background="?attr/primaryBackgroundColor">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/Widget.AppCompat.SearchView">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/primaryBackgroundColor">
<ImageView
android:id="@+id/close"
android:layout_width="@dimen/close_button_size"
android:layout_height="@dimen/close_button_size"
android:layout_marginRight="15dp"
android:layout_marginLeft="15dp"
android:gravity="center_vertical"
android:contentDescription="@string/close"
android:src="@drawable/ic_arrow_back" />
<TextView
android:id="@+id/toolbarTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/repoSettingsTitle"
android:textColor="?attr/primaryTextColor"
android:maxLines="1"
android:textSize="20sp" />
</com.google.android.material.appbar.MaterialToolbar>
</com.google.android.material.appbar.AppBarLayout>
<ScrollView android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/primaryBackgroundColor">
<LinearLayout
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="wrap_content">
<TextView
android:id="@+id/editProperties"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/repoSettingsEditProperties"
android:drawableStart="@drawable/ic_edit"
android:drawablePadding="32dp"
android:textColor="?attr/primaryTextColor"
android:textSize="16sp"
android:padding="16dp" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?attr/dividerColor" />
<LinearLayout
android:id="@+id/transferOwnerFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone">
<TextView
android:id="@+id/transferRepositoryOwnership"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/repoSettingsTransferOwnership"
android:drawableStart="@drawable/ic_arrow_up"
android:drawablePadding="32dp"
android:textColor="?attr/primaryTextColor"
android:textSize="16sp"
android:paddingTop="16dp"
android:paddingStart="16dp"
android:paddingEnd="16dp" />
<TextView
android:id="@+id/transferRepositoryOwnershipHint"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/repoSettingsTransferOwnershipHint"
android:textColor="?attr/hintColor"
android:textSize="12sp"
android:paddingBottom="16dp"
android:paddingStart="72dp"
android:paddingEnd="16dp" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?attr/dividerColor" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="wrap_content"
android:paddingBottom="16dp">
<TextView
android:id="@+id/deleteRepository"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/repoSettingsDelete"
android:drawableStart="@drawable/ic_delete"
android:drawablePadding="32dp"
android:textColor="?attr/primaryTextColor"
android:textSize="16sp"
android:paddingTop="16dp"
android:paddingStart="16dp"
android:paddingEnd="16dp" />
<TextView
android:id="@+id/deleteRepositoryHint"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/repoSettingsDeleteHint"
android:textColor="?attr/hintColor"
android:textSize="12sp"
android:paddingStart="72dp"
android:paddingEnd="16dp" />
</LinearLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical">
<TextView
android:id="@+id/counterBadgeNotification"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:maxLength="4"
android:ellipsize="marquee"
android:background="@drawable/shape_badge_background"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:textColor="@color/colorWhite"
android:textSize="12sp" />
</LinearLayout>

View File

@ -41,6 +41,18 @@
android:textColor="?attr/primaryTextColor"
android:textSize="16sp" />
<TextView
android:id="@+id/createPullRequest"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:drawableStart="@drawable/ic_pull_request"
android:drawablePadding="24dp"
android:padding="12dp"
android:text="@string/pageTitleNewPullRequest"
android:textColor="?attr/primaryTextColor"
android:textSize="16sp" />
<TextView
android:id="@+id/createNewMilestone"
android:layout_width="match_parent"
@ -189,6 +201,27 @@
android:textSize="16sp"
android:padding="12dp" />
<View
android:id="@+id/repoSettingsDivider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="12dp"
android:layout_marginBottom="12dp"
android:layout_marginStart="64dp"
android:background="?attr/dividerColor" />
<TextView
android:id="@+id/repoSettings"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:drawableStart="@drawable/ic_settings"
android:drawablePadding="24dp"
android:text="@string/navSettings"
android:textColor="?attr/primaryTextColor"
android:textSize="16sp"
android:padding="12dp" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layoutFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical">
<CheckBox
android:id="@+id/labelSelection"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checked="false"
android:textColor="?attr/primaryTextColor"
android:textSize="16sp" />
</RelativeLayout>

View File

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@drawable/shape_custom_dialog"
android:orientation="vertical">
<com.google.android.material.progressindicator.ProgressIndicator
android:id="@+id/progressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Indeterminate"
app:indicatorColor="?attr/progressIndicatorColor" />
<LinearLayout
android:id="@+id/dialogFrame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:id="@+id/TitleFrame"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?attr/primaryTextColor"
android:textSize="20sp"
android:textStyle="bold"
android:drawableStart="@drawable/ic_label"
android:drawablePadding="16dp"
android:text="@string/newIssueSelectLabelsListTitle" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:id="@+id/dividerTitle"
android:background="?attr/dividerColor" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="100"
android:layout_margin="12dp"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/labelsRecyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:id="@+id/divider"
android:background="?attr/dividerColor" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:orientation="vertical" >
<Button
android:id="@+id/cancel"
android:layout_width="wrap_content"
android:layout_height="60dp"
style="?android:attr/button"
android:layout_alignParentStart="true"
android:text="@string/close"
android:textColor="@color/colorWhite"
android:textSize="16sp" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>

View File

@ -0,0 +1,110 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@drawable/shape_custom_dialog"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?attr/primaryTextColor"
android:textSize="20sp"
android:textStyle="bold"
android:drawableStart="@drawable/ic_delete"
android:drawablePadding="16dp"
android:text="@string/repoSettingsDelete"
android:layout_marginBottom="16dp" />
<TextView
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?attr/primaryTextColor"
android:textSize="16sp"
android:text="@string/repoSettingsDeleteDescription"
android:layout_marginBottom="16dp" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/repoNameForDeletionLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:boxBackgroundColor="?attr/inputBackgroundColor"
android:textColorHint="?attr/hintColor"
app:hintTextColor="?attr/hintColor"
app:boxStrokeErrorColor="@color/darkRed"
android:layout_marginBottom="8dp"
android:layout_marginTop="8dp"
android:hint="@string/newRepoTintCopy">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/repoNameForDeletion"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?attr/inputTextColor"
android:textColorHighlight="?attr/hintColor"
android:textColorHint="?attr/hintColor"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:id="@+id/divider"
android:background="?attr/dividerColor" />
<com.google.android.material.progressindicator.ProgressIndicator
android:id="@+id/processingRequest"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Indeterminate"
app:indicatorColor="?attr/progressIndicatorColor" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:orientation="horizontal" >
<Button
android:id="@+id/cancel"
android:layout_width="wrap_content"
android:layout_height="60dp"
style="?android:attr/button"
android:layout_alignParentStart="true"
android:text="@string/cancelButton"
android:textColor="@color/colorWhite"
android:textSize="16sp" />
<Button
android:id="@+id/delete"
android:layout_width="wrap_content"
android:layout_height="60dp"
style="?android:attr/button"
android:layout_alignParentEnd="true"
android:text="@string/menuDeleteText"
android:backgroundTint="@color/darkRed"
android:textColor="@color/colorWhite"
android:textSize="16sp"
tools:ignore="RelativeOverlap" />
</RelativeLayout>
</LinearLayout>

View File

@ -0,0 +1,234 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@drawable/shape_custom_dialog"
android:orientation="vertical">
<com.google.android.material.progressindicator.ProgressIndicator
android:id="@+id/progressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Indeterminate"
app:indicatorColor="?attr/progressIndicatorColor" />
<androidx.core.widget.NestedScrollView
android:id="@+id/mainView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:orientation="vertical">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/repoNameLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:boxBackgroundColor="?attr/inputBackgroundColor"
android:textColorHint="?attr/hintColor"
app:hintTextColor="?attr/hintColor"
app:boxStrokeErrorColor="@color/darkRed"
android:layout_marginBottom="8dp"
android:hint="@string/newRepoTintCopy">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/repoName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?attr/inputTextColor"
android:textColorHighlight="?attr/hintColor"
android:textColorHint="?attr/hintColor"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/repoWebsiteLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:boxBackgroundColor="?attr/inputBackgroundColor"
android:textColorHint="?attr/hintColor"
app:hintTextColor="?attr/hintColor"
app:boxStrokeErrorColor="@color/darkRed"
android:layout_marginBottom="8dp"
android:layout_marginTop="8dp"
android:hint="@string/websiteText">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/repoWebsite"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?attr/inputTextColor"
android:textColorHighlight="?attr/hintColor"
android:textColorHint="?attr/hintColor"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/repoDescriptionLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:boxBackgroundColor="?attr/inputBackgroundColor"
android:textColorHint="?attr/hintColor"
app:hintTextColor="?attr/hintColor"
app:boxStrokeErrorColor="@color/darkRed"
android:layout_marginBottom="8dp"
android:layout_marginTop="8dp"
android:hint="@string/newRepoDescTintCopy">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/repoDescription"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?attr/inputTextColor"
android:textColorHighlight="?attr/hintColor"
android:textColorHint="?attr/hintColor"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/repoPrivate"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:checked="true"
android:textColor="?attr/primaryTextColor"
android:text="@string/newRepoPrivateCopy" />
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/repoAsTemplate"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:checked="true"
android:textColor="?attr/primaryTextColor"
android:text="@string/repoPropertiesTemplate" />
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/repoEnableIssues"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:checked="true"
android:textColor="?attr/primaryTextColor"
android:text="@string/repoPropertiesEnableIssues" />
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/repoEnableWiki"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:checked="true"
android:textColor="?attr/primaryTextColor"
android:text="@string/repoPropertiesEnableWiki" />
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/repoEnablePr"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:checked="true"
android:textColor="?attr/primaryTextColor"
android:text="@string/repoPropertiesEnablePr" />
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/repoEnableTimer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:checked="true"
android:textColor="?attr/primaryTextColor"
android:text="@string/repoPropertiesEnableTimeTracker" />
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/repoEnableMerge"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:checked="true"
android:textColor="?attr/primaryTextColor"
android:text="@string/repoPropertiesEnableMergeCommits" />
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/repoEnableRebase"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:checked="true"
android:textColor="?attr/primaryTextColor"
android:text="@string/repoPropertiesEnableRebase" />
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/repoEnableSquash"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:checked="true"
android:textColor="?attr/primaryTextColor"
android:text="@string/repoPropertiesEnableSquash" />
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/repoEnableForceMerge"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:checked="true"
android:textColor="?attr/primaryTextColor"
android:text="@string/repoPropertiesEnableForceMerge" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:id="@+id/divider"
android:background="?attr/dividerColor" />
<com.google.android.material.progressindicator.ProgressIndicator
android:id="@+id/processingRequest"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Indeterminate"
app:indicatorColor="?attr/progressIndicatorColor" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:orientation="horizontal" >
<Button
android:id="@+id/cancel"
android:layout_width="wrap_content"
android:layout_height="60dp"
style="?android:attr/button"
android:layout_alignParentStart="true"
android:text="@string/cancelButton"
android:textColor="@color/colorWhite"
android:textSize="16sp" />
<Button
android:id="@+id/save"
android:layout_width="wrap_content"
android:layout_height="60dp"
style="?android:attr/button"
android:layout_alignParentEnd="true"
android:text="@string/saveButton"
android:textColor="@color/colorWhite"
android:textSize="16sp"
tools:ignore="RelativeOverlap" />
</RelativeLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</LinearLayout>

View File

@ -0,0 +1,134 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@drawable/shape_custom_dialog"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?attr/primaryTextColor"
android:textSize="20sp"
android:textStyle="bold"
android:drawableStart="@drawable/ic_arrow_up"
android:drawablePadding="16dp"
android:text="@string/repoSettingsTransferOwnership"
android:layout_marginBottom="16dp" />
<TextView
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?attr/primaryTextColor"
android:textSize="16sp"
android:text="@string/repoSettingsTransferOwnershipDescription"
android:layout_marginBottom="16dp" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/repoNameForTransferLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:boxBackgroundColor="?attr/inputBackgroundColor"
android:textColorHint="?attr/hintColor"
app:hintTextColor="?attr/hintColor"
app:boxStrokeErrorColor="@color/darkRed"
android:layout_marginBottom="8dp"
android:layout_marginTop="8dp"
android:hint="@string/newRepoTintCopy">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/repoNameForTransfer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?attr/inputTextColor"
android:textColorHighlight="?attr/hintColor"
android:textColorHint="?attr/hintColor"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/ownerNameForTransferLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:boxBackgroundColor="?attr/inputBackgroundColor"
android:textColorHint="?attr/hintColor"
app:hintTextColor="?attr/hintColor"
app:boxStrokeErrorColor="@color/darkRed"
android:layout_marginBottom="8dp"
android:layout_marginTop="8dp"
android:hint="@string/repoTransferOwnerText">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/ownerNameForTransfer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?attr/inputTextColor"
android:textColorHighlight="?attr/hintColor"
android:textColorHint="?attr/hintColor"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:id="@+id/divider"
android:background="?attr/dividerColor" />
<com.google.android.material.progressindicator.ProgressIndicator
android:id="@+id/processingRequest"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Indeterminate"
app:indicatorColor="?attr/progressIndicatorColor" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:orientation="horizontal" >
<Button
android:id="@+id/cancel"
android:layout_width="wrap_content"
android:layout_height="60dp"
style="?android:attr/button"
android:layout_alignParentStart="true"
android:text="@string/cancelButton"
android:textColor="@color/colorWhite"
android:textSize="16sp" />
<Button
android:id="@+id/transfer"
android:layout_width="wrap_content"
android:layout_height="60dp"
style="?android:attr/button"
android:layout_alignParentEnd="true"
android:text="@string/repoTransferText"
android:backgroundTint="@color/darkRed"
android:textColor="@color/colorWhite"
android:textSize="16sp"
tools:ignore="RelativeOverlap" />
</RelativeLayout>
</LinearLayout>

View File

@ -28,7 +28,7 @@
<Button
android:id="@+id/manageAccounts"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="60dp"
android:layout_margin="16dp"
android:paddingStart="4dp"
android:paddingEnd="4dp"

View File

@ -3,7 +3,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ScrollView android:layout_width="match_parent"
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/primaryBackgroundColor">
@ -23,7 +24,7 @@
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:baselineAligned="false"
android:contentDescription="@string/logo"
android:contentDescription="@string/app_name"
android:src="@mipmap/app_logo" />
<TextView
@ -34,134 +35,200 @@
android:textIsSelectable="true"
android:layout_marginTop="5dp"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="?attr/primaryTextColor"
android:layout_gravity="center_horizontal"/>
android:layout_gravity="center_horizontal" />
<!-- version -->
<TextView
android:id="@+id/appVerBuild"
android:text="@string/appVerBuild"
android:layout_width="wrap_content"
android:id="@+id/appVersionHeader"
android:text="@string/appVersion"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textIsSelectable="true"
android:layout_marginTop="40dp"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="?attr/primaryTextColor" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:id="@+id/dividerVersion"
android:background="?attr/dividerColor"
android:layout_marginTop="5dp"
android:textSize="16sp"
android:textColor="?attr/primaryTextColor"
android:layout_gravity="center_horizontal"/>
<TextView
android:id="@+id/appDesc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/appDesc"
android:textIsSelectable="true"
android:layout_marginTop="25dp"
android:textSize="16sp"
android:textColor="?attr/primaryTextColor"
android:padding="5dp"
android:background="?attr/primaryBackgroundColor"
android:layout_gravity="center_horizontal"/>
<TextView
android:id="@+id/giteaVersion"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/commitPage"
android:layout_marginTop="15dp"
android:textSize="16sp"
android:textColor="?attr/primaryTextColor"
android:padding="5dp"
android:background="?attr/primaryBackgroundColor"
android:autoLink="web" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:orientation="vertical"
android:padding="5dp"
android:background="?attr/primaryBackgroundColor">
<TextView
android:id="@+id/donationLink"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/supportText"
android:textColor="@color/lightBlue"
android:textSize="16sp"
android:gravity="start"
android:autoLink="web"
android:visibility="visible"
android:layout_marginBottom="10dp"
android:textColorLink="@color/lightBlue" />
<TextView
android:id="@+id/donationLinkPatreon"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/supportTextPatreon"
android:textColor="@color/lightBlue"
android:textSize="16sp"
android:gravity="start"
android:autoLink="web"
android:visibility="visible"
android:layout_marginBottom="10dp"
android:textColorLink="@color/lightBlue" />
<TextView
android:id="@+id/translateLink"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="web"
android:gravity="start"
android:text="@string/translateText"
android:textColor="@color/lightBlue"
android:textColorLink="@color/lightBlue"
android:textSize="16sp"
android:visibility="visible" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:orientation="vertical"
android:padding="5dp"
android:background="?attr/primaryBackgroundColor">
<TextView
android:id="@+id/appWebsite"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/appWebsite"
android:textColor="@color/lightBlue"
android:textSize="16sp"
android:gravity="start"
android:autoLink="web"
android:visibility="visible"
android:layout_marginBottom="10dp"
android:textColorLink="@color/lightBlue" />
<TextView
android:id="@+id/appRepo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/appRepo"
android:textColor="@color/lightBlue"
android:textSize="16sp"
android:gravity="start"
android:autoLink="web"
android:visibility="visible"
android:textColorLink="@color/lightBlue" />
</LinearLayout>
android:layout_marginBottom="5dp" />
<TextView
android:id="@+id/appVersion"
android:layout_width="wrap_content"
android:layout_height="25dp" />
android:layout_height="wrap_content"
android:textIsSelectable="true"
android:textSize="14sp"
android:textColor="?attr/primaryTextColor" />
<!-- version -->
<!-- build -->
<TextView
android:id="@+id/appBuildHeader"
android:text="@string/appBuild"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="?attr/primaryTextColor" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:id="@+id/dividerBuild"
android:background="?attr/dividerColor"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp" />
<TextView
android:id="@+id/appBuild"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textIsSelectable="true"
android:textSize="14sp"
android:textColor="?attr/primaryTextColor" />
<!-- build -->
<!-- user server version -->
<TextView
android:id="@+id/userServerVersionHeader"
android:text="@string/commitPage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="?attr/primaryTextColor" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:id="@+id/dividerUserServerVersion"
android:background="?attr/dividerColor"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp" />
<TextView
android:id="@+id/userServerVersion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textIsSelectable="true"
android:textSize="14sp"
android:textColor="?attr/primaryTextColor" />
<!-- user server version -->
<!-- support -->
<TextView
android:id="@+id/supportHeader"
android:text="@string/supportText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="?attr/primaryTextColor" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:id="@+id/dividerSupport"
android:background="?attr/dividerColor"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp" />
<TextView
android:id="@+id/donationLinkLiberapay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/supportTextLiberapay"
android:textColor="@color/lightBlue"
android:textSize="14sp"
android:autoLink="web"
android:layout_marginBottom="10dp"
android:textColorLink="@color/lightBlue" />
<TextView
android:id="@+id/donationLinkPatreon"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/supportTextPatreon"
android:textColor="@color/lightBlue"
android:textSize="14sp"
android:autoLink="web"
android:textColorLink="@color/lightBlue" />
<!-- support -->
<!-- translate -->
<TextView
android:id="@+id/translateHeader"
android:text="@string/translateText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="?attr/primaryTextColor" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:id="@+id/dividerTranslate"
android:background="?attr/dividerColor"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp" />
<TextView
android:id="@+id/translateLink"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="web"
android:gravity="start"
android:text="@string/translateWithCrowdin"
android:textColor="@color/lightBlue"
android:textColorLink="@color/lightBlue"
android:textSize="14sp"
android:visibility="visible" />
<!-- translate -->
<!-- website -->
<TextView
android:id="@+id/websiteHeader"
android:text="@string/websiteText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="?attr/primaryTextColor" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:id="@+id/dividerWebsite"
android:background="?attr/dividerColor"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp" />
<TextView
android:id="@+id/appWebsite"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/appWebsiteLink"
android:textColor="@color/lightBlue"
android:textSize="14sp"
android:autoLink="web"
android:layout_marginBottom="24dp"
android:textColorLink="@color/lightBlue" />
<!-- website -->
</LinearLayout>
</ScrollView>
</androidx.core.widget.NestedScrollView>
</RelativeLayout>

View File

@ -1,50 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".activities.RepoDetailActivity">
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/pullToRefresh"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/primaryBackgroundColor"
android:scrollbars="vertical" />
<GridView
android:id="@+id/gridView"
android:numColumns="auto_fit"
android:gravity="center"
android:columnWidth="50dp"
android:stretchMode="columnWidth"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<com.google.android.material.progressindicator.ProgressIndicator
android:id="@+id/progress_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Indeterminate"
app:indicatorColor="?attr/progressIndicatorColor" />
<TextView
android:id="@+id/noDataBranches"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="15dp"
android:gravity="center"
android:text="@string/noDataBranchesTab"
android:textColor="?attr/primaryTextColor"
android:textSize="20sp"
android:visibility="gone" />
</RelativeLayout>

View File

@ -272,7 +272,7 @@
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/infoTabRepoWebsite"
android:contentDescription="@string/websiteText"
app:srcCompat="@drawable/ic_link" />
<LinearLayout

View File

@ -1,50 +0,0 @@
<?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="?attr/primaryBackgroundColor">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="5dp"
android:id="@+id/branchesFrame"
android:layout_margin="15dp"
android:orientation="vertical">
<TextView
android:id="@+id/branchName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="?attr/primaryTextColor"
android:textIsSelectable="true"
android:textSize="18sp" />
<TextView
android:id="@+id/branchCommitAuthor"
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textIsSelectable="true"
android:textColor="?attr/primaryTextColor"
android:textSize="14sp" />
<Button
android:id="@+id/branchCommitHash"
android:layout_width="wrap_content"
android:layout_height="60dp"
android:text="@string/viewCommits"
android:layout_marginTop="15dp"
android:textColor="@color/btnTextColor"
android:textSize="14sp"
android:minHeight="0dp"
android:minWidth="0dp"
android:padding="8dp" />
</LinearLayout>
</RelativeLayout>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools"
android:padding="16dp"
android:ellipsize="end"
android:maxLines="1"
tools:ignore="MissingConstraints"
android:textColor="?attr/primaryTextColor"
xmlns:android="http://schemas.android.com/apk/res/android" />

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:showIn="navigation_view">
<group android:checkableBehavior="single"
@ -26,6 +27,7 @@
android:id="@+id/nav_notifications"
android:icon="@drawable/ic_notifications"
android:title="@string/pageTitleNotifications"
app:actionLayout="@layout/badge_notification"
android:visible="false" />
<item android:id="@+id/nav_explore"

View File

@ -1,12 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/switchBranches"
android:icon="@drawable/ic_branch"
android:title="@string/strSwitchBranches"
android:orderInCategory="0"
app:showAsAction="ifRoom" />
android:id="@+id/mainRepoMenu"
android:icon="@drawable/ic_dotted_menu"
android:title="@string/menuTitleText"
android:orderInCategory="1"
app:showAsAction="always" >
<menu>
<item
android:id="@+id/repoMenu"
android:icon="@drawable/ic_dotted_menu"
android:title="@string/menuTitleText"
android:orderInCategory="0"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/switchBranches"
android:icon="@drawable/ic_branch"
android:title="@string/strSwitchBranches"
android:orderInCategory="1"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/branchCommits"
android:icon="@drawable/ic_commit"
android:title="@string/commitTitle"
android:orderInCategory="2"
app:showAsAction="ifRoom|withText" />
</menu>
</item>
</menu>

View File

@ -9,4 +9,4 @@
android:orderInCategory="1"
app:showAsAction="ifRoom" />
</menu>
</menu>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/app_logo_background"/>
<foreground android:drawable="@drawable/app_logo_foreground"/>
<foreground android:drawable="@mipmap/app_logo_foreground"/>
</adaptive-icon>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/app_logo_background"/>
<foreground android:drawable="@drawable/app_logo_foreground"/>
<foreground android:drawable="@mipmap/app_logo_foreground"/>
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1020 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

View File

@ -37,6 +37,7 @@
<string name="pageTitleExplore">استكشف</string>
<string name="pageTitleAdministration">Gitea Administration</string>
<string name="pageTitleUserAccounts">Manage Accounts</string>
<string name="pageTitleNewPullRequest">New Pull Request</string>
<!-- page titles -->
<string name="repoName">Demo repo</string>
<string name="repoFullname">Repo with ORG</string>
@ -62,6 +63,7 @@
<string name="navigation_drawer_open">Open Navigation Drawer</string>
<string name="navigation_drawer_close">Close Navigation Drawer</string>
<string name="logo">لِج إلى Gitea</string>
<string name="protocol">Protocol</string>
<string name="urlInfoTooltip">1- Choose the correct protocol(https or http). \n2- Enter Gitea url e.g: try.gitea.io. \n3- If you have enabled 2FA for your account, enter the code in the OTP Code field. \n4- For HTTP basic auth use USERNAME@DOMAIN.COM in the URL field.</string>
<string name="malformedUrl">Couldn\'t connect to host. Please check your URL or port for any errors</string>
<string name="protocolError">It is not recommended to use HTTP protocol unless you are testing on local network</string>
@ -69,6 +71,7 @@
<string name="emptyFieldURL">Instance URL is required</string>
<string name="emptyFieldUsername">اسم المستخدم لازم</string>
<string name="emptyFieldPassword">الكلمة السرية لازمة</string>
<string name="protocolEmptyError">Protocol is required</string>
<string name="checkNetConnection">Cannot access network, please check your Internet connection</string>
<string name="netConnectionIsBack">Yay, We have Internet connection!</string>
<string name="repoNameErrorEmpty">اسم المستودع فارغ</string>
@ -106,7 +109,6 @@
<string name="tab_text_collaborators">المتعاونون</string>
<string name="tabPullRequests">Pull Requests</string>
<string name="noDataIssueTab">No issues found</string>
<string name="infoTabRepoWebsite">موقع الويب</string>
<string name="infoTabRepoSize">الحجم</string>
<string name="infoTabRepoDefaultBranch">الفرع المبدئيّ</string>
<string name="infoTabRepoSshUrl">عنوان SSH</string>
@ -419,7 +421,6 @@
<string name="genericServerResponseError">We cannot reach the server at the moment, please check your server status and try again</string>
<string name="genericCopyUrl">Copy URL</string>
<!-- generic copy -->
<string name="translateText">ترجم GitNex على كراودين</string>
<string name="exploreTextBoxHint">Explore repositories</string>
<string name="starRepository">Star Repository</string>
<string name="unStarRepository">Unstar Repository</string>
@ -476,7 +477,7 @@
<string name="sharePr">Share Pull Request</string>
<string name="shareRepository">Share Repository</string>
<string name="createRepository">Create Repository</string>
<string name="commitTitle">Branch Commits</string>
<string name="commitTitle">Commits</string>
<string name="commitCommittedBy">Committed by %1$s</string>
<string name="viewCommits">View Commits</string>
<!-- Memorizing Trust Manager -->
@ -504,7 +505,7 @@
<string name="settingsEnableReportsText">Enable Crash Reports</string>
<string name="crashTitle">GitNex has stopped :(</string>
<string name="setCrashReports">Crash reports</string>
<string name="crashMessage">You can tap the OK button to send the crash report by email. It will help to fix it :)\n\nYou can also add additional content in the email. Thank you!</string>
<string name="crashMessage">It is encouraged to open an issue at the project repository with how to reproduce this bug. It is easier to debug and fix the problem that way.\n\nTap the OK button to send the crash report by email instead. Additional content could be added in the email.\nThank you!</string>
<string name="forceLogoutDialogHeader">Please sign in again</string>
<string name="forceLogoutDialogDescription">Due to some major changes regarding the internal functioning of the app, we require you to login again. These changes allow us to make the app more flexible in the future.\n\nThank you for your patience and sorry for the inconvenience.</string>
<string name="deleteAllDrafts">Delete All Drafts</string>
@ -541,4 +542,39 @@
<string name="markedNotificationsAsRead">Successfully marked all notifications as read</string>
<string name="isRead">Read</string>
<string name="isUnread">Unread</string>
<string name="repoSettingsTitle">Repository Settings</string>
<string name="repoSettingsEditProperties">Edit Properties</string>
<string name="repoSettingsDelete">Delete Repository</string>
<string name="repoSettingsDeleteHint">Be careful, this operation CANNOT be undone!</string>
<string name="repoPropertiesTemplate">Set as Template</string>
<string name="repoPropertiesEnableIssues">Enable Issues</string>
<string name="repoPropertiesExternalIssuesUrl">External Issue Tracker Url</string>
<string name="repoPropertiesEnableWiki">Enable Wiki</string>
<string name="repoPropertiesExternalWikiUrl">External Wiki Url</string>
<string name="repoPropertiesEnablePr">Enable Pull Requests</string>
<string name="repoPropertiesEnableTimeTracker">Enable Time Tracker</string>
<string name="repoPropertiesEnableMergeCommits">Enable Merge Commits</string>
<string name="repoPropertiesEnableRebase">Enable Rebase</string>
<string name="repoPropertiesEnableSquash">Enable Squash and Merge</string>
<string name="repoPropertiesEnableForceMerge">Enable Rebase with Merge Commits (&#8212;&#8212;no-ff)</string>
<string name="repoPropertiesSaveSuccess">Repository properties updated successfully</string>
<string name="repoSettingsDeleteDescription">Things to know before deletion:\n\n- This operation CANNOT be undone.\n- This operation will permanently delete the repository including code, issues, comments, wiki data and collaborator settings.\n\nEnter the repository name as confirmation</string>
<string name="repoSettingsDeleteError">Repository name does not match</string>
<string name="repoDeletionSuccess">Repository deleted successfully</string>
<string name="repoSettingsTransferOwnership">Transfer Ownership</string>
<string name="repoSettingsTransferOwnershipHint">Transfer this repository to a user or to an organization for which you have administrator rights</string>
<string name="repoSettingsTransferOwnershipDescription">Things to know before transfer:\n\n- You will lose access to the repository if you transfer it to an individual user.\n- You will keep access to the repository if you transfer it to an organization that you (co-)own.\n\nEnter the repository name as confirmation</string>
<string name="repoTransferText">Perform Transfer</string>
<string name="repoTransferOwnerText">New Owner</string>
<string name="repoTransferSuccess">Repository transferred successfully</string>
<string name="repoTransferOwnerError">New owner is required</string>
<string name="repoTransferError">There is a problem with the owner name. Make sure that the new owner exists</string>
<string name="mergeIntoBranch">Merge Into</string>
<string name="pullFromBranch">Pull From</string>
<string name="sameBranchesError">These branches are equal. There is no need to create a pull request</string>
<string name="mergeIntoError">Merge into branch is required</string>
<string name="pullFromError">Pull from branch is required</string>
<string name="titleError">Title is required</string>
<string name="prCreateSuccess">Pull Request created successfully</string>
<string name="prAlreadyExists">A pull request between these branches already exists</string>
</resources>

View File

@ -0,0 +1,580 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- menu items -->
<string name="navMyRepos">Mé repositáře</string>
<string name="navStarredRepos">Oblíbené repozitáře</string>
<string name="navRepos">Repozitáře</string>
<string name="navProfile">Profil</string>
<string name="navSettings">Nastavení</string>
<string name="navOrgs">Organizace</string>
<string name="navAbout">O aplikaci</string>
<string name="navRate">Ohodnotit GitNex</string>
<string name="navLogout">Odhlásit se</string>
<string name="navExplore">Prozkoumat</string>
<string name="navAdministration">Administrace</string>
<!-- menu items -->
<!-- page titles -->
<string name="pageTitleAbout">O aplikaci</string>
<string name="pageTitleMyRepos">Mé repositáře</string>
<string name="pageTitleRepositories">Repozitáře</string>
<string name="pageTitleProfile">Profil</string>
<string name="pageTitleNewRepo">Nový repozitář</string>
<string name="pageTitleOrganizations">Organizace</string>
<string name="pageTitleIssues">Issues</string>
<string name="pageTitleSettings">Nastavení</string>
<string name="pageTitleCreateOrganization">Nová organizace</string>
<string name="pageTitleCreateMilestone">Nový milník</string>
<string name="pageTitleCreateNewIssue">Nový problém</string>
<string name="pageTitleCreateLabel">Nový štítek</string>
<string name="pageTitleCredits">Poděkování</string>
<string name="pageTitleChooseBranch">Vybrat větev</string>
<string name="pageTitleLabelUpdate">Aktualizovat štítek</string>
<string name="pageTitleSponsors">Dárci</string>
<string name="pageTitleStarredRepos">Oblíbené repozitáře</string>
<string name="pageTitleCreateTeam">Nový tým</string>
<string name="pageTitleAddEmail">Přidat e-mailovou adresu</string>
<string name="pageTitleNewFile">Nový soubor</string>
<string name="pageTitleExplore">Prozkoumat</string>
<string name="pageTitleAdministration">Administrace Gitea</string>
<string name="pageTitleUserAccounts">Správa účtů</string>
<string name="pageTitleNewPullRequest">New Pull Request</string>
<!-- page titles -->
<string name="repoName">Demo repozitář</string>
<string name="repoFullname">Repo with ORG</string>
<string name="repoDescription">Demo popis</string>
<string name="noData">Nebyly nalezeny žádné repozitáře</string>
<string name="orgName">Demo organizace</string>
<string name="orgDescription">Demo popis</string>
<string name="noDataOrg">Nebyly nalezeny žádné organizace</string>
<string name="newCreateButtonCopy">Vytvořit</string>
<string name="newUpdateButtonCopy">Aktualizovat</string>
<string name="newRepoTintCopy">Název repositáře</string>
<string name="newRepoDescTintCopy">Popis repozitáře</string>
<string name="newRepoPrivateCopy">Soukromé</string>
<string name="newRepoDescInfo">Max 255 znaků</string>
<string name="newRepoOwner">Vlastník</string>
<string name="newOrgTintCopy">Název organizace</string>
<string name="newOrgDescTintCopy">Popis organizace</string>
<string name="newOrgDescInfo">Max 255 znaků</string>
<string name="userName">Uživatelské jméno</string>
<string name="passWord">Heslo</string>
<string name="btnLogin">Přihlásit se</string>
<string name="instanceUrl">URL instance</string>
<string name="navigation_drawer_open">Otevřít navigační menu</string>
<string name="navigation_drawer_close">Zavřít navigační menu</string>
<string name="logo">Přihlásit se do Gitea</string>
<string name="protocol">Protocol</string>
<string name="urlInfoTooltip">1- Vyberte správný protokol (https nebo http). \n2- zadejte URL Gitea např.: try.gitea.io. \n3- Pokud jste pro svůj účet povolili 2FA, zadejte kód do pole OTP kód. \n4- Pro základní ověření HTTP použijte USERNAME@DOMAIN.COM v poli URL.</string>
<string name="malformedUrl">Nelze se připojit k serveru. Zkontrolujte prosím URL nebo port pro případné chyby</string>
<string name="protocolError">Není doporučeno používat HTTP protokol, pokud netestujete na místní síti</string>
<string name="malformedJson">Byl přijat chybný JSON. Odpověď od serveru nebyla úspěšná</string>
<string name="emptyFieldURL">Je vyžadována URL instance</string>
<string name="emptyFieldUsername">Uživatelské jméno je vyžadováno</string>
<string name="emptyFieldPassword">Heslo je vyžadováno</string>
<string name="protocolEmptyError">Protocol is required</string>
<string name="checkNetConnection">Nelze se přihlásit, zkontrolujte prosím vaše připojení k internetu</string>
<string name="netConnectionIsBack">Ano, máme připojení k internetu!</string>
<string name="repoNameErrorEmpty">Název repozitáře není vyplněn</string>
<string name="repoNameErrorInvalid">Název repositáře není platný. [a&#8211;z A&#8211;Z 0&#8211;9 &#8211; _]</string>
<string name="repoNameErrorReservedName">Název repozitáře je rezervován</string>
<string name="repoNameErrorReservedPatterns">Název repozitáře obsahuje vyhrazená slova</string>
<string name="repoDescError">Popis repozitáře překračuje maximální limit 255 znaků</string>
<string name="repoCreated">Repozitář byl úspěšně vytvořen</string>
<string name="repoCreatedError">Něco se pokazilo, zkuste to prosím znovu</string>
<string name="repoExistsError">Repozitář tohoto jména již existuje pod vybraným vlastníkem</string>
<string name="orgNameErrorEmpty">Název organizace je prázdný</string>
<string name="orgNameErrorInvalid">Název organizace není platný, [a&#8211;z A&#8211;Z 0&#8211;9 &#8211; _]</string>
<string name="orgDescError">Popis organizace překračuje maximální limit 255 znaků</string>
<string name="orgCreated">Organizace byla úspěšně vytvořena</string>
<string name="orgCreatedError">Něco se pokazilo, zkuste to prosím znovu</string>
<string name="orgExistsError">Organizace již existuje</string>
<string name="binaryFileError">Binární soubory ještě nejsou podporovány.</string>
<string name="fileTooLarge">Tento soubor překračuje maximální možný počet rozdílových řádků</string>
<string name="processingText">Zpracovávání</string>
<string name="search">Hledat</string>
<string name="close">Zavřít</string>
<string name="addNewContent">Přidat</string>
<string name="orgContentAvatar">Avatar organizace</string>
<string name="repoContentAvatar">Repozitář</string>
<string name="privateAvatar">Soukromý avatar</string>
<string name="removeContent">Odebrat</string>
<string name="genericApiStatusError">Instance vrátila chybu. Kód\u0020</string>
<string name="title_activity_repo_detail">Detailní aktivity repozitáře</string>
<string name="tab_text_info">Podrobnosti</string>
<string name="tab_text_files">Soubory</string>
<string name="tab_text_ml">Milníky</string>
<string name="tab_text_releases">Vydání</string>
<string name="tab_text_branches">Větve</string>
<string name="tab_text_labels">Štítky</string>
<string name="tab_text_collaborators">Spolupracovníci</string>
<string name="tabPullRequests">Pull Requesty</string>
<string name="noDataIssueTab">Nebyla nalezena žádná issue</string>
<string name="infoTabRepoSize">Velikost</string>
<string name="infoTabRepoDefaultBranch">Výchozí větev</string>
<string name="infoTabRepoSshUrl">SSH URL</string>
<string name="infoTabRepoCloneUrl">URL pro klonování</string>
<string name="infoTabRepoRepoUrl">URL repozitáře</string>
<string name="infoTabRepoForksCount">Forky</string>
<string name="infoTabRepoCreatedAt">Vytvořeno</string>
<string name="infoTabRepoUpdatedAt">Naposledy aktualizováno</string>
<string name="infoShowMoreInformation">Zobrazit více informací</string>
<string name="infoMoreInformation">Více informací</string>
<string name="timeAtText">v(ve)</string>
<string name="createdText">Otevřeno\u0020</string>
<string name="issueCreator">Tvůrce:\u0020</string>
<string name="issueCommenter">Komentující:\u0020</string>
<string name="issueMilestone">Milník %1$s</string>
<string name="dueDate">Termín do %1$s</string>
<string name="assignedTo">Přiřazeno uživateli %1$s</string>
<string name="commentButtonText">Komentář</string>
<string name="commentEmptyError">Zadejte svůj komentář</string>
<string name="commentSuccess">Komentář byl zveřejněn</string>
<string name="commentError">Něco se pokazilo, zkuste to prosím znovu</string>
<string name="featureDeprecated">Tato funkce bude v budoucnu odstraněna</string>
<string name="generalImgContentText">Avatar</string>
<string name="noDataMilestonesTab">Nebyly nalezeny žádné milníky</string>
<string name="commitAuthor">Autor commitu: %1$s</string>
<string name="releaseDownloadText">Stahování</string>
<string name="noDataReleasesTab">Nebyly nalezeny žádná vydání</string>
<string name="releasePublishedBy">Zveřejnil/a %1$s</string>
<string name="noReleaseBodyContent">Poznámky k verzi nejsou poskytnuty vydavatelem.</string>
<string name="noDataCollaboratorTab">Nebyli nalezeni žádní spolupracovníci</string>
<string name="newMilestoneTitle">Název</string>
<string name="newMilestoneDescription">Popis</string>
<string name="newMilestoneDueDate">Splnit do</string>
<string name="milestoneNameErrorEmpty">Název milníku je prázdný</string>
<string name="milestoneDescError">Popis repozitáře překračuje maximální limit 255 znaků</string>
<string name="milestoneCreated">Milník byl úspěšně vytvořen</string>
<string name="milestoneCreatedError">Něco se pokazilo, zkuste to prosím znovu</string>
<string name="milestoneDateEmpty">Vyberte prosím datum dokončení</string>
<string name="milestoneNoDueDate">Bez termínu dokončení</string>
<string name="milestoneNoDescription">Bez popisu</string>
<string name="milestoneIssueStatusOpen">%1$d otevřených</string>
<string name="milestoneIssueStatusClosed">%1$d zavřených</string>
<string name="newIssueSelectAssigneesListTitle">Vybrat pověřenou osobu</string>
<string name="newIssueSelectLabelsListTitle">Vybrat popisek</string>
<string name="newIssueTitle">Název</string>
<string name="newIssueAssigneesListTitle">Pověřené osoby</string>
<string name="newIssueDescriptionTitle">Popis</string>
<string name="newIssueDueDateTitle">Splnit do</string>
<string name="newIssueMilestoneTitle">Milník</string>
<string name="newIssueLabelsTitle">Popisky</string>
<string name="issueTitleEmpty">Název problému je prázdný</string>
<string name="issueDescriptionEmpty">Popis je prázdný</string>
<string name="issueCreated">Problém úspěšně vytvořen</string>
<string name="issueCreatedError">Něco se pokazilo, zkuste to prosím znovu</string>
<string name="issueCreatedNoMilestone">Žádný milník</string>
<string name="noAssigneesFound">Nebyli nalezeni žádní spolupracovníci</string>
<string name="noLabelsFound">Nebyly nalezeny žádné popisky</string>
<!-- settings -->
<string name="settingsLanguageHeaderText">Překlad</string>
<string name="settingsSecurityHeader">Zabezpečení</string>
<string name="settingsCertsSelectorHeader">Odstranit důvěryhodné certifikáty</string>
<string name="settingsCertsPopupTitle">Smazat důvěryhodné certifikáty?</string>
<string name="settingsCertsPopupMessage">Opravdu chcete odstranit jakýkoli ručně důvěryhodný certifikát nebo název hostitele? \n\nBudete také odhlášeni.</string>
<string name="settingsDateTimeHeaderText">Datum &amp; čas</string>
<string name="settingsSave">Nastavení uloženo</string>
<string name="settingsLanguageSelectorHeader">Jazyk</string>
<string name="settingsLanguageSelectedHeaderDefault">Angličtina</string>
<string name="settingsAppearanceHeader">Vzhled</string>
<string name="settingsDateTimeHeaderDefault">Pěkný</string>
<string name="settingsLanguageSelectorDialogTitle">Zvolte jazyk</string>
<string name="settingsTimeSelectorDialogTitle">Zvolte formát času</string>
<string name="settingsHelpTranslateText">Pomozte nám přeložit GitNex do češtiny</string>
<string name="codeBlockHeaderText">Barva bloku kódu</string>
<string name="settingsCodeBlockSelectorDialogTitle">Výběr barvy bloku kódu</string>
<string name="settingsHomeScreenHeaderText">Úvodní obrazovka</string>
<string name="settingsHomeScreenSelectedText">Mé repositáře</string>
<string name="settingsHomeScreenSelectorDialogTitle">Vyberte domovskou obrazovku</string>
<string name="settingsCustomFontHeaderText">Písmo</string>
<string name="settingsCustomFontSelectorDialogTitle">Vybrat písmo</string>
<string name="themeSelectorDialogTitle">Select App Theme</string>
<string name="themeSelectionHeaderText">Theme</string>
<string name="settingsPdfModeHeaderText">PDF Night Mode</string>
<string name="fileViewerHeader">File Viewer</string>
<string name="settingsCounterBadges">Counter Badges</string>
<string name="settingsFileviewerSourceCodeHeaderText">Source Code Theme</string>
<string name="fileviewerSourceCodeThemeSelectorDialogTitle">Select Source Code Theme</string>
<string name="cacheSizeDataDialogHeader">Data Cache Size</string>
<string name="cacheSizeDataSelectionHeaderText">Data Cache Size</string>
<string name="cacheSizeImagesDialogHeader">Images Cache Size</string>
<string name="cacheSizeImagesSelectionHeaderText">Images Cache Size</string>
<string name="clearCacheSelectionHeaderText">Clear Cache</string>
<string name="clearCacheDialogHeader">Clear Cache?</string>
<string name="clearCacheDialogMessage">This will delete all the cache data including files and images.\n\nProceed with deletion?</string>
<string name="draftsHeader">Drafts</string>
<string name="draftsHintText">Comments draft</string>
<string name="settingsEnableCommentsDeletionText">Enable Drafts Deletion</string>
<string name="settingsEnableCommentsDeletionHintText">Delete comment draft when comment is posted</string>
<!-- settings -->
<string name="noMoreData">No more data available</string>
<string name="createLabel">New Label</string>
<string name="menuTitleText">Repo Menu</string>
<string name="labelName">Label Name</string>
<string name="labelColor">Label Color</string>
<string name="labelEmptyError">Label name is empty</string>
<string name="labelNameError">Label name is not valid</string>
<string name="labelCreated">Label created.</string>
<string name="labelGeneralError">Something went wrong, please try again</string>
<string name="labelUpdated">Label updated.</string>
<string name="noDataLabelsTab">No labels found</string>
<string name="labelMenuContentDesc">Desc</string>
<string name="labelMenuEdit">Edit</string>
<string name="labelMenuDelete">Delete</string>
<string name="labelDeleteText">Label deleted</string>
<string name="labelDeleteErrorText">Something went wrong, please try again</string>
<string name="noDataBranchesTab">No branches found</string>
<string name="alertDialogTokenRevokedTitle">Authorization Error</string>
<string name="alertDialogTokenRevokedMessage">It seems that the Access Token is revoked OR your are not allowed to see these contents.\n\nIn case of revoked Token, please logout and login again</string>
<string name="alertDialogTokenRevokedCopyNegativeButton">Cancel</string>
<string name="alertDialogTokenRevokedCopyPositiveButton">Logout</string>
<string name="labelDeleteTitle">Delete\u0020</string>
<string name="labelDeleteMessage">Do you really want to delete this label?</string>
<string name="labelDeletePositiveButton">OK</string>
<string name="labelDeleteNegativeButton">Cancel</string>
<!-- org tabbed layout str -->
<string name="title_activity_org_detail">OrgDetailActivity</string>
<string name="orgTabRepos">Repositories</string>
<string name="orgTabTeams">Teams</string>
<string name="orgTabMembers">Members</string>
<string name="orgCreateTeam">New Team</string>
<string name="noDataTeams">No teams found</string>
<string name="teamTitle">Team name</string>
<string name="teamDescription">Team desc</string>
<string name="teamPermission">Permission : %1$s</string>
<string name="noDataMembers">No members found</string>
<string name="orgMember">Org members</string>
<string name="orgTeamMembers">Organization team members</string>
<string name="addNewMember">Add / Remove New Member</string>
<string name="removeTeamMemberTitle">Remove\u0020</string>
<string name="addTeamMemberTitle">Add\u0020</string>
<string name="addTeamMemberMessage">Do you want to add this user to the team?</string>
<string name="removeTeamMemberMessage">Do you want to remove this user from the team?</string>
<string name="memberAddedMessage">Member added to the team successfully</string>
<string name="memberRemovedMessage">Member removed from the team successfully</string>
<!-- org tabbed layout str -->
<!-- create team -->
<string name="newTeamTitle">Team Name</string>
<string name="newTeamDesc">Description</string>
<string name="newTeamPermission">Permission</string>
<string name="newTeamAccessControls">Access Controls</string>
<string name="newTeamPermissionRead">Members can view and clone team repositories</string>
<string name="newTeamPermissionWrite">Members can read and push to team repositories</string>
<string name="newTeamPermissionAdmin">Members can pull and push to team repositories and add collaborators to them</string>
<string name="teamNameEmpty">Please enter team name</string>
<string name="teamNameError">Team name should contain only alphanumeric, dash (-), underscore (_) and dot (.) characters</string>
<string name="teamPermissionEmpty">Please select permission</string>
<string name="teamDescError">Team description have illegal characters</string>
<string name="teamDescLimit">Team description have more than 100 characters</string>
<string name="teamCreated">Team created successfully</string>
<string name="teamCreatedError">Something went wrong, please try again</string>
<!-- create team -->
<!-- issue comments -->
<string name="editCommentTitle">Edit Comment</string>
<string name="editCommentButtonText">Edit</string>
<string name="editCommentUpdatedText">Comment updated</string>
<string name="issueCommentShare">Share Comment</string>
<string name="deleteCommentSuccess">Comment deleted successfully</string>
<string name="copyCommentText">Copy Comment</string>
<!-- issue comments -->
<!-- add collaborator -->
<string name="addCollaboratorTitle">Add / Remove Collaborator</string>
<string name="addCollaboratorSearchHint">Search users</string>
<string name="addCollaboratorViewUserDesc">Username</string>
<string name="removeCollaboratorTitle">Remove\u0020</string>
<string name="removeCollaboratorMessage">Do you want to remove this user from the repository?</string>
<string name="removeCollaboratorToastText">User removed from the repository.</string>
<string name="addCollaboratorToastText">User added to the repository.</string>
<!-- add collaborator -->
<!-- profile section -->
<string name="profileTabFollowers">Followers</string>
<string name="profileTabFollowing">Following</string>
<string name="profileCreateNewEmailAddress">Add Email Address</string>
<string name="profileEmailButton">Save</string>
<string name="profileEmailTitle">Email Address</string>
<string name="emailAddedText">New email added successfully</string>
<string name="emailErrorEmpty">Email address is empty</string>
<string name="emailErrorInvalid">Email address is not valid</string>
<string name="emailErrorInUse">Email address is already in use</string>
<string name="emailTypeText">Primary</string>
<string name="profileTabEmails">Emails</string>
<!-- profile section -->
<!-- single issue section -->
<string name="singleIssueEditLabels">Add / Remove Labels</string>
<string name="labelsUpdated">Labels updated</string>
<string name="closeIssue">Close Issue</string>
<string name="editIssue">Edit Issue</string>
<string name="reOpenIssue">Reopen Issue</string>
<string name="issueStateClosed">Issue closed</string>
<string name="issueStateReopened">Issue reopened</string>
<string name="addRemoveAssignees">Add / Remove Assignees</string>
<string name="assigneesUpdated">Assignees updated</string>
<string name="singleIssueSubscribe">Subscribe</string>
<string name="singleIssueUnSubscribe">Unsubscribe</string>
<!-- single issue section -->
<!-- multi select dialog -->
<string name="select_entry">Select Entries</string>
<string name="please_select_atleast">Please select at least </string>
<string name="you_can_only_select_upto">You can only select up to </string>
<string name="option"> option</string>
<string name="options"> options</string>
<string name="select_all">Select all</string>
<!-- multi select dialog -->
<string name="repoMetaData">Repository Meta</string>
<!-- admin -->
<string name="adminCreateNewUser">Add New User</string>
<string name="adminUsers">System Users</string>
<string name="userRoleAdmin">Admin</string>
<!-- admin -->
<!-- create user -->
<string name="userFullNameText">Full Name</string>
<string name="userEmail">Email</string>
<string name="userUserName">Username</string>
<string name="userPassword">Password</string>
<string name="userInvalidFullName">Invalid Full Name</string>
<string name="userInvalidUserName">Invalid Username</string>
<string name="userInvalidEmail">Invalid Email</string>
<string name="userCreatedText">New user added successfully</string>
<string name="userExistsError">User already exists</string>
<!-- create user -->
<!-- edit issue -->
<string name="editIssueNavHeader">Edit Issue #%1$s</string>
<string name="editIssueSuccessMessage">Issue updated</string>
<!-- edit issue -->
<!-- release -->
<string name="createRelease">New Release</string>
<string name="releaseTagNameText">Tag Name</string>
<string name="releaseTitleText">Title</string>
<string name="releaseContentText">Content</string>
<string name="releaseTypeText">Mark as Pre-Release</string>
<string name="releaseBranchText">Select Branch</string>
<string name="releaseDraftText">Draft</string>
<string name="tagNameErrorEmpty">Tag name is empty</string>
<string name="titleErrorEmpty">Title is empty</string>
<string name="releaseCreatedText">New release created</string>
<!-- release -->
<string name="loginOTPTypeError">OTP code should be numbers</string>
<string name="loginOTP">OTP Code (Optional)</string>
<string name="otpMessage">Enter otp code if 2FA is enabled</string>
<string name="openWebRepo">Open in Browser</string>
<string name="repoStargazersInMenu">Stargazers</string>
<string name="repoWatchersInMenu">Watchers</string>
<string name="noDataWebsite">No website found</string>
<string name="noDataDescription">No description found</string>
<string name="noDataLocation">No location found</string>
<string name="starMember">Star</string>
<string name="watcherMember">Watcher</string>
<string name="zipArchiveDownloadReleasesTab">Source code (ZIP)</string>
<string name="tarArchiveDownloadReleasesTab">Source code (TAR.GZ)</string>
<!-- new file -->
<string name="newFileNameTintCopy">File Name</string>
<string name="newFileBranchTintCopy">New Branch Name</string>
<string name="newFileContentTintCopy">File Content</string>
<string name="newFileButtonCopy">Create New File</string>
<string name="newFileNameHintMessage">with folder: app/test.md</string>
<string name="newFileMessageTintCopy">Zpráva commitu</string>
<string name="newFileInvalidBranchName">Invalid branch name, may only contain &#8211;, a&#8211;z, 0&#8211;9</string>
<string name="newFileCommitMessageError">Commit zpráva je příliš dlouhá</string>
<string name="newFileSuccessMessage">New file created</string>
<string name="newFileOldBranches">Current Branches</string>
<string name="newFileRequiredFields">Fields like filename, content and commit message are required</string>
<string name="newFileCurrentBranchMessage">Selecting current branch will disable 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="strFilter">Filter</string>
<string name="strSwitchBranches">Branches</string>
<string name="strMarkdown">Markdown</string>
<string name="copyIssueUrl">Copy Issue URL</string>
<string name="copyIssueUrlToastMsg">URL copied to clipboard</string>
<string name="copyIssueCommentToastMsg">Copied comment to clipboard</string>
<string name="milestoneCompletion">%1$d\uFF05 completed</string>
<!-- files -->
<string name="noDataFilesTab">No files found</string>
<string name="filesGenericError">Sorry this file cannot be viewed as API returned an error</string>
<string name="notSupported">Not supported</string>
<!-- generic copy -->
<string name="okButton">OK</string>
<string name="doneButton">Done</string>
<string name="cancelButton">Cancel</string>
<string name="genericError">Something went wrong, please try again</string>
<string name="apiNotFound">This request needs higher Gitea version than the one installed. Please upgrade your instance to the latest version of Gitea.</string>
<string name="noDataFound">No data found</string>
<string name="addButton">Add</string>
<string name="removeButton">Remove</string>
<string name="authorizeError">You are not authorized to perform this action.</string>
<string name="menuContentDesc">Menu</string>
<string name="menuEditText">Edit</string>
<string name="menuDeleteText">Delete</string>
<string name="menuCopyText">Copy</string>
<string name="menuQuoteText">Quote and Reply</string>
<string name="modifiedText">edited</string>
<string name="saveButton">Save</string>
<string name="websiteText">Website</string>
<string name="locationText">Location</string>
<string name="characters255Limit">Max 255 characters</string>
<string name="emptyFields">All fields are required</string>
<string name="textContinue">Continue</string>
<string name="copyToken">Token</string>
<string name="viewInBrowser">View in Browser</string>
<string name="isOpen">Open</string>
<string name="isClosed">Closed</string>
<string name="genericServerResponseError">We cannot reach the server at the moment, please check your server status and try again</string>
<string name="genericCopyUrl">Copy URL</string>
<!-- generic copy -->
<string name="exploreTextBoxHint">Explore repositories</string>
<string name="starRepository">Star Repository</string>
<string name="unStarRepository">Unstar Repository</string>
<string name="starRepositorySuccess">Repository added to starred list</string>
<string name="unStarRepositorySuccess">Repository removed from starred list</string>
<string name="watchRepository">Watch Repository</string>
<string name="unWatchRepository">Unwatch Repository</string>
<string name="watchRepositorySuccess">Repository added to watch list</string>
<string name="unWatchRepositorySuccess">Repository removed from watch list</string>
<string name="titleDrafts">Drafts</string>
<string name="versionUnsupportedOld">Unsupported old version(%1$s) of Gitea detected. Please update to latest stable version. If you continue, the app may not function properly</string>
<string name="versionUnsupportedNew">New Gitea version detected! Please UPDATE GitNex!</string>
<string name="versionUnknown">No Gitea detected!</string>
<string name="versionAlertDialogHeader">Unsupported Version of Gitea</string>
<string name="loginViaPassword">Username / Password</string>
<string name="loginMethodText">Choose your preferred login method to access your account. Token is more secure!</string>
<string name="unauthorizedApiError">Instance has returned an error - Unauthorized. Check your credentials and try again</string>
<string name="loginTokenError">Token is required</string>
<string name="prDeletedFrok">Deleted Fork</string>
<string name="noDataPullRequests">No pull requests found</string>
<string name="prCreator">Creator :\u0020</string>
<string name="editPrText">Edit Pull Request</string>
<string name="copyPrUrlText">Copy Pull Request URL</string>
<string name="editPrNavHeader">Edit Pull Request #%1$s</string>
<string name="editPrSuccessMessage">Pull Request updated</string>
<string name="fileDiffViewHeader">%1$s Files Changed</string>
<string name="fileDiffViewHeaderSingle">%1$s File Changed</string>
<string name="openFileDiffText">Files Changed</string>
<string name="mergePullRequestText">Merge Pull Request</string>
<string name="mergePullRequestButtonText">Merge</string>
<string name="deleteBranchAfterMerge">Delete branch after merge</string>
<string name="mergeNoteText">Merge may fail if you are not authorized to merge this Pull Request.</string>
<string name="mergeInfoDisabledMessage">Disabled Merge button means that there are conflicts OR other things to fix before Merge</string>
<string name="deleteBranchForkInfo">This branch belong to a forked repository</string>
<string name="mergeCommentText">Merge comment</string>
<string name="mergePRSuccessMsg">Pull Request was merged successfully</string>
<string name="mergePR404ErrorMsg">Pull Request is not available for merge</string>
<string name="mergeOptionMerge">Merge Pull Request</string>
<string name="mergeOptionRebase">Rebase and Merge</string>
<string name="mergeOptionRebaseCommit">Rebase and Merge (&#45;&#45;no-ff)</string>
<string name="mergeOptionSquash">Squash and Merge</string>
<string name="downloadFile">Download This File</string>
<string name="waitLoadingDownloadFile">Please wait for the file to load to memory</string>
<string name="downloadFileSaved">File saved successfully</string>
<string name="excludeFilesInFileviewer">This file type is not supported in file viewer. Download it instead from the three dotted menu?</string>
<string name="deleteFile">Delete This File</string>
<string name="editFile">Edit This File</string>
<string name="deleteFileText">Delete %1$s</string>
<string name="deleteFileMessage">File is set for deletion by branch %1$s</string>
<string name="editFileText">Edit %1$s</string>
<string name="editFileMessage">File is modified by branch %1$s</string>
<string name="sizeCopy">Size</string>
<string name="shareIssue">Share Issue</string>
<string name="sharePr">Share Pull Request</string>
<string name="shareRepository">Share Repository</string>
<string name="createRepository">Create Repository</string>
<string name="commitTitle">Commits</string>
<string name="commitCommittedBy">Commitnuto uživatelem %1$s</string>
<string name="viewCommits">Zobrazit commity</string>
<!-- Memorizing Trust Manager -->
<string name="mtm_notification">Certificate Verification</string>
<string name="mtm_accept_cert">Accept Unknown Certificate?</string>
<string name="mtm_trust_anchor">The server certificate is not signed by a known Certificate Authority</string>
<string name="mtm_cert_expired">The server certificate is expired.</string>
<string name="mtm_accept_server_name">Accept Mismatching Server Name?</string>
<string name="mtm_hostname_mismatch">Server could not authenticate as \&quot;%s\&quot;. The certificate is only valid for:</string>
<string name="mtm_connect_anyway">Do you want to connect anyway?</string>
<string name="mtm_cert_details">Certificate details:</string>
<string name="mtm_decision_always">Trust</string>
<string name="mtm_decision_abort">Abort</string>
<string name="subscribedSuccessfully">Subscribed successfully</string>
<string name="alreadySubscribed">You have already subscribed</string>
<string name="subscriptionError">Subscription failed</string>
<string name="unsubscribedSuccessfully">Unsubscribed successfully</string>
<string name="alreadyUnsubscribed">You have already Unsubscribed</string>
<string name="unsubscriptionError">Un-Subscription failed</string>
<string name="closeMilestone">Close Milestone</string>
<string name="openMilestone">Open Milestone</string>
<string name="milestoneStatusUpdate">Milestone status updated successfully</string>
<string name="errorOnLogin">We cannot reach the server, please check your server status</string>
<string name="reportViewerHeader">Crash Reports</string>
<string name="settingsEnableReportsText">Enable Crash Reports</string>
<string name="crashTitle">GitNex has stopped :(</string>
<string name="setCrashReports">Crash reports</string>
<string name="crashMessage">It is encouraged to open an issue at the project repository with how to reproduce this bug. It is easier to debug and fix the problem that way.\n\nTap the OK button to send the crash report by email instead. Additional content could be added in the email.\nThank you!</string>
<string name="forceLogoutDialogHeader">Please sign in again</string>
<string name="forceLogoutDialogDescription">Due to some major changes regarding the internal functioning of the app, we require you to login again. These changes allow us to make the app more flexible in the future.\n\nThank you for your patience and sorry for the inconvenience.</string>
<string name="deleteAllDrafts">Delete All Drafts</string>
<string name="draftsListEmpty">No drafts found</string>
<string name="draftsDeleteSuccess">Drafts deleted successfully</string>
<string name="draftsSingleDeleteSuccess">Draft deleted successfully</string>
<string name="deleteAllDraftsDialogMessage">This will delete all the drafts for this account. \n\nProceed with deletion?</string>
<string name="draftSaved">Draft saved</string>
<string name="appearanceHintText">Themes, fonts, badges, code block theme</string>
<string name="fileViewerHintText">PDF mode, source code theme</string>
<string name="securityHintText">SSL certificates, cache, polling delay</string>
<string name="languagesHintText">Languages</string>
<string name="reportsHintText">Crash reports</string>
<string name="archivedRepository">Archived</string>
<string name="accountDeletedMessage">Account deleted successfully</string>
<string name="removeAccountPopupTitle">Remove Account</string>
<string name="removeAccountPopupMessage">Are you sure you want to remove this account from the app?\n\nThis will remove all the data related to this account on the app only.</string>
<string name="addNewAccount">New Account</string>
<string name="addNewAccountText">Add New Account</string>
<string name="accountAlreadyExistsError">Account already exists in the app</string>
<string name="accountAddedMessage">Account added successfully</string>
<string name="switchAccountSuccess">Switched to account : %1$s@%2$s</string>
<!-- Notifications -->
<string name="pageTitleNotifications">Notifications</string>
<string name="noDataNotifications">No notifications found</string>
<string name="notificationBody">You have received a new notification. (%s)</string>
<string name="notificationsPollingHeaderText">Notifications Polling Delay</string>
<string name="pollingDelaySelectedText">%d Minutes</string>
<string name="pollingDelayDialogHeaderText">Select Polling Delay</string>
<string name="pollingDelayDialogDescriptionText">Choose a minutely delay in which GitNex tries to poll new notifications</string>
<string name="markAsRead">Mark as Read</string>
<string name="markAsUnread">Mark as Unread</string>
<string name="pinNotification">Pin Notification</string>
<string name="markedNotificationsAsRead">Successfully marked all notifications as read</string>
<string name="isRead">Read</string>
<string name="isUnread">Unread</string>
<string name="repoSettingsTitle">Repository Settings</string>
<string name="repoSettingsEditProperties">Edit Properties</string>
<string name="repoSettingsDelete">Delete Repository</string>
<string name="repoSettingsDeleteHint">Be careful, this operation CANNOT be undone!</string>
<string name="repoPropertiesTemplate">Set as Template</string>
<string name="repoPropertiesEnableIssues">Enable Issues</string>
<string name="repoPropertiesExternalIssuesUrl">External Issue Tracker Url</string>
<string name="repoPropertiesEnableWiki">Enable Wiki</string>
<string name="repoPropertiesExternalWikiUrl">External Wiki Url</string>
<string name="repoPropertiesEnablePr">Enable Pull Requests</string>
<string name="repoPropertiesEnableTimeTracker">Enable Time Tracker</string>
<string name="repoPropertiesEnableMergeCommits">Enable Merge Commits</string>
<string name="repoPropertiesEnableRebase">Enable Rebase</string>
<string name="repoPropertiesEnableSquash">Enable Squash and Merge</string>
<string name="repoPropertiesEnableForceMerge">Enable Rebase with Merge Commits (&#8212;&#8212;no-ff)</string>
<string name="repoPropertiesSaveSuccess">Repository properties updated successfully</string>
<string name="repoSettingsDeleteDescription">Things to know before deletion:\n\n- This operation CANNOT be undone.\n- This operation will permanently delete the repository including code, issues, comments, wiki data and collaborator settings.\n\nEnter the repository name as confirmation</string>
<string name="repoSettingsDeleteError">Repository name does not match</string>
<string name="repoDeletionSuccess">Repository deleted successfully</string>
<string name="repoSettingsTransferOwnership">Transfer Ownership</string>
<string name="repoSettingsTransferOwnershipHint">Transfer this repository to a user or to an organization for which you have administrator rights</string>
<string name="repoSettingsTransferOwnershipDescription">Things to know before transfer:\n\n- You will lose access to the repository if you transfer it to an individual user.\n- You will keep access to the repository if you transfer it to an organization that you (co-)own.\n\nEnter the repository name as confirmation</string>
<string name="repoTransferText">Perform Transfer</string>
<string name="repoTransferOwnerText">New Owner</string>
<string name="repoTransferSuccess">Repository transferred successfully</string>
<string name="repoTransferOwnerError">New owner is required</string>
<string name="repoTransferError">There is a problem with the owner name. Make sure that the new owner exists</string>
<string name="mergeIntoBranch">Merge Into</string>
<string name="pullFromBranch">Pull From</string>
<string name="sameBranchesError">These branches are equal. There is no need to create a pull request</string>
<string name="mergeIntoError">Merge into branch is required</string>
<string name="pullFromError">Pull from branch is required</string>
<string name="titleError">Title is required</string>
<string name="prCreateSuccess">Pull Request created successfully</string>
<string name="prAlreadyExists">A pull request between these branches already exists</string>
</resources>

View File

@ -37,6 +37,7 @@
<string name="pageTitleExplore">Erkunden</string>
<string name="pageTitleAdministration">Gitea-Administration</string>
<string name="pageTitleUserAccounts">Konten verwalten</string>
<string name="pageTitleNewPullRequest">Neuer Pull-Request</string>
<!-- page titles -->
<string name="repoName">Demo Repo</string>
<string name="repoFullname">Repo mit ORG</string>
@ -62,6 +63,7 @@
<string name="navigation_drawer_open">Navigationsleiste öffnen</string>
<string name="navigation_drawer_close">Navigationsleiste schließen</string>
<string name="logo">In Gitea anmelden</string>
<string name="protocol">Protokoll</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="malformedUrl">Konnte keine Verbindung zum Host herstellen. Bitte überprüfe die URL oder Port auf irgendwelche Fehler</string>
<string name="protocolError">Es wird nicht empfohlen, das HTTP-Protokoll zu verwenden, es sei denn, du testest in einem lokalen Netzwerk</string>
@ -69,6 +71,7 @@
<string name="emptyFieldURL">Instanzen-URL ist erforderlich</string>
<string name="emptyFieldUsername">Benutzername ist erforderlich</string>
<string name="emptyFieldPassword">Passwort ist erforderlich</string>
<string name="protocolEmptyError">Protokoll ist erforderlich</string>
<string name="checkNetConnection">Kann nicht auf das Netzwerk zugreifen. Bitte überprüfe die Internetverbindung</string>
<string name="netConnectionIsBack">Juhu, wir haben eine Internetverbindung!</string>
<string name="repoNameErrorEmpty">Der Repository Name ist leer.</string>
@ -106,7 +109,6 @@
<string name="tab_text_collaborators">Mitarbeiter</string>
<string name="tabPullRequests">Pull Requests</string>
<string name="noDataIssueTab">Keine Issues gefunden!</string>
<string name="infoTabRepoWebsite">Webseite</string>
<string name="infoTabRepoSize">Größe</string>
<string name="infoTabRepoDefaultBranch">Standard Branch</string>
<string name="infoTabRepoSshUrl">SSH Link</string>
@ -419,7 +421,6 @@
<string name="genericServerResponseError">Wir können den Server im Moment nicht erreichen. Bitte überprüfen Sie Ihren Serverstatus und versuchen Sie es erneut</string>
<string name="genericCopyUrl">Link kopieren</string>
<!-- generic copy -->
<string name="translateText">GitNex mit Crowdin übersetzen</string>
<string name="exploreTextBoxHint">Repositories entdecken</string>
<string name="starRepository">Repository favorisieren</string>
<string name="unStarRepository">Repository nicht mehr favorisieren</string>
@ -468,7 +469,7 @@
<string name="deleteFile">Diese Datei löschen</string>
<string name="editFile">Diese Datei bearbeiten</string>
<string name="deleteFileText">Lösche %1$s</string>
<string name="deleteFileMessage">File is set for deletion by branch %1$s</string>
<string name="deleteFileMessage">Datei zum Löschen durch Branch %1$s gesetzt</string>
<string name="editFileText">Bearbeite %1$s</string>
<string name="editFileMessage">Datei wurde von Branch %1$s geändert</string>
<string name="sizeCopy">Größe</string>
@ -476,13 +477,13 @@
<string name="sharePr">Pull-Request teilen</string>
<string name="shareRepository">Repository teilen</string>
<string name="createRepository">Repository erstellen</string>
<string name="commitTitle">Branch-Commits</string>
<string name="commitTitle">Commits</string>
<string name="commitCommittedBy">Committed von %1$s</string>
<string name="viewCommits">Commits anzeigen</string>
<!-- Memorizing Trust Manager -->
<string name="mtm_notification">Zertifikatsüberprüfung</string>
<string name="mtm_accept_cert">Unbekanntes Zertifikat akzeptieren?</string>
<string name="mtm_trust_anchor">The server certificate is not signed by a known Certificate Authority</string>
<string name="mtm_trust_anchor">Das Serverzertifikat wurde nicht von einer bekannten Zertifizierungsstelle signiert</string>
<string name="mtm_cert_expired">Das Server-Zertifikat ist abgelaufen.</string>
<string name="mtm_accept_server_name">Nicht übereinstimmender Hostname akzeptieren?</string>
<string name="mtm_hostname_mismatch">Server konnte sich nicht als \&quot;%s\&quot; authentifizieren. Das Zertifikat ist nur gültig für:</string>
@ -504,7 +505,7 @@
<string name="settingsEnableReportsText">Absturzberichte aktivieren</string>
<string name="crashTitle">GitNex hat gestoppt :(</string>
<string name="setCrashReports">Absturzberichte</string>
<string name="crashMessage">Klicke auf OK, um den Absturzbericht per E-Mail zu senden. Es wird helfen, diesen zu beheben :)\n\nDu könntest auch zusätzliche Infos in der E-Mail angeben. Danke für deine Hilfe!</string>
<string name="crashMessage">Es wird empfohlen, ein Issue im Projekt zu öffnen, wie man diesen Fehler reproduzieren kann. Es ist einfacher, das Problem so zu debuggen und zu beheben.\n\nTippen Sie auf OK, um stattdessen den Absturzbericht per E-Mail zu senden. Zusätzliche Inhalte konnten in der E-Mail hinzugefügt werden.\nVielen Dank!</string>
<string name="forceLogoutDialogHeader">Bitte melden Sie sich erneut an</string>
<string name="forceLogoutDialogDescription">Aufgrund einiger wichtiger Änderungen in Bezug auf das interne Funktionieren der App müssen Sie sich erneut anmelden. Diese Änderungen ermöglichen es uns, die App in Zukunft flexibler zu gestalten.\n\nVielen Dank für Ihre Geduld und Entschuldigung für die Unannehmlichkeiten.</string>
<string name="deleteAllDrafts">Alle Entwürfe löschen</string>
@ -541,4 +542,39 @@
<string name="markedNotificationsAsRead">Alle Benachrichtigungen erfolgreich als gelesen markiert</string>
<string name="isRead">Gelesen</string>
<string name="isUnread">Ungelesen</string>
<string name="repoSettingsTitle">Repository Einstellungen</string>
<string name="repoSettingsEditProperties">Eigenschaften bearbeiten</string>
<string name="repoSettingsDelete">Repository löschen</string>
<string name="repoSettingsDeleteHint">Sei vorsichtig, diese Operation kann NICHT rückgängig gemacht werden!</string>
<string name="repoPropertiesTemplate">Als Vorlage speichern</string>
<string name="repoPropertiesEnableIssues">Issues aktivieren</string>
<string name="repoPropertiesExternalIssuesUrl">Url für externes Ticket Systems</string>
<string name="repoPropertiesEnableWiki">Wiki aktivieren</string>
<string name="repoPropertiesExternalWikiUrl">Externe Wiki Url</string>
<string name="repoPropertiesEnablePr">Pull Requests aktivieren</string>
<string name="repoPropertiesEnableTimeTracker">Time Tracker aktivieren</string>
<string name="repoPropertiesEnableMergeCommits">Merge Commits aktivieren</string>
<string name="repoPropertiesEnableRebase">Rebase aktivieren</string>
<string name="repoPropertiesEnableSquash">Squash und Merge aktivieren</string>
<string name="repoPropertiesEnableForceMerge">Rebase mit Merge Commits aktivieren (&#8212;&#8212;no-ff)</string>
<string name="repoPropertiesSaveSuccess">Repository-Eigenschaften erfolgreich aktualisiert</string>
<string name="repoSettingsDeleteDescription">Vor dem Löschen zu erfahrende Dinge:\n\n- Dieser Vorgang kann NICHT rückgängig gemacht werden.\n- Dieser Vorgang wird das Projektarchiv dauerhaft löschen, einschließlich Code, Issues, Kommentare, Wiki-Daten und Einstellungen.\n\nGib den Repository-Namen als Bestätigung ein</string>
<string name="repoSettingsDeleteError">Repository-Name stimmt nicht überein</string>
<string name="repoDeletionSuccess">Repository erfolgreich gelöscht</string>
<string name="repoSettingsTransferOwnership">Besitz übertragen</string>
<string name="repoSettingsTransferOwnershipHint">Dieses Repository an einen Benutzer oder eine Organisation übertragen, für die Sie Admin Rechte haben</string>
<string name="repoSettingsTransferOwnershipDescription">Dinge, die vor der Übertragung bekannt sind:\n\n- Du verlierst den Zugriff auf das Projekt, wenn es an einen Benutzer übertragen wird.\n- Du behälst den Zugriff auf das Projekt, wenn es an eine Organisation übertragen wird, die du (mit-)besitzt.\n\nGeben den Repository-Namen als Bestätigung ein</string>
<string name="repoTransferText">Übertragung durchführen</string>
<string name="repoTransferOwnerText">Neuer Besitzer</string>
<string name="repoTransferSuccess">Repository erfolgreich übertragen</string>
<string name="repoTransferOwnerError">Neuer Besitzer ist erforderlich</string>
<string name="repoTransferError">Es gibt ein Problem mit dem Besitzer Namen. Stelle sicher, dass der neue Besitzer existiert</string>
<string name="mergeIntoBranch">Zusammenführen in</string>
<string name="pullFromBranch">Pull-Request von</string>
<string name="sameBranchesError">Diese Branches sind gleich. Es besteht keine Notwendigkeit, einen Pull-Request zu erstellen</string>
<string name="mergeIntoError">Merge in Branch ist erforderlich</string>
<string name="pullFromError">Pull-Request von Branch ist erforderlich</string>
<string name="titleError">Titel wird benötigt</string>
<string name="prCreateSuccess">Pull-Request erfolgreich erstellt</string>
<string name="prAlreadyExists">Zwischen diesen Branches existiert bereits ein Pull-Request</string>
</resources>

View File

@ -37,6 +37,7 @@
<string name="pageTitleExplore">Explorar</string>
<string name="pageTitleAdministration">Gitea Administration</string>
<string name="pageTitleUserAccounts">Manage Accounts</string>
<string name="pageTitleNewPullRequest">New Pull Request</string>
<!-- page titles -->
<string name="repoName">Repo Demo</string>
<string name="repoFullname">Repo con ORG</string>
@ -62,6 +63,7 @@
<string name="navigation_drawer_open">Abrir cajón de navegación</string>
<string name="navigation_drawer_close">Cerrar cajón de navegación</string>
<string name="logo">Iniciar sesión en Gitea</string>
<string name="protocol">Protocol</string>
<string name="urlInfoTooltip">1- Elige el protocolo correcto (https o http).\n2- Introduce Gitea URL p.e: try.gitea.io.\n3- Si has activado 2FA, introduce el código OTP.\n4- Para HTTP Basic Auth usa USUARIO@DOMAIN.COM en la caja de texto URL.</string>
<string name="malformedUrl">Couldn\'t connect to host. Please check your URL or port for any errors</string>
<string name="protocolError">It is not recommended to use HTTP protocol unless you are testing on local network</string>
@ -69,6 +71,7 @@
<string name="emptyFieldURL">Se requiere la URL de la instancia</string>
<string name="emptyFieldUsername">Se requiere el usuario</string>
<string name="emptyFieldPassword">Se requiere la contraseña</string>
<string name="protocolEmptyError">Protocol is required</string>
<string name="checkNetConnection">No se puede acceder a la red, por favor comprueba tu conexión a internet</string>
<string name="netConnectionIsBack">Yay, We have Internet connection!</string>
<string name="repoNameErrorEmpty">El nombre del repositorio está vacío</string>
@ -106,7 +109,6 @@
<string name="tab_text_collaborators">Colaboradores</string>
<string name="tabPullRequests">Peticiones pull</string>
<string name="noDataIssueTab">No se han encontrado incidencias</string>
<string name="infoTabRepoWebsite">Página web</string>
<string name="infoTabRepoSize">Tamaño</string>
<string name="infoTabRepoDefaultBranch">Rama por defecto</string>
<string name="infoTabRepoSshUrl">URL SSH</string>
@ -419,7 +421,6 @@
<string name="genericServerResponseError">We cannot reach the server at the moment, please check your server status and try again</string>
<string name="genericCopyUrl">Copy URL</string>
<!-- generic copy -->
<string name="translateText">Translate GitNex with Crowdin</string>
<string name="exploreTextBoxHint">Explore repositories</string>
<string name="starRepository">Star Repository</string>
<string name="unStarRepository">Unstar Repository</string>
@ -476,7 +477,7 @@
<string name="sharePr">Compartir Pull Request</string>
<string name="shareRepository">Compartir repositorio</string>
<string name="createRepository">Crear repositorio</string>
<string name="commitTitle">Compromisos de la rama</string>
<string name="commitTitle">Commits</string>
<string name="commitCommittedBy">Comisionado por %1$s</string>
<string name="viewCommits">Ver Compromisos</string>
<!-- Memorizing Trust Manager -->
@ -504,7 +505,7 @@
<string name="settingsEnableReportsText">Enable Crash Reports</string>
<string name="crashTitle">GitNex has stopped :(</string>
<string name="setCrashReports">Crash reports</string>
<string name="crashMessage">You can tap the OK button to send the crash report by email. It will help to fix it :)\n\nYou can also add additional content in the email. Thank you!</string>
<string name="crashMessage">It is encouraged to open an issue at the project repository with how to reproduce this bug. It is easier to debug and fix the problem that way.\n\nTap the OK button to send the crash report by email instead. Additional content could be added in the email.\nThank you!</string>
<string name="forceLogoutDialogHeader">Please sign in again</string>
<string name="forceLogoutDialogDescription">Due to some major changes regarding the internal functioning of the app, we require you to login again. These changes allow us to make the app more flexible in the future.\n\nThank you for your patience and sorry for the inconvenience.</string>
<string name="deleteAllDrafts">Delete All Drafts</string>
@ -541,4 +542,39 @@
<string name="markedNotificationsAsRead">Successfully marked all notifications as read</string>
<string name="isRead">Read</string>
<string name="isUnread">Unread</string>
<string name="repoSettingsTitle">Repository Settings</string>
<string name="repoSettingsEditProperties">Edit Properties</string>
<string name="repoSettingsDelete">Delete Repository</string>
<string name="repoSettingsDeleteHint">Be careful, this operation CANNOT be undone!</string>
<string name="repoPropertiesTemplate">Set as Template</string>
<string name="repoPropertiesEnableIssues">Enable Issues</string>
<string name="repoPropertiesExternalIssuesUrl">External Issue Tracker Url</string>
<string name="repoPropertiesEnableWiki">Enable Wiki</string>
<string name="repoPropertiesExternalWikiUrl">External Wiki Url</string>
<string name="repoPropertiesEnablePr">Enable Pull Requests</string>
<string name="repoPropertiesEnableTimeTracker">Enable Time Tracker</string>
<string name="repoPropertiesEnableMergeCommits">Enable Merge Commits</string>
<string name="repoPropertiesEnableRebase">Enable Rebase</string>
<string name="repoPropertiesEnableSquash">Enable Squash and Merge</string>
<string name="repoPropertiesEnableForceMerge">Enable Rebase with Merge Commits (&#8212;&#8212;no-ff)</string>
<string name="repoPropertiesSaveSuccess">Repository properties updated successfully</string>
<string name="repoSettingsDeleteDescription">Things to know before deletion:\n\n- This operation CANNOT be undone.\n- This operation will permanently delete the repository including code, issues, comments, wiki data and collaborator settings.\n\nEnter the repository name as confirmation</string>
<string name="repoSettingsDeleteError">Repository name does not match</string>
<string name="repoDeletionSuccess">Repository deleted successfully</string>
<string name="repoSettingsTransferOwnership">Transfer Ownership</string>
<string name="repoSettingsTransferOwnershipHint">Transfer this repository to a user or to an organization for which you have administrator rights</string>
<string name="repoSettingsTransferOwnershipDescription">Things to know before transfer:\n\n- You will lose access to the repository if you transfer it to an individual user.\n- You will keep access to the repository if you transfer it to an organization that you (co-)own.\n\nEnter the repository name as confirmation</string>
<string name="repoTransferText">Perform Transfer</string>
<string name="repoTransferOwnerText">New Owner</string>
<string name="repoTransferSuccess">Repository transferred successfully</string>
<string name="repoTransferOwnerError">New owner is required</string>
<string name="repoTransferError">There is a problem with the owner name. Make sure that the new owner exists</string>
<string name="mergeIntoBranch">Merge Into</string>
<string name="pullFromBranch">Pull From</string>
<string name="sameBranchesError">These branches are equal. There is no need to create a pull request</string>
<string name="mergeIntoError">Merge into branch is required</string>
<string name="pullFromError">Pull from branch is required</string>
<string name="titleError">Title is required</string>
<string name="prCreateSuccess">Pull Request created successfully</string>
<string name="prAlreadyExists">A pull request between these branches already exists</string>
</resources>

View File

@ -37,6 +37,7 @@
<string name="pageTitleExplore">گشت‌و‌گذار</string>
<string name="pageTitleAdministration">Gitea Administration</string>
<string name="pageTitleUserAccounts">Manage Accounts</string>
<string name="pageTitleNewPullRequest">New Pull Request</string>
<!-- page titles -->
<string name="repoName">مخزن نمایشی</string>
<string name="repoFullname">نخزن با ORG</string>
@ -62,6 +63,7 @@
<string name="navigation_drawer_open">باز کردن کشو ی ناوبری</string>
<string name="navigation_drawer_close">بستن کشوی ناوبری</string>
<string name="logo">ورود به گیتی</string>
<string name="protocol">Protocol</string>
<string name="urlInfoTooltip">1. پروتوکل صحیح را انتخاب کنید (http یا https)
2. URL گیتی را وارد کنید. مثلا: try.gitea.io
3. اگر احراز هویت دو مرحله‌ای را برای حساب خود فعال کرده‌اید، کد را در کادر OTP وارد کنید.
@ -72,6 +74,7 @@
<string name="emptyFieldURL">URL نمونه مورد نیاز است</string>
<string name="emptyFieldUsername">نام کاربری اجباری است</string>
<string name="emptyFieldPassword">گذر واژه اجباری است</string>
<string name="protocolEmptyError">Protocol is required</string>
<string name="checkNetConnection">عدم دسترسی به شبکه، لطفا از برقراری ارتباط با اینترنت مطمئن شوید</string>
<string name="netConnectionIsBack">Yay, We have Internet connection!</string>
<string name="repoNameErrorEmpty">نام مخزن خالی است</string>
@ -109,7 +112,6 @@
<string name="tab_text_collaborators">Collaborators</string>
<string name="tabPullRequests">Pull Requests</string>
<string name="noDataIssueTab">No issues found</string>
<string name="infoTabRepoWebsite">Website</string>
<string name="infoTabRepoSize">Size</string>
<string name="infoTabRepoDefaultBranch">Default Branch</string>
<string name="infoTabRepoSshUrl">SSH URL</string>
@ -422,7 +424,6 @@
<string name="genericServerResponseError">We cannot reach the server at the moment, please check your server status and try again</string>
<string name="genericCopyUrl">Copy URL</string>
<!-- generic copy -->
<string name="translateText">Translate GitNex with Crowdin</string>
<string name="exploreTextBoxHint">Explore repositories</string>
<string name="starRepository">Star Repository</string>
<string name="unStarRepository">Unstar Repository</string>
@ -479,7 +480,7 @@
<string name="sharePr">Share Pull Request</string>
<string name="shareRepository">Share Repository</string>
<string name="createRepository">Create Repository</string>
<string name="commitTitle">Branch Commits</string>
<string name="commitTitle">Commits</string>
<string name="commitCommittedBy">Committed by %1$s</string>
<string name="viewCommits">View Commits</string>
<!-- Memorizing Trust Manager -->
@ -507,7 +508,7 @@
<string name="settingsEnableReportsText">Enable Crash Reports</string>
<string name="crashTitle">GitNex has stopped :(</string>
<string name="setCrashReports">Crash reports</string>
<string name="crashMessage">You can tap the OK button to send the crash report by email. It will help to fix it :)\n\nYou can also add additional content in the email. Thank you!</string>
<string name="crashMessage">It is encouraged to open an issue at the project repository with how to reproduce this bug. It is easier to debug and fix the problem that way.\n\nTap the OK button to send the crash report by email instead. Additional content could be added in the email.\nThank you!</string>
<string name="forceLogoutDialogHeader">Please sign in again</string>
<string name="forceLogoutDialogDescription">Due to some major changes regarding the internal functioning of the app, we require you to login again. These changes allow us to make the app more flexible in the future.\n\nThank you for your patience and sorry for the inconvenience.</string>
<string name="deleteAllDrafts">Delete All Drafts</string>
@ -544,4 +545,39 @@
<string name="markedNotificationsAsRead">Successfully marked all notifications as read</string>
<string name="isRead">Read</string>
<string name="isUnread">Unread</string>
<string name="repoSettingsTitle">Repository Settings</string>
<string name="repoSettingsEditProperties">Edit Properties</string>
<string name="repoSettingsDelete">Delete Repository</string>
<string name="repoSettingsDeleteHint">Be careful, this operation CANNOT be undone!</string>
<string name="repoPropertiesTemplate">Set as Template</string>
<string name="repoPropertiesEnableIssues">Enable Issues</string>
<string name="repoPropertiesExternalIssuesUrl">External Issue Tracker Url</string>
<string name="repoPropertiesEnableWiki">Enable Wiki</string>
<string name="repoPropertiesExternalWikiUrl">External Wiki Url</string>
<string name="repoPropertiesEnablePr">Enable Pull Requests</string>
<string name="repoPropertiesEnableTimeTracker">Enable Time Tracker</string>
<string name="repoPropertiesEnableMergeCommits">Enable Merge Commits</string>
<string name="repoPropertiesEnableRebase">Enable Rebase</string>
<string name="repoPropertiesEnableSquash">Enable Squash and Merge</string>
<string name="repoPropertiesEnableForceMerge">Enable Rebase with Merge Commits (&#8212;&#8212;no-ff)</string>
<string name="repoPropertiesSaveSuccess">Repository properties updated successfully</string>
<string name="repoSettingsDeleteDescription">Things to know before deletion:\n\n- This operation CANNOT be undone.\n- This operation will permanently delete the repository including code, issues, comments, wiki data and collaborator settings.\n\nEnter the repository name as confirmation</string>
<string name="repoSettingsDeleteError">Repository name does not match</string>
<string name="repoDeletionSuccess">Repository deleted successfully</string>
<string name="repoSettingsTransferOwnership">Transfer Ownership</string>
<string name="repoSettingsTransferOwnershipHint">Transfer this repository to a user or to an organization for which you have administrator rights</string>
<string name="repoSettingsTransferOwnershipDescription">Things to know before transfer:\n\n- You will lose access to the repository if you transfer it to an individual user.\n- You will keep access to the repository if you transfer it to an organization that you (co-)own.\n\nEnter the repository name as confirmation</string>
<string name="repoTransferText">Perform Transfer</string>
<string name="repoTransferOwnerText">New Owner</string>
<string name="repoTransferSuccess">Repository transferred successfully</string>
<string name="repoTransferOwnerError">New owner is required</string>
<string name="repoTransferError">There is a problem with the owner name. Make sure that the new owner exists</string>
<string name="mergeIntoBranch">Merge Into</string>
<string name="pullFromBranch">Pull From</string>
<string name="sameBranchesError">These branches are equal. There is no need to create a pull request</string>
<string name="mergeIntoError">Merge into branch is required</string>
<string name="pullFromError">Pull from branch is required</string>
<string name="titleError">Title is required</string>
<string name="prCreateSuccess">Pull Request created successfully</string>
<string name="prAlreadyExists">A pull request between these branches already exists</string>
</resources>

View File

@ -37,6 +37,7 @@
<string name="pageTitleExplore">Explore</string>
<string name="pageTitleAdministration">Gitea Administration</string>
<string name="pageTitleUserAccounts">Manage Accounts</string>
<string name="pageTitleNewPullRequest">New Pull Request</string>
<!-- page titles -->
<string name="repoName">Demo repo</string>
<string name="repoFullname">Repo with ORG</string>
@ -62,6 +63,7 @@
<string name="navigation_drawer_open">Open Navigation Drawer</string>
<string name="navigation_drawer_close">Close Navigation Drawer</string>
<string name="logo">Login to Gitea</string>
<string name="protocol">Protocol</string>
<string name="urlInfoTooltip">1- Choose the correct protocol(https or http). \n2- Enter Gitea url e.g: try.gitea.io. \n3- If you have enabled 2FA for your account, enter the code in the OTP Code field. \n4- For HTTP basic auth use USERNAME@DOMAIN.COM in the URL field.</string>
<string name="malformedUrl">Couldn\'t connect to host. Please check your URL or port for any errors</string>
<string name="protocolError">It is not recommended to use HTTP protocol unless you are testing on local network</string>
@ -69,6 +71,7 @@
<string name="emptyFieldURL">Instance URL is required</string>
<string name="emptyFieldUsername">Username is required</string>
<string name="emptyFieldPassword">Password is required</string>
<string name="protocolEmptyError">Protocol is required</string>
<string name="checkNetConnection">Cannot access network, please check your Internet connection</string>
<string name="netConnectionIsBack">Yay, We have Internet connection!</string>
<string name="repoNameErrorEmpty">Repository name is empty</string>
@ -106,7 +109,6 @@
<string name="tab_text_collaborators">Collaborators</string>
<string name="tabPullRequests">Pull Requests</string>
<string name="noDataIssueTab">No issues found</string>
<string name="infoTabRepoWebsite">Verkkosivusto</string>
<string name="infoTabRepoSize">Koko</string>
<string name="infoTabRepoDefaultBranch">Olutus haara</string>
<string name="infoTabRepoSshUrl">SSH URL</string>
@ -419,7 +421,6 @@
<string name="genericServerResponseError">We cannot reach the server at the moment, please check your server status and try again</string>
<string name="genericCopyUrl">Copy URL</string>
<!-- generic copy -->
<string name="translateText">Translate GitNex with Crowdin</string>
<string name="exploreTextBoxHint">Explore repositories</string>
<string name="starRepository">Star Repository</string>
<string name="unStarRepository">Unstar Repository</string>
@ -476,7 +477,7 @@
<string name="sharePr">Share Pull Request</string>
<string name="shareRepository">Share Repository</string>
<string name="createRepository">Create Repository</string>
<string name="commitTitle">Branch Commits</string>
<string name="commitTitle">Commits</string>
<string name="commitCommittedBy">Committed by %1$s</string>
<string name="viewCommits">View Commits</string>
<!-- Memorizing Trust Manager -->
@ -504,7 +505,7 @@
<string name="settingsEnableReportsText">Enable Crash Reports</string>
<string name="crashTitle">GitNex has stopped :(</string>
<string name="setCrashReports">Crash reports</string>
<string name="crashMessage">You can tap the OK button to send the crash report by email. It will help to fix it :)\n\nYou can also add additional content in the email. Thank you!</string>
<string name="crashMessage">It is encouraged to open an issue at the project repository with how to reproduce this bug. It is easier to debug and fix the problem that way.\n\nTap the OK button to send the crash report by email instead. Additional content could be added in the email.\nThank you!</string>
<string name="forceLogoutDialogHeader">Please sign in again</string>
<string name="forceLogoutDialogDescription">Due to some major changes regarding the internal functioning of the app, we require you to login again. These changes allow us to make the app more flexible in the future.\n\nThank you for your patience and sorry for the inconvenience.</string>
<string name="deleteAllDrafts">Delete All Drafts</string>
@ -541,4 +542,39 @@
<string name="markedNotificationsAsRead">Successfully marked all notifications as read</string>
<string name="isRead">Read</string>
<string name="isUnread">Unread</string>
<string name="repoSettingsTitle">Repository Settings</string>
<string name="repoSettingsEditProperties">Edit Properties</string>
<string name="repoSettingsDelete">Delete Repository</string>
<string name="repoSettingsDeleteHint">Be careful, this operation CANNOT be undone!</string>
<string name="repoPropertiesTemplate">Set as Template</string>
<string name="repoPropertiesEnableIssues">Enable Issues</string>
<string name="repoPropertiesExternalIssuesUrl">External Issue Tracker Url</string>
<string name="repoPropertiesEnableWiki">Enable Wiki</string>
<string name="repoPropertiesExternalWikiUrl">External Wiki Url</string>
<string name="repoPropertiesEnablePr">Enable Pull Requests</string>
<string name="repoPropertiesEnableTimeTracker">Enable Time Tracker</string>
<string name="repoPropertiesEnableMergeCommits">Enable Merge Commits</string>
<string name="repoPropertiesEnableRebase">Enable Rebase</string>
<string name="repoPropertiesEnableSquash">Enable Squash and Merge</string>
<string name="repoPropertiesEnableForceMerge">Enable Rebase with Merge Commits (&#8212;&#8212;no-ff)</string>
<string name="repoPropertiesSaveSuccess">Repository properties updated successfully</string>
<string name="repoSettingsDeleteDescription">Things to know before deletion:\n\n- This operation CANNOT be undone.\n- This operation will permanently delete the repository including code, issues, comments, wiki data and collaborator settings.\n\nEnter the repository name as confirmation</string>
<string name="repoSettingsDeleteError">Repository name does not match</string>
<string name="repoDeletionSuccess">Repository deleted successfully</string>
<string name="repoSettingsTransferOwnership">Transfer Ownership</string>
<string name="repoSettingsTransferOwnershipHint">Transfer this repository to a user or to an organization for which you have administrator rights</string>
<string name="repoSettingsTransferOwnershipDescription">Things to know before transfer:\n\n- You will lose access to the repository if you transfer it to an individual user.\n- You will keep access to the repository if you transfer it to an organization that you (co-)own.\n\nEnter the repository name as confirmation</string>
<string name="repoTransferText">Perform Transfer</string>
<string name="repoTransferOwnerText">New Owner</string>
<string name="repoTransferSuccess">Repository transferred successfully</string>
<string name="repoTransferOwnerError">New owner is required</string>
<string name="repoTransferError">There is a problem with the owner name. Make sure that the new owner exists</string>
<string name="mergeIntoBranch">Merge Into</string>
<string name="pullFromBranch">Pull From</string>
<string name="sameBranchesError">These branches are equal. There is no need to create a pull request</string>
<string name="mergeIntoError">Merge into branch is required</string>
<string name="pullFromError">Pull from branch is required</string>
<string name="titleError">Title is required</string>
<string name="prCreateSuccess">Pull Request created successfully</string>
<string name="prAlreadyExists">A pull request between these branches already exists</string>
</resources>

View File

@ -36,7 +36,8 @@
<string name="pageTitleNewFile">Nouveau fichier</string>
<string name="pageTitleExplore">Explorer</string>
<string name="pageTitleAdministration">Administration de Gitea</string>
<string name="pageTitleUserAccounts">Manage Accounts</string>
<string name="pageTitleUserAccounts">Gestion des comptes</string>
<string name="pageTitleNewPullRequest">New Pull Request</string>
<!-- page titles -->
<string name="repoName">Dépôt de démonstration</string>
<string name="repoFullname">Nom complet du dépôt</string>
@ -62,13 +63,15 @@
<string name="navigation_drawer_open">Ouvrir le volet de navigation</string>
<string name="navigation_drawer_close">Fermer le volet de navigation</string>
<string name="logo">Se connecter à Gitea</string>
<string name="protocol">Protocole</string>
<string name="urlInfoTooltip">1. Choisissez le protocole adéquat (HTTPS ou HTTP)\n2. Entrez lURL de votre instance Gitea (ex : try.gitea.io)\n3. Si lauthentification à deux facteurs est activée pour votre compte, saisissez le code OTP\n4. Pour une authentification basique avec HTTP, utilisez NOMDUTILISATEUR@DOMAINE.COM dans le champ URL GITEA</string>
<string name="malformedUrl">Couldn\'t connect to host. Please check your URL or port for any errors</string>
<string name="protocolError">It is not recommended to use HTTP protocol unless you are testing on local network</string>
<string name="malformedJson">Malformed JSON was received. Server response was not successful</string>
<string name="malformedUrl">Connexion impossible. Veuillez vérifier lURL et le port</string>
<string name="protocolError">Le protocole HTTP est déconseillé en dehors de tests sur un réseau local</string>
<string name="malformedJson">JSON mal formé. Le serveur ne répond pas.</string>
<string name="emptyFieldURL">URL de linstance requise</string>
<string name="emptyFieldUsername">Nom dutilisateur requis</string>
<string name="emptyFieldPassword">Mot de passe requis</string>
<string name="protocolEmptyError">Le protocole est requis</string>
<string name="checkNetConnection">Impossible daccéder au réseau, veuillez vérifier votre connexion Internet</string>
<string name="netConnectionIsBack">On a Internet, youpi !</string>
<string name="repoNameErrorEmpty">Nom manquant</string>
@ -86,7 +89,7 @@
<string name="orgCreatedError">Une erreur sest produite, veuillez réessayer</string>
<string name="orgExistsError">Ce nom dorganisation est déjà pris</string>
<string name="binaryFileError">Les fichiers binaires ne sont pas encore pris en charge.</string>
<string name="fileTooLarge">This file exceeds the maximum possible diff lines</string>
<string name="fileTooLarge">Ce fichier dépasse le maximum de lignes de diff</string>
<string name="processingText">Traitement en cours</string>
<string name="search">Rechercher</string>
<string name="close">Fermer</string>
@ -106,7 +109,6 @@
<string name="tab_text_collaborators">Collaborateurs</string>
<string name="tabPullRequests">Demandes de tirage</string>
<string name="noDataIssueTab">Aucun ticket</string>
<string name="infoTabRepoWebsite">Site Web</string>
<string name="infoTabRepoSize">Taille</string>
<string name="infoTabRepoDefaultBranch">Branche par défaut</string>
<string name="infoTabRepoSshUrl">URL SSH</string>
@ -128,7 +130,7 @@
<string name="commentEmptyError">Veuillez saisir votre commentaire</string>
<string name="commentSuccess">Commentaire publié</string>
<string name="commentError">Une erreur sest produite, veuillez réessayer</string>
<string name="featureDeprecated">This function will be removed in the future</string>
<string name="featureDeprecated">Cette fonction sera prochainement supprimée</string>
<string name="generalImgContentText">Avatar</string>
<string name="noDataMilestonesTab">Aucun jalon</string>
<string name="commitAuthor">Auteur de la révision : %1$s</string>
@ -223,7 +225,7 @@
<string name="labelDeleteErrorText">Une erreur sest produite, veuillez réessayer</string>
<string name="noDataBranchesTab">Aucune branche</string>
<string name="alertDialogTokenRevokedTitle">Erreur dautorisation</string>
<string name="alertDialogTokenRevokedMessage">It seems that the Access Token is revoked OR your are not allowed to see these contents.\n\nIn case of revoked Token, please logout and login again</string>
<string name="alertDialogTokenRevokedMessage">Le jeton daccès est peut-être révoqué ou vous nêtes pas autorisé à voir ce contenu.\n\nEn cas de jeton révoqué, veuillez vous reconnecter</string>
<string name="alertDialogTokenRevokedCopyNegativeButton">Annuler</string>
<string name="alertDialogTokenRevokedCopyPositiveButton">Déconnexion</string>
<string name="labelDeleteTitle">Supprimer\u0020</string>
@ -273,7 +275,7 @@
<string name="editCommentUpdatedText">Commentaire modifié</string>
<string name="issueCommentShare">Partager le commentaire</string>
<string name="deleteCommentSuccess">Commentaire supprimé avec succès</string>
<string name="copyCommentText">Copy Comment</string>
<string name="copyCommentText">Copier le commentaire</string>
<!-- issue comments -->
<!-- add collaborator -->
<string name="addCollaboratorTitle">Gérer les collaborateurs</string>
@ -290,8 +292,8 @@
<string name="profileCreateNewEmailAddress">Ajouter une adresse e-mail</string>
<string name="profileEmailButton">Sauvegarder</string>
<string name="profileEmailTitle">Adresse e-mail</string>
<string name="emailAddedText">New email added successfully</string>
<string name="emailErrorEmpty">Email address is empty</string>
<string name="emailAddedText">Nouvelle adresse e-mail ajoutée</string>
<string name="emailErrorEmpty">Adresse e-mail manquante</string>
<string name="emailErrorInvalid">Adresse e-mail invalide</string>
<string name="emailErrorInUse">Adresse e-mail déjà utilisée</string>
<string name="emailTypeText">Principale</string>
@ -351,9 +353,9 @@
<string name="titleErrorEmpty">Titre requis</string>
<string name="releaseCreatedText">Nouvelle version créée</string>
<!-- release -->
<string name="loginOTPTypeError">OTP code should be numbers</string>
<string name="loginOTPTypeError">Le code OTP est un nombre</string>
<string name="loginOTP">Code OTP (si nécessaire)</string>
<string name="otpMessage">Enter otp code if 2FA is enabled</string>
<string name="otpMessage">Entrez le code OTP si lauthentification à deux facteurs est activée</string>
<string name="openWebRepo">Ouvrir dans le navigateur</string>
<string name="repoStargazersInMenu">Fans</string>
<string name="repoWatchersInMenu">Observateurs</string>
@ -417,9 +419,8 @@
<string name="isOpen">Ouvert</string>
<string name="isClosed">Fermé</string>
<string name="genericServerResponseError">Impossible de se connecter au serveur pour le moment, veuillez vérifier son statut puis réessayer</string>
<string name="genericCopyUrl">Copy URL</string>
<string name="genericCopyUrl">Copier lURL</string>
<!-- generic copy -->
<string name="translateText">Traduire GitNex avec Crowdin</string>
<string name="exploreTextBoxHint">Explorer les dépôts</string>
<string name="starRepository">Ajouter aux favoris</string>
<string name="unStarRepository">Retirer des favoris</string>
@ -430,14 +431,14 @@
<string name="watchRepositorySuccess">Vous suivez ce dépôt</string>
<string name="unWatchRepositorySuccess">Vous ne suivez plus ce dépôt</string>
<string name="titleDrafts">Brouillons</string>
<string name="versionUnsupportedOld">Unsupported old version(%1$s) of Gitea detected. Please update to latest stable version. If you continue, the app may not function properly</string>
<string name="versionUnsupportedOld">Ancienne version de Gitea détectée (%1$s). Faire la mise à jour vers la dernière version stable est fortement recommandé.</string>
<string name="versionUnsupportedNew">Nouvelle version de Gitea détectée ! Veuillez mettre à jour GitNex !</string>
<string name="versionUnknown">Aucun serveur Gitea détecté !</string>
<string name="versionAlertDialogHeader">Version de Gitea non prise en charge</string>
<string name="loginViaPassword">Nom dutilisateur / mot de passe</string>
<string name="loginMethodText">Choisissez une méthode de connexion pour accéder à votre compte. Le jeton est la plus sécurisée !</string>
<string name="unauthorizedApiError">L\'instance a renvoyé une erreur « Autorisation refusée ». Vérifiez vos identifiants et réessayez.</string>
<string name="loginTokenError">Token is required</string>
<string name="loginTokenError">Jeton est requis</string>
<string name="prDeletedFrok">Fourche supprimée</string>
<string name="noDataPullRequests">Aucune demande de tirage</string>
<string name="prCreator">Auteur :\u0020</string>
@ -452,7 +453,7 @@
<string name="mergePullRequestButtonText">Fusionner</string>
<string name="deleteBranchAfterMerge">Supprimer la branche après la fusion</string>
<string name="mergeNoteText">La fusion peut échouer si vous nêtes pas autorisé à fusionner cette demande de tirage.</string>
<string name="mergeInfoDisabledMessage">Disabled Merge button means that there are conflicts OR other things to fix before Merge</string>
<string name="mergeInfoDisabledMessage">Le bouton Fusion désactivé signifie quil y a des conflits ou des choses à corriger au préalable</string>
<string name="deleteBranchForkInfo">Cette branche appartient à un dépôt forké</string>
<string name="mergeCommentText">Commentaire de la fusion</string>
<string name="mergePRSuccessMsg">La demande de tirage a été fusionnée</string>
@ -465,24 +466,24 @@
<string name="waitLoadingDownloadFile">Chargement du fichier dans la mémoire</string>
<string name="downloadFileSaved">Fichier sauvegardé avec succès</string>
<string name="excludeFilesInFileviewer">La visionneuse ne prend pas en charge ce type de fichier. Télécharger ce fichier ?</string>
<string name="deleteFile">Delete This File</string>
<string name="editFile">Edit This File</string>
<string name="deleteFileText">Delete %1$s</string>
<string name="deleteFileMessage">File is set for deletion by branch %1$s</string>
<string name="editFileText">Edit %1$s</string>
<string name="editFileMessage">File is modified by branch %1$s</string>
<string name="deleteFile">Supprimer ce fichier</string>
<string name="editFile">Éditer ce fichier</string>
<string name="deleteFileText">Supprimer %1$s</string>
<string name="deleteFileMessage">Fichier supprimé par la branche %1$s</string>
<string name="editFileText">Modifier %1$s</string>
<string name="editFileMessage">Fichier modifié par la branche %1$s</string>
<string name="sizeCopy">Taille</string>
<string name="shareIssue">Partager le ticket</string>
<string name="sharePr">Partager la demande de tirage</string>
<string name="shareRepository">Partager le dépôt</string>
<string name="createRepository">Créer un dépôt</string>
<string name="commitTitle">Révisions de la branche</string>
<string name="commitTitle">Révisions</string>
<string name="commitCommittedBy">Révision de %1$s</string>
<string name="viewCommits">Voir révisions</string>
<!-- Memorizing Trust Manager -->
<string name="mtm_notification">Vérification du certificat</string>
<string name="mtm_accept_cert">Accepter le certificat inconnu ?</string>
<string name="mtm_trust_anchor">The server certificate is not signed by a known Certificate Authority</string>
<string name="mtm_trust_anchor">Le certificat du serveur est signé par une autorité de certification inconnue</string>
<string name="mtm_cert_expired">Le certificat du serveur a expiré.</string>
<string name="mtm_accept_server_name">Accepter le nom de serveur incohérent ?</string>
<string name="mtm_hostname_mismatch">Le serveur ne peut sauthentifier comme « %s ». Le certificat est valide pour :</string>
@ -504,7 +505,7 @@
<string name="settingsEnableReportsText">Rapports de plantage</string>
<string name="crashTitle">GitNex a planté :(</string>
<string name="setCrashReports">Rapports de plantage</string>
<string name="crashMessage">Cliquez sur OK pour nous envoyer un courriel avec le rapport de plantage. Cela nous aidera à corriger le problème. :)\n\nVous pouvez aussi ajouter vos propres observations. Merci !</string>
<string name="crashMessage">Il est conseillé de créer un ticket expliquant comment reproduire ce bogue pour faciliter la correction du problème.\n\nAppuyez sur OK si vous préférez envoyer le rapport de plantage par courriel. Libre à vous dy ajouter du contenu supplémentaire.\nMerci!</string>
<string name="forceLogoutDialogHeader">Veuillez vous reconnecter</string>
<string name="forceLogoutDialogDescription">Une reconnexion est nécessaire en raison de changements majeurs du fonctionnement interne pour améliorer la souplesse de l\'application.\n\nMerci pour votre patience et toutes nos excuses pour la gêne occasionnée.</string>
<string name="deleteAllDrafts">Supprimer tous les brouillons</string>
@ -520,13 +521,13 @@
<string name="reportsHintText">Rapports de plantage</string>
<string name="archivedRepository">Archivé</string>
<string name="accountDeletedMessage">Compte supprimé</string>
<string name="removeAccountPopupTitle">Remove Account</string>
<string name="removeAccountPopupMessage">Are you sure you want to remove this account from the app?\n\nThis will remove all the data related to this account on the app only.</string>
<string name="addNewAccount">New Account</string>
<string name="addNewAccountText">Add New Account</string>
<string name="accountAlreadyExistsError">Account already exists in the app</string>
<string name="accountAddedMessage">Account added successfully</string>
<string name="switchAccountSuccess">Switched to account : %1$s@%2$s</string>
<string name="removeAccountPopupTitle">Supprimer le compte</string>
<string name="removeAccountPopupMessage">Êtes-vous sûr de vouloir supprimer ce compte de lapplication ?\n\nSeules les données de lapplication seront supprimées.</string>
<string name="addNewAccount">Nouveau compte</string>
<string name="addNewAccountText">Ajouter un nouveau compte</string>
<string name="accountAlreadyExistsError">Ce compte existe déjà dans lapplication</string>
<string name="accountAddedMessage">Compte ajouté</string>
<string name="switchAccountSuccess">Passé au compte : %1$s@%2$s</string>
<!-- Notifications -->
<string name="pageTitleNotifications">Notifications</string>
<string name="noDataNotifications">Aucune notification</string>
@ -534,11 +535,46 @@
<string name="notificationsPollingHeaderText">Délai de scrutation des notifications</string>
<string name="pollingDelaySelectedText">%d minutes</string>
<string name="pollingDelayDialogHeaderText">Délai de scrutation</string>
<string name="pollingDelayDialogDescriptionText">Choose a minutely delay in which GitNex tries to poll new notifications</string>
<string name="pollingDelayDialogDescriptionText">Choisissez un délai de scrutation où GitNex obtient les notifications</string>
<string name="markAsRead">Marquer comme lu</string>
<string name="markAsUnread">Marquer comme non lu</string>
<string name="pinNotification">Épingler la notification</string>
<string name="markedNotificationsAsRead">Successfully marked all notifications as read</string>
<string name="markedNotificationsAsRead">Les notifications ont été marquées comme lues</string>
<string name="isRead">Lu</string>
<string name="isUnread">Non lu</string>
<string name="repoSettingsTitle">Paramètres du dépôt</string>
<string name="repoSettingsEditProperties">Modifier les propriétés</string>
<string name="repoSettingsDelete">Supprimer le dépôt</string>
<string name="repoSettingsDeleteHint">Attention, cette opération est IRRÉVERSIBLE !</string>
<string name="repoPropertiesTemplate">Définir comme modèle</string>
<string name="repoPropertiesEnableIssues">Activer les tickets</string>
<string name="repoPropertiesExternalIssuesUrl">URL externe des tickets</string>
<string name="repoPropertiesEnableWiki">Activer le wiki</string>
<string name="repoPropertiesExternalWikiUrl">URL externe du wiki</string>
<string name="repoPropertiesEnablePr">Activer les requêtes de tirage</string>
<string name="repoPropertiesEnableTimeTracker">Activer lhorodatage</string>
<string name="repoPropertiesEnableMergeCommits">Activer la fusion des révisions</string>
<string name="repoPropertiesEnableRebase">Activer le rebasage</string>
<string name="repoPropertiesEnableSquash">Activer squash et fusion</string>
<string name="repoPropertiesEnableForceMerge">Activer resbasage avec révision de fusion (&#8212;&#8212;no-ff)</string>
<string name="repoPropertiesSaveSuccess">Propriétés du dépôt mises à jour</string>
<string name="repoSettingsDeleteDescription">Cette opération est IRRÉVERSIBLE.\nSoyez conscient que le dépôt et son contenu (code, tickets, commentaires, wiki, contributions…) seront définitivement supprimés.\n\nEntrez le nom du dépôt afin de confirmer cette opération.</string>
<string name="repoSettingsDeleteError">Nom du dépôt incorrect</string>
<string name="repoDeletionSuccess">Dépôt supprimé</string>
<string name="repoSettingsTransferOwnership">Changer de propriétaire</string>
<string name="repoSettingsTransferOwnershipHint">Transfère le dépôt à un autre utilisateur ou une autre organisation dont vous possédez les droits d\'administrateur</string>
<string name="repoSettingsTransferOwnershipDescription">Choses à savoir avant le transfert :\n\n- Vous perdez laccès au dépôt si vous le transférez à un autre utilisateur.\n- Vous conservez laccès au dépôt si vous le transférez à une organisation que vous (co-)gérez.\n\nEntrez le nom du dépôt pour confirmer</string>
<string name="repoTransferText">Transférer</string>
<string name="repoTransferOwnerText">Nouveau propriétaire</string>
<string name="repoTransferSuccess">Dépôt transféré</string>
<string name="repoTransferOwnerError">Un nouveau propriétaire est requis</string>
<string name="repoTransferError">Erreur avec le nom du propriétaire. Assurez-vous que le nouveau propriétaire existe</string>
<string name="mergeIntoBranch">Merge Into</string>
<string name="pullFromBranch">Pull From</string>
<string name="sameBranchesError">These branches are equal. There is no need to create a pull request</string>
<string name="mergeIntoError">Merge into branch is required</string>
<string name="pullFromError">Pull from branch is required</string>
<string name="titleError">Title is required</string>
<string name="prCreateSuccess">Pull Request created successfully</string>
<string name="prAlreadyExists">A pull request between these branches already exists</string>
</resources>

View File

@ -37,6 +37,7 @@
<string name="pageTitleExplore">Esplora</string>
<string name="pageTitleAdministration">Amministrazione Gitea</string>
<string name="pageTitleUserAccounts">Manage Accounts</string>
<string name="pageTitleNewPullRequest">New Pull Request</string>
<!-- page titles -->
<string name="repoName">Demo repo</string>
<string name="repoFullname">Repo con ORG</string>
@ -62,6 +63,7 @@
<string name="navigation_drawer_open">Apri panello Navigazione</string>
<string name="navigation_drawer_close">Chiudi panello Navigazione</string>
<string name="logo">Accedi a Gitea</string>
<string name="protocol">Protocol</string>
<string name="urlInfoTooltip">1- Scegli il protocollo corretto(https or http). \n2- Enter Gitea url e.g: try.gitea.io. \n3- If you have enabled 2FA for your account, enter the code in the OTP Code field. \n4- For HTTP basic auth use USERNAME@DOMAIN.COM in the URL field.</string>
<string name="malformedUrl">Couldn\'t connect to host. Please check your URL or port for any errors</string>
<string name="protocolError">It is not recommended to use HTTP protocol unless you are testing on local network</string>
@ -70,6 +72,7 @@
URL è richiesto</string>
<string name="emptyFieldUsername">Nome utente obbligatorio</string>
<string name="emptyFieldPassword">Password obbligatoria</string>
<string name="protocolEmptyError">Protocol is required</string>
<string name="checkNetConnection">Errore di connessione. Controllare la connessione Internet</string>
<string name="netConnectionIsBack">Yay, la connessione ad Internet funziona!</string>
<string name="repoNameErrorEmpty">Il nome del repository è vuoto</string>
@ -107,7 +110,6 @@ URL è richiesto</string>
<string name="tab_text_collaborators">Collaboratori</string>
<string name="tabPullRequests">Pull Requests</string>
<string name="noDataIssueTab">Nessun problema trovato</string>
<string name="infoTabRepoWebsite">Sito Web</string>
<string name="infoTabRepoSize">Dimensione</string>
<string name="infoTabRepoDefaultBranch">Branch predefinito</string>
<string name="infoTabRepoSshUrl">SSH URL</string>
@ -421,7 +423,6 @@ autorizzazione</string>
<string name="genericServerResponseError">Al momento non possiamo raggiungere il server, controlla lo stato del tuo server e riprova</string>
<string name="genericCopyUrl">Copy URL</string>
<!-- generic copy -->
<string name="translateText">Traduci GitNex con Crowdin</string>
<string name="exploreTextBoxHint">Esplora i repository</string>
<string name="starRepository">Repository star</string>
<string name="unStarRepository">Unstar Repository</string>
@ -478,7 +479,7 @@ autorizzazione</string>
<string name="sharePr">Condividi Pull Request</string>
<string name="shareRepository">Condividi Repository</string>
<string name="createRepository">Crea Repository</string>
<string name="commitTitle">Commit del branch</string>
<string name="commitTitle">Commits</string>
<string name="commitCommittedBy">Commit di %1$s</string>
<string name="viewCommits">Visualizza Commit</string>
<!-- Memorizing Trust Manager -->
@ -506,7 +507,7 @@ autorizzazione</string>
<string name="settingsEnableReportsText">Abilita Rapporti Crash</string>
<string name="crashTitle">GitNex ha smesso di funzionare :(</string>
<string name="setCrashReports">Rapporti crash</string>
<string name="crashMessage">Puoi premere il pulsante OK per inviare la segnalazione di crash via email. Aiuterà a risolvere il problema :)\n\nPuoi anche aggiungere altri dettagli nell\'email. Grazie!</string>
<string name="crashMessage">It is encouraged to open an issue at the project repository with how to reproduce this bug. It is easier to debug and fix the problem that way.\n\nTap the OK button to send the crash report by email instead. Additional content could be added in the email.\nThank you!</string>
<string name="forceLogoutDialogHeader">Per favore accedi di nuovo</string>
<string name="forceLogoutDialogDescription">A causa di alcune modifiche importanti riguardanti il funzionamento interno dell\'app, abbiamo bisogno che tu effettui nuovamente il login. Queste modifiche ci permettono di rendere l\'applicazione più flessibile in futuro.\n\nGrazie per la pazienza e ci scusiamo per il disagio.</string>
<string name="deleteAllDrafts">Elimina Tutte Le Bozze</string>
@ -543,4 +544,39 @@ autorizzazione</string>
<string name="markedNotificationsAsRead">Successfully marked all notifications as read</string>
<string name="isRead">Letto</string>
<string name="isUnread">Non letto</string>
<string name="repoSettingsTitle">Repository Settings</string>
<string name="repoSettingsEditProperties">Edit Properties</string>
<string name="repoSettingsDelete">Delete Repository</string>
<string name="repoSettingsDeleteHint">Be careful, this operation CANNOT be undone!</string>
<string name="repoPropertiesTemplate">Set as Template</string>
<string name="repoPropertiesEnableIssues">Enable Issues</string>
<string name="repoPropertiesExternalIssuesUrl">External Issue Tracker Url</string>
<string name="repoPropertiesEnableWiki">Enable Wiki</string>
<string name="repoPropertiesExternalWikiUrl">External Wiki Url</string>
<string name="repoPropertiesEnablePr">Enable Pull Requests</string>
<string name="repoPropertiesEnableTimeTracker">Enable Time Tracker</string>
<string name="repoPropertiesEnableMergeCommits">Enable Merge Commits</string>
<string name="repoPropertiesEnableRebase">Enable Rebase</string>
<string name="repoPropertiesEnableSquash">Enable Squash and Merge</string>
<string name="repoPropertiesEnableForceMerge">Enable Rebase with Merge Commits (&#8212;&#8212;no-ff)</string>
<string name="repoPropertiesSaveSuccess">Repository properties updated successfully</string>
<string name="repoSettingsDeleteDescription">Things to know before deletion:\n\n- This operation CANNOT be undone.\n- This operation will permanently delete the repository including code, issues, comments, wiki data and collaborator settings.\n\nEnter the repository name as confirmation</string>
<string name="repoSettingsDeleteError">Repository name does not match</string>
<string name="repoDeletionSuccess">Repository deleted successfully</string>
<string name="repoSettingsTransferOwnership">Transfer Ownership</string>
<string name="repoSettingsTransferOwnershipHint">Transfer this repository to a user or to an organization for which you have administrator rights</string>
<string name="repoSettingsTransferOwnershipDescription">Things to know before transfer:\n\n- You will lose access to the repository if you transfer it to an individual user.\n- You will keep access to the repository if you transfer it to an organization that you (co-)own.\n\nEnter the repository name as confirmation</string>
<string name="repoTransferText">Perform Transfer</string>
<string name="repoTransferOwnerText">New Owner</string>
<string name="repoTransferSuccess">Repository transferred successfully</string>
<string name="repoTransferOwnerError">New owner is required</string>
<string name="repoTransferError">There is a problem with the owner name. Make sure that the new owner exists</string>
<string name="mergeIntoBranch">Merge Into</string>
<string name="pullFromBranch">Pull From</string>
<string name="sameBranchesError">These branches are equal. There is no need to create a pull request</string>
<string name="mergeIntoError">Merge into branch is required</string>
<string name="pullFromError">Pull from branch is required</string>
<string name="titleError">Title is required</string>
<string name="prCreateSuccess">Pull Request created successfully</string>
<string name="prAlreadyExists">A pull request between these branches already exists</string>
</resources>

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