Merge branch 'main' into 7-assign-team-to-repo

This commit is contained in:
M M Arif 2021-08-02 20:08:41 +02:00
commit 6a6ecd251a
152 changed files with 5009 additions and 1346 deletions

View File

@ -15,8 +15,8 @@ steps:
image: zosiab/eclint:latest image: zosiab/eclint:latest
depends_on: [ clone ] depends_on: [ clone ]
commands: commands:
- git pull origin master - git pull origin main
- eclint check $(git diff --name-only origin/master) - eclint check $(git diff --name-only origin/main)
# This may be used in the future, because it makes of intellij's native code inspection/formatting capabilities. # This may be used in the future, because it makes of intellij's native code inspection/formatting capabilities.
# Additional information: https://www.jetbrains.com/help/idea/command-line-formatter.html # Additional information: https://www.jetbrains.com/help/idea/command-line-formatter.html
@ -54,7 +54,7 @@ trigger:
event: event:
- push - push
branch: branch:
- master - main
--- ---
kind: pipeline kind: pipeline
@ -101,4 +101,4 @@ trigger:
event: event:
- push - push
branch: branch:
- master - main

View File

@ -31,7 +31,7 @@
<!-- Screenshots and stacktrace's can go here. --> <!-- Screenshots and stacktrace's can go here. -->
<br><br> <br><br>
- [ ] I carefully read the [contribution guidelines](https://codeberg.org/GitNex/GitNex/src/branch/master/CONTRIBUTING.md). - [ ] I carefully read the [contribution guidelines](https://codeberg.org/GitNex/GitNex/src/branch/main/CONTRIBUTING.md).
<br> <br>
#### Thank you for your time. #### Thank you for your time.

View File

@ -2,8 +2,8 @@
<!-- Create a new issue, if it doesn't exist yet --> <!-- Create a new issue, if it doesn't exist yet -->
<br><br> <br><br>
<!-- Make sure you are targeting the master branch, pull requests on release branches are only allowed for bug fixes. --> <!-- Make sure you are targeting the "main" branch, pull requests on release branches are only allowed for bug fixes. -->
- [ ] I carefully read the [contribution guidelines](https://codeberg.org/GitNex/GitNex/src/branch/master/CONTRIBUTING.md). - [ ] I carefully read the [contribution guidelines](https://codeberg.org/GitNex/GitNex/src/branch/main/CONTRIBUTING.md).
- [ ] I'm following the code standards as defined [here](https://codeberg.org/gitnex/GitNex/wiki/Code-Standards). - [ ] I'm following the code standards as defined [here](https://codeberg.org/gitnex/GitNex/wiki/Code-Standards).
- [ ] By submitting this pull request, I permit GitNex to license my work under the [GNU General Public License v3](https://codeberg.org/GitNex/GitNex/src/branch/master/LICENSE). - [ ] By submitting this pull request, I permit GitNex to license my work under the [GNU General Public License v3](https://codeberg.org/GitNex/GitNex/src/branch/main/LICENSE).

View File

@ -4,10 +4,10 @@ stages:
- publish - publish
on_setup: on_setup:
image: tutum/curl image: curlimages/curl:7.77.0
stage: .pre stage: .pre
only: only:
- master - main
- tags - tags
variables: variables:
INSTANCE: "https://codeberg.org" INSTANCE: "https://codeberg.org"
@ -20,7 +20,7 @@ build:
image: nextcloudci/android:android-54 image: nextcloudci/android:android-54
stage: build stage: build
only: only:
- master - main
- tags - tags
script: script:
- ./gradlew assembleFreeRelease - ./gradlew assembleFreeRelease
@ -33,7 +33,7 @@ sign:
image: nextcloudci/android:android-54 image: nextcloudci/android:android-54
stage: sign stage: sign
only: only:
- master - main
- tags - tags
variables: variables:
OUTPUT: "signed.apk" OUTPUT: "signed.apk"
@ -47,10 +47,10 @@ sign:
expire_in: 15 minutes expire_in: 15 minutes
latest: latest:
image: tutum/curl image: curlimages/curl:7.77.0
stage: publish stage: publish
only: only:
- master - main
- tags - tags
variables: variables:
WEBDAV_USERNAME: "GitNexBot" WEBDAV_USERNAME: "GitNexBot"
@ -60,7 +60,7 @@ latest:
- curl -T "$PLUGIN_FILE" -u "$WEBDAV_USERNAME":"$WEBDAV_PASSWORD" "$PLUGIN_DESTINATION" - curl -T "$PLUGIN_FILE" -u "$WEBDAV_USERNAME":"$WEBDAV_PASSWORD" "$PLUGIN_DESTINATION"
release: release:
image: tutum/curl image: curlimages/curl:7.77.0
stage: publish stage: publish
only: only:
- tags - tags
@ -72,10 +72,10 @@ release:
- curl -T "$PLUGIN_FILE" -u "$WEBDAV_USERNAME":"$WEBDAV_PASSWORD" 'https://cloud.swatian.com/remote.php/dav/files/GitNexBot/gitnex/releases/'"$CI_COMMIT_REF_NAME"'.apk' - curl -T "$PLUGIN_FILE" -u "$WEBDAV_USERNAME":"$WEBDAV_PASSWORD" 'https://cloud.swatian.com/remote.php/dav/files/GitNexBot/gitnex/releases/'"$CI_COMMIT_REF_NAME"'.apk'
on_success: on_success:
image: tutum/curl image: curlimages/curl:7.77.0
stage: .post stage: .post
only: only:
- master - main
- tags - tags
variables: variables:
INSTANCE: "https://codeberg.org" INSTANCE: "https://codeberg.org"
@ -86,10 +86,10 @@ on_success:
when: on_success when: on_success
on_failure: on_failure:
image: tutum/curl image: curlimages/curl:7.77.0
stage: .post stage: .post
only: only:
- master - main
- tags - tags
variables: variables:
INSTANCE: "https://codeberg.org" INSTANCE: "https://codeberg.org"

View File

@ -29,7 +29,7 @@ It is documented in the Wiki: [Code-Standards](https://codeberg.org/gitnex/GitNe
2. Clone the forked repository from your namespace to your local machine. 2. Clone the forked repository from your namespace to your local machine.
3. Create a new branch and work on your feature, enhancement or patch. 3. Create a new branch and work on your feature, enhancement or patch.
4. Push your commits to your forked version. 4. Push your commits to your forked version.
5. You can now create a PR using the web interface against **master** branch. 5. You can now create a PR using the web interface against **main** branch.
For more information, click [here](http://makeapullrequest.com/). For more information, click [here](http://makeapullrequest.com/).

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) [![Pipeline status](https://img.shields.io/gitlab/pipeline/opyale/gitnex/master)](https://gitlab.com/opyale/gitnex/-/pipelines) [![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/main)](https://gitlab.com/opyale/gitnex/-/pipelines) [![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="Become a Patroen" src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" height="40"/>](https://www.patreon.com/mmarif)
@ -11,7 +11,7 @@ GitNex is licensed under GPLv3 License. See the LICENSE file for the full licens
## Downloads ## Downloads
[<img alt='Get it on F-droid' src='https://gitlab.com/fdroid/artwork/raw/master/badge/get-it-on.png' height="80"/>](https://f-droid.org/en/packages/org.mian.gitnex/) [<img alt='Get it on F-droid' src='https://gitlab.com/fdroid/artwork/raw/master/badge/get-it-on.png' height="80"/>](https://f-droid.org/en/packages/org.mian.gitnex/)
[<img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png' height="80"/>](https://play.google.com/store/apps/details?id=org.mian.gitnex.pro) [<img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png' height="80"/>](https://play.google.com/store/apps/details?id=org.mian.gitnex.pro)
[<img alt='Download builds and releases' src='https://codeberg.org/gitnex/GitNex/raw/branch/master/assets/apk-badge.png' height="82"/>](https://cloud.swatian.com/s/DN7E5xxtaw4fRbE) [<img alt='Download builds and releases' src='https://codeberg.org/gitnex/GitNex/raw/branch/main/assets/apk-badge.png' height="82"/>](https://cloud.swatian.com/s/DN7E5xxtaw4fRbE)
## Note about Gitea version ## Note about Gitea version
Please make sure that you are on latest stable release or later for better app experience. Please make sure that you are on latest stable release or later for better app experience.
@ -37,7 +37,7 @@ Option 2 - Open terminal(Linux) and cd to the project dir. Run `./gradlew assemb
- [MANY MORE](https://codeberg.org/gitnex/GitNex/wiki/Features) - [MANY MORE](https://codeberg.org/gitnex/GitNex/wiki/Features)
## Contributing ## Contributing
[CONTRIBUTING](https://codeberg.org/gitnex/GitNex/src/branch/master/CONTRIBUTING.md) [CONTRIBUTING](https://codeberg.org/gitnex/GitNex/src/branch/main/CONTRIBUTING.md)
## Translation ## Translation
Help us translate GitNex to your native language. Help us translate GitNex to your native language.
@ -48,9 +48,9 @@ We use [Crowdin](https://crowdin.com/project/gitnex) for translation. If your la
## Screenshots: ## Screenshots:
<img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/001.png" alt="001.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/002.png" alt="002.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/003.png" alt="003.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/004.png" alt="004.png" width="200"/> <img src="https://codeberg.org/gitnex/GitNex/raw/branch/main/fastlane/metadata/android/en-US/images/phoneScreenshots/001.png" alt="001.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/main/fastlane/metadata/android/en-US/images/phoneScreenshots/002.png" alt="002.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/main/fastlane/metadata/android/en-US/images/phoneScreenshots/003.png" alt="003.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/main/fastlane/metadata/android/en-US/images/phoneScreenshots/004.png" alt="004.png" width="200"/>
---|---|---|--- ---|---|---|---
<img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/005.png" alt="005.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/006.png" alt="006.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/007.png" alt="007.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/008.png" alt="008.png" width="200"/> <img src="https://codeberg.org/gitnex/GitNex/raw/branch/main/fastlane/metadata/android/en-US/images/phoneScreenshots/005.png" alt="005.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/main/fastlane/metadata/android/en-US/images/phoneScreenshots/006.png" alt="006.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/main/fastlane/metadata/android/en-US/images/phoneScreenshots/007.png" alt="007.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/main/fastlane/metadata/android/en-US/images/phoneScreenshots/008.png" alt="008.png" width="200"/>
## Links ## Links
[Website](https://gitnex.com) [Website](https://gitnex.com)

View File

@ -56,12 +56,13 @@ configurations {
dependencies { dependencies {
def lifecycle_version = '2.3.1' def lifecycle_version = '2.3.1'
def markwon_version = '4.6.2' def markwon_version = '4.6.2'
def work_version = "2.5.0" def work_version = "2.7.0-alpha04"
def acra = "5.7.0" def acra = "5.7.0"
implementation fileTree(include: ['*.jar'], dir: 'libs') implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.3.0-rc01' implementation 'androidx.appcompat:appcompat:1.4.0-alpha02'
implementation 'com.google.android.material:material:1.3.0' implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.viewpager2:viewpager2:1.1.0-alpha01'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation "androidx.legacy:legacy-support-v4:1.0.0" implementation "androidx.legacy:legacy-support-v4:1.0.0"
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
@ -103,14 +104,14 @@ dependencies {
implementation "ch.acra:acra-mail:$acra" implementation "ch.acra:acra-mail:$acra"
implementation "ch.acra:acra-limiter:$acra" implementation "ch.acra:acra-limiter:$acra"
implementation "ch.acra:acra-notification:$acra" implementation "ch.acra:acra-notification:$acra"
implementation 'androidx.room:room-runtime:2.2.6' implementation 'androidx.room:room-runtime:2.3.0'
annotationProcessor 'androidx.room:room-compiler:2.2.6' annotationProcessor 'androidx.room:room-compiler:2.3.0'
implementation "androidx.work:work-runtime:$work_version" implementation "androidx.work:work-runtime:$work_version"
implementation "io.mikael:urlbuilder:2.0.9" implementation "io.mikael:urlbuilder:2.0.9"
implementation "org.codeberg.gitnex-garage:emoji-java:v5.1.2" implementation "org.codeberg.gitnex-garage:emoji-java:v5.1.2"
implementation "org.codeberg.gitnex:tea4j:1.0.5" implementation "org.codeberg.gitnex:tea4j:1.0.16"
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.1.5" coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.1.5"
implementation 'androidx.biometric:biometric:1.1.0' implementation 'androidx.biometric:biometric:1.1.0'
implementation 'com.github.chrisvest:stormpot:2.4.1' implementation 'com.github.chrisvest:stormpot:2.4.2'
} }

View File

@ -51,7 +51,7 @@
android:name=".activities.CreateNewUserActivity" android:name=".activities.CreateNewUserActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" /> android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" />
<activity <activity
android:name=".activities.ProfileEmailActivity" android:name=".activities.MyProfileEmailActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" /> android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" />
<activity <activity
android:name=".activities.AddCollaboratorToRepositoryActivity" android:name=".activities.AddCollaboratorToRepositoryActivity"
@ -123,7 +123,7 @@
android:name=".activities.SettingsAppearanceActivity" android:name=".activities.SettingsAppearanceActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" /> android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" />
<activity <activity
android:name=".activities.SettingsFileViewerActivity" android:name=".activities.ProfileActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" /> android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" />
<activity <activity
android:name=".activities.SettingsSecurityActivity" android:name=".activities.SettingsSecurityActivity"

View File

@ -0,0 +1,62 @@
package org.mian.gitnex.actions;
import android.content.Context;
import androidx.annotation.NonNull;
import com.google.gson.JsonElement;
import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.Toasty;
import retrofit2.Call;
import retrofit2.Callback;
/**
* Author qwerty287
*/
public class PullRequestActions {
public static void deleteHeadBranch(Context context, String repoOwner, String repoName, String headBranch, boolean showToasts) {
Call<JsonElement> call = RetrofitClient
.getApiInterface(context)
.deleteBranch(Authorization.get(context), repoOwner, repoName, headBranch);
call.enqueue(new Callback<JsonElement>() {
@Override
public void onResponse(@NonNull Call<JsonElement> call, @NonNull retrofit2.Response<JsonElement> response) {
if(response.code() == 204) {
if(showToasts) Toasty.success(context, context.getString(R.string.deleteBranchSuccess));
}
else if(response.code() == 401) {
AlertDialogs
.authorizationTokenRevokedDialog(context, context.getResources().getString(R.string.alertDialogTokenRevokedTitle), context.getResources().getString(R.string.alertDialogTokenRevokedMessage), context.getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), context.getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
}
else if(response.code() == 403) {
if(showToasts) Toasty.error(context, context.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
if(showToasts) Toasty.warning(context, context.getString(R.string.deleteBranchErrorNotFound));
}
else {
if(showToasts) Toasty.error(context, context.getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<JsonElement> call, @NonNull Throwable t) {
if(showToasts) Toasty.error(context, context.getString(R.string.deleteBranchError));
}
});
}
}

View File

@ -49,6 +49,7 @@ public class AddNewAccountActivity extends BaseActivity {
initCloseListener(); initCloseListener();
viewBinding.close.setOnClickListener(onClickListener); viewBinding.close.setOnClickListener(onClickListener);
viewBinding.instanceUrl.setText(getIntent().getStringExtra("instanceUrl"));
ArrayAdapter<Protocol> adapterProtocols = new ArrayAdapter<>(ctx, R.layout.list_spinner_items, Protocol.values()); ArrayAdapter<Protocol> adapterProtocols = new ArrayAdapter<>(ctx, R.layout.list_spinner_items, Protocol.values());
@ -115,7 +116,7 @@ public class AddNewAccountActivity extends BaseActivity {
private void versionCheck(final String instanceUrl, final String loginToken) { private void versionCheck(final String instanceUrl, final String loginToken) {
Call<GiteaVersion> callVersion; Call<GiteaVersion> callVersion;
callVersion = RetrofitClient.getApiInterface(ctx).getGiteaVersionWithToken("token " + loginToken); callVersion = RetrofitClient.getApiInterface(ctx, instanceUrl).getGiteaVersionWithToken("token " + loginToken);
callVersion.enqueue(new Callback<GiteaVersion>() { callVersion.enqueue(new Callback<GiteaVersion>() {
@Override @Override

View File

@ -8,6 +8,7 @@ import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.notifications.Notifications; import org.mian.gitnex.notifications.Notifications;
import java.util.Locale;
/** /**
* Author M M Arif * Author M M Arif
@ -37,7 +38,7 @@ public abstract class BaseActivity extends AppCompatActivity {
break; break;
case 2: case 2:
if(TimeHelper.timeBetweenHours(18, 6)) { // 6pm to 6am if(TimeHelper.timeBetweenHours(tinyDB.getInt("darkThemeTimeHour"), tinyDB.getInt("lightThemeTimeHour"), tinyDB.getInt("darkThemeTimeMinute"), tinyDB.getInt("lightThemeTimeMinute"))) {
tinyDB.putString("currentTheme", "dark"); tinyDB.putString("currentTheme", "dark");
setTheme(R.style.AppTheme); setTheme(R.style.AppTheme);
@ -54,7 +55,7 @@ public abstract class BaseActivity extends AppCompatActivity {
setTheme(R.style.AppThemeRetro); setTheme(R.style.AppThemeRetro);
break; break;
case 4: case 4:
if(TimeHelper.timeBetweenHours(18, 6)) { // 6pm to 6am if(TimeHelper.timeBetweenHours(tinyDB.getInt("darkThemeTimeHour"), tinyDB.getInt("lightThemeTimeHour"), tinyDB.getInt("darkThemeTimeMinute"), tinyDB.getInt("lightThemeTimeMinute"))) {
tinyDB.putString("currentTheme", "dark"); tinyDB.putString("currentTheme", "dark");
setTheme(R.style.AppTheme); setTheme(R.style.AppTheme);
@ -77,7 +78,13 @@ public abstract class BaseActivity extends AppCompatActivity {
} }
AppUtil.setAppLocale(getResources(), tinyDB.getString("locale")); String locale = tinyDB.getString("locale");
if (locale.isEmpty()) {
AppUtil.setAppLocale(getResources(), Locale.getDefault().getLanguage());
}
else {
AppUtil.setAppLocale(getResources(), locale);
}
Notifications.startWorker(appCtx); Notifications.startWorker(appCtx);
} }

View File

@ -215,7 +215,7 @@ public class CreateRepoActivity extends BaseActivity {
Call<List<OrgOwner>> call = RetrofitClient Call<List<OrgOwner>> call = RetrofitClient
.getApiInterface(ctx) .getApiInterface(ctx)
.getOrgOwners(instanceToken); .getOrgOwners(instanceToken, 1, 50);
call.enqueue(new Callback<List<OrgOwner>>() { call.enqueue(new Callback<List<OrgOwner>>() {

View File

@ -9,8 +9,11 @@ import android.util.Log;
import android.view.View; import android.view.View;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.gitnex.tea4j.models.Files;
import org.gitnex.tea4j.models.Organization;
import org.gitnex.tea4j.models.PullRequests; import org.gitnex.tea4j.models.PullRequests;
import org.gitnex.tea4j.models.UserRepositories; import org.gitnex.tea4j.models.UserRepositories;
import org.jetbrains.annotations.NotNull;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.database.api.BaseApi; import org.mian.gitnex.database.api.BaseApi;
@ -20,13 +23,16 @@ import org.mian.gitnex.database.models.Repository;
import org.mian.gitnex.database.models.UserAccount; import org.mian.gitnex.database.models.UserAccount;
import org.mian.gitnex.databinding.ActivityDeeplinksBinding; import org.mian.gitnex.databinding.ActivityDeeplinksBinding;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.UrlHelper; import org.mian.gitnex.helpers.UrlHelper;
import java.net.URI; import java.net.URI;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import io.mikael.urlbuilder.UrlBuilder; import io.mikael.urlbuilder.UrlBuilder;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
import retrofit2.Response;
/** /**
* Author M M Arif * Author M M Arif
@ -42,6 +48,8 @@ public class DeepLinksActivity extends BaseActivity {
private Intent mainIntent; private Intent mainIntent;
private Intent issueIntent; private Intent issueIntent;
private Intent repoIntent; private Intent repoIntent;
private Intent orgIntent;
private Intent userIntent;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
@ -54,6 +62,9 @@ public class DeepLinksActivity extends BaseActivity {
mainIntent = new Intent(ctx, MainActivity.class); mainIntent = new Intent(ctx, MainActivity.class);
issueIntent = new Intent(ctx, IssueDetailActivity.class); issueIntent = new Intent(ctx, IssueDetailActivity.class);
repoIntent = new Intent(ctx, RepoDetailActivity.class); repoIntent = new Intent(ctx, RepoDetailActivity.class);
orgIntent = new Intent(ctx, OrganizationDetailActivity.class);
// TODO: enable if UserProfile Activity exist
//userIntent = new Intent(ctx, ProfileActivity.class)
Intent intent = getIntent(); Intent intent = getIntent();
Uri data = intent.getData(); Uri data = intent.getData();
@ -61,9 +72,10 @@ public class DeepLinksActivity extends BaseActivity {
// check for login // check for login
if(!tinyDB.getBoolean("loggedInMode")) { if(!tinyDB.getBoolean("loggedInMode")) {
Intent loginIntent = new Intent(ctx, LoginActivity.class);
loginIntent.putExtra("instanceUrl", data.getHost());
ctx.startActivity(loginIntent);
finish(); finish();
ctx.startActivity(new Intent(ctx, LoginActivity.class));
} }
// check for the links(URI) to be in the db // check for the links(URI) to be in the db
@ -89,25 +101,83 @@ public class DeepLinksActivity extends BaseActivity {
if(accountFound) { if(accountFound) {
// redirect to proper fragment/activity, If no action is there, show options where user to want to go like repos, profile, notifications etc // redirect to proper fragment/activity, if no action is there, show options where user to want to go like repos, profile, notifications etc
if(data.getPathSegments().size() > 0) { if(data.getPathSegments().size() == 1) {
if(data.getLastPathSegment().equals("notifications")) { // notifications
viewBinding.progressBar.setVisibility(View.GONE); mainIntent.putExtra("launchFragmentByLinkHandler", "notification");
String[] restOfUrl = Objects.requireNonNull(data.getPath()).split("/"); ctx.startActivity(mainIntent);
finish();
if(data.getPathSegments().contains("issues")) { // issue }
else if(data.getLastPathSegment().equals("explore")) { // explore
mainIntent.putExtra("launchFragmentByLinkHandler", "explore");
ctx.startActivity(mainIntent);
finish();
}
else if(data.getLastPathSegment().equals(tinyDB.getString("userLogin"))) { // your user profile
mainIntent.putExtra("launchFragmentByLinkHandler", "profile");
ctx.startActivity(mainIntent);
finish();
}
else if(data.getLastPathSegment().equals("admin")) {
mainIntent.putExtra("launchFragmentByLinkHandler", "admin");
ctx.startActivity(mainIntent);
finish();
}
else {
new Handler(Looper.getMainLooper()).postDelayed(() ->
getUserOrOrg(currentInstance, instanceToken, data.getLastPathSegment()), 500);
}
}
else if(data.getPathSegments().size() == 2) {
if(data.getPathSegments().get(0).equals("explore")) { // specific explore tab
if(data.getPathSegments().get(1).equals("organizations")) { // orgs
mainIntent.putExtra("exploreOrgs", true);
}
mainIntent.putExtra("launchFragmentByLinkHandler", "explore");
ctx.startActivity(mainIntent);
finish();
}
else if(data.getPathSegments().get(0).equals("user") && data.getPathSegments().get(1).equals("login")) { // open login
Intent loginIntent = new Intent(ctx, AddNewAccountActivity.class);
loginIntent.putExtra("instanceUrl", data.getHost());
loginIntent.putExtra("instanceProtocol", data.getScheme());
ctx.startActivity(loginIntent);
finish();
}
else if(data.getPathSegments().get(0).equals("admin")) {
mainIntent.putExtra("launchFragmentByLinkHandler", "admin");
mainIntent.putExtra("giteaAdminAction", data.getLastPathSegment());
ctx.startActivity(mainIntent);
finish();
}
else if(!data.getPathSegments().get(0).equals("") & !data.getLastPathSegment().equals("")) { // go to repo
new Handler(Looper.getMainLooper()).postDelayed(() ->
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getLastPathSegment(), "repo"), 500);
}
else { // no action, show options
showNoActionButtons();
}
}
else if(data.getPathSegments().size() >= 3) {
if(data.getPathSegments().get(2).equals("issues")) { // issue
if(!Objects.requireNonNull(data.getLastPathSegment()).contains("issues") & StringUtils.isNumeric(data.getLastPathSegment())) { if(!Objects.requireNonNull(data.getLastPathSegment()).contains("issues") & StringUtils.isNumeric(data.getLastPathSegment())) {
issueIntent.putExtra("issueNumber", data.getLastPathSegment()); issueIntent.putExtra("issueNumber", data.getLastPathSegment());
issueIntent.putExtra("openedFromLink", "true");
String[] urlSplitted = data.toString().split("#");
if (urlSplitted.length == 2) {
issueIntent.putExtra("issueComment", urlSplitted[1]);
}
tinyDB.putString("issueNumber", data.getLastPathSegment()); tinyDB.putString("issueNumber", data.getLastPathSegment());
tinyDB.putString("issueType", "Issue"); tinyDB.putString("issueType", "Issue");
tinyDB.putString("repoFullName", restOfUrl[restOfUrl.length - 4] + "/" + restOfUrl[restOfUrl.length - 3]); tinyDB.putString("repoFullName", data.getPathSegments().get(0) + "/" + data.getPathSegments().get(1));
final String repoOwner = restOfUrl[restOfUrl.length - 4]; final String repoOwner = data.getPathSegments().get(0);
final String repoName = restOfUrl[restOfUrl.length - 3]; final String repoName = data.getPathSegments().get(1);
int currentActiveAccountId = tinyDB.getInt("currentActiveAccountId"); int currentActiveAccountId = tinyDB.getInt("currentActiveAccountId");
RepositoriesApi repositoryData = BaseApi.getInstance(ctx, RepositoriesApi.class); RepositoriesApi repositoryData = BaseApi.getInstance(ctx, RepositoriesApi.class);
@ -129,125 +199,121 @@ public class DeepLinksActivity extends BaseActivity {
finish(); finish();
} }
else if(Objects.requireNonNull(data.getLastPathSegment()).contains("issues")) { else if(Objects.requireNonNull(data.getLastPathSegment()).contains("issues")) {
new Handler(Looper.getMainLooper()).postDelayed(() ->
new Handler(Looper.getMainLooper()).postDelayed(() -> { goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "issue"), 500);
}
goToRepoSection(currentInstance, instanceToken, restOfUrl[restOfUrl.length - 3], restOfUrl[restOfUrl.length - 2], "issue"); else if(data.getLastPathSegment().equals("new")) {
}, 500); new Handler(Looper.getMainLooper()).postDelayed(() ->
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "issueNew"), 500);
} }
else { else {
ctx.startActivity(mainIntent); ctx.startActivity(mainIntent);
finish(); finish();
} }
} }
else if(data.getPathSegments().contains("pulls")) { // pr else if(data.getPathSegments().get(2).equals("pulls")) { // pr
if(!Objects.requireNonNull(data.getLastPathSegment()).contains("pulls") & StringUtils.isNumeric(data.getLastPathSegment())) { if(!Objects.requireNonNull(data.getLastPathSegment()).contains("pulls") & StringUtils.isNumeric(data.getLastPathSegment())) {
new Handler(Looper.getMainLooper()).postDelayed(() -> { new Handler(Looper.getMainLooper()).postDelayed(() -> {
getPullRequest(currentInstance, instanceToken, restOfUrl[restOfUrl.length - 4], restOfUrl[restOfUrl.length - 3], Integer.parseInt(data.getLastPathSegment())); String[] urlSplitted = data.toString().split("#");
if (urlSplitted.length == 2) {
issueIntent.putExtra("issueComment", urlSplitted[1]);
}
getPullRequest(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), Integer.parseInt(data.getLastPathSegment()));
}, 500); }, 500);
} }
else if(Objects.requireNonNull(data.getLastPathSegment()).contains("pulls")) { else if(Objects.requireNonNull(data.getLastPathSegment()).contains("pulls")) {
new Handler(Looper.getMainLooper()).postDelayed(() ->
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "pull"), 500);
}
else if(data.getLastPathSegment().equals("files")) { // pr diff
new Handler(Looper.getMainLooper()).postDelayed(() -> { new Handler(Looper.getMainLooper()).postDelayed(() -> {
issueIntent.putExtra("openPrDiff", "true");
goToRepoSection(currentInstance, instanceToken, restOfUrl[restOfUrl.length - 3], restOfUrl[restOfUrl.length - 2], "pull"); getPullRequest(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), Integer.parseInt(data.getPathSegments().get(3)));
}, 500); }, 500);
} }
else { else {
ctx.startActivity(mainIntent); ctx.startActivity(mainIntent);
finish(); finish();
} }
} }
else if(data.getPathSegments().contains("commit")) { // commits (no API yet to properly implement)
new Handler(Looper.getMainLooper()).postDelayed(() -> { else if(data.getPathSegments().get(2).equals("compare")) { // new pull request
new Handler(Looper.getMainLooper()).postDelayed(() ->
goToRepoSection(currentInstance, instanceToken, restOfUrl[restOfUrl.length - 4], restOfUrl[restOfUrl.length - 3], "pull"); goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "pullNew"), 500);
}, 500);
} }
else if(!restOfUrl[restOfUrl.length - 2].equals("") & !restOfUrl[restOfUrl.length - 1].equals("")) { // go to repo else if(data.getPathSegments().get(2).equals("commit")) { // commits (no API yet to properly implement)
new Handler(Looper.getMainLooper()).postDelayed(() ->
new Handler(Looper.getMainLooper()).postDelayed(() -> { goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "pull"), 500);
}
goToRepoSection(currentInstance, instanceToken, restOfUrl[restOfUrl.length - 2], restOfUrl[restOfUrl.length - 1], "repo"); else if(data.getPathSegments().get(2).equals("commits")) { // commits list
}, 500); String branch = data.getLastPathSegment();
repoIntent.putExtra("branchName", branch);
new Handler(Looper.getMainLooper()).postDelayed(() ->
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "commitsList"), 500);
}
else if(data.getPathSegments().get(2).equals("milestones") && data.getLastPathSegment().equals("new")) { // new milestone
new Handler(Looper.getMainLooper()).postDelayed(() ->
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "milestonesNew"), 500);
}
else if(data.getPathSegments().get(2).equals("milestones")) { // milestones
new Handler(Looper.getMainLooper()).postDelayed(() ->
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "milestones"), 500);
}
else if(data.getPathSegments().get(2).equals("milestone")) { // milestone
repoIntent.putExtra("milestoneId", data.getLastPathSegment());
new Handler(Looper.getMainLooper()).postDelayed(() ->
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "milestones"), 500);
}
else if(data.getPathSegments().get(2).equals("releases") && data.getLastPathSegment().equals("new")) { // new release
new Handler(Looper.getMainLooper()).postDelayed(() ->
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "newRelease"), 500);
}
else if(data.getPathSegments().get(2).equals("releases") && data.getPathSegments().get(3).equals("tag") && data.getPathSegments().size() == 5) { // release
repoIntent.putExtra("releaseTagName", data.getLastPathSegment());
new Handler(Looper.getMainLooper()).postDelayed(() ->
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "releases"), 500);
}
else if(data.getPathSegments().get(2).equals("releases")) { // releases
new Handler(Looper.getMainLooper()).postDelayed(() ->
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "releases"), 500);
}
else if(data.getPathSegments().get(2).equals("labels")) { // labels
new Handler(Looper.getMainLooper()).postDelayed(() ->
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "labels"), 500);
}
else if(data.getPathSegments().get(2).equals("settings")) { // repo settings
new Handler(Looper.getMainLooper()).postDelayed(() ->
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "settings"), 500);
}
else if(data.getLastPathSegment().equals("branches")) { // branches list
new Handler(Looper.getMainLooper()).postDelayed(() ->
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "branchesList"), 500);
}
else if(data.getPathSegments().size() == 5 && data.getPathSegments().get(2).equals("src") && data.getPathSegments().get(3).equals("branch")) { // branch
repoIntent.putExtra("selectedBranch", data.getLastPathSegment());
new Handler(Looper.getMainLooper()).postDelayed(() ->
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "branch"), 500);
}
else if(data.getPathSegments().get(2).equals("src") && data.getPathSegments().get(3).equals("branch")) { // file/dir
StringBuilder filePath = new StringBuilder();
ArrayList<String> segments = new ArrayList<>(data.getPathSegments());
segments.subList(0, 5).clear();
for (String item : segments) {
filePath.append(item);
filePath.append("/");
}
filePath.deleteCharAt(filePath.toString().length() - 1);
new Handler(Looper.getMainLooper()).postDelayed(() ->
getFile(currentInstance, instanceToken, data.getPathSegments().get(0),
data.getPathSegments().get(1), filePath.toString(), data.getPathSegments().get(4)), 500);
} }
else { // no action, show options else { // no action, show options
showNoActionButtons();
if(tinyDB.getInt("defaultScreenId") == 1) { // repos
mainIntent.putExtra("launchFragmentByLinkHandler", "repos");
ctx.startActivity(mainIntent);
finish();
}
else if(tinyDB.getInt("defaultScreenId") == 2) { // org
mainIntent.putExtra("launchFragmentByLinkHandler", "org");
ctx.startActivity(mainIntent);
finish();
}
else if(tinyDB.getInt("defaultScreenId") == 3) { // notifications
mainIntent.putExtra("launchFragmentByLinkHandler", "notification");
ctx.startActivity(mainIntent);
finish();
}
else if(tinyDB.getInt("defaultScreenId") == 4) { // explore
mainIntent.putExtra("launchFragmentByLinkHandler", "explore");
ctx.startActivity(mainIntent);
finish();
}
else if(tinyDB.getInt("defaultScreenId") == 0) { // show options
viewBinding.noActionFrame.setVisibility(View.VISIBLE);
viewBinding.addNewAccountFrame.setVisibility(View.GONE);
viewBinding.repository.setOnClickListener(repository -> {
tinyDB.putInt("defaultScreenId", 1);
mainIntent.putExtra("launchFragmentByLinkHandler", "repos");
ctx.startActivity(mainIntent);
finish();
});
viewBinding.organization.setOnClickListener(organization -> {
tinyDB.putInt("defaultScreenId", 2);
mainIntent.putExtra("launchFragmentByLinkHandler", "org");
ctx.startActivity(mainIntent);
finish();
});
viewBinding.notification.setOnClickListener(notification -> {
tinyDB.putInt("defaultScreenId", 3);
mainIntent.putExtra("launchFragmentByLinkHandler", "notification");
ctx.startActivity(mainIntent);
finish();
});
viewBinding.explore.setOnClickListener(explore -> {
tinyDB.putInt("defaultScreenId", 4);
mainIntent.putExtra("launchFragmentByLinkHandler", "explore");
ctx.startActivity(mainIntent);
finish();
});
viewBinding.launchApp2.setOnClickListener(launchApp2 -> {
tinyDB.putInt("defaultScreenId", 0);
ctx.startActivity(mainIntent);
finish();
});
}
} }
} }
else { else {
@ -266,6 +332,7 @@ public class DeepLinksActivity extends BaseActivity {
viewBinding.addNewAccount.setOnClickListener(addNewAccount -> { viewBinding.addNewAccount.setOnClickListener(addNewAccount -> {
Intent accountIntent = new Intent(ctx, AddNewAccountActivity.class); Intent accountIntent = new Intent(ctx, AddNewAccountActivity.class);
accountIntent.putExtra("instanceUrl", data.getHost());
startActivity(accountIntent); startActivity(accountIntent);
finish(); finish();
}); });
@ -316,6 +383,7 @@ public class DeepLinksActivity extends BaseActivity {
issueIntent.putExtra("issueNumber", index); issueIntent.putExtra("issueNumber", index);
issueIntent.putExtra("prMergeable", prInfo.isMergeable()); issueIntent.putExtra("prMergeable", prInfo.isMergeable());
issueIntent.putExtra("openedFromLink", "true");
if(prInfo.getHead() != null) { if(prInfo.getHead() != null) {
@ -450,4 +518,184 @@ public class DeepLinksActivity extends BaseActivity {
} }
}); });
} }
private void getUserOrOrg(String url, String instanceToken, String userOrgName) {
Call<Organization> call = RetrofitClient.getApiInterface(ctx, url).getOrganization(instanceToken, userOrgName);
call.enqueue(new Callback<Organization>() {
@Override
public void onResponse(@NotNull Call<Organization> call, @NotNull Response<Organization> response) {
if(response.code() == 404) { // org doesn't exist or it's a user user
Log.d("getUserOrOrg-404", String.valueOf(response.code()));
getUser(url, instanceToken, userOrgName);
}
else if(response.code() == 200) { // org
assert response.body() != null;
orgIntent.putExtra("orgName", response.body().getUsername());
TinyDB tinyDb = TinyDB.getInstance(ctx);
tinyDb.putString("orgName", response.body().getUsername());
tinyDb.putString("organizationId", String.valueOf(response.body().getId()));
tinyDb.putBoolean("organizationAction", true);
ctx.startActivity(orgIntent);
finish();
}
else {
Log.e("getUserOrOrg-code", String.valueOf(response.code()));
ctx.startActivity(mainIntent);
finish();
}
}
@Override
public void onFailure(@NotNull Call<Organization> call, @NotNull Throwable t) {
Log.e("onFailure-getUserOrOrg", t.toString());
}
});
}
private void getUser(String url, String instanceToken, String userName) {
// TODO: enable if UserProfile Activity exist
showNoActionButtons();
/*Call<UserInfo> call = RetrofitClient.getApiInterface(ctx, url).getUserProfile(instanceToken, userName);
call.enqueue(new Callback<UserInfo>() {
@Override
public void onResponse(@NotNull Call<UserInfo> call, @NotNull Response<UserInfo> response) {
if(response.code() == 200) {
assert response.body() != null;
userIntent.putExtra("username", response.body().getLogin());
ctx.startActivity(userIntent);
finish();
}
else {
Log.e("getUser-code", String.valueOf(response.code()));
ctx.startActivity(mainIntent);
finish();
}
}
@Override
public void onFailure(@NotNull Call<UserInfo> call, @NotNull Throwable t) {
Log.e("onFailure-getUser", t.toString());
ctx.startActivity(mainIntent);
finish();
}
});*/
}
private void getFile(String url, String instanceToken, String owner, String repo, String filePath, String branch) {
Call<Files> call = RetrofitClient.getApiInterface(ctx, url).getSingleFileContents(instanceToken, owner, repo, filePath, branch);
call.enqueue(new Callback<Files>() {
@Override
public void onResponse(@NotNull Call<Files> call, @NotNull Response<Files> response) {
if(response.code() == 200) {
// check if file and open file/dir
Files file = response.body();
assert file != null;
if(file.getType().equals("file")) {
repoIntent.putExtra("file", file);
repoIntent.putExtra("branch", branch);
goToRepoSection(url, instanceToken, owner, repo, "file");
}
}
else {
Log.e("getFile-onFailure", String.valueOf(response.code()));
ctx.startActivity(mainIntent);
finish();
}
}
@Override
public void onFailure(@NotNull Call<Files> call, @NotNull Throwable t) {
Log.e("getFile-onFailure", t.toString());
// maybe it's a directory
getDir(url, instanceToken, owner, repo, filePath, branch);
}
});
}
private void getDir(String url, String instanceToken, String owner, String repo, String filePath, String branch) {
repoIntent.putExtra("branch", branch);
repoIntent.putExtra("dir", filePath);
goToRepoSection(url, instanceToken, owner, repo, "dir");
}
private void showNoActionButtons() {
viewBinding.progressBar.setVisibility(View.GONE);
if(tinyDB.getInt("defaultScreenId") == 1) { // repos
mainIntent.putExtra("launchFragmentByLinkHandler", "repos");
ctx.startActivity(mainIntent);
finish();
}
else if(tinyDB.getInt("defaultScreenId") == 2) { // org
mainIntent.putExtra("launchFragmentByLinkHandler", "org");
ctx.startActivity(mainIntent);
finish();
}
else if(tinyDB.getInt("defaultScreenId") == 3) { // notifications
mainIntent.putExtra("launchFragmentByLinkHandler", "notification");
ctx.startActivity(mainIntent);
finish();
}
else if(tinyDB.getInt("defaultScreenId") == 4) { // explore
mainIntent.putExtra("launchFragmentByLinkHandler", "explore");
ctx.startActivity(mainIntent);
finish();
}
else if(tinyDB.getInt("defaultScreenId") == 0) { // show options
viewBinding.noActionFrame.setVisibility(View.VISIBLE);
viewBinding.addNewAccountFrame.setVisibility(View.GONE);
viewBinding.repository.setOnClickListener(repository -> {
tinyDB.putInt("defaultScreenId", 1);
mainIntent.putExtra("launchFragmentByLinkHandler", "repos");
ctx.startActivity(mainIntent);
finish();
});
viewBinding.organization.setOnClickListener(organization -> {
tinyDB.putInt("defaultScreenId", 2);
mainIntent.putExtra("launchFragmentByLinkHandler", "org");
ctx.startActivity(mainIntent);
finish();
});
viewBinding.notification.setOnClickListener(notification -> {
tinyDB.putInt("defaultScreenId", 3);
mainIntent.putExtra("launchFragmentByLinkHandler", "notification");
ctx.startActivity(mainIntent);
finish();
});
viewBinding.explore.setOnClickListener(explore -> {
tinyDB.putInt("defaultScreenId", 4);
mainIntent.putExtra("launchFragmentByLinkHandler", "explore");
ctx.startActivity(mainIntent);
finish();
});
viewBinding.launchApp2.setOnClickListener(launchApp2 -> {
tinyDB.putInt("defaultScreenId", 0);
ctx.startActivity(mainIntent);
finish();
});
}
}
} }

View File

@ -148,10 +148,18 @@ public class FileViewActivity extends BaseActivity implements BottomSheetFileVie
runOnUiThread(() -> { runOnUiThread(() -> {
binding.photoView.setVisibility(View.GONE); binding.photoView.setVisibility(View.GONE);
binding.markdownFrame.setVisibility(View.GONE);
binding.contents.setVisibility(View.VISIBLE);
binding.contents.setContent(text, fileExtension); binding.contents.setContent(text, fileExtension);
if(tinyDB.getBoolean("enableMarkdownInFileView")) {
Markdown.render(ctx, EmojiParser.parseToUnicode(text), binding.markdown);
binding.contents.setVisibility(View.GONE);
binding.markdownFrame.setVisibility(View.VISIBLE);
} else {
binding.markdownFrame.setVisibility(View.GONE);
binding.contents.setVisibility(View.VISIBLE);
}
}); });
break; break;

View File

@ -1,6 +1,7 @@
package org.mian.gitnex.activities; package org.mian.gitnex.activities;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Typeface; import android.graphics.Typeface;
@ -196,6 +197,10 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
getSingleIssue(repoOwner, repoName, issueIndex); getSingleIssue(repoOwner, repoName, issueIndex);
fetchDataAsync(repoOwner, repoName, issueIndex); fetchDataAsync(repoOwner, repoName, issueIndex);
if(getIntent().getStringExtra("openPrDiff") != null && getIntent().getStringExtra("openPrDiff").equals("true")) {
startActivity(new Intent(ctx, FileDiffActivity.class));
}
} }
@Override @Override
@ -434,6 +439,11 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
if(id == android.R.id.home) { if(id == android.R.id.home) {
if(getIntent().getStringExtra("openedFromLink") != null && getIntent().getStringExtra("openedFromLink").equals("true")) {
Intent intent = new Intent(ctx, RepoDetailActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
finish(); finish();
return true; return true;
} }
@ -569,7 +579,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
} }
TinyDB tinyDb = TinyDB.getInstance(appCtx); TinyDB tinyDb = TinyDB.getInstance(appCtx);
final String locale = tinyDb.getString("locale"); final Locale locale = getResources().getConfiguration().locale;
final String timeFormat = tinyDb.getString("dateFormat"); final String timeFormat = tinyDb.getString("dateFormat");
tinyDb.putString("issueState", singleIssue.getState()); tinyDb.putString("issueState", singleIssue.getState());
tinyDb.putString("issueTitle", singleIssue.getTitle()); tinyDb.putString("issueTitle", singleIssue.getTitle());
@ -582,6 +592,17 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
viewBinding.issueTitle.setText(HtmlCompat.fromHtml(issueNumber_ + " " + EmojiParser.parseToUnicode(singleIssue.getTitle()), HtmlCompat.FROM_HTML_MODE_LEGACY)); viewBinding.issueTitle.setText(HtmlCompat.fromHtml(issueNumber_ + " " + EmojiParser.parseToUnicode(singleIssue.getTitle()), HtmlCompat.FROM_HTML_MODE_LEGACY));
String cleanIssueDescription = singleIssue.getBody().trim(); String cleanIssueDescription = singleIssue.getBody().trim();
viewBinding.assigneeAvatar.setOnClickListener(loginId -> {
Intent intent = new Intent(ctx, ProfileActivity.class);
intent.putExtra("username", singleIssue.getUser().getLogin());
ctx.startActivity(intent);
});
viewBinding.assigneeAvatar.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(ctx, singleIssue.getUser().getLogin(), ctx.getString(R.string.copyLoginIdToClipBoard, singleIssue.getUser().getLogin()));
return true;
});
Markdown.render(ctx, EmojiParser.parseToUnicode(cleanIssueDescription), viewBinding.issueDescription); Markdown.render(ctx, EmojiParser.parseToUnicode(cleanIssueDescription), viewBinding.issueDescription);
RelativeLayout.LayoutParams paramsDesc = (RelativeLayout.LayoutParams) viewBinding.issueDescription.getLayoutParams(); RelativeLayout.LayoutParams paramsDesc = (RelativeLayout.LayoutParams) viewBinding.issueDescription.getLayoutParams();
@ -603,7 +624,20 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
viewBinding.frameAssignees.addView(assigneesView); viewBinding.frameAssignees.addView(assigneesView);
assigneesView.setLayoutParams(params1); assigneesView.setLayoutParams(params1);
if(!singleIssue.getAssignees().get(i).getFull_name().equals("")) {
int finalI = i;
assigneesView.setOnClickListener(loginId -> {
Intent intent = new Intent(ctx, ProfileActivity.class);
intent.putExtra("username", singleIssue.getAssignees().get(finalI).getLogin());
ctx.startActivity(intent);
});
assigneesView.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(ctx, singleIssue.getAssignees().get(finalI).getLogin(), ctx.getString(R.string.copyLoginIdToClipBoard, singleIssue.getAssignees().get(finalI).getLogin()));
return true;
});
/*if(!singleIssue.getAssignees().get(i).getFull_name().equals("")) {
assigneesView.setOnClickListener( assigneesView.setOnClickListener(
new ClickListener(getString(R.string.assignedTo, singleIssue.getAssignees().get(i).getFull_name()), ctx)); new ClickListener(getString(R.string.assignedTo, singleIssue.getAssignees().get(i).getFull_name()), ctx));
@ -612,7 +646,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
assigneesView.setOnClickListener( assigneesView.setOnClickListener(
new ClickListener(getString(R.string.assignedTo, singleIssue.getAssignees().get(i).getLogin()), ctx)); new ClickListener(getString(R.string.assignedTo, singleIssue.getAssignees().get(i).getLogin()), ctx));
} }*/
} }
} }
else { else {
@ -660,7 +694,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
if(timeFormat.equals("normal") || timeFormat.equals("pretty")) { if(timeFormat.equals("normal") || timeFormat.equals("pretty")) {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", locale);
String dueDate = formatter.format(singleIssue.getDue_date()); String dueDate = formatter.format(singleIssue.getDue_date());
viewBinding.issueDueDate.setText(dueDate); viewBinding.issueDueDate.setText(dueDate);
viewBinding.issueDueDate viewBinding.issueDueDate
@ -668,7 +702,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
} }
else if(timeFormat.equals("normal1")) { else if(timeFormat.equals("normal1")) {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", locale);
String dueDate = formatter.format(singleIssue.getDue_date()); String dueDate = formatter.format(singleIssue.getDue_date());
viewBinding.issueDueDate.setText(dueDate); viewBinding.issueDueDate.setText(dueDate);
} }
@ -714,7 +748,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
viewBinding.issueDescription.setLayoutParams(paramsDesc); viewBinding.issueDescription.setLayoutParams(paramsDesc);
} }
viewBinding.issueCreatedTime.setText(TimeHelper.formatTime(singleIssue.getCreated_at(), new Locale(locale), timeFormat, ctx)); viewBinding.issueCreatedTime.setText(TimeHelper.formatTime(singleIssue.getCreated_at(), locale, timeFormat, ctx));
viewBinding.issueCreatedTime.setVisibility(View.VISIBLE); viewBinding.issueCreatedTime.setVisibility(View.VISIBLE);
if(timeFormat.equals("pretty")) { if(timeFormat.equals("pretty")) {
@ -750,7 +784,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
viewBinding.issueMilestone.setVisibility(View.GONE); viewBinding.issueMilestone.setVisibility(View.GONE);
} }
if(!singleIssue.getUser().getFull_name().equals("")) { /*if(!singleIssue.getUser().getFull_name().equals("")) {
viewBinding.assigneeAvatar.setOnClickListener( viewBinding.assigneeAvatar.setOnClickListener(
new ClickListener(ctx.getResources().getString(R.string.issueCreator) + singleIssue.getUser().getFull_name(), ctx)); new ClickListener(ctx.getResources().getString(R.string.issueCreator) + singleIssue.getUser().getFull_name(), ctx));
@ -759,7 +793,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
viewBinding.assigneeAvatar.setOnClickListener( viewBinding.assigneeAvatar.setOnClickListener(
new ClickListener(ctx.getResources().getString(R.string.issueCreator) + singleIssue.getUser().getLogin(), ctx)); new ClickListener(ctx.getResources().getString(R.string.issueCreator) + singleIssue.getUser().getLogin(), ctx));
} }*/
viewBinding.progressBar.setVisibility(View.GONE); viewBinding.progressBar.setVisibility(View.GONE);
} }

View File

@ -77,6 +77,8 @@ public class LoginActivity extends BaseActivity {
ArrayAdapter<Protocol> adapterProtocols = new ArrayAdapter<>(LoginActivity.this, R.layout.list_spinner_items, Protocol.values()); ArrayAdapter<Protocol> adapterProtocols = new ArrayAdapter<>(LoginActivity.this, R.layout.list_spinner_items, Protocol.values());
instanceUrlET.setText(getIntent().getStringExtra("instanceUrl"));
protocolSpinner.setAdapter(adapterProtocols); protocolSpinner.setAdapter(adapterProtocols);
protocolSpinner.setSelection(0); protocolSpinner.setSelection(0);
protocolSpinner.setOnItemClickListener((parent, view, position, id) -> { protocolSpinner.setOnItemClickListener((parent, view, position, id) -> {

View File

@ -44,7 +44,7 @@ import org.mian.gitnex.fragments.ExploreFragment;
import org.mian.gitnex.fragments.MyRepositoriesFragment; import org.mian.gitnex.fragments.MyRepositoriesFragment;
import org.mian.gitnex.fragments.NotificationsFragment; import org.mian.gitnex.fragments.NotificationsFragment;
import org.mian.gitnex.fragments.OrganizationsFragment; import org.mian.gitnex.fragments.OrganizationsFragment;
import org.mian.gitnex.fragments.ProfileFragment; import org.mian.gitnex.fragments.MyProfileFragment;
import org.mian.gitnex.fragments.RepositoriesFragment; import org.mian.gitnex.fragments.RepositoriesFragment;
import org.mian.gitnex.fragments.SettingsFragment; import org.mian.gitnex.fragments.SettingsFragment;
import org.mian.gitnex.fragments.StarredRepositoriesFragment; import org.mian.gitnex.fragments.StarredRepositoriesFragment;
@ -203,7 +203,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
else if(fragmentById instanceof NotificationsFragment) { else if(fragmentById instanceof NotificationsFragment) {
toolbarTitle.setText(R.string.pageTitleNotifications); toolbarTitle.setText(R.string.pageTitleNotifications);
} }
else if(fragmentById instanceof ProfileFragment) { else if(fragmentById instanceof MyProfileFragment) {
toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile)); toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile));
} }
else if(fragmentById instanceof DraftsFragment) { else if(fragmentById instanceof DraftsFragment) {
@ -309,7 +309,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
userAvatar.setOnClickListener(v -> { userAvatar.setOnClickListener(v -> {
toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile)); toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProfileFragment()).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyProfileFragment()).commit();
navigationView.setCheckedItem(R.id.nav_profile); navigationView.setCheckedItem(R.id.nav_profile);
drawer.closeDrawers(); drawer.closeDrawers();
@ -380,12 +380,24 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
case "notification": case "notification":
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new NotificationsFragment()).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new NotificationsFragment()).commit();
navigationView.setCheckedItem(R.id.nav_notifications); navigationView.setCheckedItem(R.id.nav_notifications);
setActionBarTitle(getResources().getString(R.string.pageTitleNotifications));
return; return;
case "explore": case "explore":
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ExploreFragment()).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ExploreFragment()).commit();
navigationView.setCheckedItem(R.id.nav_explore); navigationView.setCheckedItem(R.id.nav_explore);
return; return;
case "profile":
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyProfileFragment()).commit();
navigationView.setCheckedItem(R.id.nav_profile);
return;
case "admin":
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new AdministrationFragment()).commit();
navigationView.setCheckedItem(R.id.nav_administration);
return;
} }
} }
@ -419,7 +431,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
case 4: case 4:
toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile)); toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProfileFragment()).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyProfileFragment()).commit();
navigationView.setCheckedItem(R.id.nav_profile); navigationView.setCheckedItem(R.id.nav_profile);
break; break;
@ -557,7 +569,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
else if(id == R.id.nav_profile) { else if(id == R.id.nav_profile) {
toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile)); toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProfileFragment()).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyProfileFragment()).commit();
} }
else if(id == R.id.nav_repositories) { else if(id == R.id.nav_repositories) {

View File

@ -12,6 +12,7 @@ import com.google.gson.JsonElement;
import org.gitnex.tea4j.models.MergePullRequest; import org.gitnex.tea4j.models.MergePullRequest;
import org.gitnex.tea4j.models.MergePullRequestSpinner; import org.gitnex.tea4j.models.MergePullRequestSpinner;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.actions.PullRequestActions;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityMergePullRequestBinding; import org.mian.gitnex.databinding.ActivityMergePullRequestBinding;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
@ -187,7 +188,7 @@ public class MergePullRequestActivity extends BaseActivity {
final String repoOwner = parts[0]; final String repoOwner = parts[0];
final String repoName = parts[1]; final String repoName = parts[1];
deleteBranchFunction(repoOwner, repoName); PullRequestActions.deleteHeadBranch(ctx, repoOwner, repoName, tinyDB.getString("prHeadBranch"), false);
Toasty.success(ctx, getString(R.string.mergePRSuccessMsg)); Toasty.success(ctx, getString(R.string.mergePRSuccessMsg));
tinyDB.putBoolean("prMerged", true); tinyDB.putBoolean("prMerged", true);
@ -201,7 +202,7 @@ public class MergePullRequestActivity extends BaseActivity {
final String repoOwner = parts[0]; final String repoOwner = parts[0];
final String repoName = parts[1]; final String repoName = parts[1];
deleteBranchFunction(repoOwner, repoName); PullRequestActions.deleteHeadBranch(ctx, repoOwner, repoName, tinyDB.getString("prHeadBranch"), false);
Toasty.success(ctx, getString(R.string.mergePRSuccessMsg)); Toasty.success(ctx, getString(R.string.mergePRSuccessMsg));
tinyDB.putBoolean("prMerged", true); tinyDB.putBoolean("prMerged", true);
@ -253,36 +254,6 @@ public class MergePullRequestActivity extends BaseActivity {
} }
private void deleteBranchFunction(String repoOwner, String repoName) {
String branchName = tinyDB.getString("prHeadBranch");
Call<JsonElement> call = RetrofitClient
.getApiInterface(ctx)
.deleteBranch(Authorization.get(ctx), repoOwner, repoName, branchName);
call.enqueue(new Callback<JsonElement>() {
@Override
public void onResponse(@NonNull Call<JsonElement> call, @NonNull retrofit2.Response<JsonElement> response) {
if(response.code() == 204) {
Log.i("deleteBranch", "Branch deleted successfully");
}
}
@Override
public void onFailure(@NonNull Call<JsonElement> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
enableProcessButton();
}
});
}
private void disableProcessButton() { private void disableProcessButton() {
viewBinding.mergeButton.setEnabled(false); viewBinding.mergeButton.setEnabled(false);

View File

@ -30,7 +30,7 @@ import retrofit2.Callback;
* Author M M Arif * Author M M Arif
*/ */
public class ProfileEmailActivity extends BaseActivity { public class MyProfileEmailActivity extends BaseActivity {
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
private EditText userEmail; private EditText userEmail;

View File

@ -0,0 +1,143 @@
package org.mian.gitnex.activities;
import android.content.Intent;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import org.mian.gitnex.R;
import org.mian.gitnex.fragments.profile.DetailFragment;
import org.mian.gitnex.fragments.profile.FollowersFragment;
import org.mian.gitnex.fragments.profile.FollowingFragment;
import org.mian.gitnex.fragments.profile.OrganizationsFragment;
import org.mian.gitnex.fragments.profile.RepositoriesFragment;
import org.mian.gitnex.fragments.profile.StarredRepositoriesFragment;
import org.mian.gitnex.helpers.Toasty;
import java.util.Objects;
/**
* Author M M Arif
*/
public class ProfileActivity extends BaseActivity {
private String username;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);
Intent profileIntent = getIntent();
Typeface myTypeface;
Toolbar toolbar = findViewById(R.id.toolbar);
TextView toolbarTitle = findViewById(R.id.toolbarTitle);
if(profileIntent.getStringExtra("username") != null && !Objects.equals(profileIntent.getStringExtra("username"), "")) {
username = profileIntent.getStringExtra("username");
}
else {
Toasty.warning(ctx, ctx.getResources().getString(R.string.userInvalidUserName));
finish();
}
setSupportActionBar(toolbar);
Objects.requireNonNull(getSupportActionBar()).setTitle(username);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
ViewPager2 viewPager = findViewById(R.id.profileContainer);
viewPager.setOffscreenPageLimit(1);
TabLayout tabLayout = findViewById(R.id.tabs);
switch(tinyDB.getInt("customFontId", -1)) {
case 0:
myTypeface = Typeface.createFromAsset(ctx.getAssets(), "fonts/roboto.ttf");
break;
case 2:
myTypeface = Typeface.createFromAsset(ctx.getAssets(), "fonts/sourcecodeproregular.ttf");
break;
default:
myTypeface = Typeface.createFromAsset(ctx.getAssets(), "fonts/manroperegular.ttf");
break;
}
toolbarTitle.setTypeface(myTypeface);
toolbarTitle.setText(username);
viewPager.setAdapter(new ViewPagerAdapter(this));
String[] tabTitles = {ctx.getResources().getString(R.string.tabTextInfo), ctx.getResources().getString(R.string.navRepos), ctx.getResources().getString(R.string.navStarredRepos), ctx.getResources().getString(R.string.navOrg), ctx.getResources().getString(R.string.profileTabFollowers), ctx.getResources().getString(R.string.profileTabFollowing)};
new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> tab.setText(tabTitles[position])).attach();
ViewGroup vg = (ViewGroup) tabLayout.getChildAt(0);
int tabsCount = vg.getChildCount();
for (int j = 0; j < tabsCount; j++) {
ViewGroup vgTab = (ViewGroup) vg.getChildAt(j);
int tabChildCount = vgTab.getChildCount();
for (int i = 0; i < tabChildCount; i++) {
View tabViewChild = vgTab.getChildAt(i);
if (tabViewChild instanceof TextView) {
((TextView) tabViewChild).setTypeface(myTypeface);
}
}
}
}
public class ViewPagerAdapter extends FragmentStateAdapter {
public ViewPagerAdapter(@NonNull FragmentActivity fa) { super(fa); }
@NonNull
@Override
public Fragment createFragment(int position) {
switch(position) {
case 0: // detail
return DetailFragment.newInstance(username);
case 1: // repos
return RepositoriesFragment.newInstance(username);
case 2: // starred repos
return StarredRepositoriesFragment.newInstance(username);
case 3: // organizations
return OrganizationsFragment.newInstance(username);
case 4: // followers
return FollowersFragment.newInstance(username);
case 5: // following
return FollowingFragment.newInstance(username);
}
return null;
}
@Override
public int getItemCount() {
return 6;
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if(id == android.R.id.home) {
finish();
return true;
}
else {
return super.onOptionsItemSelected(item);
}
}
}

View File

@ -232,13 +232,84 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetRepoF
mainIntent.removeExtra("goToSection"); mainIntent.removeExtra("goToSection");
mainIntent.removeExtra("goToSectionType"); mainIntent.removeExtra("goToSectionType");
if(goToSectionType.equals("issue")) { switch(goToSectionType) {
case "branchesList":
RepoDetailActivity.mViewPager.setCurrentItem(2); RepoDetailActivity.mViewPager.setCurrentItem(1);
} chooseBranch();
else if(goToSectionType.equals("pull")) { break;
case "branch":
RepoDetailActivity.mViewPager.setCurrentItem(3); RepoDetailActivity.mViewPager.setCurrentItem(1);
String selectedBranch = mainIntent.getStringExtra("selectedBranch");
tinyDB.putString("repoBranch", selectedBranch);
if(getFragmentRefreshListenerFiles() != null) {
getFragmentRefreshListenerFiles().onRefresh(selectedBranch);
}
break;
case "file":
RepoDetailActivity.mViewPager.setCurrentItem(1);
String branch1 = mainIntent.getStringExtra("branch");
tinyDB.putString("repoBranch", branch1);
if(getFragmentRefreshListenerFiles() != null) {
getFragmentRefreshListenerFiles().onRefresh(branch1);
}
Intent intent = new Intent(ctx, FileViewActivity.class);
intent.putExtra("file", mainIntent.getSerializableExtra("file"));
startActivity(intent);
break;
case "dir":
RepoDetailActivity.mViewPager.setCurrentItem(1);
String branch2 = mainIntent.getStringExtra("branch");
tinyDB.putString("repoBranch", branch2);
if(getFragmentRefreshListenerFiles() != null) {
getFragmentRefreshListenerFiles().onRefresh(branch2);
}
//((SectionsPagerAdapter) Objects.requireNonNull(RepoDetailActivity.mViewPager.getAdapter())).getItem(1);
break;
case "commitsList":
RepoDetailActivity.mViewPager.setCurrentItem(1);
String branch = mainIntent.getStringExtra("branchName");
tinyDB.putString("repoBranch", branch);
if(getFragmentRefreshListenerFiles() != null) {
getFragmentRefreshListenerFiles().onRefresh(branch);
}
Intent intent1 = new Intent(ctx, CommitsActivity.class);
intent1.putExtra("branchName", branch);
ctx.startActivity(intent1);
break;
case "issue":
RepoDetailActivity.mViewPager.setCurrentItem(2);
break;
case "issueNew":
RepoDetailActivity.mViewPager.setCurrentItem(2);
startActivity(new Intent(RepoDetailActivity.this, CreateIssueActivity.class));
break;
case "pull":
RepoDetailActivity.mViewPager.setCurrentItem(3);
break;
case "pullNew":
RepoDetailActivity.mViewPager.setCurrentItem(3);
startActivity(new Intent(RepoDetailActivity.this, CreatePullRequestActivity.class));
break;
case "releases":
RepoDetailActivity.mViewPager.setCurrentItem(4);
break;
case "newRelease":
RepoDetailActivity.mViewPager.setCurrentItem(4);
startActivity(new Intent(RepoDetailActivity.this, CreateReleaseActivity.class));
break;
case "milestones":
RepoDetailActivity.mViewPager.setCurrentItem(5);
break;
case "milestonesNew":
RepoDetailActivity.mViewPager.setCurrentItem(5);
startActivity(new Intent(RepoDetailActivity.this, CreateMilestoneActivity.class));
break;
case "labels":
RepoDetailActivity.mViewPager.setCurrentItem(6);
break;
case "settings":
startActivity(new Intent(RepoDetailActivity.this, RepositorySettingsActivity.class));
break;
} }
} }

View File

@ -1,14 +1,20 @@
package org.mian.gitnex.activities; package org.mian.gitnex.activities;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.os.Bundle; import android.os.Bundle;
import android.text.format.DateFormat;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TimePicker;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;
import com.google.android.material.switchmaterial.SwitchMaterial; import com.google.android.material.switchmaterial.SwitchMaterial;
import org.jetbrains.annotations.NotNull;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.databinding.ActivitySettingsAppearanceBinding; import org.mian.gitnex.databinding.ActivitySettingsAppearanceBinding;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
/** /**
@ -19,13 +25,13 @@ public class SettingsAppearanceActivity extends BaseActivity {
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
private static final String[] timeList = {"Pretty", "Normal"}; private static String[] timeList;
private static int timeSelectedChoice = 0; private static int timeSelectedChoice = 0;
private static final String[] customFontList = {"Roboto", "Manrope", "Source Code Pro"}; private static String[] customFontList;
private static int customFontSelectedChoice = 0; private static int customFontSelectedChoice = 0;
private static final String[] themeList = {"Dark", "Light", "Auto (Light / Dark)", "Retro", "Auto (Retro / Dark)", "Pitch Black"}; private static String[] themeList;
private static int themeSelectedChoice = 0; private static int themeSelectedChoice = 0;
@Override @Override
@ -38,48 +44,51 @@ public class SettingsAppearanceActivity extends BaseActivity {
ImageView closeActivity = activitySettingsAppearanceBinding.close; ImageView closeActivity = activitySettingsAppearanceBinding.close;
final TextView tvDateTimeSelected = activitySettingsAppearanceBinding.tvDateTimeSelected; // setter for time
final TextView customFontSelected = activitySettingsAppearanceBinding.customFontSelected; // setter for custom font
final TextView themeSelected = activitySettingsAppearanceBinding.themeSelected; // setter for theme
LinearLayout timeFrame = activitySettingsAppearanceBinding.timeFrame; LinearLayout timeFrame = activitySettingsAppearanceBinding.timeFrame;
LinearLayout customFontFrame = activitySettingsAppearanceBinding.customFontFrame; LinearLayout customFontFrame = activitySettingsAppearanceBinding.customFontFrame;
LinearLayout themeFrame = activitySettingsAppearanceBinding.themeSelectionFrame; LinearLayout themeFrame = activitySettingsAppearanceBinding.themeSelectionFrame;
LinearLayout lightTimeFrame = activitySettingsAppearanceBinding.lightThemeTimeSelectionFrame;
LinearLayout darkTimeFrame = activitySettingsAppearanceBinding.darkThemeTimeSelectionFrame;
SwitchMaterial counterBadgesSwitch = activitySettingsAppearanceBinding.switchCounterBadge; SwitchMaterial counterBadgesSwitch = activitySettingsAppearanceBinding.switchCounterBadge;
timeList = getResources().getStringArray(R.array.timeFormats);
customFontList = getResources().getStringArray(R.array.fonts);
themeList = getResources().getStringArray(R.array.themes);
initCloseListener(); initCloseListener();
closeActivity.setOnClickListener(onClickListener); closeActivity.setOnClickListener(onClickListener);
if(!tinyDB.getString("timeStr").isEmpty()) { String lightMinute = String.valueOf(tinyDB.getInt("lightThemeTimeMinute"));
String lightHour = String.valueOf(tinyDB.getInt("lightThemeTimeHour"));
if(lightMinute.length() == 1) lightMinute = "0" + lightMinute;
if(lightHour.length() == 1) lightHour = "0" + lightHour;
tvDateTimeSelected.setText(tinyDB.getString("timeStr")); String darkMinute = String.valueOf(tinyDB.getInt("darkThemeTimeMinute"));
String darkHour = String.valueOf(tinyDB.getInt("darkThemeTimeHour"));
if(darkMinute.length() == 1) darkMinute = "0" + darkMinute;
if(darkHour.length() == 1) darkHour = "0" + darkHour;
activitySettingsAppearanceBinding.lightThemeSelectedTime.setText(ctx.getResources().getString(R.string.settingsThemeTimeSelectedHint, lightHour,
lightMinute));
activitySettingsAppearanceBinding.darkThemeSelectedTime.setText(ctx.getResources().getString(R.string.settingsThemeTimeSelectedHint, darkHour,
darkMinute));
activitySettingsAppearanceBinding.tvDateTimeSelected.setText(tinyDB.getString("timeStr"));
activitySettingsAppearanceBinding.customFontSelected.setText(tinyDB.getString("customFontStr", "Manrope"));
activitySettingsAppearanceBinding.themeSelected.setText(tinyDB.getString("themeStr", "Dark"));
if(tinyDB.getString("themeStr").startsWith("Auto")) {
darkTimeFrame.setVisibility(View.VISIBLE);
lightTimeFrame.setVisibility(View.VISIBLE);
}
else {
darkTimeFrame.setVisibility(View.GONE);
lightTimeFrame.setVisibility(View.GONE);
} }
if(!tinyDB.getString("customFontStr").isEmpty()) { timeSelectedChoice = tinyDB.getInt("timeId");
customFontSelectedChoice = tinyDB.getInt("customFontId", 1);
customFontSelected.setText(tinyDB.getString("customFontStr")); themeSelectedChoice = tinyDB.getInt("themeId");
}
if(!tinyDB.getString("themeStr").isEmpty()) {
themeSelected.setText(tinyDB.getString("themeStr"));
}
if(timeSelectedChoice == 0) {
timeSelectedChoice = tinyDB.getInt("timeId");
}
if(customFontSelectedChoice == 0) {
customFontSelectedChoice = tinyDB.getInt("customFontId", 1);
}
if(themeSelectedChoice == 0) {
themeSelectedChoice = tinyDB.getInt("themeId");
}
counterBadgesSwitch.setChecked(tinyDB.getBoolean("enableCounterBadges")); counterBadgesSwitch.setChecked(tinyDB.getBoolean("enableCounterBadges"));
@ -101,7 +110,7 @@ public class SettingsAppearanceActivity extends BaseActivity {
tsBuilder.setSingleChoiceItems(themeList, themeSelectedChoice, (dialogInterfaceTheme, i) -> { tsBuilder.setSingleChoiceItems(themeList, themeSelectedChoice, (dialogInterfaceTheme, i) -> {
themeSelectedChoice = i; themeSelectedChoice = i;
themeSelected.setText(themeList[i]); activitySettingsAppearanceBinding.themeSelected.setText(themeList[i]);
tinyDB.putString("themeStr", themeList[i]); tinyDB.putString("themeStr", themeList[i]);
tinyDB.putInt("themeId", i); tinyDB.putInt("themeId", i);
@ -116,6 +125,16 @@ public class SettingsAppearanceActivity extends BaseActivity {
cfDialog.show(); cfDialog.show();
}); });
lightTimeFrame.setOnClickListener(view -> {
LightTimePicker timePicker = new LightTimePicker();
timePicker.show(getSupportFragmentManager(), "timePicker");
});
darkTimeFrame.setOnClickListener(view -> {
DarkTimePicker timePicker = new DarkTimePicker();
timePicker.show(getSupportFragmentManager(), "timePicker");
});
// custom font dialog // custom font dialog
customFontFrame.setOnClickListener(view -> { customFontFrame.setOnClickListener(view -> {
@ -127,7 +146,7 @@ public class SettingsAppearanceActivity extends BaseActivity {
cfBuilder.setSingleChoiceItems(customFontList, customFontSelectedChoice, (dialogInterfaceCustomFont, i) -> { cfBuilder.setSingleChoiceItems(customFontList, customFontSelectedChoice, (dialogInterfaceCustomFont, i) -> {
customFontSelectedChoice = i; customFontSelectedChoice = i;
customFontSelected.setText(customFontList[i]); activitySettingsAppearanceBinding.customFontSelected.setText(customFontList[i]);
tinyDB.putString("customFontStr", customFontList[i]); tinyDB.putString("customFontStr", customFontList[i]);
tinyDB.putInt("customFontId", i); tinyDB.putInt("customFontId", i);
@ -153,17 +172,17 @@ public class SettingsAppearanceActivity extends BaseActivity {
tBuilder.setSingleChoiceItems(timeList, timeSelectedChoice, (dialogInterfaceTime, i) -> { tBuilder.setSingleChoiceItems(timeList, timeSelectedChoice, (dialogInterfaceTime, i) -> {
timeSelectedChoice = i; timeSelectedChoice = i;
tvDateTimeSelected.setText(timeList[i]); activitySettingsAppearanceBinding.tvDateTimeSelected.setText(timeList[i]);
tinyDB.putString("timeStr", timeList[i]); tinyDB.putString("timeStr", timeList[i]);
tinyDB.putInt("timeId", i); tinyDB.putInt("timeId", i);
if("Normal".equals(timeList[i])) { switch(i) {
case 0:
tinyDB.putString("dateFormat", "normal"); tinyDB.putString("dateFormat", "pretty");
} break;
else { case 1:
tinyDB.putString("dateFormat", "normal");
tinyDB.putString("dateFormat", "pretty"); break;
} }
dialogInterfaceTime.dismiss(); dialogInterfaceTime.dismiss();
@ -180,4 +199,54 @@ public class SettingsAppearanceActivity extends BaseActivity {
onClickListener = view -> finish(); onClickListener = view -> finish();
} }
public static class LightTimePicker extends DialogFragment implements TimePickerDialog.OnTimeSetListener {
TinyDB db = TinyDB.getInstance(getContext());
@NotNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
int hour = db.getInt("lightThemeTimeHour");
int minute = db.getInt("lightThemeTimeMinute");
return new TimePickerDialog(getActivity(), this, hour, minute, true);
}
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
db.putInt("lightThemeTimeHour", hourOfDay);
db.putInt("lightThemeTimeMinute", minute);
db.putBoolean("refreshParent", true);
requireActivity().overridePendingTransition(0, 0);
this.dismiss();
Toasty.success(requireActivity().getApplicationContext(), requireContext().getResources().getString(R.string.settingsSave));
requireActivity().recreate();
}
}
public static class DarkTimePicker extends DialogFragment implements TimePickerDialog.OnTimeSetListener {
TinyDB db = TinyDB.getInstance(getContext());
@NotNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
int hour = db.getInt("darkThemeTimeHour");
int minute = db.getInt("darkThemeTimeMinute");
return new TimePickerDialog(getActivity(), this, hour, minute, true);
}
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
db.putInt("darkThemeTimeHour", hourOfDay);
db.putInt("darkThemeTimeMinute", minute);
db.putBoolean("refreshParent", true);
requireActivity().overridePendingTransition(0, 0);
this.dismiss();
Toasty.success(requireActivity().getApplicationContext(), requireContext().getResources().getString(R.string.settingsSave));
requireActivity().recreate();
}
}
} }

View File

@ -23,7 +23,7 @@ public class SettingsGeneralActivity extends BaseActivity {
private List<String> homeScreenList; private List<String> homeScreenList;
private static int homeScreenSelectedChoice = 0; private static int homeScreenSelectedChoice = 0;
private List<String> defaultScreen; private List<String> linkHandlerDefaultScreen;
private static int defaultLinkHandlerScreenSelectedChoice = 0; private static int defaultLinkHandlerScreenSelectedChoice = 0;
@Override @Override
@ -38,20 +38,16 @@ public class SettingsGeneralActivity extends BaseActivity {
viewBinding.close.setOnClickListener(onClickListener); viewBinding.close.setOnClickListener(onClickListener);
// home screen // home screen
String[] homeDefaultScreen_ = {getResources().getString(R.string.pageTitleMyRepos), getResources().getString(R.string.pageTitleStarredRepos), getResources().getString(R.string.pageTitleOrganizations), String[] appHomeDefaultScreen = getResources().getStringArray(R.array.appDefaultHomeScreen);
getResources().getString(R.string.pageTitleRepositories), getResources().getString(R.string.pageTitleProfile), getResources().getString(R.string.pageTitleExplore),
getResources().getString(R.string.titleDrafts)};
String[] homeDefaultScreenNew = {getResources().getString(R.string.pageTitleMyRepos), getResources().getString(R.string.pageTitleStarredRepos), getResources().getString(R.string.pageTitleOrganizations), String[] appHomeDefaultScreenNew = getResources().getStringArray(R.array.appDefaultHomeScreenNew);
getResources().getString(R.string.pageTitleRepositories), getResources().getString(R.string.pageTitleProfile), getResources().getString(R.string.pageTitleExplore),
getResources().getString(R.string.titleDrafts), getResources().getString(R.string.pageTitleNotifications)};
if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.3")) { if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.3")) {
homeDefaultScreen_ = homeDefaultScreenNew; appHomeDefaultScreen = appHomeDefaultScreenNew;
} }
homeScreenList = new ArrayList<>(Arrays.asList(homeDefaultScreen_)); homeScreenList = new ArrayList<>(Arrays.asList(appHomeDefaultScreen));
String[] homeScreenArray = new String[homeScreenList.size()]; String[] homeScreenArray = new String[homeScreenList.size()];
homeScreenList.toArray(homeScreenArray); homeScreenList.toArray(homeScreenArray);
@ -113,34 +109,14 @@ public class SettingsGeneralActivity extends BaseActivity {
// home screen // home screen
// link handler // link handler
String[] defaultScreen_ = {getResources().getString(R.string.generalDeepLinkSelectedText), getResources().getString(R.string.navRepos), getResources().getString(R.string.navOrg), getResources().getString(R.string.pageTitleNotifications), getResources().getString(R.string.navExplore)}; String[] linkHandlerDefaultScreenList = getResources().getStringArray(R.array.linkHandlerDefaultScreen);
defaultScreen = new ArrayList<>(Arrays.asList(defaultScreen_)); linkHandlerDefaultScreen = new ArrayList<>(Arrays.asList(linkHandlerDefaultScreenList));
String[] linksArray = new String[defaultScreen.size()]; String[] linksArray = new String[linkHandlerDefaultScreen.size()];
defaultScreen.toArray(linksArray); linkHandlerDefaultScreen.toArray(linksArray);
if(defaultLinkHandlerScreenSelectedChoice == 0) { defaultLinkHandlerScreenSelectedChoice = tinyDB.getInt("defaultScreenId");
viewBinding.generalDeepLinkSelected.setText(linksArray[defaultLinkHandlerScreenSelectedChoice]);
defaultLinkHandlerScreenSelectedChoice = tinyDB.getInt("defaultScreenId");
viewBinding.generalDeepLinkSelected.setText(getResources().getString(R.string.generalDeepLinkSelectedText));
}
if(defaultLinkHandlerScreenSelectedChoice == 1) {
viewBinding.generalDeepLinkSelected.setText(getResources().getString(R.string.navRepos));
}
else if(defaultLinkHandlerScreenSelectedChoice == 2) {
viewBinding.generalDeepLinkSelected.setText(getResources().getString(R.string.navOrg));
}
else if(defaultLinkHandlerScreenSelectedChoice == 3) {
viewBinding.generalDeepLinkSelected.setText(getResources().getString(R.string.pageTitleNotifications));
}
else if(defaultLinkHandlerScreenSelectedChoice == 4) {
viewBinding.generalDeepLinkSelected.setText(getResources().getString(R.string.navExplore));
}
viewBinding.setDefaultLinkHandler.setOnClickListener(setDefaultLinkHandler -> { viewBinding.setDefaultLinkHandler.setOnClickListener(setDefaultLinkHandler -> {

View File

@ -31,10 +31,10 @@ public class SettingsSecurityActivity extends BaseActivity {
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
private static final String[] cacheSizeDataList = {"50 MB", "100 MB", "250 MB", "500 MB", "1 GB"}; private static String[] cacheSizeDataList;
private static int cacheSizeDataSelectedChoice = 0; private static int cacheSizeDataSelectedChoice = 0;
private static final String[] cacheSizeImagesList = {"50 MB", "100 MB", "250 MB", "500 MB", "1 GB"}; private static String[] cacheSizeImagesList;
private static int cacheSizeImagesSelectedChoice = 0; private static int cacheSizeImagesSelectedChoice = 0;
@Override @Override
@ -61,6 +61,9 @@ public class SettingsSecurityActivity extends BaseActivity {
SwitchMaterial switchBiometric = activitySettingsSecurityBinding.switchBiometric; SwitchMaterial switchBiometric = activitySettingsSecurityBinding.switchBiometric;
cacheSizeDataList = getResources().getStringArray(R.array.cacheSizeList);
cacheSizeImagesList = getResources().getStringArray(R.array.cacheSizeList);
if(!tinyDB.getString("cacheSizeStr").isEmpty()) { if(!tinyDB.getString("cacheSizeStr").isEmpty()) {
cacheSizeDataSelected.setText(tinyDB.getString("cacheSizeStr")); cacheSizeDataSelected.setText(tinyDB.getString("cacheSizeStr"));

View File

@ -11,6 +11,9 @@ import androidx.appcompat.app.AlertDialog;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.databinding.ActivitySettingsTranslationBinding; import org.mian.gitnex.databinding.ActivitySettingsTranslationBinding;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.TreeMap;
/** /**
* Author M M Arif * Author M M Arif
@ -20,8 +23,6 @@ public class SettingsTranslationActivity extends BaseActivity {
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
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; private static int langSelectedChoice = 0;
@Override @Override
@ -29,6 +30,12 @@ public class SettingsTranslationActivity extends BaseActivity {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
LinkedHashMap<String, String> langs = new LinkedHashMap<>();
langs.put("", getString(R.string.settingsLanguageSystem));
for(String langCode : getResources().getStringArray(R.array.languages)) {
langs.put(langCode, getLanguageDisplayName(langCode));
}
ActivitySettingsTranslationBinding activitySettingsTranslationBinding = ActivitySettingsTranslationBinding.inflate(getLayoutInflater()); ActivitySettingsTranslationBinding activitySettingsTranslationBinding = ActivitySettingsTranslationBinding.inflate(getLayoutInflater());
setContentView(activitySettingsTranslationBinding.getRoot()); setContentView(activitySettingsTranslationBinding.getRoot());
@ -52,15 +59,9 @@ public class SettingsTranslationActivity extends BaseActivity {
}); });
if(!tinyDB.getString("localeStr").isEmpty()) { tvLanguageSelected.setText(tinyDB.getString("localeStr"));
tvLanguageSelected.setText(tinyDB.getString("localeStr")); langSelectedChoice = tinyDB.getInt("langId");
}
if(langSelectedChoice == 0) {
langSelectedChoice = tinyDB.getInt("langId");
}
// language dialog // language dialog
langFrame.setOnClickListener(view -> { langFrame.setOnClickListener(view -> {
@ -70,89 +71,18 @@ public class SettingsTranslationActivity extends BaseActivity {
lBuilder.setTitle(R.string.settingsLanguageSelectorDialogTitle); lBuilder.setTitle(R.string.settingsLanguageSelectorDialogTitle);
lBuilder.setCancelable(langSelectedChoice != -1); lBuilder.setCancelable(langSelectedChoice != -1);
lBuilder.setSingleChoiceItems(langList, langSelectedChoice, (dialogInterface, i) -> { lBuilder.setSingleChoiceItems(langs.values().toArray(new String[0]), langSelectedChoice, (dialogInterface, i) -> {
langSelectedChoice = i; String selectedLanguage = langs.keySet().toArray(new String[0])[i];
tvLanguageSelected.setText(langList[i]); tinyDB.putString("localeStr", langs.get(selectedLanguage));
tinyDB.putString("localeStr", langList[i]);
tinyDB.putInt("langId", i); tinyDB.putInt("langId", i);
tinyDB.putString("locale", selectedLanguage);
switch(langList[i]) {
case "Arabic":
tinyDB.putString("locale", "ar");
break;
case "Chinese":
tinyDB.putString("locale", "zh");
break;
case "Czech":
tinyDB.putString("locale", "cs");
break;
case "Finnish":
tinyDB.putString("locale", "fi");
break;
case "French":
tinyDB.putString("locale", "fr");
break;
case "German":
tinyDB.putString("locale", "de");
break;
case "Italian":
tinyDB.putString("locale", "it");
break;
case "Latvian":
tinyDB.putString("locale", "lv");
break;
case "Persian":
tinyDB.putString("locale", "fa");
break;
case "Polish":
tinyDB.putString("locale", "pl");
break;
case "Portuguese/Brazilian":
tinyDB.putString("locale", "pt");
break;
case "Russian":
tinyDB.putString("locale", "ru");
break;
case "Serbian":
tinyDB.putString("locale", "sr");
break;
case "Spanish":
tinyDB.putString("locale", "es");
break;
case "Turkish":
tinyDB.putString("locale", "tr");
break;
case "Ukrainian":
tinyDB.putString("locale", "uk");
break;
default:
tinyDB.putString("locale", "en");
break;
}
tinyDB.putBoolean("refreshParent", true); tinyDB.putBoolean("refreshParent", true);
this.recreate();
this.overridePendingTransition(0, 0); this.overridePendingTransition(0, 0);
dialogInterface.dismiss(); dialogInterface.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave)); Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
this.recreate();
}); });
lBuilder.setNeutralButton(getString(R.string.cancelButton), null); lBuilder.setNeutralButton(getString(R.string.cancelButton), null);
@ -167,4 +97,10 @@ public class SettingsTranslationActivity extends BaseActivity {
onClickListener = view -> finish(); onClickListener = view -> finish();
} }
private static String getLanguageDisplayName(String langCode) {
Locale english = new Locale("en");
Locale translated = new Locale(langCode);
return String.format("%s (%s)", translated.getDisplayName(translated), translated.getDisplayName(english));
}
} }

View File

@ -44,7 +44,7 @@ public class AdminCronTasksAdapter extends RecyclerView.Adapter<AdminCronTasksAd
super(itemView); super(itemView);
Context ctx = itemView.getContext(); Context ctx = itemView.getContext();
final String locale = tinyDb.getString("locale"); final Locale locale = ctx.getResources().getConfiguration().locale;
final String timeFormat = tinyDb.getString("dateFormat"); final String timeFormat = tinyDb.getString("dateFormat");
ImageView runTask = itemView.findViewById(R.id.runTask); ImageView runTask = itemView.findViewById(R.id.runTask);
@ -58,10 +58,10 @@ public class AdminCronTasksAdapter extends RecyclerView.Adapter<AdminCronTasksAd
String lastRun = ""; String lastRun = "";
if(cronTasks.getNext() != null) { if(cronTasks.getNext() != null) {
nextRun = TimeHelper.formatTime(cronTasks.getNext(), new Locale(locale), timeFormat, ctx); nextRun = TimeHelper.formatTime(cronTasks.getNext(), locale, timeFormat, ctx);
} }
if(cronTasks.getPrev() != null) { if(cronTasks.getPrev() != null) {
lastRun = TimeHelper.formatTime(cronTasks.getPrev(), new Locale(locale), timeFormat, ctx); lastRun = TimeHelper.formatTime(cronTasks.getPrev(), locale, timeFormat, ctx);
} }
View view = LayoutInflater.from(ctx).inflate(R.layout.layout_cron_task_info, null); View view = LayoutInflater.from(ctx).inflate(R.layout.layout_cron_task_info, null);

View File

@ -1,6 +1,7 @@
package org.mian.gitnex.adapters; package org.mian.gitnex.adapters;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.text.Html; import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -15,6 +16,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.TextDrawable;
import org.gitnex.tea4j.models.UserInfo; import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
@ -31,7 +33,7 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter<AdminGetUsersAdap
private final Context context; private final Context context;
private final List<UserInfo> usersListFull; private final List<UserInfo> usersListFull;
static class UsersViewHolder extends RecyclerView.ViewHolder { class UsersViewHolder extends RecyclerView.ViewHolder {
private String userLoginId; private String userLoginId;
@ -52,10 +54,14 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter<AdminGetUsersAdap
userRole = itemView.findViewById(R.id.userRole); userRole = itemView.findViewById(R.id.userRole);
userAvatar.setOnClickListener(loginId -> { userAvatar.setOnClickListener(loginId -> {
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", userLoginId);
context.startActivity(intent);
});
Context context = loginId.getContext(); userAvatar.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId)); AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
return true;
}); });
} }
} }

View File

@ -2,6 +2,7 @@ package org.mian.gitnex.adapters;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.text.Html; import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -11,6 +12,7 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import org.gitnex.tea4j.models.Collaborators; import org.gitnex.tea4j.models.Collaborators;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
@ -25,7 +27,7 @@ public class CollaboratorsAdapter extends BaseAdapter {
private final List<Collaborators> collaboratorsList; private final List<Collaborators> collaboratorsList;
private final Context context; private final Context context;
private static class ViewHolder { private class ViewHolder {
private String userLoginId; private String userLoginId;
@ -38,10 +40,14 @@ public class CollaboratorsAdapter extends BaseAdapter {
collaboratorName = v.findViewById(R.id.collaboratorName); collaboratorName = v.findViewById(R.id.collaboratorName);
collaboratorAvatar.setOnClickListener(loginId -> { collaboratorAvatar.setOnClickListener(loginId -> {
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", userLoginId);
context.startActivity(intent);
});
Context context = loginId.getContext(); collaboratorAvatar.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId)); AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
return true;
}); });
} }
} }

View File

@ -57,13 +57,11 @@ public class CommitsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) { if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
isLoading = true; isLoading = true;
loadMoreListener.onLoadMore(); loadMoreListener.onLoadMore();
} }
if(getItemViewType(position) == TYPE_LOAD) { if(getItemViewType(position) == TYPE_LOAD) {
((CommitsHolder) holder).bindData(commitsList.get(position)); ((CommitsHolder) holder).bindData(commitsList.get(position));
} }
} }
@ -106,18 +104,16 @@ public class CommitsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
void bindData(Commits commitsModel) { void bindData(Commits commitsModel) {
final TinyDB tinyDb = TinyDB.getInstance(context); final TinyDB tinyDb = TinyDB.getInstance(context);
final String locale = tinyDb.getString("locale"); Locale locale = context.getResources().getConfiguration().locale;
final String timeFormat = tinyDb.getString("dateFormat"); final String timeFormat = tinyDb.getString("dateFormat");
commitTitle.setText(EmojiParser.parseToUnicode(commitsModel.getCommit().getMessage())); commitTitle.setText(EmojiParser.parseToUnicode(commitsModel.getCommit().getMessage()));
commitCommitter.setText(context.getString(R.string.commitCommittedBy, commitsModel.getCommit().getCommitter().getName())); commitCommitter.setText(context.getString(R.string.commitCommittedBy, commitsModel.getCommit().getCommitter().getName()));
commitDate.setText(TimeHelper.formatTime(commitsModel.getCommit().getCommitter().getDate(), locale, timeFormat, context));
commitDate.setText(TimeHelper.formatTime(commitsModel.getCommit().getCommitter().getDate(), new Locale(locale), timeFormat, context));
if(timeFormat.equals("pretty")) { if(timeFormat.equals("pretty")) {
commitDate.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(commitsModel.getCommit().getCommitter().getDate()), context)); commitDate.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(commitsModel.getCommit().getCommitter().getDate()), context));
} }
commitHtmlUrl.setOnClickListener(v -> context.startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse(commitsModel.getHtml_url())))); commitHtmlUrl.setOnClickListener(v -> context.startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse(commitsModel.getHtml_url()))));
} }
@ -126,36 +122,29 @@ public class CommitsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
static class LoadHolder extends RecyclerView.ViewHolder { static class LoadHolder extends RecyclerView.ViewHolder {
LoadHolder(View itemView) { LoadHolder(View itemView) {
super(itemView); super(itemView);
} }
} }
public void setMoreDataAvailable(boolean moreDataAvailable) { public void setMoreDataAvailable(boolean moreDataAvailable) {
isMoreDataAvailable = moreDataAvailable; isMoreDataAvailable = moreDataAvailable;
} }
public void notifyDataChanged() { public void notifyDataChanged() {
notifyDataSetChanged(); notifyDataSetChanged();
isLoading = false; isLoading = false;
} }
public interface OnLoadMoreListener { public interface OnLoadMoreListener {
void onLoadMore(); void onLoadMore();
} }
public void setLoadMoreListener(CommitsAdapter.OnLoadMoreListener loadMoreListener) { public void setLoadMoreListener(CommitsAdapter.OnLoadMoreListener loadMoreListener) {
this.loadMoreListener = loadMoreListener; this.loadMoreListener = loadMoreListener;
} }
public void updateList(List<Commits> list) { public void updateList(List<Commits> list) {
commitsList = list; commitsList = list;
notifyDataSetChanged(); notifyDataSetChanged();
} }
} }

View File

@ -14,6 +14,7 @@ import androidx.recyclerview.widget.RecyclerView;
import org.gitnex.tea4j.models.Issues; import org.gitnex.tea4j.models.Issues;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.IssueDetailActivity; import org.mian.gitnex.activities.IssueDetailActivity;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.database.api.BaseApi; import org.mian.gitnex.database.api.BaseApi;
import org.mian.gitnex.database.api.RepositoriesApi; import org.mian.gitnex.database.api.RepositoriesApi;
@ -33,13 +34,13 @@ import java.util.Locale;
* Author M M Arif * Author M M Arif
*/ */
public class SearchIssuesAdapter extends RecyclerView.Adapter<SearchIssuesAdapter.SearchViewHolder> { public class ExploreIssuesAdapter extends RecyclerView.Adapter<ExploreIssuesAdapter.SearchViewHolder> {
private final List<Issues> searchedList; private final List<Issues> searchedList;
private final Context context; private final Context context;
private final TinyDB tinyDb; private final TinyDB tinyDb;
public SearchIssuesAdapter(List<Issues> dataList, Context ctx) { public ExploreIssuesAdapter(List<Issues> dataList, Context ctx) {
this.context = ctx; this.context = ctx;
this.searchedList = dataList; this.searchedList = dataList;
@ -49,7 +50,6 @@ public class SearchIssuesAdapter extends RecyclerView.Adapter<SearchIssuesAdapte
class SearchViewHolder extends RecyclerView.ViewHolder { class SearchViewHolder extends RecyclerView.ViewHolder {
private Issues issue; private Issues issue;
private final ImageView issueAssigneeAvatar; private final ImageView issueAssigneeAvatar;
private final TextView issueTitle; private final TextView issueTitle;
private final TextView issueCreatedTime; private final TextView issueCreatedTime;
@ -65,9 +65,6 @@ public class SearchIssuesAdapter extends RecyclerView.Adapter<SearchIssuesAdapte
issueCreatedTime = itemView.findViewById(R.id.issueCreatedTime); issueCreatedTime = itemView.findViewById(R.id.issueCreatedTime);
itemView.setOnClickListener(v -> { itemView.setOnClickListener(v -> {
Context context = v.getContext();
Intent intent = new Intent(context, IssueDetailActivity.class); Intent intent = new Intent(context, IssueDetailActivity.class);
intent.putExtra("issueNumber", issue.getNumber()); intent.putExtra("issueNumber", issue.getNumber());
@ -90,42 +87,44 @@ public class SearchIssuesAdapter extends RecyclerView.Adapter<SearchIssuesAdapte
long id = repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName); long id = repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName);
tinyDb.putLong("repositoryId", id); tinyDb.putLong("repositoryId", id);
} }
else { else {
Repository data = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName); Repository data = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName);
tinyDb.putLong("repositoryId", data.getRepositoryId()); tinyDb.putLong("repositoryId", data.getRepositoryId());
} }
context.startActivity(intent); context.startActivity(intent);
}); });
issueAssigneeAvatar.setOnClickListener(v -> { issueAssigneeAvatar.setOnClickListener(v -> {
Context context = v.getContext(); Intent intent = new Intent(context, ProfileActivity.class);
String userLoginId = issue.getUser().getLogin(); intent.putExtra("username", issue.getUser().getLogin());
context.startActivity(intent);
});
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId)); issueAssigneeAvatar.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, issue.getUser().getLogin(), context.getString(R.string.copyLoginIdToClipBoard, issue.getUser().getLogin()));
return true;
}); });
} }
} }
@NonNull @NonNull
@Override @Override
public SearchIssuesAdapter.SearchViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public ExploreIssuesAdapter.SearchViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_issues, parent, false); View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_issues, parent, false);
return new SearchIssuesAdapter.SearchViewHolder(v); return new ExploreIssuesAdapter.SearchViewHolder(v);
} }
@Override @Override
public void onBindViewHolder(@NonNull final SearchIssuesAdapter.SearchViewHolder holder, int position) { public void onBindViewHolder(@NonNull final ExploreIssuesAdapter.SearchViewHolder holder, int position) {
Issues currentItem = searchedList.get(position); Issues currentItem = searchedList.get(position);
int imgRadius = AppUtil.getPixelsFromDensity(context, 3); int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
String locale = tinyDb.getString("locale"); Locale locale = context.getResources().getConfiguration().locale;
String timeFormat = tinyDb.getString("dateFormat"); String timeFormat = tinyDb.getString("dateFormat");
PicassoService.getInstance(context).get() PicassoService.getInstance(context).get()
@ -144,20 +143,20 @@ public class SearchIssuesAdapter extends RecyclerView.Adapter<SearchIssuesAdapte
switch(timeFormat) { switch(timeFormat) {
case "pretty": { case "pretty": {
PrettyTime prettyTime = new PrettyTime(new Locale(locale)); PrettyTime prettyTime = new PrettyTime(locale);
String createdTime = prettyTime.format(currentItem.getCreated_at()); String createdTime = prettyTime.format(currentItem.getCreated_at());
holder.issueCreatedTime.setText(createdTime); holder.issueCreatedTime.setText(createdTime);
holder.issueCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getCreated_at()), context)); holder.issueCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getCreated_at()), context));
break; break;
} }
case "normal": { case "normal": {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
String createdTime = formatter.format(currentItem.getCreated_at()); String createdTime = formatter.format(currentItem.getCreated_at());
holder.issueCreatedTime.setText(createdTime); holder.issueCreatedTime.setText(createdTime);
break; break;
} }
case "normal1": { case "normal1": {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
String createdTime = formatter.format(currentItem.getCreated_at()); String createdTime = formatter.format(currentItem.getCreated_at());
holder.issueCreatedTime.setText(createdTime); holder.issueCreatedTime.setText(createdTime);
break; break;
@ -167,12 +166,10 @@ public class SearchIssuesAdapter extends RecyclerView.Adapter<SearchIssuesAdapte
@Override @Override
public int getItemCount() { public int getItemCount() {
return searchedList.size(); return searchedList.size();
} }
public void notifyDataChanged() { public void notifyDataChanged() {
notifyDataSetChanged(); notifyDataSetChanged();
} }
} }

View File

@ -0,0 +1,148 @@
package org.mian.gitnex.adapters;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import org.gitnex.tea4j.models.Organization;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.OrganizationDetailActivity;
import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TinyDB;
import java.util.List;
/**
* Author M M Arif
*/
public class ExplorePublicOrganizationsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final Context context;
private final int TYPE_LOAD = 0;
private List<Organization> organizationsList;
private OnLoadMoreListener loadMoreListener;
private boolean isLoading = false, isMoreDataAvailable = true;
public ExplorePublicOrganizationsAdapter(Context ctx, List<Organization> organizationsListMain) {
this.context = ctx;
this.organizationsList = organizationsListMain;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
if(viewType == TYPE_LOAD) {
return new ExplorePublicOrganizationsAdapter.OrganizationsHolder(inflater.inflate(R.layout.list_organizations, parent, false));
}
else {
return new ExplorePublicOrganizationsAdapter.LoadHolder(inflater.inflate(R.layout.row_load, parent, false));
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
isLoading = true;
loadMoreListener.onLoadMore();
}
if(getItemViewType(position) == TYPE_LOAD) {
((ExplorePublicOrganizationsAdapter.OrganizationsHolder) holder).bindData(organizationsList.get(position));
}
}
@Override
public int getItemViewType(int position) {
if(organizationsList.get(position).getFull_name() != null) {
return TYPE_LOAD;
}
else {
return 1;
}
}
@Override
public int getItemCount() {
return organizationsList.size();
}
class OrganizationsHolder extends RecyclerView.ViewHolder {
private Organization organization;
private final ImageView image;
private final TextView orgName;
private final TextView orgDescription;
OrganizationsHolder(View itemView) {
super(itemView);
image = itemView.findViewById(R.id.imageAvatar);
orgName = itemView.findViewById(R.id.orgName);
orgDescription = itemView.findViewById(R.id.orgDescription);
itemView.setOnClickListener(v -> {
Context context = v.getContext();
Intent intent = new Intent(context, OrganizationDetailActivity.class);
intent.putExtra("orgName", organization.getUsername());
TinyDB tinyDb = TinyDB.getInstance(context);
tinyDb.putString("orgName", organization.getUsername());
tinyDb.putString("organizationId", String.valueOf(organization.getId()));
tinyDb.putBoolean("organizationAction", true);
context.startActivity(intent);
});
}
@SuppressLint("SetTextI18n")
void bindData(Organization organization) {
this.organization = organization;
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
orgName.setText(organization.getUsername());
PicassoService.getInstance(context).get()
.load(organization.getAvatar_url())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(120, 120)
.centerCrop()
.into(image);
if (!organization.getDescription().equals("")) {
orgDescription.setText(organization.getDescription());
}
}
}
static class LoadHolder extends RecyclerView.ViewHolder {
LoadHolder(View itemView) {
super(itemView);
}
}
public void setMoreDataAvailable(boolean moreDataAvailable) {
isMoreDataAvailable = moreDataAvailable;
}
public void notifyDataChanged() {
notifyDataSetChanged();
isLoading = false;
}
public interface OnLoadMoreListener {
void onLoadMore();
}
public void setLoadMoreListener(OnLoadMoreListener loadMoreListener) {
this.loadMoreListener = loadMoreListener;
}
public void updateList(List<Organization> list) {
organizationsList = list;
notifyDataSetChanged();
}
}

View File

@ -122,45 +122,32 @@ public class ExploreRepositoriesAdapter extends RecyclerView.Adapter<ExploreRepo
final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token"); final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token");
WatchInfo watch = new WatchInfo(); WatchInfo watch = new WatchInfo();
Call<WatchInfo> call; Call<WatchInfo> call;
call = RetrofitClient.getApiInterface(context).checkRepoWatchStatus(token, repoOwner, repoName); call = RetrofitClient.getApiInterface(context).checkRepoWatchStatus(token, repoOwner, repoName);
call.enqueue(new Callback<WatchInfo>() { call.enqueue(new Callback<WatchInfo>() {
@Override @Override
public void onResponse(@NonNull Call<WatchInfo> call, @NonNull retrofit2.Response<WatchInfo> response) { public void onResponse(@NonNull Call<WatchInfo> call, @NonNull retrofit2.Response<WatchInfo> response) {
if(response.isSuccessful()) { if(response.isSuccessful()) {
assert response.body() != null; assert response.body() != null;
tinyDb.putBoolean("repoWatch", response.body().getSubscribed()); tinyDb.putBoolean("repoWatch", response.body().getSubscribed());
} else {
tinyDb.putBoolean("repoWatch", false);
if(response.code() != 404) {
Toasty.error(context, context.getString(R.string.genericApiStatusError));
}
} }
else {
tinyDb.putBoolean("repoWatch", false);
if(response.code() != 404) {
Toasty.error(context, context.getString(R.string.genericApiStatusError));
}
}
} }
@Override @Override
public void onFailure(@NonNull Call<WatchInfo> call, @NonNull Throwable t) { public void onFailure(@NonNull Call<WatchInfo> call, @NonNull Throwable t) {
tinyDb.putBoolean("repoWatch", false); tinyDb.putBoolean("repoWatch", false);
Toasty.error(context, context.getString(R.string.genericApiStatusError)); Toasty.error(context, context.getString(R.string.genericApiStatusError));
} }
}); });
} }
context.startActivity(intent); context.startActivity(intent);
}); });
@ -183,7 +170,7 @@ public class ExploreRepositoriesAdapter extends RecyclerView.Adapter<ExploreRepo
UserRepositories currentItem = reposList.get(position); UserRepositories currentItem = reposList.get(position);
int imgRadius = AppUtil.getPixelsFromDensity(context, 3); int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
String locale = tinyDb.getString("locale"); Locale locale = context.getResources().getConfiguration().locale;
String timeFormat = tinyDb.getString("dateFormat"); String timeFormat = tinyDb.getString("dateFormat");
holder.userRepositories = currentItem; holder.userRepositories = currentItem;
holder.orgName.setText(currentItem.getFullName().split("/")[0]); holder.orgName.setText(currentItem.getFullName().split("/")[0]);
@ -212,20 +199,20 @@ public class ExploreRepositoriesAdapter extends RecyclerView.Adapter<ExploreRepo
switch(timeFormat) { switch(timeFormat) {
case "pretty": { case "pretty": {
PrettyTime prettyTime = new PrettyTime(new Locale(locale)); PrettyTime prettyTime = new PrettyTime(locale);
String createdTime = prettyTime.format(currentItem.getUpdated_at()); String createdTime = prettyTime.format(currentItem.getUpdated_at());
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
holder.repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), context)); holder.repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), context));
break; break;
} }
case "normal": { case "normal": {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
String createdTime = formatter.format(currentItem.getUpdated_at()); String createdTime = formatter.format(currentItem.getUpdated_at());
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
break; break;
} }
case "normal1": { case "normal1": {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
String createdTime = formatter.format(currentItem.getUpdated_at()); String createdTime = formatter.format(currentItem.getUpdated_at());
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
break; break;

View File

@ -20,6 +20,7 @@ import com.google.gson.JsonElement;
import com.vdurmont.emoji.EmojiParser; import com.vdurmont.emoji.EmojiParser;
import org.gitnex.tea4j.models.IssueComments; import org.gitnex.tea4j.models.IssueComments;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.fragments.BottomSheetReplyFragment; import org.mian.gitnex.fragments.BottomSheetReplyFragment;
@ -50,6 +51,7 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
private final List<IssueComments> issuesComments; private final List<IssueComments> issuesComments;
private final FragmentManager fragmentManager; private final FragmentManager fragmentManager;
private final BottomSheetReplyFragment.OnInteractedListener onInteractedListener; private final BottomSheetReplyFragment.OnInteractedListener onInteractedListener;
private final Locale locale;
public IssueCommentsAdapter(Context ctx, Bundle bundle, List<IssueComments> issuesCommentsMain, FragmentManager fragmentManager, BottomSheetReplyFragment.OnInteractedListener onInteractedListener) { public IssueCommentsAdapter(Context ctx, Bundle bundle, List<IssueComments> issuesCommentsMain, FragmentManager fragmentManager, BottomSheetReplyFragment.OnInteractedListener onInteractedListener) {
@ -58,8 +60,8 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
this.issuesComments = issuesCommentsMain; this.issuesComments = issuesCommentsMain;
this.fragmentManager = fragmentManager; this.fragmentManager = fragmentManager;
this.onInteractedListener = onInteractedListener; this.onInteractedListener = onInteractedListener;
tinyDB = TinyDB.getInstance(ctx); tinyDB = TinyDB.getInstance(ctx);
locale = ctx.getResources().getConfiguration().locale;
} }
class IssueCommentViewHolder extends RecyclerView.ViewHolder { class IssueCommentViewHolder extends RecyclerView.ViewHolder {
@ -86,10 +88,9 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
menu.setOnClickListener(v -> { menu.setOnClickListener(v -> {
final Context ctx = v.getContext();
final String loginUid = tinyDB.getString("loginUid"); final String loginUid = tinyDB.getString("loginUid");
@SuppressLint("InflateParams") View vw = LayoutInflater.from(ctx).inflate(R.layout.bottom_sheet_issue_comments, null); @SuppressLint("InflateParams") View vw = LayoutInflater.from(context).inflate(R.layout.bottom_sheet_issue_comments, null);
TextView commentMenuEdit = vw.findViewById(R.id.commentMenuEdit); TextView commentMenuEdit = vw.findViewById(R.id.commentMenuEdit);
TextView commentShare = vw.findViewById(R.id.issueCommentShare); TextView commentShare = vw.findViewById(R.id.issueCommentShare);
@ -107,7 +108,7 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
commentMenuCopy.setVisibility(View.GONE); commentMenuCopy.setVisibility(View.GONE);
} }
BottomSheetDialog dialog = new BottomSheetDialog(ctx); BottomSheetDialog dialog = new BottomSheetDialog(context);
dialog.setContentView(vw); dialog.setContentView(vw);
dialog.show(); dialog.show();
@ -117,20 +118,17 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
bundle1.putAll(bundle); bundle1.putAll(bundle);
bundle1.putInt("commentId", issueComment.getId()); bundle1.putInt("commentId", issueComment.getId());
ReactionSpinner reactionSpinner = new ReactionSpinner(ctx, bundle1); ReactionSpinner reactionSpinner = new ReactionSpinner(context, bundle1);
reactionSpinner.setOnInteractedListener(() -> { reactionSpinner.setOnInteractedListener(() -> {
tinyDB.putBoolean("commentEdited", true); tinyDB.putBoolean("commentEdited", true);
onInteractedListener.onInteracted(); onInteractedListener.onInteracted();
dialog.dismiss(); dialog.dismiss();
}); });
linearLayout.addView(reactionSpinner); linearLayout.addView(reactionSpinner);
commentMenuEdit.setOnClickListener(v1 -> { commentMenuEdit.setOnClickListener(v1 -> {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putInt("commentId", issueComment.getId()); bundle.putInt("commentId", issueComment.getId());
bundle.putString("commentAction", "edit"); bundle.putString("commentAction", "edit");
@ -141,56 +139,48 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
bottomSheetReplyFragment.show(fragmentManager, "replyBottomSheet"); bottomSheetReplyFragment.show(fragmentManager, "replyBottomSheet");
dialog.dismiss(); dialog.dismiss();
}); });
commentShare.setOnClickListener(v1 -> { commentShare.setOnClickListener(v1 -> {
// get comment Url // get comment Url
CharSequence commentUrl = issueComment.getHtml_url(); CharSequence commentUrl = issueComment.getHtml_url();
// share issue comment // share issue comment
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
sharingIntent.setType("text/plain"); sharingIntent.setType("text/plain");
String intentHeader = tinyDB.getString("issueNumber") + ctx.getResources().getString(R.string.hash) + "issuecomment-" + issueComment.getId() + " " + tinyDB.getString("issueTitle"); String intentHeader = tinyDB.getString("issueNumber") + context.getResources().getString(R.string.hash) + "issuecomment-" + issueComment.getId() + " " + tinyDB.getString("issueTitle");
sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, intentHeader); sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, intentHeader);
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, commentUrl); sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, commentUrl);
ctx.startActivity(Intent.createChooser(sharingIntent, intentHeader)); context.startActivity(Intent.createChooser(sharingIntent, intentHeader));
dialog.dismiss(); dialog.dismiss();
}); });
issueCommentCopyUrl.setOnClickListener(v1 -> { issueCommentCopyUrl.setOnClickListener(v1 -> {
// comment Url // comment Url
CharSequence commentUrl = issueComment.getHtml_url(); CharSequence commentUrl = issueComment.getHtml_url();
ClipboardManager clipboard = (ClipboardManager) Objects.requireNonNull(ctx).getSystemService(Context.CLIPBOARD_SERVICE); ClipboardManager clipboard = (ClipboardManager) Objects.requireNonNull(context).getSystemService(Context.CLIPBOARD_SERVICE);
assert clipboard != null; assert clipboard != null;
ClipData clip = ClipData.newPlainText(commentUrl, commentUrl); ClipData clip = ClipData.newPlainText(commentUrl, commentUrl);
clipboard.setPrimaryClip(clip); clipboard.setPrimaryClip(clip);
dialog.dismiss(); dialog.dismiss();
Toasty.success(ctx, ctx.getString(R.string.copyIssueUrlToastMsg)); Toasty.success(context, context.getString(R.string.copyIssueUrlToastMsg));
}); });
commentMenuQuote.setOnClickListener(v1 -> { commentMenuQuote.setOnClickListener(v1 -> {
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
String commenterName = issueComment.getUser().getUsername(); String commenterName = issueComment.getUser().getUsername();
if(!commenterName.equals(tinyDB.getString("userLogin"))) { if(!commenterName.equals(tinyDB.getString("userLogin"))) {
stringBuilder.append("@").append(commenterName).append("\n\n"); stringBuilder.append("@").append(commenterName).append("\n\n");
} }
String[] lines = issueComment.getBody().split("\\R"); String[] lines = issueComment.getBody().split("\\R");
for(String line : lines) { for(String line : lines) {
stringBuilder.append(">").append(line).append("\n"); stringBuilder.append(">").append(line).append("\n");
} }
@ -202,40 +192,37 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
dialog.dismiss(); dialog.dismiss();
BottomSheetReplyFragment.newInstance(bundle).show(fragmentManager, "replyBottomSheet"); BottomSheetReplyFragment.newInstance(bundle).show(fragmentManager, "replyBottomSheet");
}); });
commentMenuCopy.setOnClickListener(v1 -> { commentMenuCopy.setOnClickListener(v1 -> {
ClipboardManager clipboard = (ClipboardManager) Objects.requireNonNull(context).getSystemService(Context.CLIPBOARD_SERVICE);
ClipboardManager clipboard = (ClipboardManager) Objects.requireNonNull(ctx).getSystemService(Context.CLIPBOARD_SERVICE);
assert clipboard != null; assert clipboard != null;
ClipData clip = ClipData.newPlainText("Comment on issue #" + tinyDB.getString("issueNumber"), issueComment.getBody()); ClipData clip = ClipData.newPlainText("Comment on issue #" + tinyDB.getString("issueNumber"), issueComment.getBody());
clipboard.setPrimaryClip(clip); clipboard.setPrimaryClip(clip);
dialog.dismiss(); dialog.dismiss();
Toasty.success(ctx, ctx.getString(R.string.copyIssueCommentToastMsg)); Toasty.success(context, context.getString(R.string.copyIssueCommentToastMsg));
}); });
commentMenuDelete.setOnClickListener(v1 -> { commentMenuDelete.setOnClickListener(v1 -> {
deleteIssueComment(context, issueComment.getId(), getAdapterPosition());
deleteIssueComment(ctx, issueComment.getId(), getAdapterPosition());
dialog.dismiss(); dialog.dismiss();
}); });
}); });
avatar.setOnClickListener(loginId -> { avatar.setOnClickListener(loginId -> {
Intent intent = new Intent(context, ProfileActivity.class);
Context context = loginId.getContext(); intent.putExtra("username", userLoginId);
context.startActivity(intent);
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
}); });
avatar.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
return true;
});
} }
} }
private void updateAdapter(int position) { private void updateAdapter(int position) {
@ -243,7 +230,6 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
issuesComments.remove(position); issuesComments.remove(position);
notifyItemRemoved(position); notifyItemRemoved(position);
notifyItemRangeChanged(position, issuesComments.size()); notifyItemRangeChanged(position, issuesComments.size());
} }
private void deleteIssueComment(final Context ctx, final int commentId, int position) { private void deleteIssueComment(final Context ctx, final int commentId, int position) {
@ -337,14 +323,11 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
if(issueComment.getCreated_at() != null) { if(issueComment.getCreated_at() != null) {
if(timeFormat.equals("pretty")) { if(timeFormat.equals("pretty")) {
informationBuilder = new StringBuilder(TimeHelper.formatTime(issueComment.getCreated_at(), locale, "pretty", context));
informationBuilder = new StringBuilder(TimeHelper.formatTime(issueComment.getCreated_at(), Locale.getDefault(), "pretty", context));
holder.information.setOnClickListener(v -> TimeHelper.customDateFormatForToastDateFormat(issueComment.getCreated_at())); holder.information.setOnClickListener(v -> TimeHelper.customDateFormatForToastDateFormat(issueComment.getCreated_at()));
} }
else if(timeFormat.equals("normal")) { else if(timeFormat.equals("normal")) {
informationBuilder = new StringBuilder(TimeHelper.formatTime(issueComment.getCreated_at(), locale, "normal", context));
informationBuilder = new StringBuilder(TimeHelper.formatTime(issueComment.getCreated_at(), Locale.getDefault(), "normal", context));
} }
if(!issueComment.getCreated_at().equals(issueComment.getUpdated_at())) { if(!issueComment.getCreated_at().equals(issueComment.getUpdated_at())) {
@ -374,7 +357,6 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
@Override @Override
public int getItemCount() { public int getItemCount() {
return issuesComments.size(); return issuesComments.size();
} }

View File

@ -16,6 +16,7 @@ import com.vdurmont.emoji.EmojiParser;
import org.gitnex.tea4j.models.Issues; import org.gitnex.tea4j.models.Issues;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.IssueDetailActivity; import org.mian.gitnex.activities.IssueDetailActivity;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.ClickListener;
@ -110,9 +111,6 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
issueCreatedTime = itemView.findViewById(R.id.issueCreatedTime); issueCreatedTime = itemView.findViewById(R.id.issueCreatedTime);
itemView.setOnClickListener(layoutView -> { itemView.setOnClickListener(layoutView -> {
Context context = layoutView.getContext();
Intent intent = new Intent(context, IssueDetailActivity.class); Intent intent = new Intent(context, IssueDetailActivity.class);
intent.putExtra("issueNumber", issue.getNumber()); intent.putExtra("issueNumber", issue.getNumber());
@ -123,19 +121,22 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
}); });
issueAssigneeAvatar.setOnClickListener(v -> { issueAssigneeAvatar.setOnClickListener(v -> {
Context context = v.getContext(); Intent intent = new Intent(context, ProfileActivity.class);
String userLoginId = issue.getUser().getLogin(); intent.putExtra("username", issue.getUser().getLogin());
context.startActivity(intent);
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
}); });
issueAssigneeAvatar.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, issue.getUser().getLogin(), context.getString(R.string.copyLoginIdToClipBoard, issue.getUser().getLogin()));
return true;
});
} }
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
void bindData(Issues issue) { void bindData(Issues issue) {
TinyDB tinyDb = TinyDB.getInstance(context); TinyDB tinyDb = TinyDB.getInstance(context);
String locale = tinyDb.getString("locale"); Locale locale = context.getResources().getConfiguration().locale;
String timeFormat = tinyDb.getString("dateFormat"); String timeFormat = tinyDb.getString("dateFormat");
int imgRadius = AppUtil.getPixelsFromDensity(context, 3); int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
@ -156,20 +157,20 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
switch(timeFormat) { switch(timeFormat) {
case "pretty": { case "pretty": {
PrettyTime prettyTime = new PrettyTime(new Locale(locale)); PrettyTime prettyTime = new PrettyTime(locale);
String createdTime = prettyTime.format(issue.getCreated_at()); String createdTime = prettyTime.format(issue.getCreated_at());
this.issueCreatedTime.setText(createdTime); this.issueCreatedTime.setText(createdTime);
this.issueCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(issue.getCreated_at()), context)); this.issueCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(issue.getCreated_at()), context));
break; break;
} }
case "normal": { case "normal": {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
String createdTime = formatter.format(issue.getCreated_at()); String createdTime = formatter.format(issue.getCreated_at());
this.issueCreatedTime.setText(createdTime); this.issueCreatedTime.setText(createdTime);
break; break;
} }
case "normal1": { case "normal1": {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
String createdTime = formatter.format(issue.getCreated_at()); String createdTime = formatter.format(issue.getCreated_at());
this.issueCreatedTime.setText(createdTime); this.issueCreatedTime.setText(createdTime);
break; break;

View File

@ -2,6 +2,7 @@ package org.mian.gitnex.adapters;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.text.Html; import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -13,6 +14,7 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import org.gitnex.tea4j.models.UserInfo; import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
@ -29,7 +31,7 @@ public class MembersByOrgAdapter extends BaseAdapter implements Filterable {
private final Context context; private final Context context;
private final List<UserInfo> membersListFull; private final List<UserInfo> membersListFull;
private static class ViewHolder { private class ViewHolder {
private String userLoginId; private String userLoginId;
@ -42,10 +44,14 @@ public class MembersByOrgAdapter extends BaseAdapter implements Filterable {
memberName = v.findViewById(R.id.memberName); memberName = v.findViewById(R.id.memberName);
memberAvatar.setOnClickListener(loginId -> { memberAvatar.setOnClickListener(loginId -> {
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", userLoginId);
context.startActivity(intent);
});
Context context = loginId.getContext(); memberAvatar.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId)); AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
return true;
}); });
} }
} }

View File

@ -148,7 +148,7 @@ public class MilestonesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
this.milestones = dataModel; this.milestones = dataModel;
final TinyDB tinyDb = TinyDB.getInstance(context); final TinyDB tinyDb = TinyDB.getInstance(context);
final String locale = tinyDb.getString("locale"); final String locale = context.getResources().getConfiguration().locale.getLanguage();
final String timeFormat = tinyDb.getString("dateFormat"); final String timeFormat = tinyDb.getString("dateFormat");
Markdown.render(context, dataModel.getTitle(), msTitle); Markdown.render(context, dataModel.getTitle(), msTitle);

View File

@ -18,7 +18,7 @@ import java.util.List;
* Author M M Arif * Author M M Arif
*/ */
public class ProfileEmailsAdapter extends RecyclerView.Adapter<ProfileEmailsAdapter.EmailsViewHolder> { public class MyProfileEmailsAdapter extends RecyclerView.Adapter<MyProfileEmailsAdapter.EmailsViewHolder> {
private final List<Emails> emailsList; private final List<Emails> emailsList;
private final Context context; private final Context context;
@ -37,20 +37,20 @@ public class ProfileEmailsAdapter extends RecyclerView.Adapter<ProfileEmailsAdap
} }
} }
public ProfileEmailsAdapter(Context ctx, List<Emails> emailsListMain) { public MyProfileEmailsAdapter(Context ctx, List<Emails> emailsListMain) {
this.context = ctx; this.context = ctx;
this.emailsList = emailsListMain; this.emailsList = emailsListMain;
} }
@NonNull @NonNull
@Override @Override
public ProfileEmailsAdapter.EmailsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public MyProfileEmailsAdapter.EmailsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_profile_emails, parent, false); View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_profile_emails, parent, false);
return new ProfileEmailsAdapter.EmailsViewHolder(v); return new MyProfileEmailsAdapter.EmailsViewHolder(v);
} }
@Override @Override
public void onBindViewHolder(@NonNull ProfileEmailsAdapter.EmailsViewHolder holder, int position) { public void onBindViewHolder(@NonNull MyProfileEmailsAdapter.EmailsViewHolder holder, int position) {
Emails currentItem = emailsList.get(position); Emails currentItem = emailsList.get(position);

View File

@ -1,6 +1,7 @@
package org.mian.gitnex.adapters; package org.mian.gitnex.adapters;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.text.Html; import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -11,6 +12,7 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.gitnex.tea4j.models.UserInfo; import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
@ -20,12 +22,12 @@ import java.util.List;
* Author M M Arif * Author M M Arif
*/ */
public class ProfileFollowersAdapter extends RecyclerView.Adapter<ProfileFollowersAdapter.FollowersViewHolder> { public class MyProfileFollowersAdapter extends RecyclerView.Adapter<MyProfileFollowersAdapter.FollowersViewHolder> {
private final List<UserInfo> followersList; private final List<UserInfo> followersList;
private final Context context; private final Context context;
static class FollowersViewHolder extends RecyclerView.ViewHolder { class FollowersViewHolder extends RecyclerView.ViewHolder {
private String userLoginId; private String userLoginId;
@ -41,16 +43,20 @@ public class ProfileFollowersAdapter extends RecyclerView.Adapter<ProfileFollowe
userFullName = itemView.findViewById(R.id.userFullName); userFullName = itemView.findViewById(R.id.userFullName);
userName = itemView.findViewById(R.id.userName); userName = itemView.findViewById(R.id.userName);
userAvatar.setOnClickListener(loginId -> { itemView.setOnClickListener(loginId -> {
Intent intent = new Intent(context, ProfileActivity.class);
Context context = loginId.getContext(); intent.putExtra("username", userLoginId);
context.startActivity(intent);
});
itemView.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId)); AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
return true;
}); });
} }
} }
public ProfileFollowersAdapter(Context ctx, List<UserInfo> followersListMain) { public MyProfileFollowersAdapter(Context ctx, List<UserInfo> followersListMain) {
this.context = ctx; this.context = ctx;
this.followersList = followersListMain; this.followersList = followersListMain;
@ -58,14 +64,14 @@ public class ProfileFollowersAdapter extends RecyclerView.Adapter<ProfileFollowe
@NonNull @NonNull
@Override @Override
public ProfileFollowersAdapter.FollowersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public MyProfileFollowersAdapter.FollowersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_profile_followers, parent, false); View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_profile_followers_following, parent, false);
return new FollowersViewHolder(v); return new FollowersViewHolder(v);
} }
@Override @Override
public void onBindViewHolder(@NonNull ProfileFollowersAdapter.FollowersViewHolder holder, int position) { public void onBindViewHolder(@NonNull MyProfileFollowersAdapter.FollowersViewHolder holder, int position) {
UserInfo currentItem = followersList.get(position); UserInfo currentItem = followersList.get(position);
int imgRadius = AppUtil.getPixelsFromDensity(context, 3); int imgRadius = AppUtil.getPixelsFromDensity(context, 3);

View File

@ -1,6 +1,7 @@
package org.mian.gitnex.adapters; package org.mian.gitnex.adapters;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.text.Html; import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -11,6 +12,7 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.gitnex.tea4j.models.UserInfo; import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
@ -20,12 +22,12 @@ import java.util.List;
* Author M M Arif * Author M M Arif
*/ */
public class ProfileFollowingAdapter extends RecyclerView.Adapter<ProfileFollowingAdapter.FollowingViewHolder> { public class MyProfileFollowingAdapter extends RecyclerView.Adapter<MyProfileFollowingAdapter.FollowingViewHolder> {
private final List<UserInfo> followingList; private final List<UserInfo> followingList;
private final Context context; private final Context context;
static class FollowingViewHolder extends RecyclerView.ViewHolder { class FollowingViewHolder extends RecyclerView.ViewHolder {
private String userLoginId; private String userLoginId;
@ -41,16 +43,20 @@ public class ProfileFollowingAdapter extends RecyclerView.Adapter<ProfileFollowi
userFullName = itemView.findViewById(R.id.userFullName); userFullName = itemView.findViewById(R.id.userFullName);
userName = itemView.findViewById(R.id.userName); userName = itemView.findViewById(R.id.userName);
userAvatar.setOnClickListener(loginId -> { itemView.setOnClickListener(loginId -> {
Intent intent = new Intent(context, ProfileActivity.class);
Context context = loginId.getContext(); intent.putExtra("username", userLoginId);
context.startActivity(intent);
});
itemView.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId)); AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
return true;
}); });
} }
} }
public ProfileFollowingAdapter(Context ctx, List<UserInfo> followingListMain) { public MyProfileFollowingAdapter(Context ctx, List<UserInfo> followingListMain) {
this.context = ctx; this.context = ctx;
this.followingList = followingListMain; this.followingList = followingListMain;
@ -58,14 +64,14 @@ public class ProfileFollowingAdapter extends RecyclerView.Adapter<ProfileFollowi
@NonNull @NonNull
@Override @Override
public ProfileFollowingAdapter.FollowingViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public MyProfileFollowingAdapter.FollowingViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_profile_following, parent, false); View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_profile_followers_following, parent, false);
return new FollowingViewHolder(v); return new FollowingViewHolder(v);
} }
@Override @Override
public void onBindViewHolder(@NonNull ProfileFollowingAdapter.FollowingViewHolder holder, int position) { public void onBindViewHolder(@NonNull MyProfileFollowingAdapter.FollowingViewHolder holder, int position) {
UserInfo currentItem = followingList.get(position); UserInfo currentItem = followingList.get(position);
int imgRadius = AppUtil.getPixelsFromDensity(context, 3); int imgRadius = AppUtil.getPixelsFromDensity(context, 3);

View File

@ -190,7 +190,7 @@ public class MyReposListAdapter extends RecyclerView.Adapter<MyReposListAdapter.
UserRepositories currentItem = reposList.get(position); UserRepositories currentItem = reposList.get(position);
int imgRadius = AppUtil.getPixelsFromDensity(context, 3); int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
String locale = tinyDb.getString("locale"); Locale locale = context.getResources().getConfiguration().locale;
String timeFormat = tinyDb.getString("dateFormat"); String timeFormat = tinyDb.getString("dateFormat");
holder.userRepositories = currentItem; holder.userRepositories = currentItem;
holder.orgName.setText(currentItem.getFullName().split("/")[0]); holder.orgName.setText(currentItem.getFullName().split("/")[0]);
@ -219,20 +219,20 @@ public class MyReposListAdapter extends RecyclerView.Adapter<MyReposListAdapter.
switch(timeFormat) { switch(timeFormat) {
case "pretty": { case "pretty": {
PrettyTime prettyTime = new PrettyTime(new Locale(locale)); PrettyTime prettyTime = new PrettyTime(locale);
String createdTime = prettyTime.format(currentItem.getUpdated_at()); String createdTime = prettyTime.format(currentItem.getUpdated_at());
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
holder.repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), context)); holder.repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), context));
break; break;
} }
case "normal": { case "normal": {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
String createdTime = formatter.format(currentItem.getUpdated_at()); String createdTime = formatter.format(currentItem.getUpdated_at());
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
break; break;
} }
case "normal1": { case "normal1": {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
String createdTime = formatter.format(currentItem.getUpdated_at()); String createdTime = formatter.format(currentItem.getUpdated_at());
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
break; break;

View File

@ -16,6 +16,7 @@ import com.vdurmont.emoji.EmojiParser;
import org.gitnex.tea4j.models.PullRequests; import org.gitnex.tea4j.models.PullRequests;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.IssueDetailActivity; import org.mian.gitnex.activities.IssueDetailActivity;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.ClickListener;
@ -38,7 +39,6 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
private boolean isLoading = false, isMoreDataAvailable = true; private boolean isLoading = false, isMoreDataAvailable = true;
public PullRequestsAdapter(Context context, List<PullRequests> prListMain) { public PullRequestsAdapter(Context context, List<PullRequests> prListMain) {
this.context = context; this.context = context;
this.prList = prListMain; this.prList = prListMain;
} }
@ -84,7 +84,6 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
@Override @Override
public int getItemCount() { public int getItemCount() {
return prList.size(); return prList.size();
} }
@ -106,9 +105,6 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
prCreatedTime = itemView.findViewById(R.id.prCreatedTime); prCreatedTime = itemView.findViewById(R.id.prCreatedTime);
itemView.setOnClickListener(v -> { itemView.setOnClickListener(v -> {
Context context = v.getContext();
Intent intent = new Intent(context, IssueDetailActivity.class); Intent intent = new Intent(context, IssueDetailActivity.class);
intent.putExtra("issueNumber", pullRequest.getNumber()); intent.putExtra("issueNumber", pullRequest.getNumber());
intent.putExtra("prMergeable", pullRequest.isMergeable()); intent.putExtra("prMergeable", pullRequest.isMergeable());
@ -135,19 +131,22 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
}); });
assigneeAvatar.setOnClickListener(v -> { assigneeAvatar.setOnClickListener(v -> {
Context context = v.getContext(); Intent intent = new Intent(context, ProfileActivity.class);
String userLoginId = pullRequest.getUser().getLogin(); intent.putExtra("username", pullRequest.getUser().getLogin());
context.startActivity(intent);
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
}); });
assigneeAvatar.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, pullRequest.getUser().getLogin(), context.getString(R.string.copyLoginIdToClipBoard, pullRequest.getUser().getLogin()));
return true;
});
} }
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
void bindData(PullRequests pullRequest) { void bindData(PullRequests pullRequest) {
TinyDB tinyDb = TinyDB.getInstance(context); TinyDB tinyDb = TinyDB.getInstance(context);
String locale = tinyDb.getString("locale"); Locale locale = context.getResources().getConfiguration().locale;
String timeFormat = tinyDb.getString("dateFormat"); String timeFormat = tinyDb.getString("dateFormat");
int imgRadius = AppUtil.getPixelsFromDensity(context, 3); int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
@ -165,7 +164,7 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
this.prTitle.setText(HtmlCompat.fromHtml(prNumber_ + " " + EmojiParser.parseToUnicode(pullRequest.getTitle()), HtmlCompat.FROM_HTML_MODE_LEGACY)); this.prTitle.setText(HtmlCompat.fromHtml(prNumber_ + " " + EmojiParser.parseToUnicode(pullRequest.getTitle()), HtmlCompat.FROM_HTML_MODE_LEGACY));
this.prCommentsCount.setText(String.valueOf(pullRequest.getComments())); this.prCommentsCount.setText(String.valueOf(pullRequest.getComments()));
this.prCreatedTime.setText(TimeHelper.formatTime(pullRequest.getCreated_at(), new Locale(locale), timeFormat, context)); this.prCreatedTime.setText(TimeHelper.formatTime(pullRequest.getCreated_at(), locale, timeFormat, context));
if(timeFormat.equals("pretty")) { if(timeFormat.equals("pretty")) {
this.prCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(pullRequest.getCreated_at()), context)); this.prCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(pullRequest.getCreated_at()), context));
@ -176,38 +175,30 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
static class LoadHolder extends RecyclerView.ViewHolder { static class LoadHolder extends RecyclerView.ViewHolder {
LoadHolder(View itemView) { LoadHolder(View itemView) {
super(itemView); super(itemView);
} }
} }
public void setMoreDataAvailable(boolean moreDataAvailable) { public void setMoreDataAvailable(boolean moreDataAvailable) {
isMoreDataAvailable = moreDataAvailable; isMoreDataAvailable = moreDataAvailable;
} }
public void notifyDataChanged() { public void notifyDataChanged() {
notifyDataSetChanged(); notifyDataSetChanged();
isLoading = false; isLoading = false;
} }
public interface OnLoadMoreListener { public interface OnLoadMoreListener {
void onLoadMore(); void onLoadMore();
} }
public void setLoadMoreListener(PullRequestsAdapter.OnLoadMoreListener loadMoreListener) { public void setLoadMoreListener(PullRequestsAdapter.OnLoadMoreListener loadMoreListener) {
this.loadMoreListener = loadMoreListener; this.loadMoreListener = loadMoreListener;
} }
public void updateList(List<PullRequests> list) { public void updateList(List<PullRequests> list) {
prList = list; prList = list;
notifyDataSetChanged(); notifyDataSetChanged();
} }
} }

View File

@ -1,6 +1,7 @@
package org.mian.gitnex.adapters; package org.mian.gitnex.adapters;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.text.method.LinkMovementMethod; import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -14,6 +15,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.gitnex.tea4j.models.Releases; import org.gitnex.tea4j.models.Releases;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.ClickListener;
@ -35,6 +37,8 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
static class ReleasesViewHolder extends RecyclerView.ViewHolder { static class ReleasesViewHolder extends RecyclerView.ViewHolder {
private Releases releases;
private final TextView releaseType; private final TextView releaseType;
private final TextView releaseName; private final TextView releaseName;
private final ImageView authorAvatar; private final ImageView authorAvatar;
@ -70,6 +74,14 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
downloadList.setHasFixedSize(true); downloadList.setHasFixedSize(true);
downloadList.setLayoutManager(new LinearLayoutManager(itemView.getContext())); downloadList.setLayoutManager(new LinearLayoutManager(itemView.getContext()));
authorAvatar.setOnClickListener(loginId -> {
Context context = loginId.getContext();
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", releases.getAuthor().getLogin());
context.startActivity(intent);
});
} }
} }
@ -89,11 +101,12 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
public void onBindViewHolder(@NonNull ReleasesAdapter.ReleasesViewHolder holder, int position) { public void onBindViewHolder(@NonNull ReleasesAdapter.ReleasesViewHolder holder, int position) {
final TinyDB tinyDb = TinyDB.getInstance(context); final TinyDB tinyDb = TinyDB.getInstance(context);
final String locale = tinyDb.getString("locale"); final Locale locale = context.getResources().getConfiguration().locale;
final String timeFormat = tinyDb.getString("dateFormat"); final String timeFormat = tinyDb.getString("dateFormat");
int imgRadius = AppUtil.getPixelsFromDensity(context, 3); int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
Releases currentItem = releasesList.get(position); Releases currentItem = releasesList.get(position);
holder.releases = currentItem;
holder.releaseName.setText(currentItem.getName()); holder.releaseName.setText(currentItem.getName());
@ -120,7 +133,7 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
} }
if(currentItem.getPublished_at() != null) { if(currentItem.getPublished_at() != null) {
holder.releaseDate.setText(TimeHelper.formatTime(currentItem.getPublished_at(), new Locale(locale), timeFormat, context)); holder.releaseDate.setText(TimeHelper.formatTime(currentItem.getPublished_at(), locale, timeFormat, context));
} }
if(timeFormat.equals("pretty")) { if(timeFormat.equals("pretty")) {

View File

@ -132,7 +132,7 @@ public class RepoForksAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
TinyDB tinyDb = TinyDB.getInstance(context); TinyDB tinyDb = TinyDB.getInstance(context);
int imgRadius = AppUtil.getPixelsFromDensity(context, 3); int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
String locale = tinyDb.getString("locale"); Locale locale = context.getResources().getConfiguration().locale;
String timeFormat = tinyDb.getString("dateFormat"); String timeFormat = tinyDb.getString("dateFormat");
this.userRepositories = forksModel; this.userRepositories = forksModel;
orgName.setText(forksModel.getFullName().split("/")[0]); orgName.setText(forksModel.getFullName().split("/")[0]);
@ -164,20 +164,20 @@ public class RepoForksAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
switch(timeFormat) { switch(timeFormat) {
case "pretty": { case "pretty": {
PrettyTime prettyTime = new PrettyTime(new Locale(locale)); PrettyTime prettyTime = new PrettyTime(locale);
String createdTime = prettyTime.format(forksModel.getUpdated_at()); String createdTime = prettyTime.format(forksModel.getUpdated_at());
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(forksModel.getUpdated_at()), context)); repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(forksModel.getUpdated_at()), context));
break; break;
} }
case "normal": { case "normal": {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
String createdTime = formatter.format(forksModel.getUpdated_at()); String createdTime = formatter.format(forksModel.getUpdated_at());
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
break; break;
} }
case "normal1": { case "normal1": {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
String createdTime = formatter.format(forksModel.getUpdated_at()); String createdTime = formatter.format(forksModel.getUpdated_at());
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
break; break;

View File

@ -2,6 +2,7 @@ package org.mian.gitnex.adapters;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -11,6 +12,7 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import org.gitnex.tea4j.models.UserInfo; import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
@ -26,7 +28,9 @@ public class RepoStargazersAdapter extends BaseAdapter {
private final List<UserInfo> stargazersList; private final List<UserInfo> stargazersList;
private final Context context; private final Context context;
private static class ViewHolder { private class ViewHolder {
private UserInfo userInfo;
private final ImageView memberAvatar; private final ImageView memberAvatar;
private final TextView memberName; private final TextView memberName;
@ -34,6 +38,17 @@ public class RepoStargazersAdapter extends BaseAdapter {
ViewHolder(View v) { ViewHolder(View v) {
memberAvatar = v.findViewById(R.id.memberAvatar); memberAvatar = v.findViewById(R.id.memberAvatar);
memberName = v.findViewById(R.id.memberName); memberName = v.findViewById(R.id.memberName);
memberAvatar.setOnClickListener(loginId -> {
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", userInfo.getLogin());
context.startActivity(intent);
});
memberAvatar.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, userInfo.getLogin(), context.getString(R.string.copyLoginIdToClipBoard, userInfo.getLogin()));
return true;
});
} }
} }
@ -80,6 +95,7 @@ public class RepoStargazersAdapter extends BaseAdapter {
private void initData(RepoStargazersAdapter.ViewHolder viewHolder, int position) { private void initData(RepoStargazersAdapter.ViewHolder viewHolder, int position) {
UserInfo currentItem = stargazersList.get(position); UserInfo currentItem = stargazersList.get(position);
viewHolder.userInfo = currentItem;
int imgRadius = AppUtil.getPixelsFromDensity(context, 3); int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
PicassoService.getInstance(context).get().load(currentItem.getAvatar()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(180, 180).centerCrop().into(viewHolder.memberAvatar); PicassoService.getInstance(context).get().load(currentItem.getAvatar()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(180, 180).centerCrop().into(viewHolder.memberAvatar);

View File

@ -2,6 +2,7 @@ package org.mian.gitnex.adapters;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -11,6 +12,7 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import org.gitnex.tea4j.models.UserInfo; import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
@ -26,7 +28,9 @@ public class RepoWatchersAdapter extends BaseAdapter {
private final List<UserInfo> watchersList; private final List<UserInfo> watchersList;
private final Context context; private final Context context;
private static class ViewHolder { private class ViewHolder {
private UserInfo userInfo;
private final ImageView memberAvatar; private final ImageView memberAvatar;
private final TextView memberName; private final TextView memberName;
@ -34,6 +38,17 @@ public class RepoWatchersAdapter extends BaseAdapter {
ViewHolder(View v) { ViewHolder(View v) {
memberAvatar = v.findViewById(R.id.memberAvatar); memberAvatar = v.findViewById(R.id.memberAvatar);
memberName = v.findViewById(R.id.memberName); memberName = v.findViewById(R.id.memberName);
memberAvatar.setOnClickListener(loginId -> {
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", userInfo.getLogin());
context.startActivity(intent);
});
memberAvatar.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, userInfo.getLogin(), context.getString(R.string.copyLoginIdToClipBoard, userInfo.getLogin()));
return true;
});
} }
} }
@ -80,6 +95,7 @@ public class RepoWatchersAdapter extends BaseAdapter {
private void initData(RepoWatchersAdapter.ViewHolder viewHolder, int position) { private void initData(RepoWatchersAdapter.ViewHolder viewHolder, int position) {
UserInfo currentItem = watchersList.get(position); UserInfo currentItem = watchersList.get(position);
viewHolder.userInfo = currentItem;
int imgRadius = AppUtil.getPixelsFromDensity(context, 3); int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
PicassoService.getInstance(context).get().load(currentItem.getAvatar()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(180, 180).centerCrop().into(viewHolder.memberAvatar); PicassoService.getInstance(context).get().load(currentItem.getAvatar()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(180, 180).centerCrop().into(viewHolder.memberAvatar);

View File

@ -189,7 +189,7 @@ public class ReposListAdapter extends RecyclerView.Adapter<ReposListAdapter.Repo
UserRepositories currentItem = reposList.get(position); UserRepositories currentItem = reposList.get(position);
int imgRadius = AppUtil.getPixelsFromDensity(context, 3); int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
String locale = tinyDb.getString("locale"); Locale locale = context.getResources().getConfiguration().locale;
String timeFormat = tinyDb.getString("dateFormat"); String timeFormat = tinyDb.getString("dateFormat");
holder.userRepositories = currentItem; holder.userRepositories = currentItem;
holder.orgName.setText(currentItem.getFullName().split("/")[0]); holder.orgName.setText(currentItem.getFullName().split("/")[0]);
@ -218,20 +218,20 @@ public class ReposListAdapter extends RecyclerView.Adapter<ReposListAdapter.Repo
switch(timeFormat) { switch(timeFormat) {
case "pretty": { case "pretty": {
PrettyTime prettyTime = new PrettyTime(new Locale(locale)); PrettyTime prettyTime = new PrettyTime(locale);
String createdTime = prettyTime.format(currentItem.getUpdated_at()); String createdTime = prettyTime.format(currentItem.getUpdated_at());
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
holder.repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), context)); holder.repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), context));
break; break;
} }
case "normal": { case "normal": {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
String createdTime = formatter.format(currentItem.getUpdated_at()); String createdTime = formatter.format(currentItem.getUpdated_at());
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
break; break;
} }
case "normal1": { case "normal1": {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
String createdTime = formatter.format(currentItem.getUpdated_at()); String createdTime = formatter.format(currentItem.getUpdated_at());
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
break; break;

View File

@ -186,7 +186,7 @@ public class RepositoriesByOrgAdapter extends RecyclerView.Adapter<RepositoriesB
UserRepositories currentItem = reposList.get(position); UserRepositories currentItem = reposList.get(position);
int imgRadius = AppUtil.getPixelsFromDensity(context, 3); int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
String locale = tinyDb.getString("locale"); Locale locale = context.getResources().getConfiguration().locale;
String timeFormat = tinyDb.getString("dateFormat"); String timeFormat = tinyDb.getString("dateFormat");
holder.userRepositories = currentItem; holder.userRepositories = currentItem;
holder.orgName.setText(currentItem.getFullName().split("/")[0]); holder.orgName.setText(currentItem.getFullName().split("/")[0]);
@ -222,20 +222,20 @@ public class RepositoriesByOrgAdapter extends RecyclerView.Adapter<RepositoriesB
switch(timeFormat) { switch(timeFormat) {
case "pretty": { case "pretty": {
PrettyTime prettyTime = new PrettyTime(new Locale(locale)); PrettyTime prettyTime = new PrettyTime(locale);
String createdTime = prettyTime.format(currentItem.getUpdated_at()); String createdTime = prettyTime.format(currentItem.getUpdated_at());
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
holder.repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), context)); holder.repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), context));
break; break;
} }
case "normal": { case "normal": {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
String createdTime = formatter.format(currentItem.getUpdated_at()); String createdTime = formatter.format(currentItem.getUpdated_at());
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
break; break;
} }
case "normal1": { case "normal1": {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
String createdTime = formatter.format(currentItem.getUpdated_at()); String createdTime = formatter.format(currentItem.getUpdated_at());
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
break; break;

View File

@ -187,7 +187,7 @@ public class StarredReposListAdapter extends RecyclerView.Adapter<StarredReposLi
UserRepositories currentItem = reposList.get(position); UserRepositories currentItem = reposList.get(position);
int imgRadius = AppUtil.getPixelsFromDensity(context, 3); int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
String locale = tinyDb.getString("locale"); Locale locale = context.getResources().getConfiguration().locale;
String timeFormat = tinyDb.getString("dateFormat"); String timeFormat = tinyDb.getString("dateFormat");
holder.userRepositories = currentItem; holder.userRepositories = currentItem;
holder.orgName.setText(currentItem.getFullName().split("/")[0]); holder.orgName.setText(currentItem.getFullName().split("/")[0]);
@ -223,20 +223,20 @@ public class StarredReposListAdapter extends RecyclerView.Adapter<StarredReposLi
switch(timeFormat) { switch(timeFormat) {
case "pretty": { case "pretty": {
PrettyTime prettyTime = new PrettyTime(new Locale(locale)); PrettyTime prettyTime = new PrettyTime(locale);
String createdTime = prettyTime.format(currentItem.getUpdated_at()); String createdTime = prettyTime.format(currentItem.getUpdated_at());
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
holder.repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), context)); holder.repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), context));
break; break;
} }
case "normal": { case "normal": {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
String createdTime = formatter.format(currentItem.getUpdated_at()); String createdTime = formatter.format(currentItem.getUpdated_at());
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
break; break;
} }
case "normal1": { case "normal1": {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
String createdTime = formatter.format(currentItem.getUpdated_at()); String createdTime = formatter.format(currentItem.getUpdated_at());
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime)); holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
break; break;

View File

@ -2,6 +2,7 @@ package org.mian.gitnex.adapters;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.text.Html; import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -12,6 +13,7 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import org.gitnex.tea4j.models.UserInfo; import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
@ -27,7 +29,7 @@ public class TeamMembersByOrgAdapter extends BaseAdapter {
private final List<UserInfo> teamMembersList; private final List<UserInfo> teamMembersList;
private final Context context; private final Context context;
private static class ViewHolder { private class ViewHolder {
private String userLoginId; private String userLoginId;
@ -40,10 +42,14 @@ public class TeamMembersByOrgAdapter extends BaseAdapter {
memberName = v.findViewById(R.id.memberName); memberName = v.findViewById(R.id.memberName);
memberAvatar.setOnClickListener(loginId -> { memberAvatar.setOnClickListener(loginId -> {
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", userLoginId);
context.startActivity(intent);
});
Context context = loginId.getContext(); memberAvatar.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId)); AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
return true;
}); });
} }
} }

View File

@ -1,6 +1,7 @@
package org.mian.gitnex.adapters; package org.mian.gitnex.adapters;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.text.Html; import android.text.Html;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -16,6 +17,7 @@ import org.gitnex.tea4j.models.Collaborators;
import org.gitnex.tea4j.models.UserInfo; import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.actions.CollaboratorActions; import org.mian.gitnex.actions.CollaboratorActions;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
@ -42,7 +44,7 @@ public class UserSearchAdapter extends RecyclerView.Adapter<UserSearchAdapter.Us
this.usersSearchList = dataList; this.usersSearchList = dataList;
} }
static class UserSearchViewHolder extends RecyclerView.ViewHolder { class UserSearchViewHolder extends RecyclerView.ViewHolder {
private UserInfo userInfo; private UserInfo userInfo;
@ -65,9 +67,6 @@ public class UserSearchAdapter extends RecyclerView.Adapter<UserSearchAdapter.Us
addCollaboratorButtonRemove = itemView.findViewById(R.id.addCollaboratorButtonRemove); addCollaboratorButtonRemove = itemView.findViewById(R.id.addCollaboratorButtonRemove);
addCollaboratorButtonAdd.setOnClickListener(v -> { addCollaboratorButtonAdd.setOnClickListener(v -> {
final Context context = v.getContext();
AlertDialog.Builder pBuilder = new AlertDialog.Builder(context); AlertDialog.Builder pBuilder = new AlertDialog.Builder(context);
pBuilder.setTitle(R.string.newTeamPermission); pBuilder.setTitle(R.string.newTeamPermission);
@ -89,9 +88,6 @@ public class UserSearchAdapter extends RecyclerView.Adapter<UserSearchAdapter.Us
}); });
addCollaboratorButtonRemove.setOnClickListener(v -> { addCollaboratorButtonRemove.setOnClickListener(v -> {
Context context = v.getContext();
AlertDialogs.collaboratorRemoveDialog(context, userInfo.getUsername(), AlertDialogs.collaboratorRemoveDialog(context, userInfo.getUsername(),
context.getResources().getString(R.string.removeCollaboratorTitle), context.getResources().getString(R.string.removeCollaboratorTitle),
context.getResources().getString(R.string.removeCollaboratorMessage), context.getResources().getString(R.string.removeCollaboratorMessage),
@ -99,6 +95,16 @@ public class UserSearchAdapter extends RecyclerView.Adapter<UserSearchAdapter.Us
context.getResources().getString(R.string.cancelButton), "fa"); context.getResources().getString(R.string.cancelButton), "fa");
}); });
userAvatar.setOnClickListener(loginId -> {
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", userInfo.getLogin());
context.startActivity(intent);
});
userAvatar.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, userInfo.getLogin(), context.getString(R.string.copyLoginIdToClipBoard, userInfo.getLogin()));
return true;
});
} }
} }

View File

@ -1,6 +1,7 @@
package org.mian.gitnex.adapters; package org.mian.gitnex.adapters;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.text.Html; import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -11,6 +12,7 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.gitnex.tea4j.models.UserInfo; import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
@ -40,7 +42,7 @@ public class UserSearchForTeamMemberAdapter extends RecyclerView.Adapter<UserSea
UserSearchForTeamMemberAdapter.teamId = teamId; UserSearchForTeamMemberAdapter.teamId = teamId;
} }
static class UserSearchViewHolder extends RecyclerView.ViewHolder { class UserSearchViewHolder extends RecyclerView.ViewHolder {
private UserInfo userInfo; private UserInfo userInfo;
@ -60,9 +62,6 @@ public class UserSearchForTeamMemberAdapter extends RecyclerView.Adapter<UserSea
addMemberButtonRemove = itemView.findViewById(R.id.addCollaboratorButtonRemove); addMemberButtonRemove = itemView.findViewById(R.id.addCollaboratorButtonRemove);
addMemberButtonAdd.setOnClickListener(v -> { addMemberButtonAdd.setOnClickListener(v -> {
Context context = v.getContext();
AlertDialogs.addMemberDialog(context, userInfo.getLogin(), AlertDialogs.addMemberDialog(context, userInfo.getLogin(),
context.getResources().getString(R.string.addTeamMemberTitle), context.getResources().getString(R.string.addTeamMemberTitle),
context.getResources().getString(R.string.addTeamMemberMessage), context.getResources().getString(R.string.addTeamMemberMessage),
@ -71,15 +70,23 @@ public class UserSearchForTeamMemberAdapter extends RecyclerView.Adapter<UserSea
}); });
addMemberButtonRemove.setOnClickListener(v -> { addMemberButtonRemove.setOnClickListener(v -> {
Context context = v.getContext();
AlertDialogs.removeMemberDialog(context, userInfo.getLogin(), AlertDialogs.removeMemberDialog(context, userInfo.getLogin(),
context.getResources().getString(R.string.removeTeamMemberTitle), context.getResources().getString(R.string.removeTeamMemberTitle),
context.getResources().getString(R.string.removeTeamMemberMessage), context.getResources().getString(R.string.removeTeamMemberMessage),
context.getResources().getString(R.string.removeButton), context.getResources().getString(R.string.removeButton),
context.getResources().getString(R.string.cancelButton), Integer.parseInt(String.valueOf(teamId))); context.getResources().getString(R.string.cancelButton), Integer.parseInt(String.valueOf(teamId)));
}); });
userAvatar.setOnClickListener(loginId -> {
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", userInfo.getLogin());
context.startActivity(intent);
});
userAvatar.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, userInfo.getLogin(), context.getString(R.string.copyLoginIdToClipBoard, userInfo.getLogin()));
return true;
});
} }
} }

View File

@ -0,0 +1,166 @@
package org.mian.gitnex.adapters.profile;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation;
import java.util.List;
/**
* Author M M Arif
*/
public class FollowersAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final Context context;
private final int TYPE_LOAD = 0;
private List<UserInfo> usersList;
private OnLoadMoreListener loadMoreListener;
private boolean isLoading = false, isMoreDataAvailable = true;
public FollowersAdapter(Context ctx, List<UserInfo> usersListMain) {
this.context = ctx;
this.usersList = usersListMain;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
if(viewType == TYPE_LOAD) {
return new UsersHolder(inflater.inflate(R.layout.list_profile_followers_following, parent, false));
}
else {
return new LoadHolder(inflater.inflate(R.layout.row_load, parent, false));
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
isLoading = true;
loadMoreListener.onLoadMore();
}
if(getItemViewType(position) == TYPE_LOAD) {
((UsersHolder) holder).bindData(usersList.get(position));
}
}
@Override
public int getItemViewType(int position) {
if(usersList.get(position).getUsername() != null) {
return TYPE_LOAD;
}
else {
return 1;
}
}
@Override
public int getItemCount() {
return usersList.size();
}
class UsersHolder extends RecyclerView.ViewHolder {
private UserInfo userInfo;
private final ImageView userAvatar;
private final TextView userFullName;
private final TextView userName;
UsersHolder(View itemView) {
super(itemView);
Context context = itemView.getContext();
userAvatar = itemView.findViewById(R.id.userAvatar);
userFullName = itemView.findViewById(R.id.userFullName);
userName = itemView.findViewById(R.id.userName);
itemView.setOnClickListener(loginId -> {
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", userInfo.getLogin());
context.startActivity(intent);
});
itemView.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, userInfo.getLogin(), context.getString(R.string.copyLoginIdToClipBoard, userInfo.getLogin()));
return true;
});
}
@SuppressLint("SetTextI18n")
void bindData(UserInfo userInfo) {
this.userInfo = userInfo;
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
//Locale locale = context.getResources().getConfiguration().locale;
if(!userInfo.getFullname().equals("")) {
userFullName.setText(Html.fromHtml(userInfo.getFullname()));
userName.setText(context.getResources().getString(R.string.usernameWithAt, userInfo.getUsername()));
}
else {
userFullName.setText(userInfo.getUsername());
userName.setVisibility(View.GONE);
}
PicassoService.getInstance(context)
.get()
.load(userInfo.getAvatar())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(120, 120)
.centerCrop()
.into(userAvatar);
}
}
static class LoadHolder extends RecyclerView.ViewHolder {
LoadHolder(View itemView) {
super(itemView);
}
}
public void setMoreDataAvailable(boolean moreDataAvailable) {
isMoreDataAvailable = moreDataAvailable;
}
public void notifyDataChanged() {
notifyDataSetChanged();
isLoading = false;
}
public interface OnLoadMoreListener {
void onLoadMore();
}
public void setLoadMoreListener(OnLoadMoreListener loadMoreListener) {
this.loadMoreListener = loadMoreListener;
}
public void updateList(List<UserInfo> list) {
usersList = list;
notifyDataSetChanged();
}
}

View File

@ -0,0 +1,166 @@
package org.mian.gitnex.adapters.profile;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.ProfileActivity;
import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation;
import java.util.List;
/**
* Author M M Arif
*/
public class FollowingAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final Context context;
private final int TYPE_LOAD = 0;
private List<UserInfo> usersList;
private OnLoadMoreListener loadMoreListener;
private boolean isLoading = false, isMoreDataAvailable = true;
public FollowingAdapter(Context ctx, List<UserInfo> usersListMain) {
this.context = ctx;
this.usersList = usersListMain;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
if(viewType == TYPE_LOAD) {
return new UsersHolder(inflater.inflate(R.layout.list_profile_followers_following, parent, false));
}
else {
return new LoadHolder(inflater.inflate(R.layout.row_load, parent, false));
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
isLoading = true;
loadMoreListener.onLoadMore();
}
if(getItemViewType(position) == TYPE_LOAD) {
((UsersHolder) holder).bindData(usersList.get(position));
}
}
@Override
public int getItemViewType(int position) {
if(usersList.get(position).getUsername() != null) {
return TYPE_LOAD;
}
else {
return 1;
}
}
@Override
public int getItemCount() {
return usersList.size();
}
class UsersHolder extends RecyclerView.ViewHolder {
private UserInfo userInfo;
private final ImageView userAvatar;
private final TextView userFullName;
private final TextView userName;
UsersHolder(View itemView) {
super(itemView);
Context context = itemView.getContext();
userAvatar = itemView.findViewById(R.id.userAvatar);
userFullName = itemView.findViewById(R.id.userFullName);
userName = itemView.findViewById(R.id.userName);
itemView.setOnClickListener(loginId -> {
Intent intent = new Intent(context, ProfileActivity.class);
intent.putExtra("username", userInfo.getLogin());
context.startActivity(intent);
});
itemView.setOnLongClickListener(loginId -> {
AppUtil.copyToClipboard(context, userInfo.getLogin(), context.getString(R.string.copyLoginIdToClipBoard, userInfo.getLogin()));
return true;
});
}
@SuppressLint("SetTextI18n")
void bindData(UserInfo userInfo) {
this.userInfo = userInfo;
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
//Locale locale = context.getResources().getConfiguration().locale;
if(!userInfo.getFullname().equals("")) {
userFullName.setText(Html.fromHtml(userInfo.getFullname()));
userName.setText(context.getResources().getString(R.string.usernameWithAt, userInfo.getUsername()));
}
else {
userFullName.setText(userInfo.getUsername());
userName.setVisibility(View.GONE);
}
PicassoService
.getInstance(context)
.get()
.load(userInfo.getAvatar())
.placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(imgRadius, 0))
.resize(120, 120)
.centerCrop()
.into(userAvatar);
}
}
static class LoadHolder extends RecyclerView.ViewHolder {
LoadHolder(View itemView) {
super(itemView);
}
}
public void setMoreDataAvailable(boolean moreDataAvailable) {
isMoreDataAvailable = moreDataAvailable;
}
public void notifyDataChanged() {
notifyDataSetChanged();
isLoading = false;
}
public interface OnLoadMoreListener {
void onLoadMore();
}
public void setLoadMoreListener(OnLoadMoreListener loadMoreListener) {
this.loadMoreListener = loadMoreListener;
}
public void updateList(List<UserInfo> list) {
usersList = list;
notifyDataSetChanged();
}
}

View File

@ -0,0 +1,137 @@
package org.mian.gitnex.adapters.profile;
import android.annotation.SuppressLint;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import org.gitnex.tea4j.models.UserOrganizations;
import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation;
import java.util.List;
/**
* Author M M Arif
*/
public class OrganizationsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final Context context;
private final int TYPE_LOAD = 0;
private List<UserOrganizations> organizationsList;
private RepositoriesAdapter.OnLoadMoreListener loadMoreListener;
private boolean isLoading = false, isMoreDataAvailable = true;
public OrganizationsAdapter(Context ctx, List<UserOrganizations> organizationsListMain) {
this.context = ctx;
this.organizationsList = organizationsListMain;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
if(viewType == TYPE_LOAD) {
return new OrganizationsHolder(inflater.inflate(R.layout.list_organizations, parent, false));
}
else {
return new LoadHolder(inflater.inflate(R.layout.row_load, parent, false));
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
isLoading = true;
loadMoreListener.onLoadMore();
}
if(getItemViewType(position) == TYPE_LOAD) {
((OrganizationsHolder) holder).bindData(organizationsList.get(position));
}
}
@Override
public int getItemViewType(int position) {
if(organizationsList.get(position).getUsername() != null) {
return TYPE_LOAD;
}
else {
return 1;
}
}
@Override
public int getItemCount() {
return organizationsList.size();
}
class OrganizationsHolder extends RecyclerView.ViewHolder {
private UserOrganizations userOrganizations;
private final ImageView image;
private final TextView orgName;
private final TextView orgDescription;
OrganizationsHolder(View itemView) {
super(itemView);
orgName = itemView.findViewById(R.id.orgName);
orgDescription = itemView.findViewById(R.id.orgDescription);
image = itemView.findViewById(R.id.imageAvatar);
}
@SuppressLint("SetTextI18n")
void bindData(UserOrganizations userOrganizations) {
this.userOrganizations = userOrganizations;
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
orgName.setText(userOrganizations.getUsername());
PicassoService.getInstance(context).get().load(userOrganizations.getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop().into(image);
if (!userOrganizations.getDescription().equals("")) {
orgDescription.setText(userOrganizations.getDescription());
}
}
}
static class LoadHolder extends RecyclerView.ViewHolder {
LoadHolder(View itemView) {
super(itemView);
}
}
public void setMoreDataAvailable(boolean moreDataAvailable) {
isMoreDataAvailable = moreDataAvailable;
}
public void notifyDataChanged() {
notifyDataSetChanged();
isLoading = false;
}
public interface OnLoadMoreListener {
void onLoadMore();
}
public void setLoadMoreListener(RepositoriesAdapter.OnLoadMoreListener loadMoreListener) {
this.loadMoreListener = loadMoreListener;
}
public void updateList(List<UserOrganizations> list) {
organizationsList = list;
notifyDataSetChanged();
}
}

View File

@ -0,0 +1,196 @@
package org.mian.gitnex.adapters.profile;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator;
import org.gitnex.tea4j.models.UserRepositories;
import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.ClickListener;
import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB;
import java.util.List;
import java.util.Locale;
/**
* Author M M Arif
*/
public class RepositoriesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final Context context;
private final int TYPE_LOAD = 0;
private List<UserRepositories> reposList;
private OnLoadMoreListener loadMoreListener;
private boolean isLoading = false, isMoreDataAvailable = true;
public RepositoriesAdapter(Context ctx, List<UserRepositories> reposListMain) {
this.context = ctx;
this.reposList = reposListMain;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
if(viewType == TYPE_LOAD) {
return new RepositoriesAdapter.RepositoriesHolder(inflater.inflate(R.layout.list_repositories, parent, false));
}
else {
return new RepositoriesAdapter.LoadHolder(inflater.inflate(R.layout.row_load, parent, false));
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
isLoading = true;
loadMoreListener.onLoadMore();
}
if(getItemViewType(position) == TYPE_LOAD) {
((RepositoriesAdapter.RepositoriesHolder) holder).bindData(reposList.get(position));
}
}
@Override
public int getItemViewType(int position) {
if(reposList.get(position).getFullName() != null) {
return TYPE_LOAD;
}
else {
return 1;
}
}
@Override
public int getItemCount() {
return reposList.size();
}
class RepositoriesHolder extends RecyclerView.ViewHolder {
private UserRepositories userRepositories;
private final ImageView avatar;
private final TextView repoName;
private final TextView orgName;
private final TextView repoDescription;
private CheckBox isRepoAdmin;
private final TextView repoStars;
private final TextView repoLastUpdated;
RepositoriesHolder(View itemView) {
super(itemView);
repoName = itemView.findViewById(R.id.repoName);
orgName = itemView.findViewById(R.id.orgName);
repoDescription = itemView.findViewById(R.id.repoDescription);
isRepoAdmin = itemView.findViewById(R.id.repoIsAdmin);
avatar = itemView.findViewById(R.id.imageAvatar);
repoStars = itemView.findViewById(R.id.repoStars);
repoLastUpdated = itemView.findViewById(R.id.repoLastUpdated);
}
@SuppressLint("SetTextI18n")
void bindData(UserRepositories userRepositories) {
this.userRepositories = userRepositories;
TinyDB tinyDb = TinyDB.getInstance(context);
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
Locale locale = context.getResources().getConfiguration().locale;
String timeFormat = tinyDb.getString("dateFormat");
orgName.setText(userRepositories.getFullName().split("/")[0]);
repoName.setText(userRepositories.getFullName().split("/")[1]);
repoStars.setText(userRepositories.getStars_count());
ColorGenerator generator = ColorGenerator.MATERIAL;
int color = generator.getColor(userRepositories.getName());
String firstCharacter = String.valueOf(userRepositories.getFullName().charAt(0));
TextDrawable drawable = TextDrawable.builder().beginConfig().useFont(Typeface.DEFAULT).fontSize(18).toUpperCase().width(28).height(28).endConfig().buildRoundRect(firstCharacter, color, 3);
if(userRepositories.getAvatar_url() != null) {
if(!userRepositories.getAvatar_url().equals("")) {
PicassoService
.getInstance(context).get().load(userRepositories.getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop().into(avatar);
}
else {
avatar.setImageDrawable(drawable);
}
}
else {
avatar.setImageDrawable(drawable);
}
if(userRepositories.getUpdated_at() != null) {
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, TimeHelper.formatTime(userRepositories.getUpdated_at(), locale, timeFormat, context)));
if(timeFormat.equals("pretty")) {
repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(userRepositories.getUpdated_at()), context));
}
}
else {
repoLastUpdated.setVisibility(View.GONE);
}
if(!userRepositories.getDescription().equals("")) {
repoDescription.setText(userRepositories.getDescription());
}
else {
repoDescription.setText(context.getString(R.string.noDataDescription));
}
if(isRepoAdmin == null) {
isRepoAdmin = new CheckBox(context);
}
isRepoAdmin.setChecked(userRepositories.getPermissions().isAdmin());
}
}
static class LoadHolder extends RecyclerView.ViewHolder {
LoadHolder(View itemView) {
super(itemView);
}
}
public void setMoreDataAvailable(boolean moreDataAvailable) {
isMoreDataAvailable = moreDataAvailable;
}
public void notifyDataChanged() {
notifyDataSetChanged();
isLoading = false;
}
public interface OnLoadMoreListener {
void onLoadMore();
}
public void setLoadMoreListener(OnLoadMoreListener loadMoreListener) {
this.loadMoreListener = loadMoreListener;
}
public void updateList(List<UserRepositories> list) {
reposList = list;
notifyDataSetChanged();
}
}

View File

@ -0,0 +1,197 @@
package org.mian.gitnex.adapters.profile;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator;
import org.gitnex.tea4j.models.UserRepositories;
import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.ClickListener;
import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB;
import java.util.List;
import java.util.Locale;
/**
* Author M M Arif
*/
public class StarredRepositoriesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final Context context;
private final int TYPE_LOAD = 0;
private List<UserRepositories> reposList;
private OnLoadMoreListener loadMoreListener;
private boolean isLoading = false, isMoreDataAvailable = true;
public StarredRepositoriesAdapter(Context ctx, List<UserRepositories> reposListMain) {
this.context = ctx;
this.reposList = reposListMain;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
if(viewType == TYPE_LOAD) {
return new StarredRepositoriesAdapter.StarredRepositoriesHolder(inflater.inflate(R.layout.list_repositories, parent, false));
}
else {
return new StarredRepositoriesAdapter.LoadHolder(inflater.inflate(R.layout.row_load, parent, false));
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
isLoading = true;
loadMoreListener.onLoadMore();
}
if(getItemViewType(position) == TYPE_LOAD) {
((StarredRepositoriesAdapter.StarredRepositoriesHolder) holder).bindData(reposList.get(position));
}
}
@Override
public int getItemViewType(int position) {
if(reposList.get(position).getFullName() != null) {
return TYPE_LOAD;
}
else {
return 1;
}
}
@Override
public int getItemCount() {
return reposList.size();
}
class StarredRepositoriesHolder extends RecyclerView.ViewHolder {
private UserRepositories userRepositories;
private final ImageView avatar;
private final TextView repoName;
private final TextView orgName;
private final TextView repoDescription;
private CheckBox isRepoAdmin;
private final TextView repoStars;
private final TextView repoLastUpdated;
StarredRepositoriesHolder(View itemView) {
super(itemView);
repoName = itemView.findViewById(R.id.repoName);
orgName = itemView.findViewById(R.id.orgName);
repoDescription = itemView.findViewById(R.id.repoDescription);
isRepoAdmin = itemView.findViewById(R.id.repoIsAdmin);
avatar = itemView.findViewById(R.id.imageAvatar);
repoStars = itemView.findViewById(R.id.repoStars);
repoLastUpdated = itemView.findViewById(R.id.repoLastUpdated);
}
@SuppressLint("SetTextI18n")
void bindData(UserRepositories userRepositories) {
this.userRepositories = userRepositories;
TinyDB tinyDb = TinyDB.getInstance(context);
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
Locale locale = context.getResources().getConfiguration().locale;
String timeFormat = tinyDb.getString("dateFormat");
orgName.setText(userRepositories.getFullName().split("/")[0]);
repoName.setText(userRepositories.getFullName().split("/")[1]);
repoStars.setText(userRepositories.getStars_count());
ColorGenerator generator = ColorGenerator.MATERIAL;
int color = generator.getColor(userRepositories.getName());
String firstCharacter = String.valueOf(userRepositories.getFullName().charAt(0));
TextDrawable drawable = TextDrawable.builder().beginConfig().useFont(Typeface.DEFAULT).fontSize(18).toUpperCase().width(28).height(28).endConfig().buildRoundRect(firstCharacter, color, 3);
if(userRepositories.getAvatar_url() != null) {
if(!userRepositories.getAvatar_url().equals("")) {
PicassoService
.getInstance(context).get().load(userRepositories.getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop().into(avatar);
}
else {
avatar.setImageDrawable(drawable);
}
}
else {
avatar.setImageDrawable(drawable);
}
if(userRepositories.getUpdated_at() != null) {
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, TimeHelper
.formatTime(userRepositories.getUpdated_at(), locale, timeFormat, context)));
if(timeFormat.equals("pretty")) {
repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(userRepositories.getUpdated_at()), context));
}
}
else {
repoLastUpdated.setVisibility(View.GONE);
}
if(!userRepositories.getDescription().equals("")) {
repoDescription.setText(userRepositories.getDescription());
}
else {
repoDescription.setText(context.getString(R.string.noDataDescription));
}
if(isRepoAdmin == null) {
isRepoAdmin = new CheckBox(context);
}
isRepoAdmin.setChecked(userRepositories.getPermissions().isAdmin());
}
}
static class LoadHolder extends RecyclerView.ViewHolder {
LoadHolder(View itemView) {
super(itemView);
}
}
public void setMoreDataAvailable(boolean moreDataAvailable) {
isMoreDataAvailable = moreDataAvailable;
}
public void notifyDataChanged() {
notifyDataSetChanged();
isLoading = false;
}
public interface OnLoadMoreListener {
void onLoadMore();
}
public void setLoadMoreListener(OnLoadMoreListener loadMoreListener) {
this.loadMoreListener = loadMoreListener;
}
public void updateList(List<UserRepositories> list) {
reposList = list;
notifyDataSetChanged();
}
}

View File

@ -152,5 +152,20 @@ public class MainApplication extends Application {
tinyDB.putInt("homeScreenId", 0); tinyDB.putInt("homeScreenId", 0);
} }
if(tinyDB.getString("localeStr").isEmpty()) {
tinyDB.putString("localeStr", getString(R.string.settingsLanguageSystem));
tinyDB.putInt("langId", 0);
}
if(tinyDB.getInt("darkThemeTimeHour", 100) == 100) {
tinyDB.putInt("lightThemeTimeHour", 6);
tinyDB.putInt("lightThemeTimeMinute", 0);
tinyDB.putInt("darkThemeTimeHour", 18);
tinyDB.putInt("darkThemeTimeMinute", 0);
}
if(tinyDB.getString("timeStr").isEmpty()) {
tinyDB.putString("timeStr", getString(R.string.settingsDateTimeHeaderDefault));
}
} }
} }

View File

@ -1,72 +0,0 @@
package org.mian.gitnex.fragments;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.MainActivity;
import org.mian.gitnex.databinding.FragmentAboutBinding;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.TinyDB;
/**
* Author M M Arif
*/
public class AboutFragment extends Fragment {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
FragmentAboutBinding viewBinding = FragmentAboutBinding.inflate(inflater, container, false);
TinyDB tinyDb = TinyDB.getInstance(getContext());
viewBinding.appVersion.setText(AppUtil.getAppVersion(requireContext()));
viewBinding.userServerVersion.setText(tinyDb.getString("giteaVersion"));
viewBinding.appBuild.setText(String.valueOf(AppUtil.getAppBuildNo(requireContext())));
((MainActivity) requireActivity()).setActionBarTitle(getResources().getString(R.string.pageTitleAbout));
viewBinding.donationLinkPatreon.setOnClickListener(v12 -> {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse(getResources().getString(R.string.supportLinkPatreon)));
startActivity(intent);
});
viewBinding.translateLink.setOnClickListener(v13 -> {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse(getResources().getString(R.string.crowdInLink)));
startActivity(intent);
});
viewBinding.appWebsite.setOnClickListener(v14 -> {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse(getResources().getString(R.string.appWebsiteLink)));
startActivity(intent);
});
if(AppUtil.isPro(requireContext())) {
viewBinding.supportHeader.setVisibility(View.GONE);
viewBinding.dividerSupport.setVisibility(View.GONE);
viewBinding.donationLinkPatreon.setVisibility(View.GONE);
}
return viewBinding.getRoot();
}
}

View File

@ -40,6 +40,16 @@ public class AdministrationFragment extends Fragment {
fragmentAdministrationBinding.adminCron.setOnClickListener(v1 -> startActivity(new Intent(getContext(), AdminCronTasksActivity.class))); fragmentAdministrationBinding.adminCron.setOnClickListener(v1 -> startActivity(new Intent(getContext(), AdminCronTasksActivity.class)));
String action = requireActivity().getIntent().getStringExtra("giteaAdminAction");
if(action != null) {
if(action.equals("users")) {
startActivity(new Intent(getContext(), AdminGetUsersActivity.class));
}
else if(action.equals("monitor")) {
startActivity(new Intent(getContext(), AdminCronTasksActivity.class));
}
}
return fragmentAdministrationBinding.getRoot(); return fragmentAdministrationBinding.getRoot();
} }

View File

@ -8,14 +8,14 @@ import android.view.ViewGroup;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import org.mian.gitnex.activities.ProfileEmailActivity; import org.mian.gitnex.activities.MyProfileEmailActivity;
import org.mian.gitnex.databinding.BottomSheetProfileBinding; import org.mian.gitnex.databinding.BottomSheetProfileBinding;
/** /**
* Author M M Arif * Author M M Arif
*/ */
public class BottomSheetProfileFragment extends BottomSheetDialogFragment { public class BottomSheetMyProfileFragment extends BottomSheetDialogFragment {
@Nullable @Nullable
@Override @Override
@ -25,7 +25,7 @@ public class BottomSheetProfileFragment extends BottomSheetDialogFragment {
bottomSheetProfileBinding.addNewEmailAddress.setOnClickListener(v1 -> { bottomSheetProfileBinding.addNewEmailAddress.setOnClickListener(v1 -> {
startActivity(new Intent(getContext(), ProfileEmailActivity.class)); startActivity(new Intent(getContext(), MyProfileEmailActivity.class));
dismiss(); dismiss();
}); });

View File

@ -13,17 +13,24 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import com.google.gson.JsonElement;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.actions.IssueActions; import org.mian.gitnex.actions.IssueActions;
import org.mian.gitnex.actions.PullRequestActions;
import org.mian.gitnex.activities.EditIssueActivity; import org.mian.gitnex.activities.EditIssueActivity;
import org.mian.gitnex.activities.FileDiffActivity; import org.mian.gitnex.activities.FileDiffActivity;
import org.mian.gitnex.activities.MergePullRequestActivity; import org.mian.gitnex.activities.MergePullRequestActivity;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.BottomSheetSingleIssueBinding; import org.mian.gitnex.databinding.BottomSheetSingleIssueBinding;
import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version; import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.views.ReactionSpinner; import org.mian.gitnex.views.ReactionSpinner;
import java.util.Objects; import java.util.Objects;
import retrofit2.Call;
import retrofit2.Callback;
/** /**
* Author M M Arif * Author M M Arif
@ -50,6 +57,7 @@ public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment {
TextView copyIssueUrl = bottomSheetSingleIssueBinding.copyIssueUrl; TextView copyIssueUrl = bottomSheetSingleIssueBinding.copyIssueUrl;
TextView openFilesDiff = bottomSheetSingleIssueBinding.openFilesDiff; TextView openFilesDiff = bottomSheetSingleIssueBinding.openFilesDiff;
TextView mergePullRequest = bottomSheetSingleIssueBinding.mergePullRequest; TextView mergePullRequest = bottomSheetSingleIssueBinding.mergePullRequest;
TextView deletePullRequestBranch = bottomSheetSingleIssueBinding.deletePrHeadBranch;
TextView shareIssue = bottomSheetSingleIssueBinding.shareIssue; TextView shareIssue = bottomSheetSingleIssueBinding.shareIssue;
TextView subscribeIssue = bottomSheetSingleIssueBinding.subscribeIssue; TextView subscribeIssue = bottomSheetSingleIssueBinding.subscribeIssue;
TextView unsubscribeIssue = bottomSheetSingleIssueBinding.unsubscribeIssue; TextView unsubscribeIssue = bottomSheetSingleIssueBinding.unsubscribeIssue;
@ -85,9 +93,11 @@ public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment {
if(tinyDB.getBoolean("prMerged") || tinyDB.getString("repoPrState").equals("closed")) { if(tinyDB.getBoolean("prMerged") || tinyDB.getString("repoPrState").equals("closed")) {
mergePullRequest.setVisibility(View.GONE); mergePullRequest.setVisibility(View.GONE);
deletePullRequestBranch.setVisibility(View.VISIBLE);
} }
else { else {
mergePullRequest.setVisibility(View.VISIBLE); mergePullRequest.setVisibility(View.VISIBLE);
deletePullRequestBranch.setVisibility(View.GONE);
} }
if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.13.0")) { if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.13.0")) {
@ -104,6 +114,7 @@ public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment {
else { else {
mergePullRequest.setVisibility(View.GONE); mergePullRequest.setVisibility(View.GONE);
deletePullRequestBranch.setVisibility(View.GONE);
} }
mergePullRequest.setOnClickListener(v13 -> { mergePullRequest.setOnClickListener(v13 -> {
@ -112,6 +123,12 @@ public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment {
dismiss(); dismiss();
}); });
deletePullRequestBranch.setOnClickListener(v -> {
PullRequestActions.deleteHeadBranch(ctx, parts[0], parts[1], tinyDB.getString("prHeadBranch"), true);
dismiss();
});
openFilesDiff.setOnClickListener(v14 -> { openFilesDiff.setOnClickListener(v14 -> {
startActivity(new Intent(ctx, FileDiffActivity.class)); startActivity(new Intent(ctx, FileDiffActivity.class));

View File

@ -24,9 +24,6 @@ import org.mian.gitnex.helpers.TinyDB;
public class ExploreFragment extends Fragment { public class ExploreFragment extends Fragment {
private Context ctx;
private TinyDB tinyDB;
private int tabsCount; private int tabsCount;
public ViewPager mViewPager; public ViewPager mViewPager;
@ -36,8 +33,8 @@ public class ExploreFragment extends Fragment {
View view = inflater.inflate(R.layout.fragment_explore, container, false); View view = inflater.inflate(R.layout.fragment_explore, container, false);
ctx = getContext(); Context ctx = getContext();
tinyDB = TinyDB.getInstance(ctx); TinyDB tinyDB = TinyDB.getInstance(ctx);
((MainActivity) requireActivity()).setActionBarTitle(getResources().getString(R.string.navExplore)); ((MainActivity) requireActivity()).setActionBarTitle(getResources().getString(R.string.navExplore));
@ -87,6 +84,10 @@ public class ExploreFragment extends Fragment {
SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager()); SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());
mViewPager.setAdapter(mSectionsPagerAdapter); mViewPager.setAdapter(mSectionsPagerAdapter);
if(requireActivity().getIntent().getBooleanExtra("exploreOrgs", false)) {
mViewPager.setCurrentItem(2);
}
return view; return view;
} }
@ -111,7 +112,11 @@ public class ExploreFragment extends Fragment {
break; break;
case 1: // Issues case 1: // Issues
fragment = new SearchIssuesFragment(); fragment = new ExploreIssuesFragment();
break;
case 2: // Organizations
fragment = new ExplorePublicOrganizationsFragment();
break; break;
} }

View File

@ -13,13 +13,12 @@ import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import org.gitnex.tea4j.models.Issues; import org.gitnex.tea4j.models.Issues;
import org.mian.gitnex.adapters.SearchIssuesAdapter; import org.mian.gitnex.adapters.ExploreIssuesAdapter;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.FragmentSearchIssuesBinding; import org.mian.gitnex.databinding.FragmentSearchIssuesBinding;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.InfiniteScrollListener; import org.mian.gitnex.helpers.InfiniteScrollListener;
import org.mian.gitnex.helpers.TinyDB;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@ -31,30 +30,25 @@ import retrofit2.Response;
* Author M M Arif * Author M M Arif
*/ */
public class SearchIssuesFragment extends Fragment { public class ExploreIssuesFragment extends Fragment {
private Context ctx;
private TinyDB tinyDb;
private FragmentSearchIssuesBinding viewBinding; private FragmentSearchIssuesBinding viewBinding;
private SearchIssuesAdapter adapter; private ExploreIssuesAdapter adapter;
private List<Issues> dataList; private List<Issues> dataList;
Context ctx;
private int apiCallCurrentValue = 10; private int apiCallCurrentValue = 10;
private int pageCurrentIndex = 1; private int pageCurrentIndex = 1;
private String type = "issues";
private String state = "open";
@Override @Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
viewBinding = FragmentSearchIssuesBinding.inflate(inflater, container, false); viewBinding = FragmentSearchIssuesBinding.inflate(inflater, container, false);
setHasOptionsMenu(true); setHasOptionsMenu(true);
ctx = getContext(); ctx = getContext();
tinyDb = TinyDB.getInstance(getContext());
dataList = new ArrayList<>(); dataList = new ArrayList<>();
adapter = new SearchIssuesAdapter(dataList, ctx); adapter = new ExploreIssuesAdapter(dataList, ctx);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(ctx); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(ctx);
@ -65,11 +59,8 @@ public class SearchIssuesFragment extends Fragment {
viewBinding.recyclerViewSearchIssues.setAdapter(adapter); viewBinding.recyclerViewSearchIssues.setAdapter(adapter);
viewBinding.searchKeyword.setOnEditorActionListener((v1, actionId, event) -> { viewBinding.searchKeyword.setOnEditorActionListener((v1, actionId, event) -> {
if(actionId == EditorInfo.IME_ACTION_SEND) { if(actionId == EditorInfo.IME_ACTION_SEND) {
if(!Objects.requireNonNull(viewBinding.searchKeyword.getText()).toString().equals("")) { if(!Objects.requireNonNull(viewBinding.searchKeyword.getText()).toString().equals("")) {
InputMethodManager imm = (InputMethodManager) requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE); InputMethodManager imm = (InputMethodManager) requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(viewBinding.searchKeyword.getWindowToken(), 0); imm.hideSoftInputFromWindow(viewBinding.searchKeyword.getWindowToken(), 0);
@ -79,27 +70,21 @@ public class SearchIssuesFragment extends Fragment {
loadData(false, viewBinding.searchKeyword.getText().toString()); loadData(false, viewBinding.searchKeyword.getText().toString());
} }
} }
return false; return false;
}); });
viewBinding.recyclerViewSearchIssues.addOnScrollListener(new InfiniteScrollListener(pageCurrentIndex, linearLayoutManager) { viewBinding.recyclerViewSearchIssues.addOnScrollListener(new InfiniteScrollListener(pageCurrentIndex, linearLayoutManager) {
@Override @Override
public void onScrolledToEnd(int firstVisibleItemPosition) { public void onScrolledToEnd(int firstVisibleItemPosition) {
pageCurrentIndex++; pageCurrentIndex++;
loadData(true, Objects.requireNonNull(viewBinding.searchKeyword.getText()).toString()); loadData(true, Objects.requireNonNull(viewBinding.searchKeyword.getText()).toString());
} }
}); });
viewBinding.pullToRefresh.setOnRefreshListener(() -> { viewBinding.pullToRefresh.setOnRefreshListener(() -> {
pageCurrentIndex = 1; pageCurrentIndex = 1;
apiCallCurrentValue = 10; apiCallCurrentValue = 10;
loadData(false, Objects.requireNonNull(viewBinding.searchKeyword.getText()).toString()); loadData(false, Objects.requireNonNull(viewBinding.searchKeyword.getText()).toString());
}); });
loadData(false, ""); loadData(false, "");
@ -117,69 +102,50 @@ public class SearchIssuesFragment extends Fragment {
} }
if(pageCurrentIndex == 1 || !append) { if(pageCurrentIndex == 1 || !append) {
dataList.clear(); dataList.clear();
adapter.notifyDataSetChanged(); adapter.notifyDataSetChanged();
viewBinding.pullToRefresh.setRefreshing(false); viewBinding.pullToRefresh.setRefreshing(false);
viewBinding.progressBar.setVisibility(View.VISIBLE); viewBinding.progressBar.setVisibility(View.VISIBLE);
} }
else { else {
viewBinding.loadingMoreView.setVisibility(View.VISIBLE); viewBinding.loadingMoreView.setVisibility(View.VISIBLE);
} }
Call<List<Issues>> call = RetrofitClient.getApiInterface(getContext()) Call<List<Issues>> call = RetrofitClient.getApiInterface(getContext())
.queryIssues(Authorization.get(getContext()), searchKeyword, type, state, pageCurrentIndex); .queryIssues(Authorization.get(getContext()), searchKeyword, "issues", "open", pageCurrentIndex);
call.enqueue(new Callback<List<Issues>>() { call.enqueue(new Callback<List<Issues>>() {
@Override @Override
public void onResponse(@NonNull Call<List<Issues>> call, @NonNull Response<List<Issues>> response) { public void onResponse(@NonNull Call<List<Issues>> call, @NonNull Response<List<Issues>> response) {
if(response.code() == 200) { if(response.code() == 200) {
assert response.body() != null; assert response.body() != null;
apiCallCurrentValue = response.body().size(); apiCallCurrentValue = response.body().size();
if(!append) { if(!append) {
dataList.clear(); dataList.clear();
} }
dataList.addAll(response.body()); dataList.addAll(response.body());
adapter.notifyDataSetChanged(); adapter.notifyDataSetChanged();
} }
else { else {
dataList.clear(); dataList.clear();
adapter.notifyDataChanged(); adapter.notifyDataChanged();
viewBinding.noData.setVisibility(View.VISIBLE); viewBinding.noData.setVisibility(View.VISIBLE);
} }
onCleanup(); onCleanup();
} }
@Override @Override
public void onFailure(@NonNull Call<List<Issues>> call, @NonNull Throwable t) { public void onFailure(@NonNull Call<List<Issues>> call, @NonNull Throwable t) {
Log.e("onFailure", Objects.requireNonNull(t.getMessage())); Log.e("onFailure", Objects.requireNonNull(t.getMessage()));
onCleanup(); onCleanup();
} }
private void onCleanup() { private void onCleanup() {
AppUtil.setMultiVisibility(View.GONE, viewBinding.loadingMoreView, viewBinding.progressBar); AppUtil.setMultiVisibility(View.GONE, viewBinding.loadingMoreView, viewBinding.progressBar);
if(dataList.isEmpty()) { if(dataList.isEmpty()) {
viewBinding.noData.setVisibility(View.VISIBLE); viewBinding.noData.setVisibility(View.VISIBLE);
} }
} }
}); });
} }
} }

View File

@ -0,0 +1,160 @@
package org.mian.gitnex.fragments;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import org.gitnex.tea4j.models.Organization;
import org.mian.gitnex.R;
import org.mian.gitnex.adapters.ExplorePublicOrganizationsAdapter;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.FragmentOrganizationsBinding;
import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.SnackBar;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Version;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
/**
* Author M M Arif
*/
public class ExplorePublicOrganizationsFragment extends Fragment {
private FragmentOrganizationsBinding fragmentPublicOrgBinding;
private List<Organization> organizationsList;
private ExplorePublicOrganizationsAdapter adapter;
private Context context;
private int pageSize;
private final String TAG = Constants.publicOrganizations;
private int resultLimit = Constants.resultLimitOldGiteaInstances;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
fragmentPublicOrgBinding = FragmentOrganizationsBinding.inflate(inflater, container, false);
context = getContext();
TinyDB tinyDb = TinyDB.getInstance(getContext());
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
// if gitea is 1.12 or higher use the new limit
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) {
resultLimit = Constants.resultLimitNewGiteaInstances;
}
fragmentPublicOrgBinding.addNewOrganization.setVisibility(View.GONE);
organizationsList = new ArrayList<>();
fragmentPublicOrgBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
fragmentPublicOrgBinding.pullToRefresh.setRefreshing(false);
loadInitial(instanceToken, resultLimit);
adapter.notifyDataChanged();
}, 200));
adapter = new ExplorePublicOrganizationsAdapter(getContext(), organizationsList);
adapter.setLoadMoreListener(() -> fragmentPublicOrgBinding.recyclerView.post(() -> {
if(organizationsList.size() == resultLimit || pageSize == resultLimit) {
int page = (organizationsList.size() + resultLimit) / resultLimit;
loadMore(Authorization.get(getContext()), page, resultLimit);
}
}));
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(fragmentPublicOrgBinding.recyclerView.getContext(), DividerItemDecoration.VERTICAL);
fragmentPublicOrgBinding.recyclerView.setHasFixedSize(true);
fragmentPublicOrgBinding.recyclerView.addItemDecoration(dividerItemDecoration);
fragmentPublicOrgBinding.recyclerView.setLayoutManager(new LinearLayoutManager(context));
fragmentPublicOrgBinding.recyclerView.setAdapter(adapter);
loadInitial(Authorization.get(getContext()), resultLimit);
return fragmentPublicOrgBinding.getRoot();
}
private void loadInitial(String token, int resultLimit) {
Call<List<Organization>> call = RetrofitClient
.getApiInterface(context).getAllOrgs(token, Constants.publicOrganizationsPageInit, resultLimit);
call.enqueue(new Callback<List<Organization>>() {
@Override
public void onResponse(@NonNull Call<List<Organization>> call, @NonNull Response<List<Organization>> response) {
if(response.isSuccessful()) {
if(response.body() != null && response.body().size() > 0) {
organizationsList.clear();
organizationsList.addAll(response.body());
adapter.notifyDataChanged();
fragmentPublicOrgBinding.noDataOrg.setVisibility(View.GONE);
}
else {
organizationsList.clear();
adapter.notifyDataChanged();
fragmentPublicOrgBinding.noDataOrg.setVisibility(View.VISIBLE);
}
fragmentPublicOrgBinding.progressBar.setVisibility(View.GONE);
}
else if(response.code() == 404) {
fragmentPublicOrgBinding.noDataOrg.setVisibility(View.VISIBLE);
fragmentPublicOrgBinding.progressBar.setVisibility(View.GONE);
}
else {
Log.e(TAG, String.valueOf(response.code()));
}
}
@Override
public void onFailure(@NonNull Call<List<Organization>> call, @NonNull Throwable t) {
Log.e(TAG, t.toString());
}
});
}
private void loadMore(String token, int page, int resultLimit) {
fragmentPublicOrgBinding.progressLoadMore.setVisibility(View.VISIBLE);
Call<List<Organization>> call = RetrofitClient.getApiInterface(context).getAllOrgs(token, page, resultLimit);
call.enqueue(new Callback<List<Organization>>() {
@Override
public void onResponse(@NonNull Call<List<Organization>> call, @NonNull Response<List<Organization>> response) {
if(response.isSuccessful()) {
List<Organization> result = response.body();
if(result != null) {
if(result.size() > 0) {
pageSize = result.size();
organizationsList.addAll(result);
}
else {
SnackBar.info(context, fragmentPublicOrgBinding.getRoot(), getString(R.string.noMoreData));
adapter.setMoreDataAvailable(false);
}
}
adapter.notifyDataChanged();
fragmentPublicOrgBinding.progressLoadMore.setVisibility(View.GONE);
}
else {
Log.e(TAG, String.valueOf(response.code()));
}
}
@Override
public void onFailure(@NonNull Call<List<Organization>> call, @NonNull Throwable t) {
Log.e(TAG, t.toString());
}
});
}
}

View File

@ -261,54 +261,21 @@ public class ExploreRepositoriesFragment extends Fragment {
dialogFilterOptions.setContentView(view); dialogFilterOptions.setContentView(view);
filterBinding.includeTopic.setOnClickListener(includeTopic -> { filterBinding.includeTopic.setOnClickListener(includeTopic -> {
tinyDb.putBoolean("exploreRepoIncludeTopic", filterBinding.includeTopic.isChecked());
if(filterBinding.includeTopic.isChecked()) {
tinyDb.putBoolean("exploreRepoIncludeTopic", true);
}
else {
tinyDb.putBoolean("exploreRepoIncludeTopic", false);
}
}); });
filterBinding.includeDesc.setOnClickListener(includeDesc -> { filterBinding.includeDesc.setOnClickListener(includeDesc -> {
tinyDb.putBoolean("exploreRepoIncludeDescription", filterBinding.includeDesc.isChecked());
if(filterBinding.includeDesc.isChecked()) {
tinyDb.putBoolean("exploreRepoIncludeDescription", true);
}
else {
tinyDb.putBoolean("exploreRepoIncludeDescription", false);
}
}); });
filterBinding.includeTemplate.setOnClickListener(includeTemplate -> { filterBinding.includeTemplate.setOnClickListener(includeTemplate -> {
tinyDb.putBoolean("exploreRepoIncludeTemplate", filterBinding.includeTemplate.isChecked());
if(filterBinding.includeTemplate.isChecked()) {
tinyDb.putBoolean("exploreRepoIncludeTemplate", true);
}
else {
tinyDb.putBoolean("exploreRepoIncludeTemplate", false);
}
}); });
filterBinding.onlyArchived.setOnClickListener(onlyArchived -> { filterBinding.onlyArchived.setOnClickListener(onlyArchived -> {
tinyDb.putBoolean("exploreRepoOnlyArchived", filterBinding.onlyArchived.isChecked());
if(filterBinding.onlyArchived.isChecked()) {
tinyDb.putBoolean("exploreRepoOnlyArchived", true);
}
else {
tinyDb.putBoolean("exploreRepoOnlyArchived", false);
}
}); });
filterBinding.includeTopic.setChecked(tinyDb.getBoolean("exploreRepoIncludeTopic")); filterBinding.includeTopic.setChecked(tinyDb.getBoolean("exploreRepoIncludeTopic"));
filterBinding.includeDesc.setChecked(tinyDb.getBoolean("exploreRepoIncludeDescription")); filterBinding.includeDesc.setChecked(tinyDb.getBoolean("exploreRepoIncludeDescription"));
filterBinding.includeTemplate.setChecked(tinyDb.getBoolean("exploreRepoIncludeTemplate")); filterBinding.includeTemplate.setChecked(tinyDb.getBoolean("exploreRepoIncludeTemplate"));

View File

@ -130,7 +130,17 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter
}); });
fetchDataAsync(Authorization.get(getContext()), repoOwner, repoName, ref); String dir = requireActivity().getIntent().getStringExtra("dir");
if(dir != null) {
fetchDataAsyncSub(Authorization.get(getContext()), repoOwner, repoName, dir, ref);
for(String segment: dir.split("/")) {
binding.breadcrumbsView.addItem(new BreadcrumbItem(Collections.singletonList(segment)));
path.add(segment);
}
}
else {
fetchDataAsync(Authorization.get(getContext()), repoOwner, repoName, ref);
}
return binding.getRoot(); return binding.getRoot();
} }

View File

@ -29,8 +29,8 @@ import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.FragmentIssuesBinding; import org.mian.gitnex.databinding.FragmentIssuesBinding;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.Constants; import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.SnackBar;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version; import org.mian.gitnex.helpers.Version;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -44,6 +44,7 @@ import retrofit2.Response;
public class IssuesFragment extends Fragment { public class IssuesFragment extends Fragment {
private FragmentIssuesBinding fragmentIssuesBinding;
private Menu menu; private Menu menu;
private RecyclerView recyclerView; private RecyclerView recyclerView;
private List<Issues> issuesList; private List<Issues> issuesList;
@ -51,18 +52,17 @@ public class IssuesFragment extends Fragment {
private Context context; private Context context;
private int pageSize = Constants.issuesPageInit; private int pageSize = Constants.issuesPageInit;
private ProgressBar mProgressBar; private ProgressBar mProgressBar;
private String TAG = Constants.tagIssuesList; private final String TAG = Constants.tagIssuesList;
private TextView noDataIssues; private TextView noDataIssues;
private int resultLimit = Constants.resultLimitOldGiteaInstances; private int resultLimit = Constants.resultLimitOldGiteaInstances;
private String requestType = Constants.issuesRequestType; private final String requestType = Constants.issuesRequestType;
private ProgressBar progressLoadMore; private ProgressBar progressLoadMore;
@Nullable @Nullable
@Override @Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
FragmentIssuesBinding fragmentIssuesBinding = FragmentIssuesBinding.inflate(inflater, container, false); fragmentIssuesBinding = FragmentIssuesBinding.inflate(inflater, container, false);
setHasOptionsMenu(true); setHasOptionsMenu(true);
context = getContext(); context = getContext();
@ -89,23 +89,17 @@ public class IssuesFragment extends Fragment {
noDataIssues = fragmentIssuesBinding.noDataIssues; noDataIssues = fragmentIssuesBinding.noDataIssues;
swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
swipeRefresh.setRefreshing(false); swipeRefresh.setRefreshing(false);
loadInitial(instanceToken, repoOwner, repoName, resultLimit, requestType, tinyDb.getString("repoIssuesState")); loadInitial(instanceToken, repoOwner, repoName, resultLimit, requestType, tinyDb.getString("repoIssuesState"));
adapter.notifyDataChanged(); adapter.notifyDataChanged();
}, 200)); }, 200));
adapter = new IssuesAdapter(getContext(), issuesList); adapter = new IssuesAdapter(getContext(), issuesList);
adapter.setLoadMoreListener(() -> recyclerView.post(() -> { adapter.setLoadMoreListener(() -> recyclerView.post(() -> {
if(issuesList.size() == resultLimit || pageSize == resultLimit) { if(issuesList.size() == resultLimit || pageSize == resultLimit) {
int page = (issuesList.size() + resultLimit) / resultLimit; int page = (issuesList.size() + resultLimit) / resultLimit;
loadMore(Authorization.get(getContext()), repoOwner, repoName, page, resultLimit, requestType, tinyDb.getString("repoIssuesState")); loadMore(Authorization.get(getContext()), repoOwner, repoName, page, resultLimit, requestType, tinyDb.getString("repoIssuesState"));
} }
})); }));
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL); DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL);
@ -129,12 +123,9 @@ public class IssuesFragment extends Fragment {
adapter.setLoadMoreListener(() -> recyclerView.post(() -> { adapter.setLoadMoreListener(() -> recyclerView.post(() -> {
if(issuesList.size() == resultLimit || pageSize == resultLimit) { if(issuesList.size() == resultLimit || pageSize == resultLimit) {
int page = (issuesList.size() + resultLimit) / resultLimit; int page = (issuesList.size() + resultLimit) / resultLimit;
loadMore(Authorization.get(getContext()), repoOwner, repoName, page, resultLimit, requestType, tinyDb.getString("repoIssuesState")); loadMore(Authorization.get(getContext()), repoOwner, repoName, page, resultLimit, requestType, tinyDb.getString("repoIssuesState"));
} }
})); }));
tinyDb.putString("repoIssuesState", issueState); tinyDb.putString("repoIssuesState", issueState);
@ -144,13 +135,11 @@ public class IssuesFragment extends Fragment {
loadInitial(Authorization.get(getContext()), repoOwner, repoName, resultLimit, requestType, issueState); loadInitial(Authorization.get(getContext()), repoOwner, repoName, resultLimit, requestType, issueState);
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
}); });
loadInitial(Authorization.get(getContext()), repoOwner, repoName, resultLimit, requestType, tinyDb.getString("repoIssuesState")); loadInitial(Authorization.get(getContext()), repoOwner, repoName, resultLimit, requestType, tinyDb.getString("repoIssuesState"));
return fragmentIssuesBinding.getRoot(); return fragmentIssuesBinding.getRoot();
} }
@Override @Override
@ -165,11 +154,9 @@ public class IssuesFragment extends Fragment {
final String repoName = parts[1]; final String repoName = parts[1];
if(tinyDb.getBoolean("resumeIssues")) { if(tinyDb.getBoolean("resumeIssues")) {
loadInitial(Authorization.get(getContext()), repoOwner, repoName, resultLimit, requestType, tinyDb.getString("repoIssuesState")); loadInitial(Authorization.get(getContext()), repoOwner, repoName, resultLimit, requestType, tinyDb.getString("repoIssuesState"));
tinyDb.putBoolean("resumeIssues", false); tinyDb.putBoolean("resumeIssues", false);
} }
} }
private void loadInitial(String token, String repoOwner, String repoName, int resultLimit, String requestType, String issueState) { private void loadInitial(String token, String repoOwner, String repoName, int resultLimit, String requestType, String issueState) {
@ -177,49 +164,38 @@ public class IssuesFragment extends Fragment {
Call<List<Issues>> call = RetrofitClient.getApiInterface(context).getIssues(token, repoOwner, repoName, 1, resultLimit, requestType, issueState); Call<List<Issues>> call = RetrofitClient.getApiInterface(context).getIssues(token, repoOwner, repoName, 1, resultLimit, requestType, issueState);
call.enqueue(new Callback<List<Issues>>() { call.enqueue(new Callback<List<Issues>>() {
@Override @Override
public void onResponse(@NonNull Call<List<Issues>> call, @NonNull Response<List<Issues>> response) { public void onResponse(@NonNull Call<List<Issues>> call, @NonNull Response<List<Issues>> response) {
if(response.code() == 200) { if(response.code() == 200) {
assert response.body() != null; assert response.body() != null;
if(response.body().size() > 0) { if(response.body().size() > 0) {
issuesList.clear(); issuesList.clear();
issuesList.addAll(response.body()); issuesList.addAll(response.body());
adapter.notifyDataChanged(); adapter.notifyDataChanged();
noDataIssues.setVisibility(View.GONE); noDataIssues.setVisibility(View.GONE);
} }
else { else {
issuesList.clear(); issuesList.clear();
adapter.notifyDataChanged(); adapter.notifyDataChanged();
noDataIssues.setVisibility(View.VISIBLE); noDataIssues.setVisibility(View.VISIBLE);
} }
mProgressBar.setVisibility(View.GONE); mProgressBar.setVisibility(View.GONE);
} }
else if(response.code() == 404) { else if(response.code() == 404) {
noDataIssues.setVisibility(View.VISIBLE); noDataIssues.setVisibility(View.VISIBLE);
mProgressBar.setVisibility(View.GONE); mProgressBar.setVisibility(View.GONE);
} }
else { else {
Log.e(TAG, String.valueOf(response.code())); Log.e(TAG, String.valueOf(response.code()));
} }
} }
@Override @Override
public void onFailure(@NonNull Call<List<Issues>> call, @NonNull Throwable t) { public void onFailure(@NonNull Call<List<Issues>> call, @NonNull Throwable t) {
Log.e(TAG, t.toString()); Log.e(TAG, t.toString());
} }
}); });
} }
private void loadMore(String token, String repoOwner, String repoName, int page, int resultLimit, String requestType, String issueState) { private void loadMore(String token, String repoOwner, String repoName, int page, int resultLimit, String requestType, String issueState) {
@ -232,44 +208,29 @@ public class IssuesFragment extends Fragment {
@Override @Override
public void onResponse(@NonNull Call<List<Issues>> call, @NonNull Response<List<Issues>> response) { public void onResponse(@NonNull Call<List<Issues>> call, @NonNull Response<List<Issues>> response) {
if(response.code() == 200) { if(response.code() == 200) {
List<Issues> result = response.body(); List<Issues> result = response.body();
assert result != null; assert result != null;
if(result.size() > 0) { if(result.size() > 0) {
pageSize = result.size(); pageSize = result.size();
issuesList.addAll(result); issuesList.addAll(result);
} }
else { else {
SnackBar.info(context, fragmentIssuesBinding.getRoot(), getString(R.string.noMoreData));
Toasty.warning(context, getString(R.string.noMoreData));
adapter.setMoreDataAvailable(false); adapter.setMoreDataAvailable(false);
} }
adapter.notifyDataChanged(); adapter.notifyDataChanged();
progressLoadMore.setVisibility(View.GONE); progressLoadMore.setVisibility(View.GONE);
} }
else { else {
Log.e(TAG, String.valueOf(response.code())); Log.e(TAG, String.valueOf(response.code()));
} }
} }
@Override @Override
public void onFailure(@NonNull Call<List<Issues>> call, @NonNull Throwable t) { public void onFailure(@NonNull Call<List<Issues>> call, @NonNull Throwable t) {
Log.e(TAG, t.toString()); Log.e(TAG, t.toString());
} }
}); });
} }
@ -298,19 +259,15 @@ public class IssuesFragment extends Fragment {
@Override @Override
public boolean onQueryTextSubmit(String query) { public boolean onQueryTextSubmit(String query) {
return false; return false;
} }
@Override @Override
public boolean onQueryTextChange(String newText) { public boolean onQueryTextChange(String newText) {
filter(newText); filter(newText);
return false; return false;
} }
}); });
} }
private void filter(String text) { private void filter(String text) {
@ -328,5 +285,4 @@ public class IssuesFragment extends Fragment {
adapter.updateList(arr); adapter.updateList(arr);
} }
} }

View File

@ -48,6 +48,8 @@ public class MilestonesFragment extends Fragment {
private String TAG = Constants.tagMilestonesFragment; private String TAG = Constants.tagMilestonesFragment;
private int resultLimit = Constants.resultLimitOldGiteaInstances; private int resultLimit = Constants.resultLimitOldGiteaInstances;
private String milestoneId;
@Override @Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@ -63,6 +65,9 @@ public class MilestonesFragment extends Fragment {
final String loginUid = tinyDb.getString("loginUid"); final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
milestoneId = requireActivity().getIntent().getStringExtra("milestoneId");
requireActivity().getIntent().removeExtra("milestoneId");
viewBinding.recyclerView.setHasFixedSize(true); viewBinding.recyclerView.setHasFixedSize(true);
viewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); viewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
@ -188,6 +193,10 @@ public class MilestonesFragment extends Fragment {
adapter.notifyDataChanged(); adapter.notifyDataChanged();
viewBinding.noDataMilestone.setVisibility(View.GONE); viewBinding.noDataMilestone.setVisibility(View.GONE);
if(milestoneId != null) {
viewBinding.recyclerView.scrollToPosition(getMilestoneIndex(Integer.parseInt(milestoneId), response.body()));
}
} }
else { else {
@ -216,6 +225,15 @@ public class MilestonesFragment extends Fragment {
} }
private static int getMilestoneIndex(int milestoneId, List<Milestones> milestones) {
for (Milestones milestone : milestones) {
if(milestone.getId() == milestoneId) {
return milestones.indexOf(milestone);
}
}
return -1;
}
private void loadMore(String token, String repoOwner, String repoName, int page, int resultLimit, String milestoneState) { private void loadMore(String token, String repoOwner, String repoName, int page, int resultLimit, String milestoneState) {
viewBinding.progressLoadMore.setVisibility(View.VISIBLE); viewBinding.progressLoadMore.setVisibility(View.VISIBLE);

View File

@ -18,7 +18,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import org.gitnex.tea4j.models.Emails; import org.gitnex.tea4j.models.Emails;
import org.mian.gitnex.adapters.ProfileEmailsAdapter; import org.mian.gitnex.adapters.MyProfileEmailsAdapter;
import org.mian.gitnex.databinding.FragmentProfileEmailsBinding; import org.mian.gitnex.databinding.FragmentProfileEmailsBinding;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.viewmodels.ProfileEmailsViewModel; import org.mian.gitnex.viewmodels.ProfileEmailsViewModel;
@ -28,10 +28,10 @@ import java.util.List;
* Author M M Arif * Author M M Arif
*/ */
public class ProfileEmailsFragment extends Fragment { public class MyProfileEmailsFragment extends Fragment {
private ProgressBar mProgressBar; private ProgressBar mProgressBar;
private ProfileEmailsAdapter adapter; private MyProfileEmailsAdapter adapter;
private RecyclerView mRecyclerView; private RecyclerView mRecyclerView;
private TextView noDataEmails; private TextView noDataEmails;
private static String repoNameF = "param2"; private static String repoNameF = "param2";
@ -42,11 +42,11 @@ public class ProfileEmailsFragment extends Fragment {
private OnFragmentInteractionListener mListener; private OnFragmentInteractionListener mListener;
public ProfileEmailsFragment() { public MyProfileEmailsFragment() {
} }
public static ProfileEmailsFragment newInstance(String param1, String param2) { public static MyProfileEmailsFragment newInstance(String param1, String param2) {
ProfileEmailsFragment fragment = new ProfileEmailsFragment(); MyProfileEmailsFragment fragment = new MyProfileEmailsFragment();
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putString(repoOwnerF, param1); args.putString(repoOwnerF, param1);
args.putString(repoNameF, param2); args.putString(repoNameF, param2);
@ -102,7 +102,7 @@ public class ProfileEmailsFragment extends Fragment {
profileEmailModel.getEmailsList(instanceToken, getContext()).observe(getViewLifecycleOwner(), new Observer<List<Emails>>() { profileEmailModel.getEmailsList(instanceToken, getContext()).observe(getViewLifecycleOwner(), new Observer<List<Emails>>() {
@Override @Override
public void onChanged(@Nullable List<Emails> emailsListMain) { public void onChanged(@Nullable List<Emails> emailsListMain) {
adapter = new ProfileEmailsAdapter(getContext(), emailsListMain); adapter = new MyProfileEmailsAdapter(getContext(), emailsListMain);
if(adapter.getItemCount() > 0) { if(adapter.getItemCount() > 0) {
mRecyclerView.setAdapter(adapter); mRecyclerView.setAdapter(adapter);
noDataEmails.setVisibility(View.GONE); noDataEmails.setVisibility(View.GONE);

View File

@ -16,8 +16,8 @@ import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import org.mian.gitnex.adapters.ProfileFollowersAdapter; import org.mian.gitnex.adapters.MyProfileFollowersAdapter;
import org.mian.gitnex.databinding.FragmentProfileFollowersBinding; import org.mian.gitnex.databinding.FragmentProfileFollowersFollowingBinding;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.viewmodels.ProfileFollowersViewModel; import org.mian.gitnex.viewmodels.ProfileFollowersViewModel;
@ -25,10 +25,10 @@ import org.mian.gitnex.viewmodels.ProfileFollowersViewModel;
* Author M M Arif * Author M M Arif
*/ */
public class ProfileFollowersFragment extends Fragment { public class MyProfileFollowersFragment extends Fragment {
private ProgressBar mProgressBar; private ProgressBar mProgressBar;
private ProfileFollowersAdapter adapter; private MyProfileFollowersAdapter adapter;
private RecyclerView mRecyclerView; private RecyclerView mRecyclerView;
private TextView noDataFollowers; private TextView noDataFollowers;
private static String repoNameF = "param2"; private static String repoNameF = "param2";
@ -39,11 +39,11 @@ public class ProfileFollowersFragment extends Fragment {
private OnFragmentInteractionListener mListener; private OnFragmentInteractionListener mListener;
public ProfileFollowersFragment() { public MyProfileFollowersFragment() {
} }
public static ProfileFollowersFragment newInstance(String param1, String param2) { public static MyProfileFollowersFragment newInstance(String param1, String param2) {
ProfileFollowersFragment fragment = new ProfileFollowersFragment(); MyProfileFollowersFragment fragment = new MyProfileFollowersFragment();
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putString(repoOwnerF, param1); args.putString(repoOwnerF, param1);
args.putString(repoNameF, param2); args.putString(repoNameF, param2);
@ -64,12 +64,12 @@ public class ProfileFollowersFragment extends Fragment {
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
FragmentProfileFollowersBinding fragmentProfileFollowersBinding = FragmentProfileFollowersBinding.inflate(inflater, container, false); FragmentProfileFollowersFollowingBinding fragmentProfileFollowersFollowingBinding = FragmentProfileFollowersFollowingBinding.inflate(inflater, container, false);
final SwipeRefreshLayout swipeRefresh = fragmentProfileFollowersBinding.pullToRefresh; final SwipeRefreshLayout swipeRefresh = fragmentProfileFollowersFollowingBinding.pullToRefresh;
noDataFollowers = fragmentProfileFollowersBinding.noDataFollowers; noDataFollowers = fragmentProfileFollowersFollowingBinding.noData;
mRecyclerView = fragmentProfileFollowersBinding.recyclerView; mRecyclerView = fragmentProfileFollowersFollowingBinding.recyclerView;
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(), DividerItemDecoration.VERTICAL); DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(), DividerItemDecoration.VERTICAL);
@ -77,7 +77,7 @@ public class ProfileFollowersFragment extends Fragment {
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
mRecyclerView.addItemDecoration(dividerItemDecoration); mRecyclerView.addItemDecoration(dividerItemDecoration);
mProgressBar = fragmentProfileFollowersBinding.progressBar; mProgressBar = fragmentProfileFollowersFollowingBinding.progressBar;
swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
@ -88,7 +88,7 @@ public class ProfileFollowersFragment extends Fragment {
fetchDataAsync(Authorization.get(getContext())); fetchDataAsync(Authorization.get(getContext()));
return fragmentProfileFollowersBinding.getRoot(); return fragmentProfileFollowersFollowingBinding.getRoot();
} }
private void fetchDataAsync(String instanceToken) { private void fetchDataAsync(String instanceToken) {
@ -97,7 +97,7 @@ public class ProfileFollowersFragment extends Fragment {
pfModel.getFollowersList(instanceToken, getContext()).observe(getViewLifecycleOwner(), pfListMain -> { pfModel.getFollowersList(instanceToken, getContext()).observe(getViewLifecycleOwner(), pfListMain -> {
adapter = new ProfileFollowersAdapter(getContext(), pfListMain); adapter = new MyProfileFollowersAdapter(getContext(), pfListMain);
if(adapter.getItemCount() > 0) { if(adapter.getItemCount() > 0) {
mRecyclerView.setAdapter(adapter); mRecyclerView.setAdapter(adapter);

View File

@ -16,8 +16,8 @@ import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import org.mian.gitnex.adapters.ProfileFollowingAdapter; import org.mian.gitnex.adapters.MyProfileFollowingAdapter;
import org.mian.gitnex.databinding.FragmentProfileFollowingBinding; import org.mian.gitnex.databinding.FragmentProfileFollowersFollowingBinding;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.viewmodels.ProfileFollowingViewModel; import org.mian.gitnex.viewmodels.ProfileFollowingViewModel;
@ -26,25 +26,25 @@ import org.mian.gitnex.viewmodels.ProfileFollowingViewModel;
* Author M M Arif * Author M M Arif
*/ */
public class ProfileFollowingFragment extends Fragment { public class MyProfileFollowingFragment extends Fragment {
private ProgressBar mProgressBar; private ProgressBar mProgressBar;
private ProfileFollowingAdapter adapter; private MyProfileFollowingAdapter adapter;
private RecyclerView mRecyclerView; private RecyclerView mRecyclerView;
private TextView noDataFollowing; private TextView noDataFollowing;
private static String repoNameF = "param2"; private static final String repoNameF = "param2";
private static String repoOwnerF = "param1"; private static final String repoOwnerF = "param1";
private String repoName; private String repoName;
private String repoOwner; private String repoOwner;
private OnFragmentInteractionListener mListener; private OnFragmentInteractionListener mListener;
public ProfileFollowingFragment() { public MyProfileFollowingFragment() {
} }
public static ProfileFollowingFragment newInstance(String param1, String param2) { public static MyProfileFollowingFragment newInstance(String param1, String param2) {
ProfileFollowingFragment fragment = new ProfileFollowingFragment(); MyProfileFollowingFragment fragment = new MyProfileFollowingFragment();
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putString(repoOwnerF, param1); args.putString(repoOwnerF, param1);
args.putString(repoNameF, param2); args.putString(repoNameF, param2);
@ -65,14 +65,14 @@ public class ProfileFollowingFragment extends Fragment {
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
FragmentProfileFollowingBinding fragmentProfileFollowingBinding = FragmentProfileFollowingBinding.inflate(inflater, container, false); FragmentProfileFollowersFollowingBinding fragmentProfileFollowersFollowingBinding = FragmentProfileFollowersFollowingBinding.inflate(inflater, container, false);
TinyDB tinyDb = TinyDB.getInstance(getContext()); TinyDB tinyDb = TinyDB.getInstance(getContext());
final SwipeRefreshLayout swipeRefresh = fragmentProfileFollowingBinding.pullToRefresh; final SwipeRefreshLayout swipeRefresh = fragmentProfileFollowersFollowingBinding.pullToRefresh;
noDataFollowing = fragmentProfileFollowingBinding.noDataFollowing; noDataFollowing = fragmentProfileFollowersFollowingBinding.noData;
mRecyclerView = fragmentProfileFollowingBinding.recyclerView; mRecyclerView = fragmentProfileFollowersFollowingBinding.recyclerView;
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(), DividerItemDecoration.VERTICAL); DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(), DividerItemDecoration.VERTICAL);
@ -80,7 +80,7 @@ public class ProfileFollowingFragment extends Fragment {
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
mRecyclerView.addItemDecoration(dividerItemDecoration); mRecyclerView.addItemDecoration(dividerItemDecoration);
mProgressBar = fragmentProfileFollowingBinding.progressBar; mProgressBar = fragmentProfileFollowersFollowingBinding.progressBar;
swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
@ -91,7 +91,7 @@ public class ProfileFollowingFragment extends Fragment {
fetchDataAsync(Authorization.get(getContext())); fetchDataAsync(Authorization.get(getContext()));
return fragmentProfileFollowingBinding.getRoot(); return fragmentProfileFollowersFollowingBinding.getRoot();
} }
private void fetchDataAsync(String instanceToken) { private void fetchDataAsync(String instanceToken) {
@ -100,7 +100,7 @@ public class ProfileFollowingFragment extends Fragment {
pfModel.getFollowingList(instanceToken, getContext()).observe(getViewLifecycleOwner(), pfListMain -> { pfModel.getFollowingList(instanceToken, getContext()).observe(getViewLifecycleOwner(), pfListMain -> {
adapter = new ProfileFollowingAdapter(getContext(), pfListMain); adapter = new MyProfileFollowingAdapter(getContext(), pfListMain);
if(adapter.getItemCount() > 0) { if(adapter.getItemCount() > 0) {
mRecyclerView.setAdapter(adapter); mRecyclerView.setAdapter(adapter);

View File

@ -36,7 +36,7 @@ import jp.wasabeef.picasso.transformations.BlurTransformation;
* Author M M Arif * Author M M Arif
*/ */
public class ProfileFragment extends Fragment { public class MyProfileFragment extends Fragment {
private Context ctx; private Context ctx;
@ -61,18 +61,14 @@ public class ProfileFragment extends Fragment {
TextView userLanguage = v.findViewById(R.id.userLanguage); TextView userLanguage = v.findViewById(R.id.userLanguage);
ImageView userLanguageIcon = v.findViewById(R.id.userLanguageIcon); ImageView userLanguageIcon = v.findViewById(R.id.userLanguageIcon);
ViewGroup aboutFrame = v.findViewById(R.id.aboutFrame);
String[] userLanguageCodes = tinyDb.getString("userLang").split("-"); String[] userLanguageCodes = tinyDb.getString("userLang").split("-");
if(userLanguageCodes.length >= 2) { if(userLanguageCodes.length >= 2) {
Locale locale = new Locale(userLanguageCodes[0], userLanguageCodes[1]); Locale locale = new Locale(userLanguageCodes[0], userLanguageCodes[1]);
userLanguage.setText(locale.getDisplayLanguage()); userLanguage.setText(locale.getDisplayLanguage());
} }
else { else {
userLanguage.setText(getResources().getConfiguration().locale.getDisplayLanguage());
userLanguage.setText(R.string.notSupported);
} }
userAvatar.setOnClickListener(loginId -> userAvatar.setOnClickListener(loginId ->
@ -112,7 +108,7 @@ public class ProfileFragment extends Fragment {
@Override public void onError(Exception e) {} @Override public void onError(Exception e) {}
}); });
ProfileFragment.SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager()); MyProfileFragment.SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());
ViewPager mViewPager = v.findViewById(R.id.container); ViewPager mViewPager = v.findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter); mViewPager.setAdapter(mSectionsPagerAdapter);
@ -159,7 +155,6 @@ public class ProfileFragment extends Fragment {
tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager)); tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
return v; return v;
} }
public static class SectionsPagerAdapter extends FragmentStatePagerAdapter { public static class SectionsPagerAdapter extends FragmentStatePagerAdapter {
@ -175,25 +170,23 @@ public class ProfileFragment extends Fragment {
switch (position) { switch (position) {
case 0: // followers case 0: // followers
return ProfileFollowersFragment.newInstance("repoOwner", "repoName"); return MyProfileFollowersFragment.newInstance("repoOwner", "repoName");
case 1: // following case 1: // following
return ProfileFollowingFragment.newInstance("repoOwner", "repoName"); return MyProfileFollowingFragment.newInstance("repoOwner", "repoName");
case 2: // emails case 2: // emails
return ProfileEmailsFragment.newInstance("repoOwner", "repoName"); return MyProfileEmailsFragment.newInstance("repoOwner", "repoName");
} }
return null; return null;
} }
@Override @Override
public int getCount() { public int getCount() {
return 3; return 3;
} }
} }
@Override @Override
@ -202,7 +195,6 @@ public class ProfileFragment extends Fragment {
menu.clear(); menu.clear();
requireActivity().getMenuInflater().inflate(R.menu.profile_dotted_menu, menu); requireActivity().getMenuInflater().inflate(R.menu.profile_dotted_menu, menu);
super.onCreateOptionsMenu(menu, inflater); super.onCreateOptionsMenu(menu, inflater);
} }
@Override @Override
@ -210,21 +202,18 @@ public class ProfileFragment extends Fragment {
int id = item.getItemId(); int id = item.getItemId();
switch (id) { if(id == android.R.id.home) {
((MainActivity)ctx).finish();
case android.R.id.home: return true;
((MainActivity)ctx).finish(); }
return true; else if(id == R.id.profileMenu) {
BottomSheetMyProfileFragment bottomSheet = new BottomSheetMyProfileFragment();
case R.id.profileMenu: bottomSheet.show(getChildFragmentManager(), "profileBottomSheet");
BottomSheetProfileFragment bottomSheet = new BottomSheetProfileFragment(); return true;
bottomSheet.show(getChildFragmentManager(), "profileBottomSheet"); }
return true; else {
return super.onOptionsItemSelected(item);
default: }
return super.onOptionsItemSelected(item);
}
} }
} }

View File

@ -16,6 +16,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
@ -95,12 +96,15 @@ public class NotificationsFragment extends Fragment implements NotificationsAdap
notificationsActions = new NotificationsActions(context); notificationsActions = new NotificationsActions(context);
notificationsAdapter = new NotificationsAdapter(context, notificationThreads, this, this); notificationsAdapter = new NotificationsAdapter(context, notificationThreads, this, this);
RecyclerView recyclerView = fragmentNotificationsBinding.notifications;
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
RecyclerView recyclerView = fragmentNotificationsBinding.notifications; DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL);
recyclerView.setHasFixedSize(true); recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(linearLayoutManager); recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setAdapter(notificationsAdapter); recyclerView.setAdapter(notificationsAdapter);
recyclerView.addItemDecoration(dividerItemDecoration);
recyclerView.addOnScrollListener(new InfiniteScrollListener(pageResultLimit, linearLayoutManager) { recyclerView.addOnScrollListener(new InfiniteScrollListener(pageResultLimit, linearLayoutManager) {
@Override @Override
@ -249,6 +253,10 @@ public class NotificationsFragment extends Fragment implements NotificationsAdap
if(notificationThreads.isEmpty()) { if(notificationThreads.isEmpty()) {
noDataNotifications.setVisibility(View.VISIBLE); noDataNotifications.setVisibility(View.VISIBLE);
markAllAsRead.setVisibility(View.GONE);
}
else {
markAllAsRead.setVisibility(View.VISIBLE);
} }
} }
}); });

View File

@ -29,7 +29,7 @@ import retrofit2.Callback;
public class OrganizationInfoFragment extends Fragment { public class OrganizationInfoFragment extends Fragment {
private Context ctx = getContext(); private Context ctx;
private ProgressBar mProgressBar; private ProgressBar mProgressBar;
private static String orgNameF = "param1"; private static String orgNameF = "param1";
@ -67,6 +67,8 @@ public class OrganizationInfoFragment extends Fragment {
FragmentOrganizationInfoBinding fragmentOrganizationInfoBinding = FragmentOrganizationInfoBinding.inflate(inflater, container, false); FragmentOrganizationInfoBinding fragmentOrganizationInfoBinding = FragmentOrganizationInfoBinding.inflate(inflater, container, false);
ctx = getContext();
mProgressBar = fragmentOrganizationInfoBinding.progressBar; mProgressBar = fragmentOrganizationInfoBinding.progressBar;
orgAvatar = fragmentOrganizationInfoBinding.orgAvatar; orgAvatar = fragmentOrganizationInfoBinding.orgAvatar;
TextView orgNameInfo = fragmentOrganizationInfoBinding.orgNameInfo; TextView orgNameInfo = fragmentOrganizationInfoBinding.orgNameInfo;

View File

@ -18,6 +18,7 @@ import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import org.gitnex.tea4j.models.IssueComments;
import org.gitnex.tea4j.models.Releases; import org.gitnex.tea4j.models.Releases;
import org.mian.gitnex.adapters.ReleasesAdapter; import org.mian.gitnex.adapters.ReleasesAdapter;
import org.mian.gitnex.databinding.FragmentReleasesBinding; import org.mian.gitnex.databinding.FragmentReleasesBinding;
@ -41,6 +42,7 @@ public class ReleasesFragment extends Fragment {
private String repoName; private String repoName;
private String repoOwner; private String repoOwner;
private String releaseTag;
private OnFragmentInteractionListener mListener; private OnFragmentInteractionListener mListener;
@ -63,6 +65,7 @@ public class ReleasesFragment extends Fragment {
repoName = getArguments().getString(repoNameF); repoName = getArguments().getString(repoNameF);
repoOwner = getArguments().getString(repoOwnerF); repoOwner = getArguments().getString(repoOwnerF);
} }
releaseTag = requireActivity().getIntent().getStringExtra("releaseTagName");
} }
@Override @Override
@ -137,6 +140,13 @@ public class ReleasesFragment extends Fragment {
adapter = new ReleasesAdapter(getContext(), releasesListMain); adapter = new ReleasesAdapter(getContext(), releasesListMain);
if(adapter.getItemCount() > 0) { if(adapter.getItemCount() > 0) {
mRecyclerView.setAdapter(adapter); mRecyclerView.setAdapter(adapter);
if(releasesListMain != null && releaseTag != null) {
int index = getReleaseIndex(releaseTag, releasesListMain);
releaseTag = null;
if(index != -1) {
mRecyclerView.scrollToPosition(index);
}
}
noDataReleases.setVisibility(View.GONE); noDataReleases.setVisibility(View.GONE);
} }
else { else {
@ -150,4 +160,13 @@ public class ReleasesFragment extends Fragment {
} }
private static int getReleaseIndex(String tag, List<Releases> releases) {
for (Releases release : releases) {
if(release.getTag_name().equals(tag)) {
return releases.indexOf(release);
}
}
return -1;
}
} }

View File

@ -42,6 +42,7 @@ public class RepoInfoFragment extends Fragment {
private LinearLayout pageContent; private LinearLayout pageContent;
private static final String repoNameF = "param2"; private static final String repoNameF = "param2";
private static final String repoOwnerF = "param1"; private static final String repoOwnerF = "param1";
private Locale locale;
private FragmentRepoInfoBinding binding; private FragmentRepoInfoBinding binding;
@ -74,17 +75,16 @@ public class RepoInfoFragment extends Fragment {
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
binding = FragmentRepoInfoBinding.inflate(inflater, container, false); binding = FragmentRepoInfoBinding.inflate(inflater, container, false);
TinyDB tinyDb = TinyDB.getInstance(getContext()); TinyDB tinyDb = TinyDB.getInstance(getContext());
ctx = getContext(); ctx = getContext();
locale = getResources().getConfiguration().locale;
pageContent = binding.repoInfoLayout; pageContent = binding.repoInfoLayout;
pageContent.setVisibility(View.GONE); pageContent.setVisibility(View.GONE);
binding.repoMetaFrame.setVisibility(View.GONE); binding.repoMetaFrame.setVisibility(View.GONE);
getRepoInfo(Authorization.get(getContext()), repoOwner, repoName, tinyDb.getString("locale"), tinyDb.getString("dateFormat")); getRepoInfo(Authorization.get(getContext()), repoOwner, repoName, locale, tinyDb.getString("dateFormat"));
getFileContents(Authorization.get(getContext()), repoOwner, repoName, getResources().getString(R.string.defaultFilename)); getFileContents(Authorization.get(getContext()), repoOwner, repoName, getResources().getString(R.string.defaultFilename));
if(isExpandViewVisible()) { if(isExpandViewVisible()) {
@ -173,7 +173,7 @@ public class RepoInfoFragment extends Fragment {
return binding.repoMetaFrame.getVisibility() == View.VISIBLE; return binding.repoMetaFrame.getVisibility() == View.VISIBLE;
} }
private void getRepoInfo(String token, final String owner, String repo, final String locale, final String timeFormat) { private void getRepoInfo(String token, final String owner, String repo, Locale locale, final String timeFormat) {
final TinyDB tinyDb = TinyDB.getInstance(getContext()); final TinyDB tinyDb = TinyDB.getInstance(getContext());
@ -217,12 +217,12 @@ public class RepoInfoFragment extends Fragment {
binding.repoMetaWatchers.setText(repoInfo.getWatchers_count()); binding.repoMetaWatchers.setText(repoInfo.getWatchers_count());
binding.repoMetaSize.setText(FileUtils.byteCountToDisplaySize((int) repoInfo.getSize() * 1024)); binding.repoMetaSize.setText(FileUtils.byteCountToDisplaySize((int) repoInfo.getSize() * 1024));
binding.repoMetaCreatedAt.setText(TimeHelper.formatTime(repoInfo.getCreated_at(), new Locale(locale), timeFormat, ctx)); binding.repoMetaCreatedAt.setText(TimeHelper.formatTime(repoInfo.getCreated_at(), locale, timeFormat, ctx));
if(timeFormat.equals("pretty")) { if(timeFormat.equals("pretty")) {
binding.repoMetaCreatedAt.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(repoInfo.getCreated_at()), ctx)); binding.repoMetaCreatedAt.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(repoInfo.getCreated_at()), ctx));
} }
String repoMetaUpdatedAt = TimeHelper.formatTime(repoInfo.getUpdated_at(), new Locale(locale), timeFormat, ctx); String repoMetaUpdatedAt = TimeHelper.formatTime(repoInfo.getUpdated_at(), locale, timeFormat, ctx);
String website = (repoInfo.getWebsite().isEmpty()) ? getResources().getString(R.string.noDataWebsite) : repoInfo.getWebsite(); String website = (repoInfo.getWebsite().isEmpty()) ? getResources().getString(R.string.noDataWebsite) : repoInfo.getWebsite();
binding.repoMetaWebsite.setText(website); binding.repoMetaWebsite.setText(website);

View File

@ -69,7 +69,6 @@ public class RepositoriesFragment extends Fragment {
createNewRepo = fragmentRepositoriesBinding.addNewRepo; createNewRepo = fragmentRepositoriesBinding.addNewRepo;
createNewRepo.setOnClickListener(view -> { createNewRepo.setOnClickListener(view -> {
Intent intent = new Intent(view.getContext(), CreateRepoActivity.class); Intent intent = new Intent(view.getContext(), CreateRepoActivity.class);
startActivity(intent); startActivity(intent);
}); });
@ -79,9 +78,9 @@ public class RepositoriesFragment extends Fragment {
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
if (dy > 0 && createNewRepo.isShown()) { if (dy > 0 && createNewRepo.isShown()) {
createNewRepo.setVisibility(View.GONE); createNewRepo.setVisibility(View.GONE);
} else if (dy < 0 ) { }
else if (dy < 0 ) {
createNewRepo.setVisibility(View.VISIBLE); createNewRepo.setVisibility(View.VISIBLE);
} }
} }
@ -135,7 +134,6 @@ public class RepositoriesFragment extends Fragment {
} }
mProgressBar.setVisibility(View.GONE); mProgressBar.setVisibility(View.GONE);
}); });
} }
@Override @Override
@ -147,11 +145,6 @@ public class RepositoriesFragment extends Fragment {
MenuItem searchItem = menu.findItem(R.id.action_search); MenuItem searchItem = menu.findItem(R.id.action_search);
androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) searchItem.getActionView(); androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) searchItem.getActionView();
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE); searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
//searchView.setQueryHint(getContext().getString(R.string.strFilter));
/*if(!connToInternet) {
return;
}*/
searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() { searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
@Override @Override
@ -167,7 +160,6 @@ public class RepositoriesFragment extends Fragment {
return false; return false;
} }
}); });
} }
} }

View File

@ -1,8 +1,11 @@
package org.mian.gitnex.fragments; package org.mian.gitnex.fragments;
import android.app.Dialog;
import android.content.ActivityNotFoundException; import android.content.ActivityNotFoundException;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -20,7 +23,9 @@ import org.mian.gitnex.activities.SettingsNotificationsActivity;
import org.mian.gitnex.activities.SettingsReportsActivity; import org.mian.gitnex.activities.SettingsReportsActivity;
import org.mian.gitnex.activities.SettingsSecurityActivity; import org.mian.gitnex.activities.SettingsSecurityActivity;
import org.mian.gitnex.activities.SettingsTranslationActivity; import org.mian.gitnex.activities.SettingsTranslationActivity;
import org.mian.gitnex.databinding.CustomAboutDialogBinding;
import org.mian.gitnex.databinding.FragmentSettingsBinding; import org.mian.gitnex.databinding.FragmentSettingsBinding;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Version; import org.mian.gitnex.helpers.Version;
@ -32,6 +37,7 @@ public class SettingsFragment extends Fragment {
private Context ctx; private Context ctx;
private TinyDB tinyDB; private TinyDB tinyDB;
private Dialog aboutAppDialog;
@Nullable @Nullable
@Override @Override
@ -41,6 +47,7 @@ public class SettingsFragment extends Fragment {
ctx = getContext(); ctx = getContext();
tinyDB = TinyDB.getInstance(ctx); tinyDB = TinyDB.getInstance(ctx);
aboutAppDialog = new Dialog(ctx, R.style.ThemeOverlay_MaterialComponents_Dialog_Alert);
((MainActivity) requireActivity()).setActionBarTitle(getResources().getString(R.string.navSettings)); ((MainActivity) requireActivity()).setActionBarTitle(getResources().getString(R.string.navSettings));
@ -63,37 +70,78 @@ public class SettingsFragment extends Fragment {
fragmentSettingsBinding.reportsFrame.setOnClickListener(v1 -> startActivity(new Intent(ctx, SettingsReportsActivity.class))); fragmentSettingsBinding.reportsFrame.setOnClickListener(v1 -> startActivity(new Intent(ctx, SettingsReportsActivity.class)));
fragmentSettingsBinding.rateAppFrame.setOnClickListener(aboutApp -> rateThisApp()); fragmentSettingsBinding.rateAppFrame.setOnClickListener(rateApp -> rateThisApp());
fragmentSettingsBinding.aboutAppFrame.setOnClickListener(aboutApp -> requireActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new AboutFragment()).commit()); fragmentSettingsBinding.aboutAppFrame.setOnClickListener(aboutApp -> showAboutAppDialog());
return fragmentSettingsBinding.getRoot(); return fragmentSettingsBinding.getRoot();
}
public void showAboutAppDialog() {
if (aboutAppDialog.getWindow() != null) {
aboutAppDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
CustomAboutDialogBinding aboutAppDialogBinding = CustomAboutDialogBinding.inflate(LayoutInflater.from(ctx));
View view = aboutAppDialogBinding.getRoot();
aboutAppDialog.setContentView(view);
aboutAppDialogBinding.appVersionBuild.setText(getString(R.string.appVersionBuild, AppUtil.getAppVersion(ctx), AppUtil.getAppBuildNo(ctx)));
aboutAppDialogBinding.userServerVersion.setText(tinyDB.getString("giteaVersion"));
aboutAppDialogBinding.donationLinkPatreon.setOnClickListener(v12 -> {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse(getResources().getString(R.string.supportLinkPatreon)));
startActivity(intent);
});
aboutAppDialogBinding.translateLink.setOnClickListener(v13 -> {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse(getResources().getString(R.string.crowdInLink)));
startActivity(intent);
});
aboutAppDialogBinding.appWebsite.setOnClickListener(v14 -> {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse(getResources().getString(R.string.appWebsiteLink)));
startActivity(intent);
});
if(AppUtil.isPro(requireContext())) {
aboutAppDialogBinding.supportHeader.setVisibility(View.GONE);
aboutAppDialogBinding.dividerSupport.setVisibility(View.GONE);
aboutAppDialogBinding.donationLinkPatreon.setVisibility(View.GONE);
}
aboutAppDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
aboutAppDialog.show();
} }
public void rateThisApp() { public void rateThisApp() {
try { try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + requireActivity().getPackageName()))); startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + requireActivity().getPackageName())));
} }
catch(ActivityNotFoundException e) { catch(ActivityNotFoundException e) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + requireActivity().getPackageName()))); startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + requireActivity().getPackageName())));
} }
} }
@Override @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
if(tinyDB.getBoolean("refreshParent")) { if(tinyDB.getBoolean("refreshParent")) {
requireActivity().recreate(); requireActivity().recreate();
requireActivity().overridePendingTransition(0, 0); requireActivity().overridePendingTransition(0, 0);
tinyDB.putBoolean("refreshParent", false); tinyDB.putBoolean("refreshParent", false);
} }
} }
} }

View File

@ -0,0 +1,160 @@
package org.mian.gitnex.fragments.profile;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.FragmentProfileDetailBinding;
import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.ClickListener;
import org.mian.gitnex.helpers.ColorInverter;
import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty;
import java.util.Locale;
import jp.wasabeef.picasso.transformations.BlurTransformation;
import retrofit2.Call;
import retrofit2.Callback;
/**
* Author M M Arif
*/
public class DetailFragment extends Fragment {
private Context context;
private FragmentProfileDetailBinding binding;
Locale locale;
TinyDB tinyDb;
private static final String usernameBundle = "";
private String username;
public DetailFragment() {}
public static DetailFragment newInstance(String username) {
DetailFragment fragment = new DetailFragment();
Bundle args = new Bundle();
args.putString(usernameBundle, username);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
username = getArguments().getString(usernameBundle);
}
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
binding = FragmentProfileDetailBinding.inflate(inflater, container, false);
context = getContext();
tinyDb = TinyDB.getInstance(context);
locale = getResources().getConfiguration().locale;
getProfileDetail(username);
return binding.getRoot();
}
public void getProfileDetail(String username) {
Call<UserInfo> call = RetrofitClient
.getApiInterface(context)
.getUserProfile(Authorization.get(context), username);
call.enqueue(new Callback<UserInfo>() {
@Override
public void onResponse(@NonNull Call<UserInfo> call, @NonNull retrofit2.Response<UserInfo> response) {
if(response.isSuccessful() && response.body() != null) {
switch(response.code()) {
case 200:
String username = !response.body().getFullname().isEmpty() ? response.body().getFullname() : response.body().getUsername();
String email = !response.body().getEmail().isEmpty() ? response.body().getEmail() : "";
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
String timeFormat = tinyDb.getString("dateFormat");
binding.userFullName.setText(username);
binding.userLogin.setText(getString(R.string.usernameWithAt, response.body().getLogin()));
binding.userEmail.setText(email);
String[] userLanguageCodes = response.body().getLang().split("-");
if(userLanguageCodes.length >= 2) {
Locale locale = new Locale(userLanguageCodes[0], userLanguageCodes[1]);
binding.userLang.setText(locale.getDisplayLanguage());
}
else {
binding.userLang.setText(locale.getDisplayLanguage());
}
PicassoService.getInstance(context).get()
.load(response.body().getAvatar())
.transform(new RoundedTransformation(imgRadius, 0))
.placeholder(R.drawable.loader_animated)
.resize(120, 120)
.centerCrop()
.into(binding.userAvatar);
PicassoService.getInstance(context).get()
.load(response.body().getAvatar())
.transform(new BlurTransformation(context))
.into(binding.userAvatarBackground, new com.squareup.picasso.Callback() {
@Override
public void onSuccess() {
int invertedColor = new ColorInverter().getImageViewContrastColor(binding.userAvatarBackground);
binding.userFullName.setTextColor(invertedColor);
binding.userLogin.setTextColor(invertedColor);
}
@Override public void onError(Exception e) {}
});
binding.userJoinedOn.setText(TimeHelper.formatTime(response.body().getCreated(), locale, timeFormat, context));
if(timeFormat.equals("pretty")) {
binding.userJoinedOn.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(response.body().getCreated()), context));
}
break;
case 401:
AlertDialogs
.authorizationTokenRevokedDialog(context, context.getResources().getString(R.string.alertDialogTokenRevokedTitle), context.getResources().getString(R.string.alertDialogTokenRevokedMessage), context.getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), context.getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
break;
case 403:
Toasty.error(context, context.getString(R.string.authorizeError));
break;
default:
Toasty.error(context, getString(R.string.genericError));
break;
}
}
}
@Override
public void onFailure(@NonNull Call<UserInfo> call, @NonNull Throwable t) {
Toasty.error(context, context.getResources().getString(R.string.genericError));
}
});
}
}

View File

@ -0,0 +1,272 @@
package org.mian.gitnex.fragments.profile;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R;
import org.mian.gitnex.adapters.profile.FollowersAdapter;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.FragmentProfileFollowersFollowingBinding;
import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.SnackBar;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
/**
* Author M M Arif
*/
public class FollowersFragment extends Fragment {
private Context context;
private FragmentProfileFollowersFollowingBinding fragmentProfileFollowersFollowingBinding;
private List<UserInfo> usersList;
private FollowersAdapter adapter;
private int pageSize;
private int resultLimit = Constants.resultLimitOldGiteaInstances;
private static final String usernameBundle = "";
private String username;
public FollowersFragment() {}
public static FollowersFragment newInstance(String username) {
FollowersFragment fragment = new FollowersFragment();
Bundle args = new Bundle();
args.putString(usernameBundle, username);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
username = getArguments().getString(usernameBundle);
}
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
fragmentProfileFollowersFollowingBinding = FragmentProfileFollowersFollowingBinding.inflate(inflater, container, false);
setHasOptionsMenu(true);
context = getContext();
TinyDB tinyDb = TinyDB.getInstance(context);
// if gitea is 1.12 or higher use the new limit
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) {
resultLimit = Constants.resultLimitNewGiteaInstances;
}
usersList = new ArrayList<>();
fragmentProfileFollowersFollowingBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
fragmentProfileFollowersFollowingBinding.pullToRefresh.setRefreshing(false);
loadInitial(Authorization.get(context), username, resultLimit);
adapter.notifyDataChanged();
}, 200));
adapter = new FollowersAdapter(context, usersList);
adapter.setLoadMoreListener(() -> fragmentProfileFollowersFollowingBinding.recyclerView.post(() -> {
if(usersList.size() == resultLimit || pageSize == resultLimit) {
int page = (usersList.size() + resultLimit) / resultLimit;
loadMore(Authorization.get(context), username, page, resultLimit);
}
}));
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(context, DividerItemDecoration.VERTICAL);
fragmentProfileFollowersFollowingBinding.recyclerView.setHasFixedSize(true);
fragmentProfileFollowersFollowingBinding.recyclerView.addItemDecoration(dividerItemDecoration);
fragmentProfileFollowersFollowingBinding.recyclerView.setLayoutManager(new LinearLayoutManager(context));
fragmentProfileFollowersFollowingBinding.recyclerView.setAdapter(adapter);
loadInitial(Authorization.get(context), username, resultLimit);
return fragmentProfileFollowersFollowingBinding.getRoot();
}
private void loadInitial(String token, String username, int resultLimit) {
Call<List<UserInfo>> call = RetrofitClient
.getApiInterface(context)
.getUserFollowers(token, username, 1, resultLimit);
call.enqueue(new Callback<List<UserInfo>>() {
@Override
public void onResponse(@NonNull Call<List<UserInfo>> call, @NonNull Response<List<UserInfo>> response) {
if(response.isSuccessful()) {
switch(response.code()) {
case 200:
assert response.body() != null;
if(response.body().size() > 0) {
usersList.clear();
usersList.addAll(response.body());
adapter.notifyDataChanged();
fragmentProfileFollowersFollowingBinding.noData.setVisibility(View.GONE);
}
else {
usersList.clear();
adapter.notifyDataChanged();
fragmentProfileFollowersFollowingBinding.noData.setVisibility(View.VISIBLE);
}
fragmentProfileFollowersFollowingBinding.progressBar.setVisibility(View.GONE);
break;
case 401:
AlertDialogs.authorizationTokenRevokedDialog(context, getResources().getString(R.string.alertDialogTokenRevokedTitle),
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
break;
case 403:
Toasty.error(context, context.getString(R.string.authorizeError));
break;
case 404:
fragmentProfileFollowersFollowingBinding.noData.setVisibility(View.VISIBLE);
fragmentProfileFollowersFollowingBinding.progressBar.setVisibility(View.GONE);
break;
default:
Toasty.error(context, getString(R.string.genericError));
break;
}
}
}
@Override
public void onFailure(@NonNull Call<List<UserInfo>> call, @NonNull Throwable t) {
Toasty.error(context, getString(R.string.genericError));
}
});
}
private void loadMore(String token, String username, int page, int resultLimit) {
fragmentProfileFollowersFollowingBinding.progressLoadMore.setVisibility(View.VISIBLE);
Call<List<UserInfo>> call = RetrofitClient
.getApiInterface(context)
.getUserFollowers(token, username, page, resultLimit);
call.enqueue(new Callback<List<UserInfo>>() {
@Override
public void onResponse(@NonNull Call<List<UserInfo>> call, @NonNull Response<List<UserInfo>> response) {
if(response.isSuccessful()) {
switch(response.code()) {
case 200:
List<UserInfo> result = response.body();
assert result != null;
if(result.size() > 0) {
pageSize = result.size();
usersList.addAll(result);
}
else {
SnackBar.info(context, fragmentProfileFollowersFollowingBinding.getRoot(), getString(R.string.noMoreData));
adapter.setMoreDataAvailable(false);
}
adapter.notifyDataChanged();
fragmentProfileFollowersFollowingBinding.progressLoadMore.setVisibility(View.GONE);
break;
case 401:
AlertDialogs.authorizationTokenRevokedDialog(context, getResources().getString(R.string.alertDialogTokenRevokedTitle),
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
break;
case 403:
Toasty.error(context, context.getString(R.string.authorizeError));
break;
case 404:
fragmentProfileFollowersFollowingBinding.noData.setVisibility(View.VISIBLE);
fragmentProfileFollowersFollowingBinding.progressBar.setVisibility(View.GONE);
break;
default:
Toasty.error(context, getString(R.string.genericError));
break;
}
}
}
@Override
public void onFailure(@NonNull Call<List<UserInfo>> call, @NonNull Throwable t) {
Toasty.error(context, getString(R.string.genericError));
}
});
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
inflater.inflate(R.menu.search_menu, menu);
super.onCreateOptionsMenu(menu, inflater);
MenuItem searchItem = menu.findItem(R.id.action_search);
androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) searchItem.getActionView();
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
filter(newText);
return false;
}
});
}
private void filter(String text) {
List<UserInfo> arr = new ArrayList<>();
for(UserInfo d : usersList) {
if(d == null || d.getUsername() == null || d.getFullname() == null) {
continue;
}
if(d.getUsername().toLowerCase().contains(text) || d.getFullname().toLowerCase().contains(text)) {
arr.add(d);
}
}
adapter.updateList(arr);
}
}

View File

@ -0,0 +1,273 @@
package org.mian.gitnex.fragments.profile;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R;
import org.mian.gitnex.adapters.profile.FollowersAdapter;
import org.mian.gitnex.adapters.profile.FollowingAdapter;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.FragmentProfileFollowersFollowingBinding;
import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.SnackBar;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
/**
* Author M M Arif
*/
public class FollowingFragment extends Fragment {
private Context context;
private FragmentProfileFollowersFollowingBinding fragmentProfileFollowersFollowingBinding;
private List<UserInfo> usersList;
private FollowingAdapter adapter;
private int pageSize;
private int resultLimit = Constants.resultLimitOldGiteaInstances;
private static final String usernameBundle = "";
private String username;
public FollowingFragment() {}
public static FollowingFragment newInstance(String username) {
FollowingFragment fragment = new FollowingFragment();
Bundle args = new Bundle();
args.putString(usernameBundle, username);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
username = getArguments().getString(usernameBundle);
}
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
fragmentProfileFollowersFollowingBinding = FragmentProfileFollowersFollowingBinding.inflate(inflater, container, false);
setHasOptionsMenu(true);
context = getContext();
TinyDB tinyDb = TinyDB.getInstance(context);
// if gitea is 1.12 or higher use the new limit
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) {
resultLimit = Constants.resultLimitNewGiteaInstances;
}
usersList = new ArrayList<>();
fragmentProfileFollowersFollowingBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
fragmentProfileFollowersFollowingBinding.pullToRefresh.setRefreshing(false);
loadInitial(Authorization.get(context), username, resultLimit);
adapter.notifyDataChanged();
}, 200));
adapter = new FollowingAdapter(context, usersList);
adapter.setLoadMoreListener(() -> fragmentProfileFollowersFollowingBinding.recyclerView.post(() -> {
if(usersList.size() == resultLimit || pageSize == resultLimit) {
int page = (usersList.size() + resultLimit) / resultLimit;
loadMore(Authorization.get(context), username, page, resultLimit);
}
}));
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(context, DividerItemDecoration.VERTICAL);
fragmentProfileFollowersFollowingBinding.recyclerView.setHasFixedSize(true);
fragmentProfileFollowersFollowingBinding.recyclerView.addItemDecoration(dividerItemDecoration);
fragmentProfileFollowersFollowingBinding.recyclerView.setLayoutManager(new LinearLayoutManager(context));
fragmentProfileFollowersFollowingBinding.recyclerView.setAdapter(adapter);
loadInitial(Authorization.get(context), username, resultLimit);
return fragmentProfileFollowersFollowingBinding.getRoot();
}
private void loadInitial(String token, String username, int resultLimit) {
Call<List<UserInfo>> call = RetrofitClient
.getApiInterface(context)
.getUserFollowing(token, username, 1, resultLimit);
call.enqueue(new Callback<List<UserInfo>>() {
@Override
public void onResponse(@NonNull Call<List<UserInfo>> call, @NonNull Response<List<UserInfo>> response) {
if(response.isSuccessful()) {
switch(response.code()) {
case 200:
assert response.body() != null;
if(response.body().size() > 0) {
usersList.clear();
usersList.addAll(response.body());
adapter.notifyDataChanged();
fragmentProfileFollowersFollowingBinding.noData.setVisibility(View.GONE);
}
else {
usersList.clear();
adapter.notifyDataChanged();
fragmentProfileFollowersFollowingBinding.noData.setVisibility(View.VISIBLE);
}
fragmentProfileFollowersFollowingBinding.progressBar.setVisibility(View.GONE);
break;
case 401:
AlertDialogs.authorizationTokenRevokedDialog(context, getResources().getString(R.string.alertDialogTokenRevokedTitle),
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
break;
case 403:
Toasty.error(context, context.getString(R.string.authorizeError));
break;
case 404:
fragmentProfileFollowersFollowingBinding.noData.setVisibility(View.VISIBLE);
fragmentProfileFollowersFollowingBinding.progressBar.setVisibility(View.GONE);
break;
default:
Toasty.error(context, getString(R.string.genericError));
break;
}
}
}
@Override
public void onFailure(@NonNull Call<List<UserInfo>> call, @NonNull Throwable t) {
Toasty.error(context, getString(R.string.genericError));
}
});
}
private void loadMore(String token, String username, int page, int resultLimit) {
fragmentProfileFollowersFollowingBinding.progressLoadMore.setVisibility(View.VISIBLE);
Call<List<UserInfo>> call = RetrofitClient
.getApiInterface(context)
.getUserFollowing(token, username, page, resultLimit);
call.enqueue(new Callback<List<UserInfo>>() {
@Override
public void onResponse(@NonNull Call<List<UserInfo>> call, @NonNull Response<List<UserInfo>> response) {
if(response.isSuccessful()) {
switch(response.code()) {
case 200:
List<UserInfo> result = response.body();
assert result != null;
if(result.size() > 0) {
pageSize = result.size();
usersList.addAll(result);
}
else {
SnackBar.info(context, fragmentProfileFollowersFollowingBinding.getRoot(), getString(R.string.noMoreData));
adapter.setMoreDataAvailable(false);
}
adapter.notifyDataChanged();
fragmentProfileFollowersFollowingBinding.progressLoadMore.setVisibility(View.GONE);
break;
case 401:
AlertDialogs.authorizationTokenRevokedDialog(context, getResources().getString(R.string.alertDialogTokenRevokedTitle),
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
break;
case 403:
Toasty.error(context, context.getString(R.string.authorizeError));
break;
case 404:
fragmentProfileFollowersFollowingBinding.noData.setVisibility(View.VISIBLE);
fragmentProfileFollowersFollowingBinding.progressBar.setVisibility(View.GONE);
break;
default:
Toasty.error(context, getString(R.string.genericError));
break;
}
}
}
@Override
public void onFailure(@NonNull Call<List<UserInfo>> call, @NonNull Throwable t) {
Toasty.error(context, getString(R.string.genericError));
}
});
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
inflater.inflate(R.menu.search_menu, menu);
super.onCreateOptionsMenu(menu, inflater);
MenuItem searchItem = menu.findItem(R.id.action_search);
androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) searchItem.getActionView();
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
filter(newText);
return false;
}
});
}
private void filter(String text) {
List<UserInfo> arr = new ArrayList<>();
for(UserInfo d : usersList) {
if(d == null || d.getUsername() == null || d.getFullname() == null) {
continue;
}
if(d.getUsername().toLowerCase().contains(text) || d.getFullname().toLowerCase().contains(text)) {
arr.add(d);
}
}
adapter.updateList(arr);
}
}

View File

@ -0,0 +1,274 @@
package org.mian.gitnex.fragments.profile;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import org.gitnex.tea4j.models.UserOrganizations;
import org.mian.gitnex.R;
import org.mian.gitnex.adapters.profile.OrganizationsAdapter;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.FragmentOrganizationsBinding;
import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.SnackBar;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
/**
* Author M M Arif
*/
public class OrganizationsFragment extends Fragment {
private Context context;
private FragmentOrganizationsBinding fragmentOrganizationsBinding;
private List<UserOrganizations> organizationsList;
private OrganizationsAdapter adapter;
private int pageSize;
private int resultLimit = Constants.resultLimitOldGiteaInstances;
private static final String usernameBundle = "";
private String username;
public OrganizationsFragment() {}
public static OrganizationsFragment newInstance(String username) {
OrganizationsFragment fragment = new OrganizationsFragment();
Bundle args = new Bundle();
args.putString(usernameBundle, username);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
username = getArguments().getString(usernameBundle);
}
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
fragmentOrganizationsBinding = FragmentOrganizationsBinding.inflate(inflater, container, false);
setHasOptionsMenu(true);
context = getContext();
TinyDB tinyDb = TinyDB.getInstance(context);
// if gitea is 1.12 or higher use the new limit
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) {
resultLimit = Constants.resultLimitNewGiteaInstances;
}
organizationsList = new ArrayList<>();
fragmentOrganizationsBinding.addNewOrganization.setVisibility(View.GONE);
fragmentOrganizationsBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
fragmentOrganizationsBinding.pullToRefresh.setRefreshing(false);
loadInitial(Authorization.get(context), username, resultLimit);
adapter.notifyDataChanged();
}, 200));
adapter = new OrganizationsAdapter(context, organizationsList);
adapter.setLoadMoreListener(() -> fragmentOrganizationsBinding.recyclerView.post(() -> {
if(organizationsList.size() == resultLimit || pageSize == resultLimit) {
int page = (organizationsList.size() + resultLimit) / resultLimit;
loadMore(Authorization.get(context), username, page, resultLimit);
}
}));
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(context, DividerItemDecoration.VERTICAL);
fragmentOrganizationsBinding.recyclerView.setHasFixedSize(true);
fragmentOrganizationsBinding.recyclerView.addItemDecoration(dividerItemDecoration);
fragmentOrganizationsBinding.recyclerView.setLayoutManager(new LinearLayoutManager(context));
fragmentOrganizationsBinding.recyclerView.setAdapter(adapter);
loadInitial(Authorization.get(context), username, resultLimit);
return fragmentOrganizationsBinding.getRoot();
}
private void loadInitial(String token, String username, int resultLimit) {
Call<List<UserOrganizations>> call = RetrofitClient
.getApiInterface(context)
.getUserProfileOrganizations(token, username, 1, resultLimit);
call.enqueue(new Callback<List<UserOrganizations>>() {
@Override
public void onResponse(@NonNull Call<List<UserOrganizations>> call, @NonNull Response<List<UserOrganizations>> response) {
if(response.isSuccessful()) {
switch(response.code()) {
case 200:
assert response.body() != null;
if(response.body().size() > 0) {
organizationsList.clear();
organizationsList.addAll(response.body());
adapter.notifyDataChanged();
fragmentOrganizationsBinding.noDataOrg.setVisibility(View.GONE);
}
else {
organizationsList.clear();
adapter.notifyDataChanged();
fragmentOrganizationsBinding.noDataOrg.setVisibility(View.VISIBLE);
}
fragmentOrganizationsBinding.progressBar.setVisibility(View.GONE);
break;
case 401:
AlertDialogs.authorizationTokenRevokedDialog(context, getResources().getString(R.string.alertDialogTokenRevokedTitle),
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
break;
case 403:
Toasty.error(context, context.getString(R.string.authorizeError));
break;
case 404:
fragmentOrganizationsBinding.noDataOrg.setVisibility(View.VISIBLE);
fragmentOrganizationsBinding.progressBar.setVisibility(View.GONE);
break;
default:
Toasty.error(context, getString(R.string.genericError));
break;
}
}
}
@Override
public void onFailure(@NonNull Call<List<UserOrganizations>> call, @NonNull Throwable t) {
Toasty.error(context, getString(R.string.genericError));
}
});
}
private void loadMore(String token, String username, int page, int resultLimit) {
fragmentOrganizationsBinding.progressLoadMore.setVisibility(View.VISIBLE);
Call<List<UserOrganizations>> call = RetrofitClient
.getApiInterface(context)
.getUserProfileOrganizations(token, username, page, resultLimit);
call.enqueue(new Callback<List<UserOrganizations>>() {
@Override
public void onResponse(@NonNull Call<List<UserOrganizations>> call, @NonNull Response<List<UserOrganizations>> response) {
if(response.isSuccessful()) {
switch(response.code()) {
case 200:
List<UserOrganizations> result = response.body();
assert result != null;
if(result.size() > 0) {
pageSize = result.size();
organizationsList.addAll(result);
}
else {
SnackBar.info(context, fragmentOrganizationsBinding.getRoot(), getString(R.string.noMoreData));
adapter.setMoreDataAvailable(false);
}
adapter.notifyDataChanged();
fragmentOrganizationsBinding.progressLoadMore.setVisibility(View.GONE);
break;
case 401:
AlertDialogs.authorizationTokenRevokedDialog(context, getResources().getString(R.string.alertDialogTokenRevokedTitle),
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
break;
case 403:
Toasty.error(context, context.getString(R.string.authorizeError));
break;
case 404:
fragmentOrganizationsBinding.noDataOrg.setVisibility(View.VISIBLE);
fragmentOrganizationsBinding.progressBar.setVisibility(View.GONE);
break;
default:
Toasty.error(context, getString(R.string.genericError));
break;
}
}
}
@Override
public void onFailure(@NonNull Call<List<UserOrganizations>> call, @NonNull Throwable t) {
Toasty.error(context, getString(R.string.genericError));
}
});
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
inflater.inflate(R.menu.search_menu, menu);
super.onCreateOptionsMenu(menu, inflater);
MenuItem searchItem = menu.findItem(R.id.action_search);
androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) searchItem.getActionView();
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
filter(newText);
return false;
}
});
}
private void filter(String text) {
List<UserOrganizations> arr = new ArrayList<>();
for(UserOrganizations d : organizationsList) {
if(d == null || d.getUsername() == null || d.getDescription() == null) {
continue;
}
if(d.getUsername().toLowerCase().contains(text) || d.getDescription().toLowerCase().contains(text)) {
arr.add(d);
}
}
adapter.updateList(arr);
}
}

View File

@ -0,0 +1,271 @@
package org.mian.gitnex.fragments.profile;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import org.gitnex.tea4j.models.UserRepositories;
import org.mian.gitnex.R;
import org.mian.gitnex.adapters.profile.RepositoriesAdapter;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.FragmentRepositoriesBinding;
import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.SnackBar;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
/**
* Author M M Arif
*/
public class RepositoriesFragment extends Fragment {
private Context context;
private FragmentRepositoriesBinding fragmentRepositoriesBinding;
private List<UserRepositories> reposList;
private RepositoriesAdapter adapter;
private int pageSize;
private int resultLimit = Constants.resultLimitOldGiteaInstances;
private static final String usernameBundle = "";
private String username;
public RepositoriesFragment() {}
public static RepositoriesFragment newInstance(String username) {
RepositoriesFragment fragment = new RepositoriesFragment();
Bundle args = new Bundle();
args.putString(usernameBundle, username);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
username = getArguments().getString(usernameBundle);
}
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
fragmentRepositoriesBinding = FragmentRepositoriesBinding.inflate(inflater, container, false);
setHasOptionsMenu(true);
context = getContext();
TinyDB tinyDb = TinyDB.getInstance(context);
// if gitea is 1.12 or higher use the new limit
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) {
resultLimit = Constants.resultLimitNewGiteaInstances;
}
reposList = new ArrayList<>();
fragmentRepositoriesBinding.addNewRepo.setVisibility(View.GONE);
fragmentRepositoriesBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
fragmentRepositoriesBinding.pullToRefresh.setRefreshing(false);
loadInitial(Authorization.get(context), username, resultLimit);
adapter.notifyDataChanged();
}, 200));
adapter = new RepositoriesAdapter(context, reposList);
adapter.setLoadMoreListener(() -> fragmentRepositoriesBinding.recyclerView.post(() -> {
if(reposList.size() == resultLimit || pageSize == resultLimit) {
int page = (reposList.size() + resultLimit) / resultLimit;
loadMore(Authorization.get(context), username, page, resultLimit);
}
}));
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(context, DividerItemDecoration.VERTICAL);
fragmentRepositoriesBinding.recyclerView.setHasFixedSize(true);
fragmentRepositoriesBinding.recyclerView.addItemDecoration(dividerItemDecoration);
fragmentRepositoriesBinding.recyclerView.setLayoutManager(new LinearLayoutManager(context));
fragmentRepositoriesBinding.recyclerView.setAdapter(adapter);
loadInitial(Authorization.get(context), username, resultLimit);
return fragmentRepositoriesBinding.getRoot();
}
private void loadInitial(String token, String username, int resultLimit) {
Call<List<UserRepositories>> call = RetrofitClient
.getApiInterface(context).getUserProfileRepositories(token, username, 1, resultLimit);
call.enqueue(new Callback<List<UserRepositories>>() {
@Override
public void onResponse(@NonNull Call<List<UserRepositories>> call, @NonNull Response<List<UserRepositories>> response) {
if(response.isSuccessful()) {
switch(response.code()) {
case 200:
assert response.body() != null;
if(response.body().size() > 0) {
reposList.clear();
reposList.addAll(response.body());
adapter.notifyDataChanged();
fragmentRepositoriesBinding.noData.setVisibility(View.GONE);
}
else {
reposList.clear();
adapter.notifyDataChanged();
fragmentRepositoriesBinding.noData.setVisibility(View.VISIBLE);
}
fragmentRepositoriesBinding.progressBar.setVisibility(View.GONE);
break;
case 401:
AlertDialogs.authorizationTokenRevokedDialog(context, getResources().getString(R.string.alertDialogTokenRevokedTitle),
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
break;
case 403:
Toasty.error(context, context.getString(R.string.authorizeError));
break;
case 404:
fragmentRepositoriesBinding.noData.setVisibility(View.VISIBLE);
fragmentRepositoriesBinding.progressBar.setVisibility(View.GONE);
break;
default:
Toasty.error(context, getString(R.string.genericError));
break;
}
}
}
@Override
public void onFailure(@NonNull Call<List<UserRepositories>> call, @NonNull Throwable t) {
Toasty.error(context, getString(R.string.genericError));
}
});
}
private void loadMore(String token, String username, int page, int resultLimit) {
fragmentRepositoriesBinding.progressLoadMore.setVisibility(View.VISIBLE);
Call<List<UserRepositories>> call = RetrofitClient.getApiInterface(context).getUserProfileRepositories(token, username, page, resultLimit);
call.enqueue(new Callback<List<UserRepositories>>() {
@Override
public void onResponse(@NonNull Call<List<UserRepositories>> call, @NonNull Response<List<UserRepositories>> response) {
if(response.isSuccessful()) {
switch(response.code()) {
case 200:
List<UserRepositories> result = response.body();
assert result != null;
if(result.size() > 0) {
pageSize = result.size();
reposList.addAll(result);
}
else {
SnackBar.info(context, fragmentRepositoriesBinding.getRoot(), getString(R.string.noMoreData));
adapter.setMoreDataAvailable(false);
}
adapter.notifyDataChanged();
fragmentRepositoriesBinding.progressLoadMore.setVisibility(View.GONE);
break;
case 401:
AlertDialogs.authorizationTokenRevokedDialog(context, getResources().getString(R.string.alertDialogTokenRevokedTitle),
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
break;
case 403:
Toasty.error(context, context.getString(R.string.authorizeError));
break;
case 404:
fragmentRepositoriesBinding.noData.setVisibility(View.VISIBLE);
fragmentRepositoriesBinding.progressBar.setVisibility(View.GONE);
break;
default:
Toasty.error(context, getString(R.string.genericError));
break;
}
}
}
@Override
public void onFailure(@NonNull Call<List<UserRepositories>> call, @NonNull Throwable t) {
Toasty.error(context, getString(R.string.genericError));
}
});
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
inflater.inflate(R.menu.search_menu, menu);
super.onCreateOptionsMenu(menu, inflater);
MenuItem searchItem = menu.findItem(R.id.action_search);
androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) searchItem.getActionView();
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
filter(newText);
return false;
}
});
}
private void filter(String text) {
List<UserRepositories> arr = new ArrayList<>();
for(UserRepositories d : reposList) {
if(d == null || d.getFullName() == null || d.getDescription() == null) {
continue;
}
if(d.getFullName().toLowerCase().contains(text) || d.getDescription().toLowerCase().contains(text)) {
arr.add(d);
}
}
adapter.updateList(arr);
}
}

View File

@ -0,0 +1,273 @@
package org.mian.gitnex.fragments.profile;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import org.gitnex.tea4j.models.UserRepositories;
import org.mian.gitnex.R;
import org.mian.gitnex.adapters.profile.StarredRepositoriesAdapter;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.FragmentRepositoriesBinding;
import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.SnackBar;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
/**
* Author M M Arif
*/
public class StarredRepositoriesFragment extends Fragment {
private Context context;
private FragmentRepositoriesBinding fragmentRepositoriesBinding;
private List<UserRepositories> reposList;
private StarredRepositoriesAdapter adapter;
private int pageSize;
private int resultLimit = Constants.resultLimitOldGiteaInstances;
private static final String usernameBundle = "";
private String username;
public StarredRepositoriesFragment() {}
public static StarredRepositoriesFragment newInstance(String username) {
StarredRepositoriesFragment fragment = new StarredRepositoriesFragment();
Bundle args = new Bundle();
args.putString(usernameBundle, username);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
username = getArguments().getString(usernameBundle);
}
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
fragmentRepositoriesBinding = org.mian.gitnex.databinding.FragmentRepositoriesBinding.inflate(inflater, container, false);
setHasOptionsMenu(true);
context = getContext();
TinyDB tinyDb = TinyDB.getInstance(context);
// if gitea is 1.12 or higher use the new limit
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) {
resultLimit = Constants.resultLimitNewGiteaInstances;
}
reposList = new ArrayList<>();
fragmentRepositoriesBinding.addNewRepo.setVisibility(View.GONE);
fragmentRepositoriesBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
fragmentRepositoriesBinding.pullToRefresh.setRefreshing(false);
loadInitial(Authorization.get(context), username, resultLimit);
adapter.notifyDataChanged();
}, 200));
adapter = new StarredRepositoriesAdapter(context, reposList);
adapter.setLoadMoreListener(() -> fragmentRepositoriesBinding.recyclerView.post(() -> {
if(reposList.size() == resultLimit || pageSize == resultLimit) {
int page = (reposList.size() + resultLimit) / resultLimit;
loadMore(Authorization.get(context), username, page, resultLimit);
}
}));
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(context, DividerItemDecoration.VERTICAL);
fragmentRepositoriesBinding.recyclerView.setHasFixedSize(true);
fragmentRepositoriesBinding.recyclerView.addItemDecoration(dividerItemDecoration);
fragmentRepositoriesBinding.recyclerView.setLayoutManager(new LinearLayoutManager(context));
fragmentRepositoriesBinding.recyclerView.setAdapter(adapter);
loadInitial(Authorization.get(context), username, resultLimit);
return fragmentRepositoriesBinding.getRoot();
}
private void loadInitial(String token, String username, int resultLimit) {
Call<List<UserRepositories>> call = RetrofitClient
.getApiInterface(context)
.getUserProfileStarredRepositories(token, username, 1, resultLimit);
call.enqueue(new Callback<List<UserRepositories>>() {
@Override
public void onResponse(@NonNull Call<List<UserRepositories>> call, @NonNull Response<List<UserRepositories>> response) {
if(response.isSuccessful()) {
switch(response.code()) {
case 200:
assert response.body() != null;
if(response.body().size() > 0) {
reposList.clear();
reposList.addAll(response.body());
adapter.notifyDataChanged();
fragmentRepositoriesBinding.noData.setVisibility(View.GONE);
}
else {
reposList.clear();
adapter.notifyDataChanged();
fragmentRepositoriesBinding.noData.setVisibility(View.VISIBLE);
}
fragmentRepositoriesBinding.progressBar.setVisibility(View.GONE);
break;
case 401:
AlertDialogs.authorizationTokenRevokedDialog(context, getResources().getString(R.string.alertDialogTokenRevokedTitle),
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
break;
case 403:
Toasty.error(context, context.getString(R.string.authorizeError));
break;
case 404:
fragmentRepositoriesBinding.noData.setVisibility(View.VISIBLE);
fragmentRepositoriesBinding.progressBar.setVisibility(View.GONE);
break;
default:
Toasty.error(context, getString(R.string.genericError));
break;
}
}
}
@Override
public void onFailure(@NonNull Call<List<UserRepositories>> call, @NonNull Throwable t) {
Toasty.error(context, getString(R.string.genericError));
}
});
}
private void loadMore(String token, String username, int page, int resultLimit) {
fragmentRepositoriesBinding.progressLoadMore.setVisibility(View.VISIBLE);
Call<List<UserRepositories>> call = RetrofitClient
.getApiInterface(context)
.getUserProfileStarredRepositories(token, username, page, resultLimit);
call.enqueue(new Callback<List<UserRepositories>>() {
@Override
public void onResponse(@NonNull Call<List<UserRepositories>> call, @NonNull Response<List<UserRepositories>> response) {
if(response.isSuccessful()) {
switch(response.code()) {
case 200:
List<UserRepositories> result = response.body();
assert result != null;
if(result.size() > 0) {
pageSize = result.size();
reposList.addAll(result);
}
else {
SnackBar.info(context, fragmentRepositoriesBinding.getRoot(), getString(R.string.noMoreData));
adapter.setMoreDataAvailable(false);
}
adapter.notifyDataChanged();
fragmentRepositoriesBinding.progressLoadMore.setVisibility(View.GONE);
break;
case 401:
AlertDialogs.authorizationTokenRevokedDialog(context, getResources().getString(R.string.alertDialogTokenRevokedTitle),
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
break;
case 403:
Toasty.error(context, context.getString(R.string.authorizeError));
break;
case 404:
fragmentRepositoriesBinding.noData.setVisibility(View.VISIBLE);
fragmentRepositoriesBinding.progressBar.setVisibility(View.GONE);
break;
default:
Toasty.error(context, getString(R.string.genericError));
break;
}
}
}
@Override
public void onFailure(@NonNull Call<List<UserRepositories>> call, @NonNull Throwable t) {
Toasty.error(context, getString(R.string.genericError));
}
});
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
inflater.inflate(R.menu.search_menu, menu);
super.onCreateOptionsMenu(menu, inflater);
MenuItem searchItem = menu.findItem(R.id.action_search);
androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) searchItem.getActionView();
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
filter(newText);
return false;
}
});
}
private void filter(String text) {
List<UserRepositories> arr = new ArrayList<>();
for(UserRepositories d : reposList) {
if(d == null || d.getFullName() == null || d.getDescription() == null) {
continue;
}
if(d.getFullName().toLowerCase().contains(text) || d.getDescription().toLowerCase().contains(text)) {
arr.add(d);
}
}
adapter.updateList(arr);
}
}

View File

@ -27,9 +27,9 @@ public class Constants {
public static final String tagMilestonesAdapter = "MilestonesAdapter"; public static final String tagMilestonesAdapter = "MilestonesAdapter";
public static final String draftsApi = "DraftsApi"; public static final String draftsApi = "DraftsApi";
public static final String repositoriesApi = "RepositoriesApi"; public static final String repositoriesApi = "RepositoriesApi";
public static final String replyToIssueActivity = "ReplyToIssueActivity";
public static final String tagDraftsBottomSheet = "BottomSheetDraftsFragment"; public static final String tagDraftsBottomSheet = "BottomSheetDraftsFragment";
public static final String userAccountsApi = "UserAccountsApi"; public static final String userAccountsApi = "UserAccountsApi";
public static final String publicOrganizations = "PublicOrganizations";
// issues variables // issues variables
public static final int issuesPageInit = 1; public static final int issuesPageInit = 1;
@ -51,6 +51,9 @@ public class Constants {
public static final int defaultPollingDelay = 15; public static final int defaultPollingDelay = 15;
public static final int maximumPollingDelay = 720; public static final int maximumPollingDelay = 720;
// public organizations
public static final int publicOrganizationsPageInit = 1;
public static final int maximumFileViewerSize = 3 * 1024 * 1024; public static final int maximumFileViewerSize = 3 * 1024 * 1024;
public static final String mainNotificationChannelId = "main_channel"; public static final String mainNotificationChannelId = "main_channel";

View File

@ -3,6 +3,7 @@ package org.mian.gitnex.helpers;
import android.content.Context; import android.content.Context;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.text.Spanned; import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.content.res.ResourcesCompat; import androidx.core.content.res.ResourcesCompat;
@ -79,6 +80,7 @@ public class Markdown {
public static void render(Context context, String markdown, TextView textView) { public static void render(Context context, String markdown, TextView textView) {
try { try {
textView.setMovementMethod(LinkMovementMethod.getInstance());
Renderer renderer = rendererPool.claim(timeout); Renderer renderer = rendererPool.claim(timeout);
if(renderer != null) { if(renderer != null) {

View File

@ -0,0 +1,46 @@
package org.mian.gitnex.helpers;
import android.content.Context;
import android.view.View;
import android.widget.TextView;
import com.google.android.material.snackbar.Snackbar;
import org.mian.gitnex.R;
/**
* Author M M Arif
*/
public class SnackBar {
public static void info(Context context, View view, String message) {
Snackbar snackBar = Snackbar.make(view, message, Snackbar.LENGTH_LONG);
View sbView = snackBar.getView();
TextView textView = sbView.findViewById(R.id.snackbar_text);
textView.setTextColor(context.getResources().getColor(R.color.colorWhite));
snackBar.show();
}
public static void success(Context context, View view, String message) {
Snackbar snackBar = Snackbar.make(view, message, Snackbar.LENGTH_LONG);
View sbView = snackBar.getView();
TextView textView = sbView.findViewById(R.id.snackbar_text);
textView.setTextColor(context.getResources().getColor(R.color.colorLightGreen));
snackBar.show();
}
public static void warning(Context context, View view, String message) {
Snackbar snackBar = Snackbar.make(view, message, Snackbar.LENGTH_LONG);
View sbView = snackBar.getView();
TextView textView = sbView.findViewById(R.id.snackbar_text);
textView.setTextColor(context.getResources().getColor(R.color.lightYellow));
snackBar.show();
}
public static void error(Context context, View view, String message) {
Snackbar snackBar = Snackbar.make(view, message, Snackbar.LENGTH_LONG);
View sbView = snackBar.getView();
TextView textView = sbView.findViewById(R.id.snackbar_text);
textView.setTextColor(context.getResources().getColor(R.color.darkRed));
snackBar.show();
}
}

View File

@ -43,7 +43,7 @@ public class TimeHelper {
switch(timeFormat) { switch(timeFormat) {
case "pretty": { case "pretty": {
PrettyTime prettyTime = new PrettyTime(Locale.getDefault()); PrettyTime prettyTime = new PrettyTime(locale);
return prettyTime.format(date); return prettyTime.format(date);
} }
@ -69,17 +69,17 @@ public class TimeHelper {
} }
public static boolean timeBetweenHours(int fromHour, int toHour) { public static boolean timeBetweenHours(int fromHour, int toHour, int fromMinute, int toMinute) {
Calendar cal = Calendar.getInstance(); Calendar cal = Calendar.getInstance();
Calendar from = Calendar.getInstance(); Calendar from = Calendar.getInstance();
from.set(Calendar.HOUR_OF_DAY, fromHour); from.set(Calendar.HOUR_OF_DAY, fromHour);
from.set(Calendar.MINUTE, 0); from.set(Calendar.MINUTE, fromMinute);
Calendar to = Calendar.getInstance(); Calendar to = Calendar.getInstance();
to.set(Calendar.HOUR_OF_DAY, toHour); to.set(Calendar.HOUR_OF_DAY, toHour);
to.set(Calendar.MINUTE, 0); to.set(Calendar.MINUTE, toMinute);
if(to.before(from)) { if(to.before(from)) {
if(cal.after(to)) { if(cal.after(to)) {

View File

@ -424,16 +424,16 @@ public class MemorizingTrustManager implements X509TrustManager {
} }
} }
private static void certDetails(StringBuilder stringBuilder, X509Certificate c) { private void certDetails(StringBuilder stringBuilder, X509Certificate c) {
SimpleDateFormat validityDateFormater = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); SimpleDateFormat validityDateFormatter = new SimpleDateFormat("yyyy-MM-dd", context.getResources().getConfiguration().locale);
stringBuilder.append("\n") stringBuilder.append("\n")
.append(c.getSubjectDN().toString()) .append(c.getSubjectDN().toString())
.append("\n") .append("\n")
.append(validityDateFormater.format(c.getNotBefore())) .append(validityDateFormatter.format(c.getNotBefore()))
.append(" - ") .append(" - ")
.append(validityDateFormater.format(c.getNotAfter())) .append(validityDateFormatter.format(c.getNotAfter()))
.append("\nSHA-256: ") .append("\nSHA-256: ")
.append(certHash(c, "SHA-256")) .append(certHash(c, "SHA-256"))
.append("\nSHA-1: ") .append("\nSHA-1: ")

View File

@ -42,39 +42,23 @@ public class FilesViewModel extends ViewModel {
.getFiles(token, owner, repo, ref); .getFiles(token, owner, repo, ref);
call.enqueue(new Callback<List<Files>>() { call.enqueue(new Callback<List<Files>>() {
@Override @Override
public void onResponse(@NonNull Call<List<Files>> call, @NonNull Response<List<Files>> response) { public void onResponse(@NonNull Call<List<Files>> call, @NonNull Response<List<Files>> response) {
if (response.code() == 200) { if(response.isSuccessful() && response.body() != null && !response.body().isEmpty()) {
Collections.sort(response.body(), (byType1, byType2) -> byType1.getType().compareTo(byType2.getType()));
assert response.body() != null; filesList.postValue(response.body());
if(response.body().size() > 0) {
Collections.sort(response.body(), (byType1, byType2) -> byType1.getType().compareTo(byType2.getType()));
filesList.postValue(response.body());
}
else {
progressBar.setVisibility(View.GONE);
noDataFiles.setVisibility(View.VISIBLE);
}
} }
else { else {
progressBar.setVisibility(View.GONE); progressBar.setVisibility(View.GONE);
noDataFiles.setVisibility(View.VISIBLE); noDataFiles.setVisibility(View.VISIBLE);
} }
} }
@Override @Override
public void onFailure(@NonNull Call<List<Files>> call, @NonNull Throwable t) { public void onFailure(@NonNull Call<List<Files>> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.errorOnLogin)); Toasty.error(ctx, ctx.getString(R.string.errorOnLogin));
} }
}); });
} }
@ -93,27 +77,14 @@ public class FilesViewModel extends ViewModel {
.getDirFiles(token, owner, repo, filesDir, ref); .getDirFiles(token, owner, repo, filesDir, ref);
call.enqueue(new Callback<List<Files>>() { call.enqueue(new Callback<List<Files>>() {
@Override @Override
public void onResponse(@NonNull Call<List<Files>> call, @NonNull Response<List<Files>> response) { public void onResponse(@NonNull Call<List<Files>> call, @NonNull Response<List<Files>> response) {
if (response.code() == 200) { if(response.isSuccessful() && response.body() != null && !response.body().isEmpty()) {
Collections.sort(response.body(), (byType1, byType2) -> byType1.getType().compareTo(byType2.getType()));
assert response.body() != null; filesList2.postValue(response.body());
if(response.body().size() > 0) {
Collections.sort(response.body(), (byType1, byType2) -> byType1.getType().compareTo(byType2.getType()));
filesList2.postValue(response.body());
}
else {
progressBar.setVisibility(View.GONE);
noDataFiles.setVisibility(View.VISIBLE);
}
} }
else { else {
progressBar.setVisibility(View.GONE); progressBar.setVisibility(View.GONE);
noDataFiles.setVisibility(View.VISIBLE); noDataFiles.setVisibility(View.VISIBLE);
} }
@ -121,10 +92,8 @@ public class FilesViewModel extends ViewModel {
@Override @Override
public void onFailure(@NonNull Call<List<Files>> call, @NonNull Throwable t) { public void onFailure(@NonNull Call<List<Files>> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.errorOnLogin)); Toasty.error(ctx, ctx.getString(R.string.errorOnLogin));
} }
}); });
} }

View File

@ -35,7 +35,7 @@ public class OrganizationListViewModel extends ViewModel {
Call<List<UserOrganizations>> call = RetrofitClient Call<List<UserOrganizations>> call = RetrofitClient
.getApiInterface(ctx) .getApiInterface(ctx)
.getUserOrgs(token); .getUserOrgs(token, 1, 50);
call.enqueue(new Callback<List<UserOrganizations>>() { call.enqueue(new Callback<List<UserOrganizations>>() {

View File

@ -33,7 +33,7 @@ public class ProfileFollowersViewModel extends ViewModel {
Call<List<UserInfo>> call = RetrofitClient Call<List<UserInfo>> call = RetrofitClient
.getApiInterface(ctx) .getApiInterface(ctx)
.getFollowers(token); .getFollowers(token, 1, 50);
call.enqueue(new Callback<List<UserInfo>>() { call.enqueue(new Callback<List<UserInfo>>() {

View File

@ -33,7 +33,7 @@ public class ProfileFollowingViewModel extends ViewModel {
Call<List<UserInfo>> call = RetrofitClient Call<List<UserInfo>> call = RetrofitClient
.getApiInterface(ctx) .getApiInterface(ctx)
.getFollowing(token); .getFollowing(token, 1, 50);
call.enqueue(new Callback<List<UserInfo>>() { call.enqueue(new Callback<List<UserInfo>>() {

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<size android:width="1px" android:height="1px" />
<solid android:color="@color/toastBackground" />
</shape>

View File

@ -10,6 +10,7 @@
android:id="@+id/appbar" android:id="@+id/appbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:elevation="0dp"
android:theme="@style/Widget.AppCompat.SearchView"> android:theme="@style/Widget.AppCompat.SearchView">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar

View File

@ -13,6 +13,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:theme="@style/Widget.AppCompat.SearchView" android:theme="@style/Widget.AppCompat.SearchView"
app:elevation="0dp"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar

View File

@ -10,6 +10,7 @@
android:id="@+id/appbar" android:id="@+id/appbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:elevation="0dp"
android:theme="@style/Widget.AppCompat.SearchView"> android:theme="@style/Widget.AppCompat.SearchView">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="?attr/primaryBackgroundColor" android:background="?attr/primaryBackgroundColor"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
android:orientation="vertical"> android:orientation="vertical">
@ -11,6 +11,7 @@
android:id="@+id/appbar" android:id="@+id/appbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:elevation="0dp"
android:theme="@style/Widget.AppCompat.SearchView"> android:theme="@style/Widget.AppCompat.SearchView">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="?attr/primaryBackgroundColor" android:background="?attr/primaryBackgroundColor"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
android:orientation="vertical"> android:orientation="vertical">
@ -11,6 +11,7 @@
android:id="@+id/appbar" android:id="@+id/appbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:elevation="0dp"
android:theme="@style/Widget.AppCompat.SearchView"> android:theme="@style/Widget.AppCompat.SearchView">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar

View File

@ -10,6 +10,7 @@
android:id="@+id/appbar" android:id="@+id/appbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:elevation="0dp"
android:theme="@style/Widget.AppCompat.SearchView"> android:theme="@style/Widget.AppCompat.SearchView">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar

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