From 1dd615fcaeda063e756700bf4cca55651d77113a Mon Sep 17 00:00:00 2001 From: opyale Date: Sat, 1 May 2021 20:30:44 +0200 Subject: [PATCH 01/21] Moving to 'main' branch (#902) Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/902 Reviewed-by: M M Arif Co-authored-by: opyale Co-committed-by: opyale --- .drone.yml | 8 ++++---- .gitea/issue_template.md | 2 +- .gitea/pull_request_template.md | 6 +++--- .gitlab-ci.yml | 12 ++++++------ CONTRIBUTING.md | 2 +- README.md | 12 ++++++------ 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/.drone.yml b/.drone.yml index c3b82520..e00ad6cd 100644 --- a/.drone.yml +++ b/.drone.yml @@ -15,8 +15,8 @@ steps: image: zosiab/eclint:latest depends_on: [ clone ] commands: - - git pull origin master - - eclint check $(git diff --name-only origin/master) + - git pull origin main + - 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. # Additional information: https://www.jetbrains.com/help/idea/command-line-formatter.html @@ -54,7 +54,7 @@ trigger: event: - push branch: - - master + - main --- kind: pipeline @@ -101,4 +101,4 @@ trigger: event: - push branch: - - master + - main diff --git a/.gitea/issue_template.md b/.gitea/issue_template.md index d1307a05..727faec8 100644 --- a/.gitea/issue_template.md +++ b/.gitea/issue_template.md @@ -31,7 +31,7 @@

-- [ ] 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).
#### Thank you for your time. \ No newline at end of file diff --git a/.gitea/pull_request_template.md b/.gitea/pull_request_template.md index dd43dcc3..b9a0ce9a 100644 --- a/.gitea/pull_request_template.md +++ b/.gitea/pull_request_template.md @@ -2,8 +2,8 @@

- + -- [ ] 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). -- [ ] 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). \ No newline at end of file +- [ ] 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). \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 069faff3..bae163bf 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,7 +7,7 @@ on_setup: image: tutum/curl stage: .pre only: - - master + - main - tags variables: INSTANCE: "https://codeberg.org" @@ -20,7 +20,7 @@ build: image: nextcloudci/android:android-54 stage: build only: - - master + - main - tags script: - ./gradlew assembleFreeRelease @@ -33,7 +33,7 @@ sign: image: nextcloudci/android:android-54 stage: sign only: - - master + - main - tags variables: OUTPUT: "signed.apk" @@ -50,7 +50,7 @@ latest: image: tutum/curl stage: publish only: - - master + - main - tags variables: WEBDAV_USERNAME: "GitNexBot" @@ -75,7 +75,7 @@ on_success: image: tutum/curl stage: .post only: - - master + - main - tags variables: INSTANCE: "https://codeberg.org" @@ -89,7 +89,7 @@ on_failure: image: tutum/curl stage: .post only: - - master + - main - tags variables: INSTANCE: "https://codeberg.org" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 43385f65..de3a1a9c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -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. 3. Create a new branch and work on your feature, enhancement or patch. 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/). diff --git a/README.md b/README.md index b0b4de81..e7f76f8d 100644 --- a/README.md +++ b/README.md @@ -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) [Become a Patroen](https://www.patreon.com/mmarif) @@ -9,9 +9,9 @@ GitNex is a free/paid, open-source Android client for Git repository management GitNex is licensed under GPLv3 License. See the LICENSE file for the full license text. **No trackers are used** and source code is available here for anyone to audit. ## Downloads -[Get it on F-droid](https://f-droid.org/en/packages/org.mian.gitnex/) +[Get it on F-droid](https://f-droid.org/en/packages/org.mian.gitnex/) [Get it on Google Play](https://play.google.com/store/apps/details?id=org.mian.gitnex.pro) -[Download builds and releases](https://cloud.swatian.com/s/DN7E5xxtaw4fRbE) +[Download builds and releases](https://cloud.swatian.com/s/DN7E5xxtaw4fRbE) ## Note about Gitea version 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) ## Contributing -[CONTRIBUTING](https://codeberg.org/gitnex/GitNex/src/branch/master/CONTRIBUTING.md) +[CONTRIBUTING](https://codeberg.org/gitnex/GitNex/src/branch/main/CONTRIBUTING.md) ## Translation 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: -001.png | 002.png | 003.png | 004.png +001.png | 002.png | 003.png | 004.png ---|---|---|--- -005.png | 006.png | 007.png | 008.png +005.png | 006.png | 007.png | 008.png ## Links [Website](https://gitnex.com) From 224ead33bf1fa4d89a9385417f28b46c5c358a05 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sun, 23 May 2021 22:29:11 +0200 Subject: [PATCH 02/21] Fix going back from about fragment (#908) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Describe what your pull request does and which issue you’re targeting This PR fixes the problem that you can't go back from the "About" section in the settings and it changes the action bar behaviour of the about fragment to keep the design consistent (see below). The activity action bar is hidden [here](https://codeberg.org/qwerty287/GitNex/src/commit/82ffeefdc4f071e5f35f8cec9dd16eca564be7ea/app/src/main/java/org/mian/gitnex/fragments/AboutFragment.java#L35), as the about fragment uses it's own (in my implementation) to keep the design consistent (currently, all sections of the settings are own activitys and their action bar has a close button, except the about section). If you don't like this, I can remove it, but currently, it doesn't look nice integrated. Closes #905 - [X] I carefully read the [contribution guidelines](https://codeberg.org/GitNex/GitNex/src/branch/main/CONTRIBUTING.md). - [X] I'm following the code standards as defined [here](https://codeberg.org/gitnex/GitNex/wiki/Code-Standards). - [X] 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). Co-authored-by: qwerty287 Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/908 Reviewed-by: M M Arif Co-authored-by: qwerty287 Co-committed-by: qwerty287 --- .../mian/gitnex/fragments/AboutFragment.java | 18 +++++++- app/src/main/res/layout/fragment_about.xml | 41 +++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/mian/gitnex/fragments/AboutFragment.java b/app/src/main/java/org/mian/gitnex/fragments/AboutFragment.java index c26aeb9f..727321b3 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/AboutFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/AboutFragment.java @@ -6,6 +6,7 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import org.mian.gitnex.R; @@ -13,6 +14,7 @@ import org.mian.gitnex.activities.MainActivity; import org.mian.gitnex.databinding.FragmentAboutBinding; import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.TinyDB; +import java.util.Objects; /** * Author M M Arif @@ -30,7 +32,21 @@ public class AboutFragment extends Fragment { viewBinding.userServerVersion.setText(tinyDb.getString("giteaVersion")); viewBinding.appBuild.setText(String.valueOf(AppUtil.getAppBuildNo(requireContext()))); - ((MainActivity) requireActivity()).setActionBarTitle(getResources().getString(R.string.pageTitleAbout)); + Objects.requireNonNull(((MainActivity) requireActivity()).getSupportActionBar()).hide(); + + viewBinding.close.setOnClickListener(v15 -> { + requireActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new SettingsFragment()).commit(); + Objects.requireNonNull(((MainActivity) requireActivity()).getSupportActionBar()).show(); + }); + + OnBackPressedCallback callback = new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + requireActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new SettingsFragment()).commit(); + Objects.requireNonNull(((MainActivity) requireActivity()).getSupportActionBar()).show(); + } + }; + requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), callback); viewBinding.donationLinkPatreon.setOnClickListener(v12 -> { diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml index 4ed2cf06..b8137b93 100644 --- a/app/src/main/res/layout/fragment_about.xml +++ b/app/src/main/res/layout/fragment_about.xml @@ -3,6 +3,46 @@ android:layout_width="match_parent" android:layout_height="match_parent" > + + + + + + + + + + + + Date: Mon, 24 May 2021 14:42:08 +0200 Subject: [PATCH 03/21] Fix missing docker image. (#909) Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/909 Reviewed-by: M M Arif Co-authored-by: opyale Co-committed-by: opyale --- .gitlab-ci.yml | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bae163bf..e8b1ef37 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,7 +4,9 @@ stages: - publish on_setup: - image: tutum/curl + image: + name: curlimages/curl:7.76.1 + entrypoint: ["/bin/sh", "-c"] stage: .pre only: - main @@ -47,7 +49,9 @@ sign: expire_in: 15 minutes latest: - image: tutum/curl + image: + name: curlimages/curl:7.76.1 + entrypoint: ["/bin/sh", "-c"] stage: publish only: - main @@ -60,7 +64,9 @@ latest: - curl -T "$PLUGIN_FILE" -u "$WEBDAV_USERNAME":"$WEBDAV_PASSWORD" "$PLUGIN_DESTINATION" release: - image: tutum/curl + image: + name: curlimages/curl:7.76.1 + entrypoint: ["/bin/sh", "-c"] stage: publish only: - tags @@ -72,7 +78,9 @@ 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' on_success: - image: tutum/curl + image: + name: curlimages/curl:7.76.1 + entrypoint: ["/bin/sh", "-c"] stage: .post only: - main @@ -86,7 +94,9 @@ on_success: when: on_success on_failure: - image: tutum/curl + image: + name: curlimages/curl:7.76.1 + entrypoint: ["/bin/sh", "-c"] stage: .post only: - main From c8872ade9f7194b31905da317ac9e4f695451ee9 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Tue, 25 May 2021 14:35:30 +0200 Subject: [PATCH 04/21] Fix typo (#911) Fixes "Crodwin" typo - [X] I carefully read the [contribution guidelines](https://codeberg.org/GitNex/GitNex/src/branch/main/CONTRIBUTING.md). - [X] I'm following the code standards as defined [here](https://codeberg.org/gitnex/GitNex/wiki/Code-Standards). - [X] 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). Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/911 Reviewed-by: M M Arif Co-authored-by: qwerty287 Co-committed-by: qwerty287 --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d9ce558f..3574f267 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -235,7 +235,7 @@ Pretty Choose Language Choose Time Format - Translate GitNex via Crodwin + Translate GitNex via Crowdin Green - Black Code Block Color Code Block Color Selector From a9f1010addf73216f5645a248cf486bb83d97f1e Mon Sep 17 00:00:00 2001 From: M M Arif Date: Tue, 25 May 2021 21:26:21 +0200 Subject: [PATCH 05/21] Improve reply comment title (#912) Closes #910 Co-authored-by: M M Arif Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/912 Reviewed-by: opyale Co-authored-by: M M Arif Co-committed-by: M M Arif --- app/src/main/res/layout/bottom_sheet_reply_layout.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/bottom_sheet_reply_layout.xml b/app/src/main/res/layout/bottom_sheet_reply_layout.xml index 47e74c5a..86fdd1ea 100644 --- a/app/src/main/res/layout/bottom_sheet_reply_layout.xml +++ b/app/src/main/res/layout/bottom_sheet_reply_layout.xml @@ -42,10 +42,11 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" - android:maxLines="1" + android:maxLines="2" + android:ellipsize="end" android:text="@string/commentButtonText" android:textColor="?attr/primaryTextColor" - android:textSize="20sp" /> + android:textSize="14sp" /> Date: Tue, 25 May 2021 22:39:06 +0200 Subject: [PATCH 06/21] Public organizations (#906) Closes #903 Co-authored-by: M M Arif Co-authored-by: opyale Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/906 Reviewed-by: opyale Co-authored-by: M M Arif Co-committed-by: M M Arif --- README.md | 2 +- app/build.gradle | 8 +- .../adapters/PublicOrganizationsAdapter.java | 148 ++++++++++++++++ .../gitnex/fragments/ExploreFragment.java | 13 +- ...agment.java => ExploreIssuesFragment.java} | 40 +---- .../ExplorePublicOrganizationsFragment.java | 160 ++++++++++++++++++ .../mian/gitnex/fragments/IssuesFragment.java | 56 +----- .../fragments/NotificationsFragment.java | 6 +- .../org/mian/gitnex/helpers/Constants.java | 4 + .../org/mian/gitnex/helpers/SnackBar.java | 46 +++++ ...ctivity_add_collaborator_to_repository.xml | 1 + .../res/layout/activity_add_new_account.xml | 1 + .../layout/activity_add_new_team_member.xml | 1 + .../res/layout/activity_admin_cron_tasks.xml | 5 +- .../res/layout/activity_admin_get_users.xml | 5 +- app/src/main/res/layout/activity_commits.xml | 1 + .../main/res/layout/activity_create_file.xml | 1 + .../main/res/layout/activity_create_issue.xml | 1 + .../main/res/layout/activity_create_label.xml | 1 + .../res/layout/activity_create_milestone.xml | 1 + .../res/layout/activity_create_new_user.xml | 1 + .../layout/activity_create_organization.xml | 1 + .../main/res/layout/activity_create_pr.xml | 3 +- .../res/layout/activity_create_release.xml | 1 + .../main/res/layout/activity_create_repo.xml | 1 + .../layout/activity_create_team_by_org.xml | 1 + .../main/res/layout/activity_edit_issue.xml | 1 + .../main/res/layout/activity_file_diff.xml | 1 + .../main/res/layout/activity_file_view.xml | 1 + .../main/res/layout/activity_issue_detail.xml | 1 + app/src/main/res/layout/activity_main.xml | 2 +- .../layout/activity_merge_pull_request.xml | 1 + .../main/res/layout/activity_org_detail.xml | 1 + .../res/layout/activity_org_team_members.xml | 1 + .../res/layout/activity_profile_email.xml | 1 + .../main/res/layout/activity_repo_detail.xml | 1 + .../main/res/layout/activity_repo_forks.xml | 1 + .../res/layout/activity_repo_stargazers.xml | 1 + .../res/layout/activity_repo_watchers.xml | 1 + .../layout/activity_repository_settings.xml | 3 +- .../layout/activity_settings_appearance.xml | 5 +- .../res/layout/activity_settings_drafts.xml | 2 + .../res/layout/activity_settings_general.xml | 2 + .../activity_settings_notifications.xml | 1 + .../res/layout/activity_settings_reports.xml | 2 + .../res/layout/activity_settings_security.xml | 2 + .../layout/activity_settings_translation.xml | 5 +- app/src/main/res/layout/fragment_explore.xml | 9 +- .../res/layout/fragment_organizations.xml | 9 + app/src/main/res/layout/fragment_profile.xml | 7 +- .../main/res/layout/list_notifications.xml | 2 +- build.gradle | 2 +- 52 files changed, 458 insertions(+), 116 deletions(-) create mode 100644 app/src/main/java/org/mian/gitnex/adapters/PublicOrganizationsAdapter.java rename app/src/main/java/org/mian/gitnex/fragments/{SearchIssuesFragment.java => ExploreIssuesFragment.java} (94%) create mode 100644 app/src/main/java/org/mian/gitnex/fragments/ExplorePublicOrganizationsFragment.java create mode 100644 app/src/main/java/org/mian/gitnex/helpers/SnackBar.java diff --git a/README.md b/README.md index e7f76f8d..a71f4ef4 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ GitNex is a free/paid, open-source Android client for Git repository management GitNex is licensed under GPLv3 License. See the LICENSE file for the full license text. **No trackers are used** and source code is available here for anyone to audit. ## Downloads -[Get it on F-droid](https://f-droid.org/en/packages/org.mian.gitnex/) +[Get it on F-droid](https://f-droid.org/en/packages/org.mian.gitnex/) [Get it on Google Play](https://play.google.com/store/apps/details?id=org.mian.gitnex.pro) [Download builds and releases](https://cloud.swatian.com/s/DN7E5xxtaw4fRbE) diff --git a/app/build.gradle b/app/build.gradle index 3738d3cb..86c3f050 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,7 +56,7 @@ configurations { dependencies { def lifecycle_version = '2.3.1' def markwon_version = '4.6.2' - def work_version = "2.5.0" + def work_version = "2.7.0-alpha03" def acra = "5.7.0" implementation fileTree(include: ['*.jar'], dir: 'libs') @@ -103,12 +103,12 @@ dependencies { implementation "ch.acra:acra-mail:$acra" implementation "ch.acra:acra-limiter:$acra" implementation "ch.acra:acra-notification:$acra" - implementation 'androidx.room:room-runtime:2.2.6' - annotationProcessor 'androidx.room:room-compiler:2.2.6' + implementation 'androidx.room:room-runtime:2.3.0' + annotationProcessor 'androidx.room:room-compiler:2.3.0' implementation "androidx.work:work-runtime:$work_version" implementation "io.mikael:urlbuilder:2.0.9" 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.10" coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.1.5" implementation 'androidx.biometric:biometric:1.1.0' implementation 'com.github.chrisvest:stormpot:2.4.1' diff --git a/app/src/main/java/org/mian/gitnex/adapters/PublicOrganizationsAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/PublicOrganizationsAdapter.java new file mode 100644 index 00000000..5a8e7528 --- /dev/null +++ b/app/src/main/java/org/mian/gitnex/adapters/PublicOrganizationsAdapter.java @@ -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 PublicOrganizationsAdapter extends RecyclerView.Adapter { + + private final Context context; + private final int TYPE_LOAD = 0; + private List organizationsList; + private OnLoadMoreListener loadMoreListener; + private boolean isLoading = false, isMoreDataAvailable = true; + + public PublicOrganizationsAdapter(Context ctx, List 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 PublicOrganizationsAdapter.OrganizationsHolder(inflater.inflate(R.layout.list_organizations, parent, false)); + } + else { + return new PublicOrganizationsAdapter.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) { + ((PublicOrganizationsAdapter.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 list) { + organizationsList = list; + notifyDataSetChanged(); + } +} diff --git a/app/src/main/java/org/mian/gitnex/fragments/ExploreFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ExploreFragment.java index 58544f8f..5ea4b5cf 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ExploreFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ExploreFragment.java @@ -24,9 +24,6 @@ import org.mian.gitnex.helpers.TinyDB; public class ExploreFragment extends Fragment { - private Context ctx; - private TinyDB tinyDB; - private int tabsCount; public ViewPager mViewPager; @@ -36,8 +33,8 @@ public class ExploreFragment extends Fragment { View view = inflater.inflate(R.layout.fragment_explore, container, false); - ctx = getContext(); - tinyDB = TinyDB.getInstance(ctx); + Context ctx = getContext(); + TinyDB tinyDB = TinyDB.getInstance(ctx); ((MainActivity) requireActivity()).setActionBarTitle(getResources().getString(R.string.navExplore)); @@ -111,7 +108,11 @@ public class ExploreFragment extends Fragment { break; case 1: // Issues - fragment = new SearchIssuesFragment(); + fragment = new ExploreIssuesFragment(); + break; + + case 2: // Organizations + fragment = new ExplorePublicOrganizationsFragment(); break; } diff --git a/app/src/main/java/org/mian/gitnex/fragments/SearchIssuesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ExploreIssuesFragment.java similarity index 94% rename from app/src/main/java/org/mian/gitnex/fragments/SearchIssuesFragment.java rename to app/src/main/java/org/mian/gitnex/fragments/ExploreIssuesFragment.java index 374dc47c..180a8a90 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/SearchIssuesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ExploreIssuesFragment.java @@ -19,7 +19,6 @@ import org.mian.gitnex.databinding.FragmentSearchIssuesBinding; import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.InfiniteScrollListener; -import org.mian.gitnex.helpers.TinyDB; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -31,27 +30,22 @@ import retrofit2.Response; * Author M M Arif */ -public class SearchIssuesFragment extends Fragment { +public class ExploreIssuesFragment extends Fragment { - private Context ctx; - private TinyDB tinyDb; private FragmentSearchIssuesBinding viewBinding; private SearchIssuesAdapter adapter; private List dataList; + Context ctx; private int apiCallCurrentValue = 10; private int pageCurrentIndex = 1; - private String type = "issues"; - private String state = "open"; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { viewBinding = FragmentSearchIssuesBinding.inflate(inflater, container, false); setHasOptionsMenu(true); - ctx = getContext(); - tinyDb = TinyDB.getInstance(getContext()); dataList = new ArrayList<>(); adapter = new SearchIssuesAdapter(dataList, ctx); @@ -65,11 +59,8 @@ public class SearchIssuesFragment extends Fragment { viewBinding.recyclerViewSearchIssues.setAdapter(adapter); viewBinding.searchKeyword.setOnEditorActionListener((v1, actionId, event) -> { - if(actionId == EditorInfo.IME_ACTION_SEND) { - if(!Objects.requireNonNull(viewBinding.searchKeyword.getText()).toString().equals("")) { - InputMethodManager imm = (InputMethodManager) requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(viewBinding.searchKeyword.getWindowToken(), 0); @@ -79,27 +70,21 @@ public class SearchIssuesFragment extends Fragment { loadData(false, viewBinding.searchKeyword.getText().toString()); } } - return false; }); viewBinding.recyclerViewSearchIssues.addOnScrollListener(new InfiniteScrollListener(pageCurrentIndex, linearLayoutManager) { - @Override public void onScrolledToEnd(int firstVisibleItemPosition) { - pageCurrentIndex++; loadData(true, Objects.requireNonNull(viewBinding.searchKeyword.getText()).toString()); - } }); viewBinding.pullToRefresh.setOnRefreshListener(() -> { - pageCurrentIndex = 1; apiCallCurrentValue = 10; loadData(false, Objects.requireNonNull(viewBinding.searchKeyword.getText()).toString()); - }); loadData(false, ""); @@ -117,69 +102,50 @@ public class SearchIssuesFragment extends Fragment { } if(pageCurrentIndex == 1 || !append) { - dataList.clear(); adapter.notifyDataSetChanged(); viewBinding.pullToRefresh.setRefreshing(false); viewBinding.progressBar.setVisibility(View.VISIBLE); } else { - viewBinding.loadingMoreView.setVisibility(View.VISIBLE); } Call> call = RetrofitClient.getApiInterface(getContext()) - .queryIssues(Authorization.get(getContext()), searchKeyword, type, state, pageCurrentIndex); + .queryIssues(Authorization.get(getContext()), searchKeyword, "issues", "open", pageCurrentIndex); call.enqueue(new Callback>() { - @Override public void onResponse(@NonNull Call> call, @NonNull Response> response) { - if(response.code() == 200) { - assert response.body() != null; apiCallCurrentValue = response.body().size(); - if(!append) { - dataList.clear(); } - dataList.addAll(response.body()); adapter.notifyDataSetChanged(); - } else { - dataList.clear(); adapter.notifyDataChanged(); viewBinding.noData.setVisibility(View.VISIBLE); - } - onCleanup(); - } @Override public void onFailure(@NonNull Call> call, @NonNull Throwable t) { - Log.e("onFailure", Objects.requireNonNull(t.getMessage())); onCleanup(); - } private void onCleanup() { - AppUtil.setMultiVisibility(View.GONE, viewBinding.loadingMoreView, viewBinding.progressBar); - if(dataList.isEmpty()) { - viewBinding.noData.setVisibility(View.VISIBLE); } } }); } - } diff --git a/app/src/main/java/org/mian/gitnex/fragments/ExplorePublicOrganizationsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ExplorePublicOrganizationsFragment.java new file mode 100644 index 00000000..d49de8b1 --- /dev/null +++ b/app/src/main/java/org/mian/gitnex/fragments/ExplorePublicOrganizationsFragment.java @@ -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.PublicOrganizationsAdapter; +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 organizationsList; + private PublicOrganizationsAdapter 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 PublicOrganizationsAdapter(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> call = RetrofitClient + .getApiInterface(context).getAllOrgs(token, Constants.publicOrganizationsPageInit, resultLimit); + call.enqueue(new Callback>() { + @Override + public void onResponse(@NonNull Call> call, @NonNull Response> 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> call, @NonNull Throwable t) { + Log.e(TAG, t.toString()); + } + }); + } + + private void loadMore(String token, int page, int resultLimit) { + + fragmentPublicOrgBinding.progressLoadMore.setVisibility(View.VISIBLE); + Call> call = RetrofitClient.getApiInterface(context).getAllOrgs(token, page, resultLimit); + call.enqueue(new Callback>() { + @Override + public void onResponse(@NonNull Call> call, @NonNull Response> response) { + if(response.isSuccessful()) { + List 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> call, @NonNull Throwable t) { + Log.e(TAG, t.toString()); + } + }); + } +} diff --git a/app/src/main/java/org/mian/gitnex/fragments/IssuesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/IssuesFragment.java index 88095d88..eda404ac 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/IssuesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/IssuesFragment.java @@ -29,8 +29,8 @@ import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.FragmentIssuesBinding; 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; @@ -44,6 +44,7 @@ import retrofit2.Response; public class IssuesFragment extends Fragment { + private FragmentIssuesBinding fragmentIssuesBinding; private Menu menu; private RecyclerView recyclerView; private List issuesList; @@ -51,18 +52,17 @@ public class IssuesFragment extends Fragment { private Context context; private int pageSize = Constants.issuesPageInit; private ProgressBar mProgressBar; - private String TAG = Constants.tagIssuesList; + private final String TAG = Constants.tagIssuesList; private TextView noDataIssues; private int resultLimit = Constants.resultLimitOldGiteaInstances; - private String requestType = Constants.issuesRequestType; + private final String requestType = Constants.issuesRequestType; private ProgressBar progressLoadMore; @Nullable @Override 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); context = getContext(); @@ -89,23 +89,17 @@ public class IssuesFragment extends Fragment { noDataIssues = fragmentIssuesBinding.noDataIssues; swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { - swipeRefresh.setRefreshing(false); loadInitial(instanceToken, repoOwner, repoName, resultLimit, requestType, tinyDb.getString("repoIssuesState")); adapter.notifyDataChanged(); - }, 200)); adapter = new IssuesAdapter(getContext(), issuesList); adapter.setLoadMoreListener(() -> recyclerView.post(() -> { - if(issuesList.size() == resultLimit || pageSize == resultLimit) { - int page = (issuesList.size() + resultLimit) / resultLimit; loadMore(Authorization.get(getContext()), repoOwner, repoName, page, resultLimit, requestType, tinyDb.getString("repoIssuesState")); - } - })); DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL); @@ -129,12 +123,9 @@ public class IssuesFragment extends Fragment { adapter.setLoadMoreListener(() -> recyclerView.post(() -> { if(issuesList.size() == resultLimit || pageSize == resultLimit) { - int page = (issuesList.size() + resultLimit) / resultLimit; loadMore(Authorization.get(getContext()), repoOwner, repoName, page, resultLimit, requestType, tinyDb.getString("repoIssuesState")); - } - })); tinyDb.putString("repoIssuesState", issueState); @@ -144,13 +135,11 @@ public class IssuesFragment extends Fragment { loadInitial(Authorization.get(getContext()), repoOwner, repoName, resultLimit, requestType, issueState); recyclerView.setAdapter(adapter); - }); loadInitial(Authorization.get(getContext()), repoOwner, repoName, resultLimit, requestType, tinyDb.getString("repoIssuesState")); return fragmentIssuesBinding.getRoot(); - } @Override @@ -165,11 +154,9 @@ public class IssuesFragment extends Fragment { final String repoName = parts[1]; if(tinyDb.getBoolean("resumeIssues")) { - loadInitial(Authorization.get(getContext()), repoOwner, repoName, resultLimit, requestType, tinyDb.getString("repoIssuesState")); tinyDb.putBoolean("resumeIssues", false); } - } 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> call = RetrofitClient.getApiInterface(context).getIssues(token, repoOwner, repoName, 1, resultLimit, requestType, issueState); call.enqueue(new Callback>() { - @Override public void onResponse(@NonNull Call> call, @NonNull Response> response) { if(response.code() == 200) { - assert response.body() != null; if(response.body().size() > 0) { - issuesList.clear(); issuesList.addAll(response.body()); adapter.notifyDataChanged(); noDataIssues.setVisibility(View.GONE); } else { - issuesList.clear(); adapter.notifyDataChanged(); noDataIssues.setVisibility(View.VISIBLE); } - mProgressBar.setVisibility(View.GONE); - } else if(response.code() == 404) { - noDataIssues.setVisibility(View.VISIBLE); mProgressBar.setVisibility(View.GONE); } else { Log.e(TAG, String.valueOf(response.code())); } - } @Override public void onFailure(@NonNull Call> call, @NonNull Throwable t) { - Log.e(TAG, t.toString()); } - }); - } 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 public void onResponse(@NonNull Call> call, @NonNull Response> response) { - if(response.code() == 200) { - List result = response.body(); - assert result != null; if(result.size() > 0) { - pageSize = result.size(); issuesList.addAll(result); - } else { - - Toasty.warning(context, getString(R.string.noMoreData)); + SnackBar.info(context, fragmentIssuesBinding.getRoot(), getString(R.string.noMoreData)); adapter.setMoreDataAvailable(false); - } - adapter.notifyDataChanged(); progressLoadMore.setVisibility(View.GONE); - } else { - Log.e(TAG, String.valueOf(response.code())); - } - } @Override public void onFailure(@NonNull Call> call, @NonNull Throwable t) { - Log.e(TAG, t.toString()); - } - }); } @@ -298,19 +259,15 @@ public class IssuesFragment extends Fragment { @Override public boolean onQueryTextSubmit(String query) { - return false; } @Override public boolean onQueryTextChange(String newText) { - filter(newText); return false; } - }); - } private void filter(String text) { @@ -328,5 +285,4 @@ public class IssuesFragment extends Fragment { adapter.updateList(arr); } - } diff --git a/app/src/main/java/org/mian/gitnex/fragments/NotificationsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/NotificationsFragment.java index a62be27d..61a42132 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/NotificationsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/NotificationsFragment.java @@ -16,6 +16,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; @@ -95,12 +96,15 @@ public class NotificationsFragment extends Fragment implements NotificationsAdap notificationsActions = new NotificationsActions(context); notificationsAdapter = new NotificationsAdapter(context, notificationThreads, this, this); + RecyclerView recyclerView = fragmentNotificationsBinding.notifications; LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context); - RecyclerView recyclerView = fragmentNotificationsBinding.notifications; + DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL); + recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(linearLayoutManager); recyclerView.setAdapter(notificationsAdapter); + recyclerView.addItemDecoration(dividerItemDecoration); recyclerView.addOnScrollListener(new InfiniteScrollListener(pageResultLimit, linearLayoutManager) { @Override diff --git a/app/src/main/java/org/mian/gitnex/helpers/Constants.java b/app/src/main/java/org/mian/gitnex/helpers/Constants.java index c9683935..3c06b35d 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/Constants.java +++ b/app/src/main/java/org/mian/gitnex/helpers/Constants.java @@ -30,6 +30,7 @@ public class Constants { public static final String replyToIssueActivity = "ReplyToIssueActivity"; public static final String tagDraftsBottomSheet = "BottomSheetDraftsFragment"; public static final String userAccountsApi = "UserAccountsApi"; + public static final String publicOrganizations = "PublicOrganizations"; // issues variables public static final int issuesPageInit = 1; @@ -51,6 +52,9 @@ public class Constants { public static final int defaultPollingDelay = 15; 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 String mainNotificationChannelId = "main_channel"; diff --git a/app/src/main/java/org/mian/gitnex/helpers/SnackBar.java b/app/src/main/java/org/mian/gitnex/helpers/SnackBar.java new file mode 100644 index 00000000..c2febdac --- /dev/null +++ b/app/src/main/java/org/mian/gitnex/helpers/SnackBar.java @@ -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(); + } +} diff --git a/app/src/main/res/layout/activity_add_collaborator_to_repository.xml b/app/src/main/res/layout/activity_add_collaborator_to_repository.xml index 218adf7d..34114444 100644 --- a/app/src/main/res/layout/activity_add_collaborator_to_repository.xml +++ b/app/src/main/res/layout/activity_add_collaborator_to_repository.xml @@ -10,6 +10,7 @@ android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" + app:elevation="0dp" android:theme="@style/Widget.AppCompat.SearchView"> - @@ -11,6 +11,7 @@ android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" + app:elevation="0dp" android:theme="@style/Widget.AppCompat.SearchView"> - @@ -11,6 +11,7 @@ android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" + app:elevation="0dp" android:theme="@style/Widget.AppCompat.SearchView"> + android:src="@drawable/ic_close" /> + android:elevation="0dp"> + android:src="@drawable/ic_close" /> - @@ -11,6 +11,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" + app:elevation="0dp" android:theme="@style/Widget.AppCompat.SearchView"> @@ -10,6 +11,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" + app:elevation="0dp" android:theme="@style/Widget.AppCompat.SearchView"> @@ -10,6 +11,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" + app:elevation="0dp" android:theme="@style/Widget.AppCompat.SearchView"> @@ -10,6 +11,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" + app:elevation="0dp" android:theme="@style/Widget.AppCompat.SearchView"> @@ -10,6 +11,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" + app:elevation="0dp" android:theme="@style/Widget.AppCompat.SearchView"> - @@ -11,6 +11,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" + app:elevation="0dp" android:theme="@style/Widget.AppCompat.SearchView"> + + diff --git a/app/src/main/res/layout/fragment_organizations.xml b/app/src/main/res/layout/fragment_organizations.xml index e7a0ae12..7af6fb1d 100644 --- a/app/src/main/res/layout/fragment_organizations.xml +++ b/app/src/main/res/layout/fragment_organizations.xml @@ -27,6 +27,15 @@ style="@style/Widget.MaterialComponents.LinearProgressIndicator" app:indicatorColor="?attr/progressIndicatorColor" /> + + - + android:gravity="center_vertical" + tools:ignore="UseCompoundDrawables"> diff --git a/app/src/main/res/layout/list_notifications.xml b/app/src/main/res/layout/list_notifications.xml index 588bccce..33b8a273 100644 --- a/app/src/main/res/layout/list_notifications.xml +++ b/app/src/main/res/layout/list_notifications.xml @@ -6,7 +6,7 @@ android:layout_height="wrap_content" android:background="?attr/primaryBackgroundColor" android:padding="16dp" - android:orientation="vertical"> + android:orientation="horizontal"> Date: Fri, 28 May 2021 21:23:07 +0200 Subject: [PATCH 07/21] Make markdown links clickable (#916) Pr makes links in markdown clickable. Closes #797

- [X] I carefully read the [contribution guidelines](https://codeberg.org/GitNex/GitNex/src/branch/main/CONTRIBUTING.md). - [X] I'm following the code standards as defined [here](https://codeberg.org/gitnex/GitNex/wiki/Code-Standards). - [X] 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). Co-authored-by: qwerty287 Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/916 Reviewed-by: M M Arif Co-authored-by: qwerty287 Co-committed-by: qwerty287 --- app/src/main/java/org/mian/gitnex/helpers/Markdown.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/org/mian/gitnex/helpers/Markdown.java b/app/src/main/java/org/mian/gitnex/helpers/Markdown.java index 986661c7..a3c81282 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/Markdown.java +++ b/app/src/main/java/org/mian/gitnex/helpers/Markdown.java @@ -3,6 +3,7 @@ package org.mian.gitnex.helpers; import android.content.Context; import android.graphics.Typeface; import android.text.Spanned; +import android.text.method.LinkMovementMethod; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.core.content.res.ResourcesCompat; @@ -79,6 +80,7 @@ public class Markdown { public static void render(Context context, String markdown, TextView textView) { try { + textView.setMovementMethod(LinkMovementMethod.getInstance()); Renderer renderer = rendererPool.claim(timeout); if(renderer != null) { From 547e7c705d7e4fe9f7f1a29372097d1b5c8ae9de Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sat, 29 May 2021 18:21:48 +0200 Subject: [PATCH 08/21] Use language provided by system (#914) Pr tries to implement support for usage of system language. Currently work in progress. - [x] add option to use system language - [x] use this by default - [x] fix other usages of db value "locale" - [X] fix usages of `Locale.getDefault()` (except [here](https://codeberg.org/gitnex/GitNex/src/branch/main/app/src/main/java/org/mian/gitnex/helpers/ssl/MemorizingTrustManager.java#L429)) - [ ] get language list programmaticaly - [X] localize language names (related to #101) - [X] move languages list to ~~Hashmap~~ TreeMap (it seems that HashMaps sort everything in a random order) 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). 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).
Fixes #899 Co-authored-by: qwerty287 Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/914 Reviewed-by: opyale Co-authored-by: qwerty287 Co-committed-by: qwerty287 --- .../mian/gitnex/activities/BaseActivity.java | 9 +- .../activities/IssueDetailActivity.java | 2 +- .../SettingsTranslationActivity.java | 108 ++++-------------- .../adapters/AdminCronTasksAdapter.java | 2 +- .../mian/gitnex/adapters/CommitsAdapter.java | 2 +- .../adapters/ExploreRepositoriesAdapter.java | 8 +- .../gitnex/adapters/IssueCommentsAdapter.java | 4 +- .../mian/gitnex/adapters/IssuesAdapter.java | 2 +- .../gitnex/adapters/MilestonesAdapter.java | 2 +- .../gitnex/adapters/MyReposListAdapter.java | 2 +- .../gitnex/adapters/PullRequestsAdapter.java | 2 +- .../mian/gitnex/adapters/ReleasesAdapter.java | 2 +- .../gitnex/adapters/RepoForksAdapter.java | 2 +- .../gitnex/adapters/ReposListAdapter.java | 2 +- .../adapters/RepositoriesByOrgAdapter.java | 2 +- .../gitnex/adapters/SearchIssuesAdapter.java | 2 +- .../adapters/StarredReposListAdapter.java | 2 +- .../org/mian/gitnex/core/MainApplication.java | 5 + .../gitnex/fragments/RepoInfoFragment.java | 8 +- .../org/mian/gitnex/helpers/TimeHelper.java | 2 +- app/src/main/res/values/arrays.xml | 23 ++++ app/src/main/res/values/strings.xml | 1 + 22 files changed, 83 insertions(+), 111 deletions(-) create mode 100644 app/src/main/res/values/arrays.xml diff --git a/app/src/main/java/org/mian/gitnex/activities/BaseActivity.java b/app/src/main/java/org/mian/gitnex/activities/BaseActivity.java index c5642a6c..e054ba6e 100644 --- a/app/src/main/java/org/mian/gitnex/activities/BaseActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/BaseActivity.java @@ -8,6 +8,7 @@ import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.notifications.Notifications; +import java.util.Locale; /** * Author M M Arif @@ -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); } diff --git a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java index 3760ab8a..2deae15a 100644 --- a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java @@ -569,7 +569,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt } TinyDB tinyDb = TinyDB.getInstance(appCtx); - final String locale = tinyDb.getString("locale"); + final String locale = getResources().getConfiguration().locale.getLanguage(); final String timeFormat = tinyDb.getString("dateFormat"); tinyDb.putString("issueState", singleIssue.getState()); tinyDb.putString("issueTitle", singleIssue.getTitle()); diff --git a/app/src/main/java/org/mian/gitnex/activities/SettingsTranslationActivity.java b/app/src/main/java/org/mian/gitnex/activities/SettingsTranslationActivity.java index 45b3e8ac..8a40543d 100644 --- a/app/src/main/java/org/mian/gitnex/activities/SettingsTranslationActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/SettingsTranslationActivity.java @@ -11,6 +11,9 @@ import androidx.appcompat.app.AlertDialog; import org.mian.gitnex.R; import org.mian.gitnex.databinding.ActivitySettingsTranslationBinding; import org.mian.gitnex.helpers.Toasty; +import java.util.LinkedHashMap; +import java.util.Locale; +import java.util.TreeMap; /** * Author M M Arif @@ -20,8 +23,6 @@ public class SettingsTranslationActivity extends BaseActivity { 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; @Override @@ -29,6 +30,12 @@ public class SettingsTranslationActivity extends BaseActivity { super.onCreate(savedInstanceState); + LinkedHashMap 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()); 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")); - } - - if(langSelectedChoice == 0) { - - langSelectedChoice = tinyDB.getInt("langId"); - } + langSelectedChoice = tinyDB.getInt("langId"); // language dialog langFrame.setOnClickListener(view -> { @@ -70,89 +71,18 @@ public class SettingsTranslationActivity extends BaseActivity { lBuilder.setTitle(R.string.settingsLanguageSelectorDialogTitle); lBuilder.setCancelable(langSelectedChoice != -1); - lBuilder.setSingleChoiceItems(langList, langSelectedChoice, (dialogInterface, i) -> { + lBuilder.setSingleChoiceItems(langs.values().toArray(new String[0]), langSelectedChoice, (dialogInterface, i) -> { - langSelectedChoice = i; - tvLanguageSelected.setText(langList[i]); - tinyDB.putString("localeStr", langList[i]); + String selectedLanguage = langs.keySet().toArray(new String[0])[i]; + tinyDB.putString("localeStr", langs.get(selectedLanguage)); tinyDB.putInt("langId", i); - - 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.putString("locale", selectedLanguage); tinyDB.putBoolean("refreshParent", true); - this.recreate(); this.overridePendingTransition(0, 0); dialogInterface.dismiss(); Toasty.success(appCtx, getResources().getString(R.string.settingsSave)); + this.recreate(); }); lBuilder.setNeutralButton(getString(R.string.cancelButton), null); @@ -167,4 +97,10 @@ public class SettingsTranslationActivity extends BaseActivity { 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)); + } + } diff --git a/app/src/main/java/org/mian/gitnex/adapters/AdminCronTasksAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/AdminCronTasksAdapter.java index cb53bff4..c8be42c4 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/AdminCronTasksAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/AdminCronTasksAdapter.java @@ -44,7 +44,7 @@ public class AdminCronTasksAdapter extends RecyclerView.Adapter TimeHelper.customDateFormatForToastDateFormat(issueComment.getCreated_at())); } else if(timeFormat.equals("normal")) { - informationBuilder = new StringBuilder(TimeHelper.formatTime(issueComment.getCreated_at(), Locale.getDefault(), "normal", context)); + informationBuilder = new StringBuilder(TimeHelper.formatTime(issueComment.getCreated_at(), context.getResources().getConfiguration().locale, "normal", context)); } if(!issueComment.getCreated_at().equals(issueComment.getUpdated_at())) { diff --git a/app/src/main/java/org/mian/gitnex/adapters/IssuesAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/IssuesAdapter.java index 4a53a42c..6931df10 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/IssuesAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/IssuesAdapter.java @@ -135,7 +135,7 @@ public class IssuesAdapter extends RecyclerView.Adapter void bindData(Issues issue) { TinyDB tinyDb = TinyDB.getInstance(context); - String locale = tinyDb.getString("locale"); + String locale = context.getResources().getConfiguration().locale.getLanguage(); String timeFormat = tinyDb.getString("dateFormat"); int imgRadius = AppUtil.getPixelsFromDensity(context, 3); diff --git a/app/src/main/java/org/mian/gitnex/adapters/MilestonesAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/MilestonesAdapter.java index f805e570..6c5f4a96 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/MilestonesAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/MilestonesAdapter.java @@ -148,7 +148,7 @@ public class MilestonesAdapter extends RecyclerView.Adapter + + en + ar + zh + cs + fi + fr + de + it + lv + fa + pl + pt + ru + ru + sr + es + tr + uk + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3574f267..9aff1aef 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -223,6 +223,7 @@ Translation + System Security Delete Trusted Certificates Delete Trusted Certificates? From 881aad5f2d5967c0a3bbc21e579067b2493e654d Mon Sep 17 00:00:00 2001 From: M M Arif Date: Sun, 30 May 2021 19:28:14 +0200 Subject: [PATCH 09/21] New About App dialog, improvements and fixes (#922) Possible fix for #917 Co-authored-by: M M Arif Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/922 Reviewed-by: opyale Co-authored-by: M M Arif Co-committed-by: M M Arif --- .../activities/IssueDetailActivity.java | 8 +- .../adapters/AdminCronTasksAdapter.java | 6 +- .../mian/gitnex/adapters/CommitsAdapter.java | 15 +- ...Adapter.java => ExploreIssuesAdapter.java} | 24 +- ...=> ExplorePublicOrganizationsAdapter.java} | 10 +- .../adapters/ExploreRepositoriesAdapter.java | 25 +- .../gitnex/adapters/IssueCommentsAdapter.java | 31 +- .../mian/gitnex/adapters/IssuesAdapter.java | 8 +- .../gitnex/adapters/MyReposListAdapter.java | 8 +- .../gitnex/adapters/PullRequestsAdapter.java | 4 +- .../mian/gitnex/adapters/ReleasesAdapter.java | 4 +- .../gitnex/adapters/RepoForksAdapter.java | 8 +- .../gitnex/adapters/ReposListAdapter.java | 8 +- .../adapters/RepositoriesByOrgAdapter.java | 8 +- .../adapters/StarredReposListAdapter.java | 8 +- .../mian/gitnex/fragments/AboutFragment.java | 88 ------ .../fragments/ExploreIssuesFragment.java | 6 +- .../ExplorePublicOrganizationsFragment.java | 6 +- .../ExploreRepositoriesFragment.java | 41 +-- .../gitnex/fragments/RepoInfoFragment.java | 8 +- .../gitnex/fragments/SettingsFragment.java | 62 +++- .../helpers/ssl/MemorizingTrustManager.java | 8 +- .../gitnex/viewmodels/FilesViewModel.java | 43 +-- .../main/res/layout/custom_about_dialog.xml | 205 ++++++++++++++ app/src/main/res/layout/fragment_about.xml | 264 ------------------ .../res/values/{arrays.xml => settings.xml} | 1 - app/src/main/res/values/strings.xml | 3 +- 27 files changed, 346 insertions(+), 564 deletions(-) rename app/src/main/java/org/mian/gitnex/adapters/{SearchIssuesAdapter.java => ExploreIssuesAdapter.java} (89%) rename app/src/main/java/org/mian/gitnex/adapters/{PublicOrganizationsAdapter.java => ExplorePublicOrganizationsAdapter.java} (87%) delete mode 100644 app/src/main/java/org/mian/gitnex/fragments/AboutFragment.java create mode 100644 app/src/main/res/layout/custom_about_dialog.xml delete mode 100644 app/src/main/res/layout/fragment_about.xml rename app/src/main/res/values/{arrays.xml => settings.xml} (99%) diff --git a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java index 2deae15a..afa16ada 100644 --- a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java @@ -569,7 +569,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt } TinyDB tinyDb = TinyDB.getInstance(appCtx); - final String locale = getResources().getConfiguration().locale.getLanguage(); + final Locale locale = getResources().getConfiguration().locale; final String timeFormat = tinyDb.getString("dateFormat"); tinyDb.putString("issueState", singleIssue.getState()); tinyDb.putString("issueTitle", singleIssue.getTitle()); @@ -660,7 +660,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt 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()); viewBinding.issueDueDate.setText(dueDate); viewBinding.issueDueDate @@ -668,7 +668,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt } 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()); viewBinding.issueDueDate.setText(dueDate); } @@ -714,7 +714,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt 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); if(timeFormat.equals("pretty")) { diff --git a/app/src/main/java/org/mian/gitnex/adapters/AdminCronTasksAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/AdminCronTasksAdapter.java index c8be42c4..38d78019 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/AdminCronTasksAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/AdminCronTasksAdapter.java @@ -44,7 +44,7 @@ public class AdminCronTasksAdapter extends RecyclerView.Adapter= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) { - isLoading = true; loadMoreListener.onLoadMore(); } if(getItemViewType(position) == TYPE_LOAD) { - ((CommitsHolder) holder).bindData(commitsList.get(position)); } } @@ -106,18 +104,16 @@ public class CommitsAdapter extends RecyclerView.Adapter context.startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse(commitsModel.getHtml_url())))); } @@ -126,36 +122,29 @@ public class CommitsAdapter extends RecyclerView.Adapter list) { - commitsList = list; notifyDataSetChanged(); } - } diff --git a/app/src/main/java/org/mian/gitnex/adapters/SearchIssuesAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/ExploreIssuesAdapter.java similarity index 89% rename from app/src/main/java/org/mian/gitnex/adapters/SearchIssuesAdapter.java rename to app/src/main/java/org/mian/gitnex/adapters/ExploreIssuesAdapter.java index b827dbcb..e24250c0 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/SearchIssuesAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/ExploreIssuesAdapter.java @@ -33,13 +33,13 @@ import java.util.Locale; * Author M M Arif */ -public class SearchIssuesAdapter extends RecyclerView.Adapter { +public class ExploreIssuesAdapter extends RecyclerView.Adapter { private final List searchedList; private final Context context; private final TinyDB tinyDb; - public SearchIssuesAdapter(List dataList, Context ctx) { + public ExploreIssuesAdapter(List dataList, Context ctx) { this.context = ctx; this.searchedList = dataList; @@ -49,7 +49,6 @@ public class SearchIssuesAdapter extends RecyclerView.Adapter { Context context = v.getContext(); - Intent intent = new Intent(context, IssueDetailActivity.class); intent.putExtra("issueNumber", issue.getNumber()); @@ -90,13 +88,11 @@ public class SearchIssuesAdapter extends RecyclerView.Adapter { +public class ExplorePublicOrganizationsAdapter extends RecyclerView.Adapter { private final Context context; private final int TYPE_LOAD = 0; @@ -31,7 +31,7 @@ public class PublicOrganizationsAdapter extends RecyclerView.Adapter organizationsListMain) { + public ExplorePublicOrganizationsAdapter(Context ctx, List organizationsListMain) { this.context = ctx; this.organizationsList = organizationsListMain; } @@ -41,10 +41,10 @@ public class PublicOrganizationsAdapter extends RecyclerView.Adapter call; - call = RetrofitClient.getApiInterface(context).checkRepoWatchStatus(token, repoOwner, repoName); call.enqueue(new Callback() { - @Override public void onResponse(@NonNull Call call, @NonNull retrofit2.Response response) { if(response.isSuccessful()) { - assert response.body() != null; 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 public void onFailure(@NonNull Call call, @NonNull Throwable t) { - tinyDb.putBoolean("repoWatch", false); Toasty.error(context, context.getString(R.string.genericApiStatusError)); } }); - } - context.startActivity(intent); }); diff --git a/app/src/main/java/org/mian/gitnex/adapters/IssueCommentsAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/IssueCommentsAdapter.java index a8dccb58..0ead649f 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/IssueCommentsAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/IssueCommentsAdapter.java @@ -50,6 +50,7 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter issuesComments; private final FragmentManager fragmentManager; private final BottomSheetReplyFragment.OnInteractedListener onInteractedListener; + private final Locale locale; public IssueCommentsAdapter(Context ctx, Bundle bundle, List issuesCommentsMain, FragmentManager fragmentManager, BottomSheetReplyFragment.OnInteractedListener onInteractedListener) { @@ -58,8 +59,8 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter { - tinyDB.putBoolean("commentEdited", true); onInteractedListener.onInteracted(); dialog.dismiss(); - }); linearLayout.addView(reactionSpinner); commentMenuEdit.setOnClickListener(v1 -> { - Bundle bundle = new Bundle(); bundle.putInt("commentId", issueComment.getId()); bundle.putString("commentAction", "edit"); @@ -141,11 +139,9 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter { - // get comment Url CharSequence commentUrl = issueComment.getHtml_url(); @@ -158,11 +154,9 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter { - // comment Url CharSequence commentUrl = issueComment.getHtml_url(); @@ -174,23 +168,19 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter { - StringBuilder stringBuilder = new StringBuilder(); String commenterName = issueComment.getUser().getUsername(); if(!commenterName.equals(tinyDB.getString("userLogin"))) { - stringBuilder.append("@").append(commenterName).append("\n\n"); } String[] lines = issueComment.getBody().split("\\R"); for(String line : lines) { - stringBuilder.append(">").append(line).append("\n"); } @@ -202,11 +192,9 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter { - ClipboardManager clipboard = (ClipboardManager) Objects.requireNonNull(ctx).getSystemService(Context.CLIPBOARD_SERVICE); assert clipboard != null; @@ -215,14 +203,11 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter { - deleteIssueComment(ctx, issueComment.getId(), getAdapterPosition()); dialog.dismiss(); - }); }); @@ -230,12 +215,9 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter { Context context = loginId.getContext(); - AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId)); }); - } - } private void updateAdapter(int position) { @@ -243,7 +225,6 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter TimeHelper.customDateFormatForToastDateFormat(issueComment.getCreated_at())); - } else if(timeFormat.equals("normal")) { - - informationBuilder = new StringBuilder(TimeHelper.formatTime(issueComment.getCreated_at(), context.getResources().getConfiguration().locale, "normal", context)); + informationBuilder = new StringBuilder(TimeHelper.formatTime(issueComment.getCreated_at(), locale, "normal", context)); } if(!issueComment.getCreated_at().equals(issueComment.getUpdated_at())) { @@ -374,7 +352,6 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter void bindData(Issues issue) { TinyDB tinyDb = TinyDB.getInstance(context); - String locale = context.getResources().getConfiguration().locale.getLanguage(); + Locale locale = context.getResources().getConfiguration().locale; String timeFormat = tinyDb.getString("dateFormat"); int imgRadius = AppUtil.getPixelsFromDensity(context, 3); @@ -156,20 +156,20 @@ public class IssuesAdapter extends RecyclerView.Adapter switch(timeFormat) { case "pretty": { - PrettyTime prettyTime = new PrettyTime(new Locale(locale)); + PrettyTime prettyTime = new PrettyTime(locale); String createdTime = prettyTime.format(issue.getCreated_at()); this.issueCreatedTime.setText(createdTime); this.issueCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(issue.getCreated_at()), context)); break; } 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()); this.issueCreatedTime.setText(createdTime); break; } 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()); this.issueCreatedTime.setText(createdTime); break; diff --git a/app/src/main/java/org/mian/gitnex/adapters/MyReposListAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/MyReposListAdapter.java index 78902648..e8801a6d 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/MyReposListAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/MyReposListAdapter.java @@ -190,7 +190,7 @@ public class MyReposListAdapter extends RecyclerView.Adapter { - requireActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new SettingsFragment()).commit(); - Objects.requireNonNull(((MainActivity) requireActivity()).getSupportActionBar()).show(); - }); - - OnBackPressedCallback callback = new OnBackPressedCallback(true) { - @Override - public void handleOnBackPressed() { - requireActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new SettingsFragment()).commit(); - Objects.requireNonNull(((MainActivity) requireActivity()).getSupportActionBar()).show(); - } - }; - requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), callback); - - 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(); - } - -} diff --git a/app/src/main/java/org/mian/gitnex/fragments/ExploreIssuesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ExploreIssuesFragment.java index 180a8a90..47b414c4 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ExploreIssuesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ExploreIssuesFragment.java @@ -13,7 +13,7 @@ import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; 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.databinding.FragmentSearchIssuesBinding; import org.mian.gitnex.helpers.AppUtil; @@ -33,7 +33,7 @@ import retrofit2.Response; public class ExploreIssuesFragment extends Fragment { private FragmentSearchIssuesBinding viewBinding; - private SearchIssuesAdapter adapter; + private ExploreIssuesAdapter adapter; private List dataList; Context ctx; @@ -48,7 +48,7 @@ public class ExploreIssuesFragment extends Fragment { ctx = getContext(); dataList = new ArrayList<>(); - adapter = new SearchIssuesAdapter(dataList, ctx); + adapter = new ExploreIssuesAdapter(dataList, ctx); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(ctx); diff --git a/app/src/main/java/org/mian/gitnex/fragments/ExplorePublicOrganizationsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ExplorePublicOrganizationsFragment.java index d49de8b1..27a60b71 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ExplorePublicOrganizationsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ExplorePublicOrganizationsFragment.java @@ -15,7 +15,7 @@ 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.PublicOrganizationsAdapter; +import org.mian.gitnex.adapters.ExplorePublicOrganizationsAdapter; import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.databinding.FragmentOrganizationsBinding; import org.mian.gitnex.helpers.Authorization; @@ -37,7 +37,7 @@ public class ExplorePublicOrganizationsFragment extends Fragment { private FragmentOrganizationsBinding fragmentPublicOrgBinding; private List organizationsList; - private PublicOrganizationsAdapter adapter; + private ExplorePublicOrganizationsAdapter adapter; private Context context; private int pageSize; private final String TAG = Constants.publicOrganizations; @@ -68,7 +68,7 @@ public class ExplorePublicOrganizationsFragment extends Fragment { adapter.notifyDataChanged(); }, 200)); - adapter = new PublicOrganizationsAdapter(getContext(), organizationsList); + adapter = new ExplorePublicOrganizationsAdapter(getContext(), organizationsList); adapter.setLoadMoreListener(() -> fragmentPublicOrgBinding.recyclerView.post(() -> { if(organizationsList.size() == resultLimit || pageSize == resultLimit) { int page = (organizationsList.size() + resultLimit) / resultLimit; diff --git a/app/src/main/java/org/mian/gitnex/fragments/ExploreRepositoriesFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ExploreRepositoriesFragment.java index e09cbb05..980edc01 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ExploreRepositoriesFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ExploreRepositoriesFragment.java @@ -261,54 +261,21 @@ public class ExploreRepositoriesFragment extends Fragment { dialogFilterOptions.setContentView(view); filterBinding.includeTopic.setOnClickListener(includeTopic -> { - - if(filterBinding.includeTopic.isChecked()) { - - tinyDb.putBoolean("exploreRepoIncludeTopic", true); - } - else { - - tinyDb.putBoolean("exploreRepoIncludeTopic", false); - } + tinyDb.putBoolean("exploreRepoIncludeTopic", filterBinding.includeTopic.isChecked()); }); filterBinding.includeDesc.setOnClickListener(includeDesc -> { - - if(filterBinding.includeDesc.isChecked()) { - - tinyDb.putBoolean("exploreRepoIncludeDescription", true); - } - else { - - tinyDb.putBoolean("exploreRepoIncludeDescription", false); - } + tinyDb.putBoolean("exploreRepoIncludeDescription", filterBinding.includeDesc.isChecked()); }); filterBinding.includeTemplate.setOnClickListener(includeTemplate -> { - - if(filterBinding.includeTemplate.isChecked()) { - - tinyDb.putBoolean("exploreRepoIncludeTemplate", true); - } - else { - - tinyDb.putBoolean("exploreRepoIncludeTemplate", false); - } + tinyDb.putBoolean("exploreRepoIncludeTemplate", filterBinding.includeTemplate.isChecked()); }); filterBinding.onlyArchived.setOnClickListener(onlyArchived -> { - - if(filterBinding.onlyArchived.isChecked()) { - - tinyDb.putBoolean("exploreRepoOnlyArchived", true); - } - else { - - tinyDb.putBoolean("exploreRepoOnlyArchived", false); - } + tinyDb.putBoolean("exploreRepoOnlyArchived", filterBinding.onlyArchived.isChecked()); }); - filterBinding.includeTopic.setChecked(tinyDb.getBoolean("exploreRepoIncludeTopic")); filterBinding.includeDesc.setChecked(tinyDb.getBoolean("exploreRepoIncludeDescription")); filterBinding.includeTemplate.setChecked(tinyDb.getBoolean("exploreRepoIncludeTemplate")); diff --git a/app/src/main/java/org/mian/gitnex/fragments/RepoInfoFragment.java b/app/src/main/java/org/mian/gitnex/fragments/RepoInfoFragment.java index 3f14691d..64a62304 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/RepoInfoFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/RepoInfoFragment.java @@ -42,6 +42,7 @@ public class RepoInfoFragment extends Fragment { private LinearLayout pageContent; private static final String repoNameF = "param2"; private static final String repoOwnerF = "param1"; + private Locale locale; private FragmentRepoInfoBinding binding; @@ -74,17 +75,16 @@ public class RepoInfoFragment extends Fragment { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = FragmentRepoInfoBinding.inflate(inflater, container, false); - TinyDB tinyDb = TinyDB.getInstance(getContext()); - ctx = getContext(); + locale = getResources().getConfiguration().locale; pageContent = binding.repoInfoLayout; pageContent.setVisibility(View.GONE); binding.repoMetaFrame.setVisibility(View.GONE); - getRepoInfo(Authorization.get(getContext()), repoOwner, repoName, getResources().getConfiguration().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)); if(isExpandViewVisible()) { @@ -173,7 +173,7 @@ public class RepoInfoFragment extends Fragment { return binding.repoMetaFrame.getVisibility() == View.VISIBLE; } - private void getRepoInfo(String token, final String owner, String repo, final Locale 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()); diff --git a/app/src/main/java/org/mian/gitnex/fragments/SettingsFragment.java b/app/src/main/java/org/mian/gitnex/fragments/SettingsFragment.java index 68603d59..4541e9a4 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/SettingsFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/SettingsFragment.java @@ -1,8 +1,11 @@ package org.mian.gitnex.fragments; +import android.app.Dialog; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.Bundle; 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.SettingsSecurityActivity; import org.mian.gitnex.activities.SettingsTranslationActivity; +import org.mian.gitnex.databinding.CustomAboutDialogBinding; import org.mian.gitnex.databinding.FragmentSettingsBinding; +import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Version; @@ -32,6 +37,7 @@ public class SettingsFragment extends Fragment { private Context ctx; private TinyDB tinyDB; + private Dialog aboutAppDialog; @Nullable @Override @@ -41,6 +47,7 @@ public class SettingsFragment extends Fragment { ctx = getContext(); tinyDB = TinyDB.getInstance(ctx); + aboutAppDialog = new Dialog(ctx); ((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.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(); + } + 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() { try { - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + requireActivity().getPackageName()))); } catch(ActivityNotFoundException e) { - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + requireActivity().getPackageName()))); } } @Override public void onResume() { - super.onResume(); if(tinyDB.getBoolean("refreshParent")) { - requireActivity().recreate(); requireActivity().overridePendingTransition(0, 0); tinyDB.putBoolean("refreshParent", false); } } - } diff --git a/app/src/main/java/org/mian/gitnex/helpers/ssl/MemorizingTrustManager.java b/app/src/main/java/org/mian/gitnex/helpers/ssl/MemorizingTrustManager.java index cc5161c0..78db04ec 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/ssl/MemorizingTrustManager.java +++ b/app/src/main/java/org/mian/gitnex/helpers/ssl/MemorizingTrustManager.java @@ -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") .append(c.getSubjectDN().toString()) .append("\n") - .append(validityDateFormater.format(c.getNotBefore())) + .append(validityDateFormatter.format(c.getNotBefore())) .append(" - ") - .append(validityDateFormater.format(c.getNotAfter())) + .append(validityDateFormatter.format(c.getNotAfter())) .append("\nSHA-256: ") .append(certHash(c, "SHA-256")) .append("\nSHA-1: ") diff --git a/app/src/main/java/org/mian/gitnex/viewmodels/FilesViewModel.java b/app/src/main/java/org/mian/gitnex/viewmodels/FilesViewModel.java index aa6eabb0..9a6cb1f3 100644 --- a/app/src/main/java/org/mian/gitnex/viewmodels/FilesViewModel.java +++ b/app/src/main/java/org/mian/gitnex/viewmodels/FilesViewModel.java @@ -42,39 +42,23 @@ public class FilesViewModel extends ViewModel { .getFiles(token, owner, repo, ref); call.enqueue(new Callback>() { - @Override public void onResponse(@NonNull Call> call, @NonNull Response> response) { - if (response.code() == 200) { - - assert response.body() != null; - - 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); - } + if(response.isSuccessful() && response.body() != null && !response.body().isEmpty()) { + Collections.sort(response.body(), (byType1, byType2) -> byType1.getType().compareTo(byType2.getType())); + filesList.postValue(response.body()); } else { - progressBar.setVisibility(View.GONE); noDataFiles.setVisibility(View.VISIBLE); } - } @Override public void onFailure(@NonNull Call> call, @NonNull Throwable t) { - Toasty.error(ctx, ctx.getString(R.string.errorOnLogin)); } - }); } @@ -93,27 +77,14 @@ public class FilesViewModel extends ViewModel { .getDirFiles(token, owner, repo, filesDir, ref); call.enqueue(new Callback>() { - @Override public void onResponse(@NonNull Call> call, @NonNull Response> response) { - if (response.code() == 200) { - - assert response.body() != null; - - 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); - } + if(response.isSuccessful() && response.body() != null && !response.body().isEmpty()) { + Collections.sort(response.body(), (byType1, byType2) -> byType1.getType().compareTo(byType2.getType())); + filesList2.postValue(response.body()); } else { - progressBar.setVisibility(View.GONE); noDataFiles.setVisibility(View.VISIBLE); } @@ -121,10 +92,8 @@ public class FilesViewModel extends ViewModel { @Override public void onFailure(@NonNull Call> call, @NonNull Throwable t) { - Toasty.error(ctx, ctx.getString(R.string.errorOnLogin)); } - }); } diff --git a/app/src/main/res/layout/custom_about_dialog.xml b/app/src/main/res/layout/custom_about_dialog.xml new file mode 100644 index 00000000..73be47b3 --- /dev/null +++ b/app/src/main/res/layout/custom_about_dialog.xml @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +