Compare commits

..

68 Commits

Author SHA1 Message Date
0cbce9d291 3.5.1 release (#872)
3.5.1 release

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/872
Co-Authored-By: M M Arif <mmarif@noreply.codeberg.org>
Co-Committed-By: M M Arif <mmarif@noreply.codeberg.org>
2021-04-01 08:22:02 +02:00
16d11f591b Translation updates (#870)
Tr updates

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/870
Co-Authored-By: M M Arif <mmarif@noreply.codeberg.org>
Co-Committed-By: M M Arif <mmarif@noreply.codeberg.org>
2021-04-01 07:59:02 +02:00
6572a6d334 [Backport] Launch Toasts on UI thread. (#869)
[Backport] Launch Toasts on UI thread.

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/869
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: opyale <opyale@noreply.codeberg.org>
Co-Committed-By: opyale <opyale@noreply.codeberg.org>
2021-03-31 19:42:15 +02:00
756ee398ff [Backport] Fixing crash on ProfileFragment (#867)
[Backport] Fixing crash on ProfileFragment

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/867
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: opyale <opyale@noreply.codeberg.org>
Co-Committed-By: opyale <opyale@noreply.codeberg.org>
2021-03-31 19:20:05 +02:00
7c7db79af5 [Backport] Fix lock icon for repos (#866)
Fix lock icon for repos

Fix layout

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/866
Reviewed-by: opyale <opyale@noreply.codeberg.org>
Co-Authored-By: M M Arif <mmarif@noreply.codeberg.org>
Co-Committed-By: M M Arif <mmarif@noreply.codeberg.org>
2021-03-31 19:09:42 +02:00
3c8ed2042a [Backport] Fall back to plain text if syntax highlighting fails. (#858)
[Backport] Fall back to plain text if syntax highlighting fails.

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/858
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: opyale <opyale@noreply.codeberg.org>
Co-Committed-By: opyale <opyale@noreply.codeberg.org>
2021-03-30 17:18:33 +02:00
f43b92186c Fix ACRA and workmanager errors (#855)
Move acra

Fix ACRA and workmanager errors

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/855
Reviewed-by: opyale <opyale@noreply.codeberg.org>
Co-Authored-By: M M Arif <mmarif@noreply.codeberg.org>
Co-Committed-By: M M Arif <mmarif@noreply.codeberg.org>
2021-03-30 16:31:23 +02:00
b3c4ae9e18 Release 3.5.0 2021-03-22 00:36:05 +05:00
0b8d8618ed Update French (#849)
Update French

Co-authored-by: 6543 <6543@obermui.de>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/849
Reviewed-by: opyale <opyale@noreply.codeberg.org>
Co-Authored-By: 6543 <6543@noreply.codeberg.org>
Co-Committed-By: 6543 <6543@noreply.codeberg.org>
2021-03-21 20:14:01 +01:00
62ce30db23 Crowdin 2020-03-21 (#848)
Co-authored-by: 6543 <6543@obermui.de>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/848
Reviewed-by: opyale <opyale@noreply.codeberg.org>
Co-Authored-By: 6543 <6543@noreply.codeberg.org>
Co-Committed-By: 6543 <6543@noreply.codeberg.org>
2021-03-21 19:57:34 +01:00
dc29a31e63 Replacing highlightJS with custom view due to performance issues and high file sizes. (#837)
Fixing crash and minor improvements.

Add ".properties" and ".ini" formats.

Increase surface area of files list item.

Fixing issue where some source code is not visible.

Replacing highlightJS with custom view due to performance issues and high file sizes.

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/837
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Reviewed-by: 6543 <6543@noreply.codeberg.org>
Co-Authored-By: opyale <opyale@noreply.codeberg.org>
Co-Committed-By: opyale <opyale@noreply.codeberg.org>
2021-03-21 19:26:28 +01:00
98cf1a1976 Improve file type handling. (#841)
Removing file size selection dialog in favor of hardcoded value.

Adding warning to file size picker and minor improvements.

Bump dependencies and gradle

Merge branch 'master' of https://codeberg.org/gitnex/GitNex into improve-filetype-recognition

Improving credits, adding symlink and submodule icons to FilesAdapter and removing unused libraries.

Minor improvements and bug fixes.

Add true progress indication routine for copying streams.

Merge branch 'master' of https://codeberg.org/gitnex/GitNex into improve-filetype-recognition

Performance and memory usage improvements

Notification improvements

Renaming StaticGlobalVariables to Constants

Overall improvements and fixes.

Merge branch 'master' of https://codeberg.org/gitnex/GitNex into improve-filetype-recognition

Add additional image formats.

Adding audio and video categories.

Merge branch 'master' of https://codeberg.org/gitnex/GitNex into improve-filetype-recognition

Improve file type handling.

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/841
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: opyale <opyale@noreply.codeberg.org>
Co-Committed-By: opyale <opyale@noreply.codeberg.org>
2021-03-21 16:56:54 +01:00
ef3108db14 Crowdin 2021-03-18 (#845)
Crowdin 2021-03-18

Co-authored-by: 6543 <6543@obermui.de>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/845
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: 6543 <6543@noreply.codeberg.org>
Co-Committed-By: 6543 <6543@noreply.codeberg.org>
2021-03-18 11:48:54 +01:00
f1c88921bc Update readme (#844)
add line for used trademarks

update readme

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/844
Reviewed-by: opyale <opyale@noreply.codeberg.org>
Co-Authored-By: M M Arif <mmarif@noreply.codeberg.org>
Co-Committed-By: M M Arif <mmarif@noreply.codeberg.org>
2021-03-10 13:05:07 +01:00
fb0bd0299c Disable cancel repo settings dialogs (#843)
Merge branch 'master' into disable-dialog-close-repo-settings

Disable cancel repo settings dialogs

Co-authored-by: opyale <opyale@noreply.codeberg.org>
Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/843
Reviewed-by: opyale <opyale@noreply.codeberg.org>
Co-Authored-By: M M Arif <mmarif@noreply.codeberg.org>
Co-Committed-By: M M Arif <mmarif@noreply.codeberg.org>
2021-03-09 22:21:42 +01:00
c353275ab8 Biometric support (#820)
Minor improvements.

Merge branch 'master' into biometric-support

# Conflicts:
#	app/src/main/res/values/strings.xml

Merge branch 'master' into biometric-support

Merge branch 'master' into biometric-support

UI transition improvements

check for older version(android 6+), support for android 10 and below

Fix material lib builds with new version

Merge branch 'biometric-support' of codeberg.org:gitnex/GitNex into biometric-support

Merge branch 'master' into biometric-support

# Conflicts:
#	app/src/main/java/org/mian/gitnex/activities/BaseActivity.java
#	app/src/main/res/values/strings.xml

Merge branch 'master' into biometric-support

Merge branch 'master' into biometric-support

Merge branch 'master' into biometric-support

set status to false

Merge branch 'master' into biometric-support

check for bimetric status on device

Merge branch 'master' of https://codeberg.org/gitnex/GitNex into biometric-support

close app if back button or cancel is clicked

Enable/disable and show biometric auth dialog

Layout

Co-authored-by: opyale <opyale@noreply.codeberg.org>
Co-authored-by: M M Arif <mmarif@swatian.com>
Co-authored-by: 6543 <6543@noreply.codeberg.org>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/820
Reviewed-by: opyale <opyale@noreply.codeberg.org>
Co-Authored-By: M M Arif <mmarif@noreply.codeberg.org>
Co-Committed-By: M M Arif <mmarif@noreply.codeberg.org>
2021-03-09 22:15:42 +01:00
328dbaa01c Copy user id to clipboard (#840)
Co-Authored-By: M M Arif <mmarif@noreply.codeberg.org>
Co-Committed-By: M M Arif <mmarif@noreply.codeberg.org>
2021-03-05 06:24:48 +01:00
ff915f1813 Make singletons threadsafe. (#838)
Merge branch 'master' into threadsafe-singletons

Make singletons threadsafe.

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/838
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: opyale <opyale@noreply.codeberg.org>
Co-Committed-By: opyale <opyale@noreply.codeberg.org>
2021-03-03 15:10:23 +01:00
77e39952c1 Crowdin 2021-03-03 (#839)
Crowdin 2021-03-03

Co-authored-by: 6543 <6543@obermui.de>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/839
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: 6543 <6543@noreply.codeberg.org>
Co-Committed-By: 6543 <6543@noreply.codeberg.org>
2021-03-03 10:27:49 +01:00
afffb7c15a Switch to proper account for popular instances and other ui improvements (#836)
* improve navigation via keyboard

* switch to proper account for popular instances

* ui improvements

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/836
Reviewed-by: 6543 <6543@noreply.codeberg.org>
Co-Authored-By: M M Arif <mmarif@noreply.codeberg.org>
Co-Committed-By: M M Arif <mmarif@noreply.codeberg.org>
2021-02-25 00:22:11 +01:00
47d6c68410 Improve files ui and bug fix encoding in names (#834)
Minor UI and performance improvements.

use one image and remove relativelayout

Fix html codes in name, fix org fragment tab count to load Members

Improve files ui

Co-authored-by: opyale <opyale@noreply.codeberg.org>
Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/834
Reviewed-by: opyale <opyale@noreply.codeberg.org>
Co-Authored-By: M M Arif <mmarif@noreply.codeberg.org>
Co-Committed-By: M M Arif <mmarif@noreply.codeberg.org>
2021-02-21 23:15:46 +01:00
57ce453661 Fixing bug where path separators would be URL encoded. (#832)
Merge branch 'master' of https://codeberg.org/gitnex/GitNex into fix-path-encoding-issues

Fixing bug where path separators would be URL encoded.

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/832
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: opyale <opyale@noreply.codeberg.org>
Co-Committed-By: opyale <opyale@noreply.codeberg.org>
2021-02-17 14:51:20 +01:00
d8a14105c9 Fixing and improving scaling of images, improving performance by doing work that has to be done once only once and using different terminology. (#831)
remove unknown case for editing

Improve var names and code formatting

Minor improvements.

Restoring ACRA functionality.

Fixing and improving scaling of images, improving performance by doing work that has to be done once only once and using different terminology.

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/831
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: opyale <opyale@noreply.codeberg.org>
Co-Committed-By: opyale <opyale@noreply.codeberg.org>
2021-02-13 20:31:38 +01:00
711711274e Fix canvas too large crash (#830)
fix crash by scaling the image resolution

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/830
Reviewed-by: 6543 <6543@noreply.codeberg.org>
Co-Authored-By: M M Arif <mmarif@noreply.codeberg.org>
Co-Committed-By: M M Arif <mmarif@noreply.codeberg.org>
2021-02-12 23:16:29 +01:00
44b8ad8d1c Add crowdin-cli config template (#827)
Add example crowdin Config

„crowdin.yml“ ändern

now able to upload new strings.xml file

add crowdin config (without API key)

Co-authored-by: 6543 <6543@obermui.de>
Co-authored-by: 6543 <6543@noreply@gitea.io>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/827
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: 6543 <6543@noreply.codeberg.org>
Co-Committed-By: 6543 <6543@noreply.codeberg.org>
2021-02-12 10:30:02 +01:00
fc49e29703 Crowdin 2021-02-11 (#828)
Crowdin 2021-02-11

Co-authored-by: 6543 <6543@obermui.de>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/828
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: 6543 <6543@noreply.codeberg.org>
Co-Committed-By: 6543 <6543@noreply.codeberg.org>
2021-02-12 10:29:04 +01:00
7f8595defc Fixing theme issues in RepoStargazersActivity. (#825)
Merge branch 'master' into fixing-theme-on-stargazers

Fixing theme issues in RepoStargazersActivity.

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/825
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: opyale <opyale@noreply.codeberg.org>
Co-Committed-By: opyale <opyale@noreply.codeberg.org>
2021-02-11 14:40:06 +01:00
eb858f3535 Moving ApiInterface, WebInterface and models to different repository. (#824)
Gradle v6.8.2

Use release instead of commit hash.

Moving ApiInterface, WebInterface and models to different repository.

Co-authored-by: 6543 <6543@obermui.de>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/824
Reviewed-by: 6543 <6543@noreply.codeberg.org>
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: opyale <opyale@noreply.codeberg.org>
Co-Committed-By: opyale <opyale@noreply.codeberg.org>
2021-02-11 11:23:35 +01:00
29653cade2 Calling overloaded method first. (#823)
Calling overloaded method first.

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/823
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: opyale <opyale@noreply.codeberg.org>
Co-Committed-By: opyale <opyale@noreply.codeberg.org>
2021-02-09 13:51:13 +01:00
d72cd57cd7 Cron tasks (#817)
* Run task

* Add info popup dialog for details

* List cron tasks

* Add cron to admin screen

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/817
Reviewed-by: 6543 <6543@noreply.codeberg.org>
Co-Authored-By: M M Arif <mmarif@noreply.codeberg.org>
Co-Committed-By: M M Arif <mmarif@noreply.codeberg.org>
2021-02-04 04:47:00 +01:00
cb241d80f3 Fix crash on creating new file (#819)
Allow multi line text in desc inputs

Minor improvements.

Improving the selection of branches.

Default to first branch in spinner.

Minor improvements.

fix crash on creating new file

Co-authored-by: M M Arif <mmarif@swatian.com>
Co-authored-by: opyale <opyale@noreply.codeberg.org>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/819
Reviewed-by: opyale <opyale@noreply.codeberg.org>
Co-Authored-By: M M Arif <mmarif@noreply.codeberg.org>
Co-Committed-By: M M Arif <mmarif@noreply.codeberg.org>
2021-02-01 19:13:48 +01:00
3c381f372e Add execution permissions for script. (#815)
Add execution permissions for script.

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/815
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: opyale <opyale@noreply.codeberg.org>
Co-Committed-By: opyale <opyale@noreply.codeberg.org>
2021-01-27 10:00:18 +01:00
2398995928 Update nextcloud image. (#814)
Update nextcloud image.

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/814
Reviewed-by: 6543 <6543@noreply.codeberg.org>
Co-Authored-By: opyale <opyale@noreply.codeberg.org>
Co-Committed-By: opyale <opyale@noreply.codeberg.org>
2021-01-27 05:01:56 +01:00
7faf800d02 Changing docker image. (#813)
Changing docker image.

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/813
Reviewed-by: 6543 <6543@noreply.codeberg.org>
Co-Authored-By: opyale <opyale@noreply.codeberg.org>
Co-Committed-By: opyale <opyale@noreply.codeberg.org>
2021-01-27 00:24:50 +01:00
d0c06a65f4 Add tool to set commit status. (#812)
Add tool to set commit status.

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/812
Reviewed-by: 6543 <6543@noreply.codeberg.org>
Co-Authored-By: opyale <opyale@noreply.codeberg.org>
Co-Committed-By: opyale <opyale@noreply.codeberg.org>
2021-01-26 23:21:47 +01:00
20b203c4ad Render emoji in issue/pr titles, commit msg and markdown files (#805)
Merge branch 'master' into render-emoji-in-titles

Merge branch 'master' into render-emoji-in-titles

Merge branch 'master' into render-emoji-in-titles

# Conflicts:
#	app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java
#	app/src/main/java/org/mian/gitnex/adapters/IssuesAdapter.java
#	app/src/main/java/org/mian/gitnex/adapters/PullRequestsAdapter.java

Render emoji in issue/pr titles, commit msg and markdown files

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/805
Reviewed-by: opyale <opyale@noreply.codeberg.org>
Co-Authored-By: M M Arif <mmarif@noreply.codeberg.org>
Co-Committed-By: M M Arif <mmarif@noreply.codeberg.org>
2021-01-26 18:53:59 +01:00
b02c87b143 Support hx and ts files (#811)
Support hx and ts files

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/811
Reviewed-by: opyale <opyale@noreply.codeberg.org>
Co-Authored-By: M M Arif <mmarif@noreply.codeberg.org>
Co-Committed-By: M M Arif <mmarif@noreply.codeberg.org>
2021-01-26 18:48:24 +01:00
093204df43 Fixing layout issues and crashes. (#810)
Fixing layout issues and crashes.

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/810
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: opyale <opyale@noreply.codeberg.org>
Co-Committed-By: opyale <opyale@noreply.codeberg.org>
2021-01-26 18:43:25 +01:00
a26737e510 Rewriting deprecated code and adding view bindings to all fragments and activities. (#809)
Remove jetbrain import

Merge branch 'master' into deprecations

View bindings #3

View bindings #2

View bindings #1

Rewriting deprecated code.

Co-authored-by: M M Arif <mmarif@swatian.com>
Co-authored-by: M M Arif <mmarif@noreply.codeberg.org>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/809
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: opyale <opyale@noreply.codeberg.org>
Co-Committed-By: opyale <opyale@noreply.codeberg.org>
2021-01-26 16:10:31 +01:00
371649b8ca Adding ProGuard rules to improve performance on low-spec devices. (#808)
Fixing failing build.

Bumping dependencies.

Adding ProGuard rules to improve performance on low-spec devices.

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/808
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: opyale <opyale@noreply.codeberg.org>
Co-Committed-By: opyale <opyale@noreply.codeberg.org>
2021-01-26 15:08:55 +01:00
8c62ecadbc Fix crash for offline mode org labels (#804)
Merge branch 'master' into fix-offline-org-labels

Fix crash for offline mode org labels

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/804
Reviewed-by: opyale <opyale@noreply.codeberg.org>
Co-Authored-By: M M Arif <mmarif@noreply.codeberg.org>
Co-Committed-By: M M Arif <mmarif@noreply.codeberg.org>
2021-01-14 18:42:35 +01:00
b75bf84d43 Rewriting deprecated code and improving offline mode. (#800)
Moving UI-related code to message queue of main thread.

Removing NetworkObserver in favor of NetworkStatusObserver

Some fixes.

Removing deprecated PreferenceManager.

Fixing crash.

Merge branch 'master' of https://codeberg.org/gitnex/GitNex into fix-performance-regression

 Conflicts:
	app/src/main/java/org/mian/gitnex/clients/RetrofitClient.java

Rewriting deprecated code.

Improving degraded performance due to unnecessary object allocation.

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/800
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: opyale <opyale@noreply.codeberg.org>
Co-Committed-By: opyale <opyale@noreply.codeberg.org>
2021-01-14 17:33:50 +01:00
5d2bb02b2d Improving degraded performance due to unnecessary object allocation. (#799)
Improving degraded performance due to unnecessary object allocation.

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/799
Reviewed-by: 6543 <6543@noreply.codeberg.org>
Co-Authored-By: opyale <opyale@noreply.codeberg.org>
Co-Committed-By: opyale <opyale@noreply.codeberg.org>
2021-01-01 18:30:30 +01:00
fef1597522 dev-3.5.0 (#798)
fix typo

start dev of 3.5.0

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/798
Co-Authored-By: M M Arif <mmarif@noreply.codeberg.org>
Co-Committed-By: M M Arif <mmarif@noreply.codeberg.org>
2021-01-01 12:57:16 +01:00
1f9a3eb85d Crowdin 2020-12-31 (#795)
CI.restart()

Crowdin 2020-12-31

Co-authored-by: 6543 <6543@obermui.de>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/795
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: 6543 <6543@noreply.codeberg.org>
Co-Committed-By: 6543 <6543@noreply.codeberg.org>
2020-12-31 16:55:13 +01:00
a51ba4f2a8 Fix offline mode (#794)
Closes #790

update libs

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/794
Reviewed-by: 6543 <6543@noreply.codeberg.org>
Co-Authored-By: M M Arif <mmarif@noreply.codeberg.org>
Co-Committed-By: M M Arif <mmarif@noreply.codeberg.org>
2020-12-31 15:38:18 +01:00
4c4a7376cb Uppdate Supported Gitea Version Range (#793)
Uppdate Supported Gitea Versins

Co-authored-by: 6543 <6543@obermui.de>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/793
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
Co-Authored-By: 6543 <6543@noreply.codeberg.org>
Co-Committed-By: 6543 <6543@noreply.codeberg.org>
2020-12-15 08:57:47 +01:00
bbbcb56b98 Organization labels (#771)
List, Create, Edit & Delete OrgLabels

Co-authored-by: M M Arif <mmarif@swatian.com>
Co-authored-by: 6543 <6543@obermui.de>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/771
Reviewed-by: 6543 <6543@noreply.codeberg.org>
2020-11-30 23:20:14 +01:00
b871a1fb22 Removing left-over space in case no reactions are available (#782)
update gradle

Removing left-over space in case no reactions are available.

Co-authored-by: 6543 <6543@obermui.de>
Co-authored-by: 6543 <6543@noreply.codeberg.org>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/782
Reviewed-by: 6543 <6543@noreply.codeberg.org>
2020-11-30 00:26:01 +01:00
f2bc81210c Cap sentence start letters where necessary in input fields (#786)
Cap sentence start letters where necessary in input fields

Co-authored-by: 6543 <6543@noreply.codeberg.org>
Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/786
Reviewed-by: 6543 <6543@noreply.codeberg.org>
2020-11-29 23:41:44 +01:00
a6e97a1b36 Add new theme - Pitch Black (#787)
update drawables

Add new theme - Pitch Black

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/787
Reviewed-by: 6543 <6543@noreply.codeberg.org>
2020-11-29 22:51:35 +01:00
2ebcdf9186 Kick start dev of 3.4.0 (#781)
Kick start development of 3.4.0

Release 3.3.0

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/781
2020-11-18 08:25:34 +01:00
272fc78df9 [Frontport] Fix add new account (#779)
Fix add new account

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/779
Reviewed-by: 6543 <6543@noreply.codeberg.org>
2020-11-17 19:56:16 +01:00
3aa819f3ef [Frontport] Fix date and minor ui improvements (#774)
Fix date and minor ui improvements

Co-authored-by: 6543 <6543@noreply.codeberg.org>
Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/774
Reviewed-by: 6543 <6543@noreply.codeberg.org>
2020-11-17 05:40:58 +01:00
e9fa2984a1 Update Translations 2020-11-16 (#775)
Update Translations 2020-11-16

Co-authored-by: 6543 <6543@obermui.de>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/775
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
2020-11-16 14:13:43 +01:00
240cdf5701 Fix pr pagination (#770)
links improvement

Fix button alignment in polling delay popup

Fix pr pagination

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/770
2020-11-13 16:04:43 +01:00
a170c10e43 Improve deeplinks (#769)
Change to mainIntent

Add commit to deep links

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/769
2020-11-13 16:04:14 +01:00
d11da92fc4 Fixing missing emotes. (#768)
switch to tagged version (v5.1.2)

Using JitPack for artifact instead.

Fixing missing emotes.

Co-authored-by: 6543 <6543@obermui.de>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/768
Reviewed-by: 6543 <6543@noreply.codeberg.org>
2020-11-08 23:57:33 +01:00
3b53111981 3.3.0 rc3 release (#766)
3.3.0 rc3 release

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/766
2020-11-08 20:09:29 +01:00
ade7b797f1 Add Issue/Comment Reactions (#557)
Minor performance improvements.

Merge branch 'master' of https://codeberg.org/gitnex/GitNex into issue-reactions

Improving color of selected elements.

First, fully working implementation of reactions.

Merge branch 'master' of https://codeberg.org/gitnex/GitNex into issue-reactions

 Conflicts:
	app/src/main/res/layout/bottom_sheet_issue_comments.xml
	app/src/main/res/layout/list_issue_comments.xml

(Hopefully) fixing merge issues.

Merge branch 'master' of https://codeberg.org/gitnex/GitNex into issue-reactions

 Conflicts:
	app/src/main/java/org/mian/gitnex/interfaces/ApiInterface.java
	app/src/main/res/layout/activity_issue_detail.xml
	app/src/main/res/layout/bottom_sheet_issue_comments.xml
	app/src/main/res/layout/bottom_sheet_single_issue.xml
	app/src/main/res/values/colors.xml

Moving reactions below time frame on comments.

Merge branch 'master' into layout-reactions

Add IssueReactions

Merge remote-tracking branch 'origin/layout-reactions' into layout-reactions

Merge branch 'master' of https://gitea.com/gitnex/GitNex into layout-reactions

Merge branch 'master' into layout-reactions

Applying to pulls and issues.

Merge branch 'master' of https://gitea.com/gitnex/GitNex into layout-reactions

Providing external layouts.

Some improvements.

Adding comment emote indications.

Adding circle around emotes.

Adding some padding.

First tests.

Co-authored-by: opyale <opyale@noreply.gitea.io>
Co-authored-by: 6543 <6543@obermui.de>
Co-authored-by: 6543 <6543@noreply.gitea.io>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/557
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
2020-11-08 19:58:47 +01:00
f97f668363 Improve nav drawer lag (#765)
Improve drawer nav lagginess

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/765
Reviewed-by: opyale <opyale@noreply.codeberg.org>
2020-11-06 02:09:34 +01:00
639cf51027 Org level labels in issue labels (#763)
Adding null checks.

Minor cleanups.

Merge branch 'master' into org-labels-in-issue

Fix repo size

Add new instances

Merge branch 'master' into org-labels-in-issue

Add org level labels to issue labels

Co-authored-by: opyale <opyale@noreply.codeberg.org>
Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/763
Reviewed-by: opyale <opyale@noreply.codeberg.org>
2020-11-05 13:10:17 +01:00
a92da6a6d4 Improve notifications (#764)
Moving translation.

Adding option to enable/disable notifications.

Fix typos

Improve notifications

Co-authored-by: opyale <opyale@noreply.codeberg.org>
Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/764
Reviewed-by: opyale <opyale@noreply.codeberg.org>
2020-11-03 20:14:24 +01:00
87379ae0b2 Refactor deeplinks (#762)
Minor improvements.

refactor deeplinks

Add popular instances taken from #758

Co-authored-by: opyale <opyale@noreply.codeberg.org>
Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/762
Reviewed-by: 6543 <6543@noreply.codeberg.org>
Reviewed-by: opyale <opyale@noreply.codeberg.org>
2020-11-02 18:01:06 +01:00
43166237ee Adding link to CI. (#761)
Adding link to CI.

Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/761
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
2020-11-02 16:25:45 +01:00
a3bd5c2af2 Increasing performance, fixing bugs and adding syntax highlighting. (#755)
Merge branch 'performance-highlight-refactor' of https://codeberg.org/opyale/GitNex into performance-highlight-refactor

Fixing theme recognition.

Merge branch 'master' into performance-highlight-refactor

Merge commit 'refs/pull/755/head' of codeberg.org:gitnex/GitNex into performance-highlight-refactor

Add new field issueType to db

Improving theme recognition.

Fixing alignment of menu button.

Fixing cut off text.

Merge commit 'refs/pull/755/head' of codeberg.org:gitnex/GitNex into performance-highlight-refactor

Fixing crash.

Refactoring activities.

Improving drafts.

Calculating density for avatars.

Improving drafts.

Calculating density for avatars.

Increasing size of avatar.

Decreasing size of avatar.

Restoring DeepLinksActivity

Merge branch 'master' of https://codeberg.org/gitnex/GitNex into performance-highlight-refactor

 Conflicts:
	app/src/main/java/org/mian/gitnex/adapters/IssueCommentsAdapter.java

Initial commit.

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/755
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
2020-11-02 16:17:00 +01:00
0f5858f292 Compress PNG (#759)
Compress PNG

Co-authored-by: 6543 <6543@obermui.de>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/759
Reviewed-by: M M Arif <mmarif@noreply.codeberg.org>
2020-11-02 16:01:59 +01:00
dcec158076 Remove liberapay (#754)
remove about screen

remove liberapay

Co-authored-by: M M Arif <mmarif@swatian.com>
Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/754
2020-10-30 16:12:13 +01:00
430 changed files with 10120 additions and 13612 deletions

3
.gitignore vendored
View File

@ -195,3 +195,6 @@ crowdin.yml
!/gradle/wrapper/gradle-wrapper.jar !/gradle/wrapper/gradle-wrapper.jar
# End of https://www.gitignore.io/api/android,androidstudio # End of https://www.gitignore.io/api/android,androidstudio
# Crowdin Config
crowdin.yml

View File

@ -1,20 +1,23 @@
stages: stages:
- test
- build - build
- sign - sign
- publish - publish
test: on_setup:
image: nextcloudci/android:android-49 image: tutum/curl
stage: test stage: .pre
only: only:
- master - master
- tags - tags
variables:
INSTANCE: "https://codeberg.org"
MAIN_REPO: gitnex/GitNex
STATE: pending
script: script:
- ./gradlew test - ./scripts/add-commit-status.sh
build: build:
image: nextcloudci/android:android-49 image: nextcloudci/android:android-54
stage: build stage: build
only: only:
- master - master
@ -27,7 +30,7 @@ build:
expire_in: 15 minutes expire_in: 15 minutes
sign: sign:
image: nextcloudci/android:android-49 image: nextcloudci/android:android-54
stage: sign stage: sign
only: only:
- master - master
@ -67,3 +70,31 @@ release:
script: script:
- "[[ $CI_COMMIT_REF_NAME == *'-rc'* ]] && echo 'Upload blocked. Build seems to be a release candidate.' && exit 0" - "[[ $CI_COMMIT_REF_NAME == *'-rc'* ]] && echo 'Upload blocked. Build seems to be a release candidate.' && exit 0"
- curl -T "$PLUGIN_FILE" -u "$WEBDAV_USERNAME":"$WEBDAV_PASSWORD" 'https://cloud.swatian.com/remote.php/dav/files/GitNexBot/gitnex/releases/'"$CI_COMMIT_REF_NAME"'.apk' - curl -T "$PLUGIN_FILE" -u "$WEBDAV_USERNAME":"$WEBDAV_PASSWORD" 'https://cloud.swatian.com/remote.php/dav/files/GitNexBot/gitnex/releases/'"$CI_COMMIT_REF_NAME"'.apk'
on_success:
image: tutum/curl
stage: .post
only:
- master
- tags
variables:
INSTANCE: "https://codeberg.org"
MAIN_REPO: gitnex/GitNex
STATE: success
script:
- ./scripts/add-commit-status.sh
when: on_success
on_failure:
image: tutum/curl
stage: .post
only:
- master
- tags
variables:
INSTANCE: "https://codeberg.org"
MAIN_REPO: gitnex/GitNex
STATE: failure
script:
- ./scripts/add-commit-status.sh
when: on_failure

View File

@ -19,9 +19,18 @@
<JetCodeStyleSettings> <JetCodeStyleSettings>
<option name="PACKAGES_TO_USE_STAR_IMPORTS"> <option name="PACKAGES_TO_USE_STAR_IMPORTS">
<value> <value>
<package name="java.util" withSubpackages="false" static="false" /> <package name="java.util" alias="false" withSubpackages="false" />
<package name="kotlinx.android.synthetic" withSubpackages="true" static="false" /> <package name="kotlinx.android.synthetic" alias="false" withSubpackages="true" />
<package name="io.ktor" withSubpackages="true" static="false" /> <package name="io.ktor" alias="false" withSubpackages="true" />
</value>
</option>
<option name="PACKAGES_IMPORT_LAYOUT">
<value>
<package name="" alias="false" withSubpackages="true" />
<package name="java" alias="false" withSubpackages="true" />
<package name="javax" alias="false" withSubpackages="true" />
<package name="kotlin" alias="false" withSubpackages="true" />
<package name="" alias="true" withSubpackages="true" />
</value> </value>
</option> </option>
</JetCodeStyleSettings> </JetCodeStyleSettings>

View File

@ -1,12 +1,12 @@
[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) ![Pipeline status](https://img.shields.io/gitlab/pipeline/opyale/gitnex/master) [![Release](https://img.shields.io/badge/dynamic/json.svg?label=release&url=https://codeberg.org/api/v1/repos/gitnex/GitNex/releases&query=$[0].tag_name)](https://codeberg.org/gitnex/GitNex/releases) [![Crowdin](https://badges.crowdin.net/gitnex/localized.svg)](https://crowdin.com/project/gitnex) [![Join the Discord chat at https://discord.gg/FbSS4rf](https://img.shields.io/discord/632219664587685908.svg)](https://discord.gg/FbSS4rf) [![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)
[<img alt="Become a Patroen" src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" height="40"/>](https://www.patreon.com/mmarif) [<img alt="Donate using Liberapay" src="https://liberapay.com/assets/widgets/donate.svg" height="40"/>](https://liberapay.com/mmarif/donate) [<img alt="Become a Patroen" src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" height="40"/>](https://www.patreon.com/mmarif)
# GitNex - Android client for Gitea # GitNex - Android client for Gitea
GitNex is a free/paid, open-source Android client for Git repository management tool Gitea. Gitea is a community managed fork of Gogs, lightweight code hosting solution written in Go. GitNex is a free/paid, open-source Android client for Git repository management tool Gitea. Gitea is a community managed fork of Gogs, lightweight code hosting solution written in Go.
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. 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 ## Downloads
[<img alt='Get it on F-droid' src='https://gitlab.com/fdroid/artwork/raw/master/badge/get-it-on.png' height="80"/>](https://f-droid.org/en/packages/org.mian.gitnex/) [<img alt='Get it on F-droid' src='https://gitlab.com/fdroid/artwork/raw/master/badge/get-it-on.png' height="80"/>](https://f-droid.org/en/packages/org.mian.gitnex/)
@ -52,10 +52,6 @@ We use [Crowdin](https://crowdin.com/project/gitnex) for translation. If your la
---|---|---|--- ---|---|---|---
<img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/005.png" alt="005.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/006.png" alt="006.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/007.png" alt="007.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/008.png" alt="008.png" width="200"/> <img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/005.png" alt="005.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/006.png" alt="006.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/007.png" alt="007.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/008.png" alt="008.png" width="200"/>
## FAQ
[Faq](https://codeberg.org/gitnex/GitNex/wiki/FAQ)
## Links ## Links
[Website](https://gitnex.com) [Website](https://gitnex.com)
@ -65,28 +61,39 @@ We use [Crowdin](https://crowdin.com/project/gitnex) for translation. If your la
[Troubleshoot Guide](https://codeberg.org/gitnex/GitNex/wiki/Troubleshoot-Guide) [Troubleshoot Guide](https://codeberg.org/gitnex/GitNex/wiki/Troubleshoot-Guide)
[Faq](https://codeberg.org/gitnex/GitNex/wiki/FAQ)
[Release Blog](https://gitnex.codeberg.page)
## Thanks ## Thanks
Thanks to all the open source libraries, contributors and donators. Thanks to all the open source libraries, contributors and donators.
#### Open source libraries #### Open source libraries
- Retrofit - [square/retrofit](https://github.com/square/retrofit)
- Gson - [google/gson](https://github.com/google/gson)
- Okhttp - [square/okhttp](https://github.com/square/okhttp)
- Picasso - [square/picasso](https://github.com/square/picasso)
- Markwon - [wasabeef/picasso-transformations](https://github.com/wasabeef/picasso-transformations)
- Prettytime - [cats-oss/android-gpuimage](https://github.com/cats-oss/android-gpuimage)
- Amulyakhare/textdrawable - [noties/Markwon](https://github.com/noties/Markwon)
- Vdurmont/emoji-java - [noties/Prism4j](https://github.com/noties/Prism4j)
- Pes/materialcolorpicker - [ocpsoft/prettytime](https://github.com/ocpsoft/prettytime)
- HamidrezaAmz/BreadcrumbsView - [amulyakhare/TextDrawable](https://github.com/amulyakhare/TextDrawable)
- Chrisbanes/PhotoView - [vdurmont/emoji-java](https://github.com/vdurmont/emoji-java)
- Pddstudio/highlightjs-android - [Pes8/android-material-color-picker-dialog](https://github.com/Pes8/android-material-color-picker-dialog)
- Apache/commons-io - [HamidrezaAmz/BreadcrumbsView](https://github.com/HamidrezaAmz/BreadcrumbsView)
- Caverock/androidsvg - [Baseflow/PhotoView](https://github.com/Baseflow/PhotoView)
- Droidsonroids.gif/android-gif-drawable - [apache/commons](https://github.com/apache/commons-io)
- Barteksc/androidPdfViewer - [barteksc/AndroidPdfViewer](https://github.com/barteksc/AndroidPdfViewer)
- Ge0rg/memorizingTrustManager - [ge0rg/MemorizingTrustManager](https://github.com/ge0rg/MemorizingTrustManager)
- Dimezis/blurView - [mikaelhg/urlbuilder](https://github.com/mikaelhg/urlbuilder)
- Mikaelhg/urlbuilder - [ACRA/acra](https://github.com/ACRA/acra)
#### Icon sets
- [feathericons/feather](https://github.com/feathericons/feather)
- [primer/octicons](https://github.com/primer/octicons)
- [google/material-design-icons](https://github.com/google/material-design-icons)
[Follow me on Fediverse - mastodon.social/@mmarif](https://mastodon.social/@mmarif) [Follow me on Fediverse - mastodon.social/@mmarif](https://mastodon.social/@mmarif)
*All trademarks and logos are the properties of their respective owners.*

View File

@ -6,8 +6,8 @@ android {
applicationId "org.mian.gitnex" applicationId "org.mian.gitnex"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 30 targetSdkVersion 30
versionCode 328 versionCode 351
versionName "3.3.0-rc2" versionName "3.5.1"
multiDexEnabled true multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }
@ -30,7 +30,7 @@ android {
release { release {
minifyEnabled false minifyEnabled false
shrinkResources false shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
} }
} }
lintOptions { lintOptions {
@ -38,8 +38,10 @@ android {
abortOnError false abortOnError false
} }
compileOptions { compileOptions {
targetCompatibility = "8" coreLibraryDesugaringEnabled true
sourceCompatibility = "8"
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
} }
defaultConfig{ defaultConfig{
vectorDrawables.useSupportLibrary = true vectorDrawables.useSupportLibrary = true
@ -52,30 +54,31 @@ configurations {
} }
dependencies { dependencies {
def lifecycle_version = '2.3.0-beta01' def lifecycle_version = '2.3.0'
def markwon_version = '4.6.0' def markwon_version = '4.6.2'
def work_version = "2.4.0" def work_version = "2.5.0"
def acra = "5.5.0" def acra = "5.7.0"
implementation fileTree(include: ['*.jar'], dir: 'libs') implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.3.0-alpha02' implementation 'androidx.appcompat:appcompat:1.3.0-beta01'
implementation 'com.google.android.material:material:1.3.0-alpha03' implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.2' implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation "androidx.legacy:legacy-support-v4:1.0.0" implementation "androidx.legacy:legacy-support-v4:1.0.0"
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
testImplementation 'junit:junit:4.13.1' testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test:runner:1.3.0' androidTestImplementation 'androidx.test:runner:1.3.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
implementation 'com.squareup.okhttp3:okhttp:4.9.0' implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.2'
implementation "com.google.code.gson:gson:2.8.6" implementation "com.google.code.gson:gson:2.8.6"
implementation "com.squareup.picasso:picasso:2.71828" implementation "com.squareup.picasso:picasso:2.71828"
implementation 'jp.wasabeef:picasso-transformations:2.4.0'
implementation 'jp.co.cyberagent.android:gpuimage:2.1.0'
implementation "com.amulyakhare:com.amulyakhare.textdrawable:1.0.1" implementation "com.amulyakhare:com.amulyakhare.textdrawable:1.0.1"
implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0' implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0' implementation 'com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.2'
implementation 'org.ocpsoft.prettytime:prettytime:4.0.6.Final' implementation 'org.ocpsoft.prettytime:prettytime:5.0.0.Final'
implementation "com.vdurmont:emoji-java:5.1.1"
implementation "com.pes.materialcolorpicker:library:1.2.5" implementation "com.pes.materialcolorpicker:library:1.2.5"
implementation "io.noties.markwon:core:$markwon_version" implementation "io.noties.markwon:core:$markwon_version"
implementation "io.noties.markwon:ext-latex:$markwon_version" implementation "io.noties.markwon:ext-latex:$markwon_version"
@ -90,20 +93,24 @@ dependencies {
implementation "io.noties.markwon:recycler-table:$markwon_version" implementation "io.noties.markwon:recycler-table:$markwon_version"
implementation "io.noties.markwon:simple-ext:$markwon_version" implementation "io.noties.markwon:simple-ext:$markwon_version"
implementation "io.noties.markwon:syntax-highlight:$markwon_version" implementation "io.noties.markwon:syntax-highlight:$markwon_version"
implementation "com.caverock:androidsvg:1.4" implementation "io.noties.markwon:image-picasso:$markwon_version"
implementation "pl.droidsonroids.gif:android-gif-drawable:1.2.19" implementation "io.noties:prism4j:2.0.0"
annotationProcessor "io.noties:prism4j-bundler:2.0.0"
implementation "com.github.HamidrezaAmz:BreadcrumbsView:0.2.9" implementation "com.github.HamidrezaAmz:BreadcrumbsView:0.2.9"
implementation "commons-io:commons-io:20030203.000550" implementation "commons-io:commons-io:20030203.000550"
implementation 'org.apache.commons:commons-lang3:3.11' implementation 'org.apache.commons:commons-lang3:3.12.0'
implementation "com.github.chrisbanes:PhotoView:2.3.0" implementation "com.github.chrisbanes:PhotoView:2.3.0"
implementation "com.github.barteksc:android-pdf-viewer:3.2.0-beta.1" implementation "com.github.barteksc:android-pdf-viewer:3.2.0-beta.1"
implementation "ch.acra:acra-mail:$acra" implementation "ch.acra:acra-mail:$acra"
implementation "ch.acra:acra-limiter:$acra" implementation "ch.acra:acra-limiter:$acra"
implementation "ch.acra:acra-notification:$acra" implementation "ch.acra:acra-notification:$acra"
implementation "androidx.room:room-runtime:2.2.5" implementation 'androidx.room:room-runtime:2.2.6'
annotationProcessor "androidx.room:room-compiler:2.2.5" annotationProcessor 'androidx.room:room-compiler:2.2.6'
implementation "androidx.work:work-runtime:$work_version" implementation "androidx.work:work-runtime:$work_version"
implementation "com.eightbitlab:blurview:1.6.3"
implementation "io.mikael:urlbuilder:2.0.9" implementation "io.mikael:urlbuilder:2.0.9"
implementation "org.codeberg.gitnex-garage:emoji-java:v5.1.2"
implementation "org.codeberg.gitnex:tea4j:1.0.5"
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.1.5"
implementation 'androidx.biometric:biometric:1.1.0'
} }

View File

@ -19,3 +19,5 @@
# If you keep the line number information, uncomment this to # If you keep the line number information, uncomment this to
# hide the original source file name. # hide the original source file name.
#-renamesourcefileattribute SourceFile #-renamesourcefileattribute SourceFile
-optimizationpasses 30
-allowaccessmodification

View File

@ -6,11 +6,13 @@
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<application <application
android:name=".core.MainApplication"
android:allowBackup="true" android:allowBackup="true"
android:icon="@mipmap/app_logo" android:icon="@mipmap/app_logo"
android:label="@string/app_name" android:label="@string/appName"
android:networkSecurityConfig="@xml/network_security_config" android:networkSecurityConfig="@xml/network_security_config"
android:resizeableActivity="true" android:resizeableActivity="true"
android:roundIcon="@mipmap/app_logo_round" android:roundIcon="@mipmap/app_logo_round"
@ -63,7 +65,7 @@
<activity <activity
android:name=".activities.OrganizationDetailActivity" android:name=".activities.OrganizationDetailActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation"
android:label="@string/title_activity_org_detail" android:label="@string/titleActivityOrgDetail"
android:theme="@style/AppTheme.NoActionBar" /> android:theme="@style/AppTheme.NoActionBar" />
<activity <activity
android:name=".activities.CreateLabelActivity" android:name=".activities.CreateLabelActivity"
@ -74,9 +76,6 @@
<activity <activity
android:name=".activities.CreateMilestoneActivity" android:name=".activities.CreateMilestoneActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" /> android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" />
<activity
android:name=".activities.ReplyToIssueActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" />
<activity <activity
android:name=".activities.IssueDetailActivity" android:name=".activities.IssueDetailActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation"
@ -84,7 +83,7 @@
<activity <activity
android:name=".activities.RepoDetailActivity" android:name=".activities.RepoDetailActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation"
android:label="@string/title_activity_repo_detail" android:label="@string/titleActivityRepoDetail"
android:theme="@style/AppTheme.NoActionBar" /> android:theme="@style/AppTheme.NoActionBar" />
<activity <activity
android:name=".activities.MainActivity" android:name=".activities.MainActivity"
@ -156,6 +155,13 @@
<activity <activity
android:name=".activities.SettingsGeneralActivity" android:name=".activities.SettingsGeneralActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" /> android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" />
<activity
android:name=".activities.SettingsNotificationsActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" />
<activity
android:name=".activities.AdminCronTasksActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" />
<!-- Version < 3.0. DeX Mode and Screen Mirroring support --> <!-- Version < 3.0. DeX Mode and Screen Mirroring support -->
<meta-data android:name="com.samsung.android.keepalive.density" android:value="true"/> <meta-data android:name="com.samsung.android.keepalive.density" android:value="true"/>
@ -166,13 +172,21 @@
<activity <activity
android:name=".activities.DeepLinksActivity" android:name=".activities.DeepLinksActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar" android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:noHistory="true"
android:launchMode="singleTask"> android:launchMode="singleTask">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" android:host="*" /> <data android:scheme="http" />
<data android:scheme="https" />
<data android:host="codeberg.org" />
<data android:host="gitea.com" />
<data android:host="try.gitea.io" />
<data android:host="code.obermui.de" />
<data android:host="git.fsfe.org" />
<data android:host="opendev.org" />
</intent-filter> </intent-filter>
</activity> </activity>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
!function(e){"use strict";function t(){"complete"===document.readyState?n():e.addEventListener("DOMContentLoaded",n)}function n(){try{var e=document.querySelectorAll("code.hljs");for(var t in e)e.hasOwnProperty(t)&&r(e[t])}catch(n){console.error("LineNumbers error: ",n)}}function r(e){if("object"==typeof e){var t=e.parentNode,n=o(t.textContent);if(n>1){for(var r="",c=0;n>c;c++)r+=c+1+"\n";var l=document.createElement("code");l.className="hljs hljs-line-numbers",l.style["float"]="left",l.textContent=r,t.insertBefore(l,e)}}}function o(e){if(0===e.length)return 0;var t=/\r\n|\r|\n/g,n=e.match(t);return n=n?n.length:0,e[e.length-1].match(t)||(n+=1),n}"undefined"==typeof e.hljs?console.error("highlight.js not detected!"):(e.hljs.initLineNumbersOnLoad=t,e.hljs.lineNumbersBlock=r)}(window);

View File

@ -1,66 +0,0 @@
/*
Date: 24 Fev 2015
Author: Pedro Oliveira <kanytu@gmail . com>
*/
.hljs {
color: #a9b7c6;
background: #282b2e;
display: block;
overflow-x: auto;
padding: 0.5em;
}
.hljs-number,
.hljs-literal,
.hljs-symbol,
.hljs-bullet {
color: #6897BB;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-deletion {
color: #cc7832;
}
.hljs-variable,
.hljs-template-variable,
.hljs-link {
color: #629755;
}
.hljs-comment,
.hljs-quote {
color: #808080;
}
.hljs-meta {
color: #bbb529;
}
.hljs-string,
.hljs-attribute,
.hljs-addition {
color: #6A8759;
}
.hljs-section,
.hljs-title,
.hljs-type {
color: #ffc66d;
}
.hljs-name,
.hljs-selector-id,
.hljs-selector-class {
color: #e8bf6a;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}

View File

@ -1,87 +0,0 @@
/*
Arduino® Light Theme - Stefania Mellai <s.mellai@arduino.cc>
*/
.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
background: #FFFFFF;
}
.hljs,
.hljs-subst {
color: #434f54;
}
.hljs-keyword,
.hljs-attribute,
.hljs-selector-tag,
.hljs-doctag,
.hljs-name {
color: #00979D;
}
.hljs-built_in,
.hljs-literal,
.hljs-bullet,
.hljs-code,
.hljs-addition {
color: #D35400;
}
.hljs-regexp,
.hljs-symbol,
.hljs-variable,
.hljs-template-variable,
.hljs-link,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #00979D;
}
.hljs-type,
.hljs-string,
.hljs-selector-id,
.hljs-selector-class,
.hljs-quote,
.hljs-template-tag,
.hljs-deletion {
color: #005C5F;
}
.hljs-title,
.hljs-section {
color: #880000;
font-weight: bold;
}
.hljs-comment {
color: rgba(149,165,166,.8);
}
.hljs-meta-keyword {
color: #728E00;
}
.hljs-meta {
color: #434f54;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
.hljs-function {
color: #728E00;
}
.hljs-number {
color: #8A7B52;
}

View File

@ -1,71 +0,0 @@
/*
FAR Style (c) MajestiC <majestic2k@gmail.com>
*/
.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
background: #000080;
}
.hljs,
.hljs-subst {
color: #0ff;
}
.hljs-string,
.hljs-attribute,
.hljs-symbol,
.hljs-bullet,
.hljs-built_in,
.hljs-builtin-name,
.hljs-template-tag,
.hljs-template-variable,
.hljs-addition {
color: #ff0;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-section,
.hljs-type,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-variable {
color: #fff;
}
.hljs-comment,
.hljs-quote,
.hljs-doctag,
.hljs-deletion {
color: #888;
}
.hljs-number,
.hljs-regexp,
.hljs-literal,
.hljs-link {
color: #0f0;
}
.hljs-meta {
color: #008080;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-title,
.hljs-section,
.hljs-name,
.hljs-strong {
font-weight: bold;
}
.hljs-emphasis {
font-style: italic;
}

View File

@ -1,99 +0,0 @@
/*
github.com style (c) Vasily Polovnyov <vast@whiteants.net>
*/
.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
color: #333;
background: #f8f8f8;
}
.hljs-comment,
.hljs-quote {
color: #998;
font-style: italic;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-subst {
color: #333;
font-weight: bold;
}
.hljs-number,
.hljs-literal,
.hljs-variable,
.hljs-template-variable,
.hljs-tag .hljs-attr {
color: #008080;
}
.hljs-string,
.hljs-doctag {
color: #d14;
}
.hljs-title,
.hljs-section,
.hljs-selector-id {
color: #900;
font-weight: bold;
}
.hljs-subst {
font-weight: normal;
}
.hljs-type,
.hljs-class .hljs-title {
color: #458;
font-weight: bold;
}
.hljs-tag,
.hljs-name,
.hljs-attribute {
color: #000080;
font-weight: normal;
}
.hljs-regexp,
.hljs-link {
color: #009926;
}
.hljs-symbol,
.hljs-bullet {
color: #990073;
}
.hljs-built_in,
.hljs-builtin-name {
color: #0086b3;
}
.hljs-meta {
color: #999;
font-weight: bold;
}
.hljs-deletion {
background: #fdd;
}
.hljs-addition {
background: #dfd;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}

View File

@ -1,73 +0,0 @@
/*
IR_Black style (c) Vasily Mikhailitchenko <vaskas@programica.ru>
*/
.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
background: #000;
color: #f8f8f8;
}
.hljs-comment,
.hljs-quote,
.hljs-meta {
color: #7c7c7c;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-tag,
.hljs-name {
color: #96cbfe;
}
.hljs-attribute,
.hljs-selector-id {
color: #ffffb6;
}
.hljs-string,
.hljs-selector-attr,
.hljs-selector-pseudo,
.hljs-addition {
color: #a8ff60;
}
.hljs-subst {
color: #daefa3;
}
.hljs-regexp,
.hljs-link {
color: #e9c062;
}
.hljs-title,
.hljs-section,
.hljs-type,
.hljs-doctag {
color: #ffffb6;
}
.hljs-symbol,
.hljs-bullet,
.hljs-variable,
.hljs-template-variable,
.hljs-literal {
color: #c6c5fe;
}
.hljs-number,
.hljs-deletion {
color:#ff73fd;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}

View File

@ -1,83 +0,0 @@
/*
Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/
*/
.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
background: #23241f;
}
.hljs,
.hljs-tag,
.hljs-subst {
color: #f8f8f2;
}
.hljs-strong,
.hljs-emphasis {
color: #a8a8a2;
}
.hljs-bullet,
.hljs-quote,
.hljs-number,
.hljs-regexp,
.hljs-literal,
.hljs-link {
color: #ae81ff;
}
.hljs-code,
.hljs-title,
.hljs-section,
.hljs-selector-class {
color: #a6e22e;
}
.hljs-strong {
font-weight: bold;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-name,
.hljs-attr {
color: #f92672;
}
.hljs-symbol,
.hljs-attribute {
color: #66d9ef;
}
.hljs-params,
.hljs-class .hljs-title {
color: #f8f8f2;
}
.hljs-string,
.hljs-type,
.hljs-built_in,
.hljs-builtin-name,
.hljs-selector-id,
.hljs-selector-attr,
.hljs-selector-pseudo,
.hljs-addition,
.hljs-variable,
.hljs-template-variable {
color: #e6db74;
}
.hljs-comment,
.hljs-deletion,
.hljs-meta {
color: #75715e;
}

View File

@ -5,6 +5,8 @@ import android.content.Context;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import org.gitnex.tea4j.models.Collaborators;
import org.gitnex.tea4j.models.Issues;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.adapters.AssigneesListAdapter; import org.mian.gitnex.adapters.AssigneesListAdapter;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
@ -12,8 +14,6 @@ import org.mian.gitnex.databinding.CustomAssigneesSelectionDialogBinding;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.Collaborators;
import org.mian.gitnex.models.Issues;
import java.util.List; import java.util.List;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
@ -24,12 +24,11 @@ import retrofit2.Callback;
public class AssigneesActions { public class AssigneesActions {
public static void getCurrentIssueAssignees(Context ctx, String instanceUrl, String loginUid, String instanceToken, String repoOwner, String repoName, int issueIndex, List<String> currentAssignees) { public static void getCurrentIssueAssignees(Context ctx, String repoOwner, String repoName, int issueIndex, List<String> currentAssignees) {
Call<Issues> callSingleIssueLabels = RetrofitClient Call<Issues> callSingleIssueLabels = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface() .getIssueByIndex(Authorization.get(ctx), repoOwner, repoName, issueIndex);
.getIssueByIndex(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, issueIndex);
callSingleIssueLabels.enqueue(new Callback<Issues>() { callSingleIssueLabels.enqueue(new Callback<Issues>() {
@ -63,14 +62,13 @@ public class AssigneesActions {
}); });
} }
public static void getRepositoryAssignees(Context ctx, String instanceUrl, String instanceToken, String repoOwner, String repoName, List<Collaborators> assigneesList, Dialog dialogAssignees, AssigneesListAdapter assigneesAdapter, CustomAssigneesSelectionDialogBinding assigneesBinding) { public static void getRepositoryAssignees(Context ctx, String repoOwner, String repoName, List<Collaborators> assigneesList, Dialog dialogAssignees, AssigneesListAdapter assigneesAdapter, CustomAssigneesSelectionDialogBinding assigneesBinding) {
TinyDB tinyDB = new TinyDB(ctx); TinyDB tinyDB = TinyDB.getInstance(ctx);
Call<List<Collaborators>> call = RetrofitClient Call<List<Collaborators>> call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface() .getCollaborators(Authorization.get(ctx), repoOwner, repoName);
.getCollaborators(instanceToken, repoOwner, repoName);
call.enqueue(new Callback<List<Collaborators>>() { call.enqueue(new Callback<List<Collaborators>>() {

View File

@ -3,6 +3,8 @@ package org.mian.gitnex.actions;
import android.content.Context; import android.content.Context;
import android.util.Log; import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import org.gitnex.tea4j.models.Collaborators;
import org.gitnex.tea4j.models.Permission;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.AddCollaboratorToRepositoryActivity; import org.mian.gitnex.activities.AddCollaboratorToRepositoryActivity;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
@ -10,8 +12,6 @@ import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.Collaborators;
import org.mian.gitnex.models.Permission;
import java.util.List; import java.util.List;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
@ -25,21 +25,16 @@ public class CollaboratorActions {
public static void deleteCollaborator(final Context context, final String searchKeyword, String userName) { public static void deleteCollaborator(final Context context, final String searchKeyword, String userName) {
final TinyDB tinyDb = new TinyDB(context); final TinyDB tinyDb = TinyDB.getInstance(context);
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String repoFullName = tinyDb.getString("repoFullName"); String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
final String repoOwner = parts[0]; final String repoOwner = parts[0];
final String repoName = parts[1]; final String repoName = parts[1];
Call<Collaborators> call; Call<Collaborators> call = RetrofitClient
.getApiInterface(context)
call = RetrofitClient .deleteCollaborator(Authorization.get(context), repoOwner, repoName, userName);
.getInstance(instanceUrl, context)
.getApiInterface()
.deleteCollaborator(Authorization.returnAuthentication(context, loginUid, instanceToken), repoOwner, repoName, userName);
call.enqueue(new Callback<Collaborators>() { call.enqueue(new Callback<Collaborators>() {
@ -54,7 +49,7 @@ public class CollaboratorActions {
//Log.i("addCollaboratorSearch", addCollaboratorSearch.getText().toString()); //Log.i("addCollaboratorSearch", addCollaboratorSearch.getText().toString());
//tinyDb.putBoolean("updateDataSet", true); //tinyDb.putBoolean("updateDataSet", true);
//AddCollaboratorToRepositoryActivity usersSearchData = new AddCollaboratorToRepositoryActivity(); //AddCollaboratorToRepositoryActivity usersSearchData = new AddCollaboratorToRepositoryActivity();
//usersSearchData.loadUserSearchList(instanceUrl, instanceToken, searchKeyword, context); //usersSearchData.loadUserSearchList(instanceToken, searchKeyword, context);
} }
} }
@ -94,22 +89,18 @@ public class CollaboratorActions {
public static void addCollaborator(final Context context, String permission, String userName) { public static void addCollaborator(final Context context, String permission, String userName) {
final TinyDB tinyDb = new TinyDB(context); final TinyDB tinyDb = TinyDB.getInstance(context);
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String repoFullName = tinyDb.getString("repoFullName"); String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
final String repoOwner = parts[0]; final String repoOwner = parts[0];
final String repoName = parts[1]; final String repoName = parts[1];
Permission permissionString = new Permission(permission); Permission permissionString = new Permission(permission);
Call<Permission> call;
call = RetrofitClient Call<Permission> call = RetrofitClient
.getInstance(instanceUrl, context) .getApiInterface(context)
.getApiInterface() .addCollaborator(Authorization.get(context), repoOwner, repoName, userName, permissionString);
.addCollaborator(Authorization.returnAuthentication(context, loginUid, instanceToken), repoOwner, repoName, userName, permissionString);
call.enqueue(new Callback<Permission>() { call.enqueue(new Callback<Permission>() {
@ -122,7 +113,7 @@ public class CollaboratorActions {
Toasty.success(context, context.getString(R.string.addCollaboratorToastText)); Toasty.success(context, context.getString(R.string.addCollaboratorToastText));
((AddCollaboratorToRepositoryActivity)context).finish(); ((AddCollaboratorToRepositoryActivity)context).finish();
//AddCollaboratorToRepositoryActivity usersSearchData = new AddCollaboratorToRepositoryActivity(); //AddCollaboratorToRepositoryActivity usersSearchData = new AddCollaboratorToRepositoryActivity();
//usersSearchData.loadUserSearchList(instanceUrl, instanceToken, searchKeyword, context); //usersSearchData.loadUserSearchList(instanceToken, searchKeyword, context);
} }
} }
@ -164,11 +155,7 @@ public class CollaboratorActions {
public static ActionResult<List<Collaborators>> getCollaborators(Context context) { public static ActionResult<List<Collaborators>> getCollaborators(Context context) {
ActionResult<List<Collaborators>> actionResult = new ActionResult<>(); ActionResult<List<Collaborators>> actionResult = new ActionResult<>();
TinyDB tinyDb = new TinyDB(context); TinyDB tinyDb = TinyDB.getInstance(context);
String instanceUrl = tinyDb.getString("instanceUrl");
String loginUid = tinyDb.getString("loginUid");
String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String repoFullName = tinyDb.getString("repoFullName"); String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
@ -176,9 +163,8 @@ public class CollaboratorActions {
String repoName = parts[1]; String repoName = parts[1];
Call<List<Collaborators>> call = RetrofitClient Call<List<Collaborators>> call = RetrofitClient
.getInstance(instanceUrl, context) .getApiInterface(context)
.getApiInterface() .getCollaborators(Authorization.get(context), repoOwner, repoName);
.getCollaborators(Authorization.returnAuthentication(context, loginUid, instanceToken), repoOwner, repoName);
call.enqueue(new Callback<List<Collaborators>>() { call.enqueue(new Callback<List<Collaborators>>() {

View File

@ -3,18 +3,18 @@ package org.mian.gitnex.actions;
import android.content.Context; import android.content.Context;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import org.gitnex.tea4j.models.IssueComments;
import org.gitnex.tea4j.models.Issues;
import org.gitnex.tea4j.models.UpdateIssueState;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.database.api.DraftsApi;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.IssueComments;
import org.mian.gitnex.models.Issues;
import org.mian.gitnex.models.UpdateIssueState;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
import retrofit2.Response;
/** /**
* Author M M Arif * Author M M Arif
@ -22,85 +22,72 @@ import retrofit2.Callback;
public class IssueActions { public class IssueActions {
public static void editIssueComment(final Context ctx, final int commentId, final String commentBody, long draftIdOnCreate) { public static ActionResult<Response<?>> edit(Context context, String comment, int commentId) {
ActionResult<Response<?>> actionResult = new ActionResult<>();
TinyDB tinyDb = TinyDB.getInstance(context);
final TinyDB tinyDb = new TinyDB(ctx);
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String repoFullName = tinyDb.getString("repoFullName"); String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
final String repoOwner = parts[0];
final String repoName = parts[1];
IssueComments commentBodyJson = new IssueComments(commentBody); String repoOwner = parts[0];
Call<IssueComments> call; String repoName = parts[1];
call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().patchIssueComment(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, commentId, commentBodyJson); Call<IssueComments> call = RetrofitClient
.getApiInterface(context)
.patchIssueComment(Authorization.get(context), repoOwner, repoName, commentId, new IssueComments(comment));
call.enqueue(new Callback<IssueComments>() { call.enqueue(new Callback<IssueComments>() {
@Override @Override
public void onResponse(@NonNull Call<IssueComments> call, @NonNull retrofit2.Response<IssueComments> response) { public void onResponse(@NonNull Call<IssueComments> call, @NonNull retrofit2.Response<IssueComments> response) {
if(response.isSuccessful()) { switch(response.code()) {
if(response.code() == 200) {
tinyDb.putBoolean("commentEdited", true); case 200:
Toasty.info(ctx, ctx.getString(R.string.editCommentUpdatedText)); actionResult.finish(ActionResult.Status.SUCCESS);
break;
DraftsApi draftsApi = new DraftsApi(ctx); case 401:
draftsApi.deleteSingleDraft((int) draftIdOnCreate); actionResult.finish(ActionResult.Status.FAILED, response);
AlertDialogs.authorizationTokenRevokedDialog(context, context.getResources().getString(R.string.alertDialogTokenRevokedTitle), context.getResources().getString(R.string.alertDialogTokenRevokedMessage), context.getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), context.getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
break;
default:
actionResult.finish(ActionResult.Status.FAILED, response);
break;
} }
} }
else if(response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx, ctx.getResources().getString(R.string.alertDialogTokenRevokedTitle), ctx.getResources().getString(R.string.alertDialogTokenRevokedMessage), ctx.getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), ctx.getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
}
else if(response.code() == 403) {
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
}
else {
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
@Override @Override
public void onFailure(@NonNull Call<IssueComments> call, @NonNull Throwable t) { public void onFailure(@NonNull Call<IssueComments> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getResources().getString(R.string.genericServerResponseError)); actionResult.finish(ActionResult.Status.FAILED);
} }
}); });
return actionResult;
} }
public static void closeReopenIssue(final Context ctx, final int issueIndex, final String issueState) { public static void closeReopenIssue(final Context ctx, final int issueIndex, final String issueState) {
final TinyDB tinyDb = new TinyDB(ctx); final TinyDB tinyDb = TinyDB.getInstance(ctx);
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String repoFullName = tinyDb.getString("repoFullName"); String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
final String repoOwner = parts[0]; final String repoOwner = parts[0];
final String repoName = parts[1]; final String repoName = parts[1];
UpdateIssueState issueStatJson = new UpdateIssueState(issueState); UpdateIssueState issueStatJson = new UpdateIssueState(issueState);
Call<JsonElement> call; Call<JsonElement> call;
call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().closeReopenIssue(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, issueIndex, issueStatJson); call = RetrofitClient
.getApiInterface(ctx)
.closeReopenIssue(Authorization.get(ctx), repoOwner, repoName, issueIndex, issueStatJson);
call.enqueue(new Callback<JsonElement>() { call.enqueue(new Callback<JsonElement>() {
@ -162,20 +149,23 @@ public class IssueActions {
public static void subscribe(final Context ctx) { public static void subscribe(final Context ctx) {
final TinyDB tinyDB = new TinyDB(ctx); final TinyDB tinyDB = TinyDB.getInstance(ctx);
final String instanceUrl = tinyDB.getString("instanceUrl");
String[] repoFullName = tinyDB.getString("repoFullName").split("/"); String[] repoFullName = tinyDB.getString("repoFullName").split("/");
if(repoFullName.length != 2) { if(repoFullName.length != 2) {
return; return;
} }
final String userLogin = tinyDB.getString("userLogin"); final String userLogin = tinyDB.getString("userLogin");
final String token = "token " + tinyDB.getString(tinyDB.getString("loginUid") + "-token"); final String token = "token " + tinyDB.getString(tinyDB.getString("loginUid") + "-token");
final int issueNr = Integer.parseInt(tinyDB.getString("issueNumber")); final int issueNr = Integer.parseInt(tinyDB.getString("issueNumber"));
Call<Void> call; Call<Void> call;
call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().addIssueSubscriber(token, repoFullName[0], repoFullName[1], issueNr, userLogin); call = RetrofitClient
.getApiInterface(ctx)
.addIssueSubscriber(token, repoFullName[0], repoFullName[1], issueNr, userLogin);
call.enqueue(new Callback<Void>() { call.enqueue(new Callback<Void>() {
@ -222,9 +212,8 @@ public class IssueActions {
public static void unsubscribe(final Context ctx) { public static void unsubscribe(final Context ctx) {
final TinyDB tinyDB = new TinyDB(ctx); final TinyDB tinyDB = TinyDB.getInstance(ctx);
final String instanceUrl = tinyDB.getString("instanceUrl");
String[] repoFullName = tinyDB.getString("repoFullName").split("/"); String[] repoFullName = tinyDB.getString("repoFullName").split("/");
if(repoFullName.length != 2) { if(repoFullName.length != 2) {
return; return;
@ -235,7 +224,7 @@ public class IssueActions {
Call<Void> call; Call<Void> call;
call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().delIssueSubscriber(token, repoFullName[0], repoFullName[1], issueNr, userLogin); call = RetrofitClient.getApiInterface(ctx).delIssueSubscriber(token, repoFullName[0], repoFullName[1], issueNr, userLogin);
call.enqueue(new Callback<Void>() { call.enqueue(new Callback<Void>() {
@ -265,7 +254,7 @@ public class IssueActions {
} }
else { else {
Toasty.error(ctx, ctx.getString(R.string.unsubscriptionError)); Toasty.error(ctx, ctx.getString(R.string.unSubscriptionError));
} }
@ -282,11 +271,8 @@ public class IssueActions {
public static ActionResult<ActionResult.None> reply(Context context, String comment, int issueIndex) { public static ActionResult<ActionResult.None> reply(Context context, String comment, int issueIndex) {
ActionResult<ActionResult.None> actionResult = new ActionResult<>(); ActionResult<ActionResult.None> actionResult = new ActionResult<>();
TinyDB tinyDb = new TinyDB(context);
String instanceUrl = tinyDb.getString("instanceUrl"); TinyDB tinyDb = TinyDB.getInstance(context);
String loginUid = tinyDb.getString("loginUid");
String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String repoFullName = tinyDb.getString("repoFullName"); String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
@ -296,9 +282,8 @@ public class IssueActions {
Issues issueComment = new Issues(comment); Issues issueComment = new Issues(comment);
Call<Issues> call = RetrofitClient Call<Issues> call = RetrofitClient
.getInstance(instanceUrl, context) .getApiInterface(context)
.getApiInterface() .replyCommentToIssue(Authorization.get(context), repoOwner, repoName, issueIndex, issueComment);
.replyCommentToIssue(Authorization.returnAuthentication(context, loginUid, instanceToken), repoOwner, repoName, issueIndex, issueComment);
call.enqueue(new Callback<Issues>() { call.enqueue(new Callback<Issues>() {

View File

@ -5,13 +5,13 @@ import android.content.Context;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import org.gitnex.tea4j.models.Labels;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.adapters.LabelsListAdapter; import org.mian.gitnex.adapters.LabelsListAdapter;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.CustomLabelsSelectionDialogBinding; import org.mian.gitnex.databinding.CustomLabelsSelectionDialogBinding;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.Labels;
import java.util.List; import java.util.List;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
@ -22,12 +22,11 @@ import retrofit2.Callback;
public class LabelsActions { public class LabelsActions {
public static void getCurrentIssueLabels(Context ctx, String instanceUrl, String loginUid, String instanceToken, String repoOwner, String repoName, int issueIndex, List<Integer> currentLabelsIds) { public static void getCurrentIssueLabels(Context ctx, String repoOwner, String repoName, int issueIndex, List<Integer> currentLabelsIds) {
Call<List<Labels>> callSingleIssueLabels = RetrofitClient Call<List<Labels>> callSingleIssueLabels = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface() .getIssueLabels(Authorization.get(ctx), repoOwner, repoName, issueIndex);
.getIssueLabels(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, issueIndex);
callSingleIssueLabels.enqueue(new Callback<List<Labels>>() { callSingleIssueLabels.enqueue(new Callback<List<Labels>>() {
@ -60,12 +59,11 @@ public class LabelsActions {
}); });
} }
public static void getRepositoryLabels(Context ctx, String instanceUrl, String instanceToken, String repoOwner, String repoName, List<Labels> labelsList, Dialog dialogLabels, LabelsListAdapter labelsAdapter, CustomLabelsSelectionDialogBinding labelsBinding) { public static void getRepositoryLabels(Context ctx, String repoOwner, String repoName, List<Labels> labelsList, Dialog dialogLabels, LabelsListAdapter labelsAdapter, CustomLabelsSelectionDialogBinding labelsBinding) {
Call<List<Labels>> call = RetrofitClient Call<List<Labels>> call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface() .getLabels(Authorization.get(ctx), repoOwner, repoName);
.getlabels(instanceToken, repoOwner, repoName);
call.enqueue(new Callback<List<Labels>>() { call.enqueue(new Callback<List<Labels>>() {
@ -73,26 +71,45 @@ public class LabelsActions {
public void onResponse(@NonNull Call<List<Labels>> call, @NonNull retrofit2.Response<List<Labels>> response) { public void onResponse(@NonNull Call<List<Labels>> call, @NonNull retrofit2.Response<List<Labels>> response) {
labelsList.clear(); labelsList.clear();
List<Labels> labelsList_ = response.body();
if (response.code() == 200) {
if(response.body() != null) {
labelsList.addAll(response.body());
}
// Load organization labels
Call<List<Labels>> callOrgLabels = RetrofitClient
.getApiInterface(ctx)
.getOrganizationLabels(Authorization.get(ctx), repoOwner);
callOrgLabels.enqueue(new Callback<List<Labels>>() {
@Override
public void onResponse(@NonNull Call<List<Labels>> call, @NonNull retrofit2.Response<List<Labels>> responseOrg) {
labelsBinding.progressBar.setVisibility(View.GONE); labelsBinding.progressBar.setVisibility(View.GONE);
labelsBinding.dialogFrame.setVisibility(View.VISIBLE); labelsBinding.dialogFrame.setVisibility(View.VISIBLE);
if (response.code() == 200) { if(responseOrg.body() != null) {
assert labelsList_ != null; labelsList.addAll(responseOrg.body());
if(labelsList_.size() > 0) {
labelsList.addAll(labelsList_);
} }
else {
if(labelsList.isEmpty()) {
dialogLabels.dismiss(); dialogLabels.dismiss();
Toasty.warning(ctx, ctx.getResources().getString(R.string.noLabelsFound)); Toasty.warning(ctx, ctx.getResources().getString(R.string.noLabelsFound));
} }
labelsBinding.labelsRecyclerView.setAdapter(labelsAdapter); labelsBinding.labelsRecyclerView.setAdapter(labelsAdapter);
}
@Override public void onFailure(@NonNull Call<List<Labels>> call, @NonNull Throwable t) {}
});
} }
else { else {

View File

@ -4,12 +4,12 @@ import android.content.Context;
import android.util.Log; import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import org.gitnex.tea4j.models.Milestones;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.Milestones;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
@ -23,9 +23,8 @@ public class MilestoneActions {
public static void closeMilestone(final Context ctx, int milestoneId_) { public static void closeMilestone(final Context ctx, int milestoneId_) {
final TinyDB tinyDB = new TinyDB(ctx); final TinyDB tinyDB = TinyDB.getInstance(ctx);
final String instanceUrl = tinyDB.getString("instanceUrl");
String repoFullName = tinyDB.getString("repoFullName"); String repoFullName = tinyDB.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
final String repoOwner = parts[0]; final String repoOwner = parts[0];
@ -37,8 +36,7 @@ public class MilestoneActions {
Call<JsonElement> call; Call<JsonElement> call;
call = RetrofitClient call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface()
.closeReopenMilestone(token, repoOwner, repoName, milestoneId_, milestoneStateJson); .closeReopenMilestone(token, repoOwner, repoName, milestoneId_, milestoneStateJson);
call.enqueue(new Callback<JsonElement>() { call.enqueue(new Callback<JsonElement>() {
@ -81,9 +79,8 @@ public class MilestoneActions {
public static void openMilestone(final Context ctx, int milestoneId_) { public static void openMilestone(final Context ctx, int milestoneId_) {
final TinyDB tinyDB = new TinyDB(ctx); final TinyDB tinyDB = TinyDB.getInstance(ctx);
final String instanceUrl = tinyDB.getString("instanceUrl");
String repoFullName = tinyDB.getString("repoFullName"); String repoFullName = tinyDB.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
final String repoOwner = parts[0]; final String repoOwner = parts[0];
@ -95,8 +92,7 @@ public class MilestoneActions {
Call<JsonElement> call; Call<JsonElement> call;
call = RetrofitClient call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface()
.closeReopenMilestone(token, repoOwner, repoName, milestoneId_, milestoneStateJson); .closeReopenMilestone(token, repoOwner, repoName, milestoneId_, milestoneStateJson);
call.enqueue(new Callback<JsonElement>() { call.enqueue(new Callback<JsonElement>() {

View File

@ -1,13 +1,12 @@
package org.mian.gitnex.actions; package org.mian.gitnex.actions;
import android.content.Context; import android.content.Context;
import org.gitnex.tea4j.models.NotificationThread;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.models.NotificationThread;
import java.io.IOException; import java.io.IOException;
import java.util.Date; import java.util.Date;
import okhttp3.ResponseBody;
import retrofit2.Call; import retrofit2.Call;
/** /**
@ -20,24 +19,22 @@ public class NotificationsActions {
private TinyDB tinyDB; private TinyDB tinyDB;
private Context context; private Context context;
private String instanceUrl;
private String instanceToken; private String instanceToken;
public NotificationsActions(Context context) { public NotificationsActions(Context context) {
this.context = context; this.context = context;
this.tinyDB = new TinyDB(context); this.tinyDB = TinyDB.getInstance(context);
String loginUid = tinyDB.getString("loginUid"); String loginUid = tinyDB.getString("loginUid");
instanceUrl = tinyDB.getString("instanceUrl");
instanceToken = "token " + tinyDB.getString(loginUid + "-token"); instanceToken = "token " + tinyDB.getString(loginUid + "-token");
} }
public void setNotificationStatus(NotificationThread notificationThread, NotificationStatus notificationStatus) throws IOException { public void setNotificationStatus(NotificationThread notificationThread, NotificationStatus notificationStatus) throws IOException {
Call<ResponseBody> call = RetrofitClient.getInstance(instanceUrl, context).getApiInterface() Call<Void> call = RetrofitClient.getApiInterface(context)
.markNotificationThreadAsRead(instanceToken, notificationThread.getId(), notificationStatus.name()); .markNotificationThreadAsRead(instanceToken, notificationThread.getId(), notificationStatus.name());
if(!call.execute().isSuccessful()) { if(!call.execute().isSuccessful()) {
@ -48,7 +45,7 @@ public class NotificationsActions {
public boolean setAllNotificationsRead(Date date) throws IOException { public boolean setAllNotificationsRead(Date date) throws IOException {
Call<ResponseBody> call = RetrofitClient.getInstance(instanceUrl, context).getApiInterface() Call<Void> call = RetrofitClient.getApiInterface(context)
.markNotificationThreadsAsRead(instanceToken, AppUtil.getTimestampFromDate(context, date), true, .markNotificationThreadsAsRead(instanceToken, AppUtil.getTimestampFromDate(context, date), true,
new String[]{"unread", "pinned"}, "read"); new String[]{"unread", "pinned"}, "read");

View File

@ -21,10 +21,8 @@ public class RepositoryActions {
public static void starRepository(final Context context) { public static void starRepository(final Context context) {
final TinyDB tinyDb = new TinyDB(context); final TinyDB tinyDb = TinyDB.getInstance(context);
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String repoFullName = tinyDb.getString("repoFullName"); String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
final String repoOwner = parts[0]; final String repoOwner = parts[0];
@ -33,9 +31,8 @@ public class RepositoryActions {
Call<JsonElement> call; Call<JsonElement> call;
call = RetrofitClient call = RetrofitClient
.getInstance(instanceUrl, context) .getApiInterface(context)
.getApiInterface() .starRepository(Authorization.get(context), repoOwner, repoName);
.starRepository(Authorization.returnAuthentication(context, loginUid, instanceToken), repoOwner, repoName);
call.enqueue(new Callback<JsonElement>() { call.enqueue(new Callback<JsonElement>() {
@ -86,10 +83,8 @@ public class RepositoryActions {
public static void unStarRepository(final Context context) { public static void unStarRepository(final Context context) {
final TinyDB tinyDb = new TinyDB(context); final TinyDB tinyDb = TinyDB.getInstance(context);
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String repoFullName = tinyDb.getString("repoFullName"); String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
final String repoOwner = parts[0]; final String repoOwner = parts[0];
@ -98,9 +93,8 @@ public class RepositoryActions {
Call<JsonElement> call; Call<JsonElement> call;
call = RetrofitClient call = RetrofitClient
.getInstance(instanceUrl, context) .getApiInterface(context)
.getApiInterface() .unStarRepository(Authorization.get(context), repoOwner, repoName);
.unStarRepository(Authorization.returnAuthentication(context, loginUid, instanceToken), repoOwner, repoName);
call.enqueue(new Callback<JsonElement>() { call.enqueue(new Callback<JsonElement>() {
@ -151,10 +145,8 @@ public class RepositoryActions {
public static void watchRepository(final Context context) { public static void watchRepository(final Context context) {
final TinyDB tinyDb = new TinyDB(context); final TinyDB tinyDb = TinyDB.getInstance(context);
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String repoFullName = tinyDb.getString("repoFullName"); String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
final String repoOwner = parts[0]; final String repoOwner = parts[0];
@ -163,9 +155,8 @@ public class RepositoryActions {
Call<JsonElement> call; Call<JsonElement> call;
call = RetrofitClient call = RetrofitClient
.getInstance(instanceUrl, context) .getApiInterface(context)
.getApiInterface() .watchRepository(Authorization.get(context), repoOwner, repoName);
.watchRepository(Authorization.returnAuthentication(context, loginUid, instanceToken), repoOwner, repoName);
call.enqueue(new Callback<JsonElement>() { call.enqueue(new Callback<JsonElement>() {
@ -216,10 +207,8 @@ public class RepositoryActions {
public static void unWatchRepository(final Context context) { public static void unWatchRepository(final Context context) {
final TinyDB tinyDb = new TinyDB(context); final TinyDB tinyDb = TinyDB.getInstance(context);
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String repoFullName = tinyDb.getString("repoFullName"); String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
final String repoOwner = parts[0]; final String repoOwner = parts[0];
@ -228,9 +217,8 @@ public class RepositoryActions {
Call<JsonElement> call; Call<JsonElement> call;
call = RetrofitClient call = RetrofitClient
.getInstance(instanceUrl, context) .getApiInterface(context)
.getApiInterface() .unWatchRepository(Authorization.get(context), repoOwner, repoName);
.unWatchRepository(Authorization.returnAuthentication(context, loginUid, instanceToken), repoOwner, repoName);
call.enqueue(new Callback<JsonElement>() { call.enqueue(new Callback<JsonElement>() {

View File

@ -21,17 +21,13 @@ public class TeamActions {
public static void removeTeamMember(final Context context, String userName, int teamId) { public static void removeTeamMember(final Context context, String userName, int teamId) {
final TinyDB tinyDb = new TinyDB(context); final TinyDB tinyDb = TinyDB.getInstance(context);
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
Call<JsonElement> call; Call<JsonElement> call;
call = RetrofitClient call = RetrofitClient
.getInstance(instanceUrl, context) .getApiInterface(context)
.getApiInterface() .removeTeamMember(Authorization.get(context), teamId, userName);
.removeTeamMember(Authorization.returnAuthentication(context, loginUid, instanceToken), teamId, userName);
call.enqueue(new Callback<JsonElement>() { call.enqueue(new Callback<JsonElement>() {
@ -87,17 +83,11 @@ public class TeamActions {
public static void addTeamMember(final Context context, String userName, int teamId) { public static void addTeamMember(final Context context, String userName, int teamId) {
final TinyDB tinyDb = new TinyDB(context); final TinyDB tinyDb = TinyDB.getInstance(context);
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
Call<JsonElement> call; Call<JsonElement> call = RetrofitClient
.getApiInterface(context)
call = RetrofitClient .addTeamMember(Authorization.get(context), teamId, userName);
.getInstance(instanceUrl, context)
.getApiInterface()
.addTeamMember(Authorization.returnAuthentication(context, loginUid, instanceToken), teamId, userName);
call.enqueue(new Callback<JsonElement>() { call.enqueue(new Callback<JsonElement>() {

View File

@ -13,13 +13,12 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.mian.gitnex.R; import org.gitnex.tea4j.models.UserInfo;
import org.gitnex.tea4j.models.UserSearch;
import org.mian.gitnex.adapters.UserSearchAdapter; import org.mian.gitnex.adapters.UserSearchAdapter;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityAddCollaboratorToRepositoryBinding;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.models.UserInfo;
import org.mian.gitnex.models.UserSearch;
import java.util.List; import java.util.List;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
@ -32,39 +31,27 @@ import retrofit2.Response;
public class AddCollaboratorToRepositoryActivity extends BaseActivity { public class AddCollaboratorToRepositoryActivity extends BaseActivity {
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
final Context ctx = this;
private Context appCtx;
private TextView addCollaboratorSearch; private TextView addCollaboratorSearch;
private TextView noData; private TextView noData;
private ProgressBar mProgressBar; private ProgressBar mProgressBar;
private RecyclerView mRecyclerView; private RecyclerView mRecyclerView;
@Override
protected int getLayoutResourceId(){
return R.layout.activity_add_collaborator_to_repository;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
ActivityAddCollaboratorToRepositoryBinding activityAddCollaboratorToRepositoryBinding = ActivityAddCollaboratorToRepositoryBinding.inflate(getLayoutInflater());
setContentView(activityAddCollaboratorToRepositoryBinding.getRoot());
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
TinyDB tinyDb = new TinyDB(appCtx); ImageView closeActivity = activityAddCollaboratorToRepositoryBinding.close;
final String instanceUrl = tinyDb.getString("instanceUrl"); addCollaboratorSearch = activityAddCollaboratorToRepositoryBinding.addCollaboratorSearch;
final String loginUid = tinyDb.getString("loginUid"); mRecyclerView = activityAddCollaboratorToRepositoryBinding.recyclerViewUserSearch;
String repoFullName = tinyDb.getString("repoFullName"); mProgressBar = activityAddCollaboratorToRepositoryBinding.progressBar;
String[] parts = repoFullName.split("/"); noData = activityAddCollaboratorToRepositoryBinding.noData;
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
ImageView closeActivity = findViewById(R.id.close);
addCollaboratorSearch = findViewById(R.id.addCollaboratorSearch);
mRecyclerView = findViewById(R.id.recyclerViewUserSearch);
mProgressBar = findViewById(R.id.progressBar);
noData = findViewById(R.id.noData);
addCollaboratorSearch.requestFocus(); addCollaboratorSearch.requestFocus();
assert imm != null; assert imm != null;
@ -80,7 +67,7 @@ public class AddCollaboratorToRepositoryActivity extends BaseActivity {
if(!addCollaboratorSearch.getText().toString().equals("")) { if(!addCollaboratorSearch.getText().toString().equals("")) {
mProgressBar.setVisibility(View.VISIBLE); mProgressBar.setVisibility(View.VISIBLE);
loadUserSearchList(instanceUrl, instanceToken, addCollaboratorSearch.getText().toString(), loginUid); loadUserSearchList(addCollaboratorSearch.getText().toString());
} }
} }
@ -90,12 +77,11 @@ public class AddCollaboratorToRepositoryActivity extends BaseActivity {
} }
public void loadUserSearchList(String instanceUrl, String token, String searchKeyword, String loginUid) { public void loadUserSearchList(String searchKeyword) {
Call<UserSearch> call = RetrofitClient Call<UserSearch> call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(appCtx)
.getApiInterface() .getUserBySearch(Authorization.get(ctx), searchKeyword, 10);
.getUserBySearch(Authorization.returnAuthentication(ctx, loginUid, token), searchKeyword, 10);
call.enqueue(new Callback<UserSearch>() { call.enqueue(new Callback<UserSearch>() {

View File

@ -1,6 +1,5 @@
package org.mian.gitnex.activities; package org.mian.gitnex.activities;
import android.content.Context;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.os.Bundle; import android.os.Bundle;
@ -9,18 +8,17 @@ import android.view.View;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import org.gitnex.tea4j.models.GiteaVersion;
import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.database.api.UserAccountsApi; import org.mian.gitnex.database.api.UserAccountsApi;
import org.mian.gitnex.databinding.ActivityAddNewAccountBinding; import org.mian.gitnex.databinding.ActivityAddNewAccountBinding;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.PathsHelper; import org.mian.gitnex.helpers.PathsHelper;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.UrlHelper; import org.mian.gitnex.helpers.UrlHelper;
import org.mian.gitnex.helpers.Version; import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.models.GiteaVersion;
import org.mian.gitnex.models.UserInfo;
import java.net.URI; import java.net.URI;
import io.mikael.urlbuilder.UrlBuilder; import io.mikael.urlbuilder.UrlBuilder;
import retrofit2.Call; import retrofit2.Call;
@ -32,32 +30,19 @@ import retrofit2.Callback;
public class AddNewAccountActivity extends BaseActivity { public class AddNewAccountActivity extends BaseActivity {
final Context ctx = this;
private Context appCtx;
private TinyDB tinyDB;
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
private ActivityAddNewAccountBinding viewBinding; private ActivityAddNewAccountBinding viewBinding;
private enum Protocol {HTTPS, HTTP} private enum Protocol {HTTPS, HTTP}
private String spinnerSelectedValue; private String spinnerSelectedValue;
@Override
protected int getLayoutResourceId() {
return R.layout.activity_add_new_account;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
tinyDB = new TinyDB(appCtx);
viewBinding = ActivityAddNewAccountBinding.inflate(getLayoutInflater()); viewBinding = ActivityAddNewAccountBinding.inflate(getLayoutInflater());
View view = viewBinding.getRoot(); setContentView(viewBinding.getRoot());
setContentView(view);
getWindow().getDecorView().setBackground(new ColorDrawable(Color.TRANSPARENT)); getWindow().getDecorView().setBackground(new ColorDrawable(Color.TRANSPARENT));
@ -65,10 +50,9 @@ public class AddNewAccountActivity extends BaseActivity {
viewBinding.close.setOnClickListener(onClickListener); viewBinding.close.setOnClickListener(onClickListener);
ArrayAdapter<Protocol> adapterProtocols = new ArrayAdapter<>(ctx, R.layout.list_spinner_items, Protocol.values()); ArrayAdapter<Protocol> adapterProtocols = new ArrayAdapter<>(ctx, R.layout.list_spinner_items, Protocol.values());
viewBinding.protocolSpinner.setAdapter(adapterProtocols); viewBinding.protocolSpinner.setAdapter(adapterProtocols);
viewBinding.protocolSpinner.setOnItemClickListener((parent, view1, position, id) -> spinnerSelectedValue = String.valueOf(parent.getItemAtPosition(position))); viewBinding.protocolSpinner.setOnItemClickListener((parent, view1, position, id) -> spinnerSelectedValue = String.valueOf(parent.getItemAtPosition(position)));
viewBinding.addNewAccount.setOnClickListener(login -> { viewBinding.addNewAccount.setOnClickListener(login -> {
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
@ -131,7 +115,7 @@ public class AddNewAccountActivity extends BaseActivity {
Call<GiteaVersion> callVersion; Call<GiteaVersion> callVersion;
callVersion = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getGiteaVersionWithToken("token " + loginToken); callVersion = RetrofitClient.getApiInterface(ctx).getGiteaVersionWithToken("token " + loginToken);
callVersion.enqueue(new Callback<GiteaVersion>() { callVersion.enqueue(new Callback<GiteaVersion>() {
@ -205,7 +189,7 @@ public class AddNewAccountActivity extends BaseActivity {
private void setupNewAccountWithToken(String instanceUrl, final String loginToken) { private void setupNewAccountWithToken(String instanceUrl, final String loginToken) {
Call<UserInfo> call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getUserInfo("token " + loginToken); Call<UserInfo> call = RetrofitClient.getApiInterface(ctx, instanceUrl).getUserInfo("token " + loginToken);
call.enqueue(new Callback<UserInfo>() { call.enqueue(new Callback<UserInfo>() {

View File

@ -14,13 +14,12 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.mian.gitnex.R; import org.gitnex.tea4j.models.UserInfo;
import org.gitnex.tea4j.models.UserSearch;
import org.mian.gitnex.adapters.UserSearchForTeamMemberAdapter; import org.mian.gitnex.adapters.UserSearchForTeamMemberAdapter;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityAddNewTeamMemberBinding;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.models.UserInfo;
import org.mian.gitnex.models.UserSearch;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@ -35,8 +34,6 @@ import retrofit2.Response;
public class AddNewTeamMemberActivity extends BaseActivity { public class AddNewTeamMemberActivity extends BaseActivity {
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
final Context ctx = this;
private Context appCtx;
private TextView addNewTeamMember; private TextView addNewTeamMember;
private TextView noData; private TextView noData;
private ProgressBar mProgressBar; private ProgressBar mProgressBar;
@ -47,31 +44,21 @@ public class AddNewTeamMemberActivity extends BaseActivity {
private String teamId; private String teamId;
@Override
protected int getLayoutResourceId() {
return R.layout.activity_add_new_team_member;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
ActivityAddNewTeamMemberBinding activityAddNewTeamMemberBinding = ActivityAddNewTeamMemberBinding.inflate(getLayoutInflater());
setContentView(activityAddNewTeamMemberBinding.getRoot());
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
TinyDB tinyDb = new TinyDB(appCtx); ImageView closeActivity = activityAddNewTeamMemberBinding.close;
final String instanceUrl = tinyDb.getString("instanceUrl"); addNewTeamMember = activityAddNewTeamMemberBinding.addNewTeamMember;
final String loginUid = tinyDb.getString("loginUid"); mRecyclerView = activityAddNewTeamMemberBinding.recyclerViewUserSearch;
String repoFullName = tinyDb.getString("repoFullName"); mProgressBar = activityAddNewTeamMemberBinding.progressBar;
String[] parts = repoFullName.split("/"); noData = activityAddNewTeamMemberBinding.noData;
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
ImageView closeActivity = findViewById(R.id.close);
addNewTeamMember = findViewById(R.id.addNewTeamMember);
mRecyclerView = findViewById(R.id.recyclerViewUserSearch);
mProgressBar = findViewById(R.id.progress_bar);
noData = findViewById(R.id.noData);
addNewTeamMember.requestFocus(); addNewTeamMember.requestFocus();
assert imm != null; assert imm != null;
@ -105,7 +92,7 @@ public class AddNewTeamMemberActivity extends BaseActivity {
if(!addNewTeamMember.getText().toString().equals("") && addNewTeamMember.getText().toString().length() > 1) { if(!addNewTeamMember.getText().toString().equals("") && addNewTeamMember.getText().toString().length() > 1) {
adapter = new UserSearchForTeamMemberAdapter(dataList, ctx, Integer.parseInt(teamId)); adapter = new UserSearchForTeamMemberAdapter(dataList, ctx, Integer.parseInt(teamId));
loadUserSearchList(instanceUrl, instanceToken, addNewTeamMember.getText().toString(), loginUid, teamId); loadUserSearchList(addNewTeamMember.getText().toString(), teamId);
} }
} }
@ -121,9 +108,9 @@ public class AddNewTeamMemberActivity extends BaseActivity {
} }
public void loadUserSearchList(String instanceUrl, String token, String searchKeyword, String loginUid, String teamId) { public void loadUserSearchList(String searchKeyword, String teamId) {
Call<UserSearch> call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getUserBySearch(Authorization.returnAuthentication(ctx, loginUid, token), searchKeyword, 10); Call<UserSearch> call = RetrofitClient.getApiInterface(ctx).getUserBySearch(Authorization.get(ctx), searchKeyword, 10);
mProgressBar.setVisibility(View.VISIBLE); mProgressBar.setVisibility(View.VISIBLE);

View File

@ -0,0 +1,89 @@
package org.mian.gitnex.activities;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.View;
import androidx.appcompat.widget.Toolbar;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import org.mian.gitnex.adapters.AdminCronTasksAdapter;
import org.mian.gitnex.databinding.ActivityAdminCronTasksBinding;
import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.viewmodels.AdminCronTasksViewModel;
/**
* Author M M Arif
*/
public class AdminCronTasksActivity extends BaseActivity {
private View.OnClickListener onClickListener;
private AdminCronTasksAdapter adapter;
private ActivityAdminCronTasksBinding activityAdminCronTasksBinding;
public static final int PAGE = 1;
public static final int LIMIT = 50;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activityAdminCronTasksBinding = ActivityAdminCronTasksBinding.inflate(getLayoutInflater());
setContentView(activityAdminCronTasksBinding.getRoot());
initCloseListener();
activityAdminCronTasksBinding.close.setOnClickListener(onClickListener);
Toolbar toolbar = activityAdminCronTasksBinding.toolbar;
setSupportActionBar(toolbar);
activityAdminCronTasksBinding.recyclerView.setHasFixedSize(true);
activityAdminCronTasksBinding.recyclerView.setLayoutManager(new LinearLayoutManager(ctx));
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(activityAdminCronTasksBinding.recyclerView.getContext(),
DividerItemDecoration.VERTICAL);
activityAdminCronTasksBinding.recyclerView.addItemDecoration(dividerItemDecoration);
activityAdminCronTasksBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
activityAdminCronTasksBinding.pullToRefresh.setRefreshing(false);
AdminCronTasksViewModel.loadCronTasksList(ctx, Authorization.get(ctx), PAGE, LIMIT);
}, 500));
fetchDataAsync(ctx, Authorization.get(ctx));
}
private void fetchDataAsync(Context ctx, String instanceToken) {
AdminCronTasksViewModel cronTasksViewModel = new ViewModelProvider(this).get(AdminCronTasksViewModel.class);
cronTasksViewModel.getCronTasksList(ctx, instanceToken, PAGE, LIMIT).observe(this, cronTasksListMain -> {
adapter = new AdminCronTasksAdapter(ctx, cronTasksListMain);
if(adapter.getItemCount() > 0) {
activityAdminCronTasksBinding.recyclerView.setVisibility(View.VISIBLE);
activityAdminCronTasksBinding.recyclerView.setAdapter(adapter);
activityAdminCronTasksBinding.noData.setVisibility(View.GONE);
}
else {
activityAdminCronTasksBinding.recyclerView.setVisibility(View.GONE);
activityAdminCronTasksBinding.noData.setVisibility(View.VISIBLE);
}
});
}
private void initCloseListener() {
onClickListener = view -> finish();
}
}

View File

@ -21,10 +21,10 @@ import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.adapters.AdminGetUsersAdapter; import org.mian.gitnex.adapters.AdminGetUsersAdapter;
import org.mian.gitnex.databinding.ActivityAdminGetUsersBinding;
import org.mian.gitnex.fragments.BottomSheetAdminUsersFragment; import org.mian.gitnex.fragments.BottomSheetAdminUsersFragment;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.viewmodels.AdminGetUsersViewModel; import org.mian.gitnex.viewmodels.AdminGetUsersViewModel;
/** /**
@ -34,36 +34,26 @@ import org.mian.gitnex.viewmodels.AdminGetUsersViewModel;
public class AdminGetUsersActivity extends BaseActivity implements BottomSheetAdminUsersFragment.BottomSheetListener { public class AdminGetUsersActivity extends BaseActivity implements BottomSheetAdminUsersFragment.BottomSheetListener {
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
final Context ctx = this;
private Context appCtx;
private AdminGetUsersAdapter adapter; private AdminGetUsersAdapter adapter;
private RecyclerView mRecyclerView; private RecyclerView mRecyclerView;
private TextView noDataUsers; private TextView noDataUsers;
private Boolean searchFilter = false; private Boolean searchFilter = false;
@Override
protected int getLayoutResourceId(){
return R.layout.activity_admin_get_users;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
TinyDB tinyDb = new TinyDB(appCtx); ActivityAdminGetUsersBinding activityAdminGetUsersBinding = ActivityAdminGetUsersBinding.inflate(getLayoutInflater());
final String instanceUrl = tinyDb.getString("instanceUrl"); setContentView(activityAdminGetUsersBinding.getRoot());
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
ImageView closeActivity = findViewById(R.id.close); ImageView closeActivity = activityAdminGetUsersBinding.close;
noDataUsers = findViewById(R.id.noDataUsers); noDataUsers = activityAdminGetUsersBinding.noDataUsers;
mRecyclerView = findViewById(R.id.recyclerView); mRecyclerView = activityAdminGetUsersBinding.recyclerView;
final SwipeRefreshLayout swipeRefresh = findViewById(R.id.pullToRefresh); final SwipeRefreshLayout swipeRefresh = activityAdminGetUsersBinding.pullToRefresh;
Toolbar toolbar = findViewById(R.id.toolbar); Toolbar toolbar = activityAdminGetUsersBinding.toolbar;
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
initCloseListener(); initCloseListener();
@ -79,19 +69,19 @@ public class AdminGetUsersActivity extends BaseActivity implements BottomSheetAd
swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
swipeRefresh.setRefreshing(false); swipeRefresh.setRefreshing(false);
AdminGetUsersViewModel.loadUsersList(ctx, instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken)); AdminGetUsersViewModel.loadUsersList(ctx, Authorization.get(ctx));
}, 500)); }, 500));
fetchDataAsync(ctx, instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken)); fetchDataAsync(ctx, Authorization.get(ctx));
} }
private void fetchDataAsync(Context ctx, String instanceUrl, String instanceToken) { private void fetchDataAsync(Context ctx, String instanceToken) {
AdminGetUsersViewModel usersModel = new ViewModelProvider(this).get(AdminGetUsersViewModel.class); AdminGetUsersViewModel usersModel = new ViewModelProvider(this).get(AdminGetUsersViewModel.class);
usersModel.getUsersList(ctx, instanceUrl, instanceToken).observe(this, usersListMain -> { usersModel.getUsersList(ctx, instanceToken).observe(this, usersListMain -> {
adapter = new AdminGetUsersAdapter(ctx, usersListMain); adapter = new AdminGetUsersAdapter(ctx, usersListMain);
if(adapter.getItemCount() > 0) { if(adapter.getItemCount() > 0) {

View File

@ -5,6 +5,7 @@ import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import org.acra.ACRA; import org.acra.ACRA;
import org.acra.BuildConfig; import org.acra.BuildConfig;
import org.acra.ReportField;
import org.acra.annotation.AcraCore; import org.acra.annotation.AcraCore;
import org.acra.annotation.AcraNotification; import org.acra.annotation.AcraNotification;
import org.acra.config.CoreConfigurationBuilder; import org.acra.config.CoreConfigurationBuilder;
@ -13,151 +14,83 @@ import org.acra.config.MailSenderConfigurationBuilder;
import org.acra.data.StringFormat; import org.acra.data.StringFormat;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.FontsOverride;
import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.notifications.NotificationsMaster; import org.mian.gitnex.notifications.Notifications;
import static org.acra.ReportField.ANDROID_VERSION;
import static org.acra.ReportField.PHONE_MODEL;
import static org.acra.ReportField.STACK_TRACE;
/** /**
* Author M M Arif * Author M M Arif
*/ */
@AcraNotification(resIcon = R.drawable.gitnex_transparent,
resTitle = R.string.crashTitle,
resChannelName = R.string.setCrashReports,
resText = R.string.crashMessage)
@AcraCore(reportContent = { ANDROID_VERSION, PHONE_MODEL, STACK_TRACE })
public abstract class BaseActivity extends AppCompatActivity { public abstract class BaseActivity extends AppCompatActivity {
protected TinyDB tinyDB;
protected Context ctx = this;
protected Context appCtx;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
Context appCtx = getApplicationContext(); super.onCreate(savedInstanceState);
final TinyDB tinyDb = new TinyDB(appCtx);
switch(tinyDb.getInt("themeId")) { this.appCtx = getApplicationContext();
this.tinyDB = TinyDB.getInstance(appCtx);
switch(tinyDB.getInt("themeId")) {
case 1: case 1:
tinyDB.putString("currentTheme", "light");
setTheme(R.style.AppThemeLight); setTheme(R.style.AppThemeLight);
break; break;
case 2: case 2:
if(TimeHelper.timeBetweenHours(18, 6)) { // 6pm to 6am if(TimeHelper.timeBetweenHours(18, 6)) { // 6pm to 6am
tinyDB.putString("currentTheme", "dark");
setTheme(R.style.AppTheme); setTheme(R.style.AppTheme);
} }
else { else {
tinyDB.putString("currentTheme", "light");
setTheme(R.style.AppThemeLight); setTheme(R.style.AppThemeLight);
} }
break; break;
case 3: case 3:
tinyDB.putString("currentTheme", "light");
setTheme(R.style.AppThemeRetro); setTheme(R.style.AppThemeRetro);
break; break;
case 4: case 4:
if(TimeHelper.timeBetweenHours(18, 6)) { // 6pm to 6am if(TimeHelper.timeBetweenHours(18, 6)) { // 6pm to 6am
tinyDB.putString("currentTheme", "dark");
setTheme(R.style.AppTheme); setTheme(R.style.AppTheme);
} }
else { else {
tinyDB.putString("currentTheme", "light");
setTheme(R.style.AppThemeRetro); setTheme(R.style.AppThemeRetro);
} }
break; break;
case 5:
tinyDB.putString("currentTheme", "dark");
setTheme(R.style.AppThemePitchBlack);
break;
default: default:
tinyDB.putString("currentTheme", "dark");
setTheme(R.style.AppTheme); setTheme(R.style.AppTheme);
break;
} }
String appLocale = tinyDb.getString("locale"); AppUtil.setAppLocale(getResources(), tinyDB.getString("locale"));
AppUtil.setAppLocale(getResources(), appLocale);
super.onCreate(savedInstanceState); Notifications.startWorker(appCtx);
setContentView(getLayoutResourceId());
switch(tinyDb.getInt("customFontId", -1)) {
case 0:
FontsOverride.setDefaultFont(this, "DEFAULT", "fonts/roboto.ttf");
FontsOverride.setDefaultFont(this, "MONOSPACE", "fonts/roboto.ttf");
FontsOverride.setDefaultFont(this, "SERIF", "fonts/roboto.ttf");
FontsOverride.setDefaultFont(this, "SANS_SERIF", "fonts/roboto.ttf");
break;
case 2:
FontsOverride.setDefaultFont(this, "DEFAULT", "fonts/sourcecodeproregular.ttf");
FontsOverride.setDefaultFont(this, "MONOSPACE", "fonts/sourcecodeproregular.ttf");
FontsOverride.setDefaultFont(this, "SERIF", "fonts/sourcecodeproregular.ttf");
FontsOverride.setDefaultFont(this, "SANS_SERIF", "fonts/sourcecodeproregular.ttf");
break;
default:
FontsOverride.setDefaultFont(this, "DEFAULT", "fonts/manroperegular.ttf");
FontsOverride.setDefaultFont(this, "MONOSPACE", "fonts/manroperegular.ttf");
FontsOverride.setDefaultFont(this, "SERIF", "fonts/manroperegular.ttf");
FontsOverride.setDefaultFont(this, "SANS_SERIF", "fonts/manroperegular.ttf");
break;
} }
if(tinyDb.getInt("pollingDelayMinutes") == 0) {
tinyDb.putInt("pollingDelayMinutes", 15);
}
NotificationsMaster.hireWorker(appCtx);
// enabling counter badges by default
if(tinyDb.getString("enableCounterBadgesInit").isEmpty()) {
tinyDb.putBoolean("enableCounterBadges", true);
tinyDb.putString("enableCounterBadgesInit", "yes");
}
// enable crash reports by default
if(tinyDb.getString("crashReportingEnabledInit").isEmpty()) {
tinyDb.putBoolean("crashReportingEnabled", true);
tinyDb.putString("crashReportingEnabledInit", "yes");
}
// default cache setter
if(tinyDb.getString("cacheSizeStr").isEmpty()) {
tinyDb.putString("cacheSizeStr", getResources().getString(R.string.cacheSizeDataSelectionSelectedText));
}
if(tinyDb.getString("cacheSizeImagesStr").isEmpty()) {
tinyDb.putString("cacheSizeImagesStr", getResources().getString(R.string.cacheSizeImagesSelectionSelectedText));
}
// enable comment drafts by default
if(tinyDb.getString("draftsCommentsDeletionEnabledInit").isEmpty()) {
tinyDb.putBoolean("draftsCommentsDeletionEnabled", true);
tinyDb.putString("draftsCommentsDeletionEnabledInit", "yes");
}
if (tinyDb.getBoolean("crashReportingEnabled")) {
CoreConfigurationBuilder ACRABuilder = new CoreConfigurationBuilder(this);
ACRABuilder.setBuildConfigClass(BuildConfig.class).setReportFormat(StringFormat.KEY_VALUE_LIST);
ACRABuilder.getPluginConfigurationBuilder(MailSenderConfigurationBuilder.class).setReportAsFile(true).setMailTo(getResources().getString(R.string.appEmail)).setSubject(getResources().getString(R.string.crashReportEmailSubject, AppUtil.getAppBuildNo(getApplicationContext()))).setEnabled(true);
ACRABuilder.getPluginConfigurationBuilder(LimiterConfigurationBuilder.class).setEnabled(true);
ACRA.init(getApplication(), ACRABuilder);
}
}
protected abstract int getLayoutResourceId();
} }

View File

@ -1,6 +1,5 @@
package org.mian.gitnex.activities; package org.mian.gitnex.activities;
import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
@ -19,16 +18,15 @@ import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import org.gitnex.tea4j.models.Commits;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.adapters.CommitsAdapter; import org.mian.gitnex.adapters.CommitsAdapter;
import org.mian.gitnex.clients.AppApiService; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityCommitsBinding;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.StaticGlobalVariables; import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version; import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.interfaces.ApiInterface;
import org.mian.gitnex.models.Commits;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import retrofit2.Call; import retrofit2.Call;
@ -41,72 +39,62 @@ import retrofit2.Response;
public class CommitsActivity extends BaseActivity { public class CommitsActivity extends BaseActivity {
final Context ctx = this;
private Context appCtx;
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
private TextView noData; private TextView noData;
private ProgressBar progressBar; private ProgressBar progressBar;
private String TAG = "CommitsActivity"; private String TAG = "CommitsActivity";
private int resultLimit = StaticGlobalVariables.resultLimitOldGiteaInstances; private int resultLimit = Constants.resultLimitOldGiteaInstances;
private int pageSize = 1; private int pageSize = 1;
private RecyclerView recyclerView; private RecyclerView recyclerView;
private List<Commits> commitsList; private List<Commits> commitsList;
private CommitsAdapter adapter; private CommitsAdapter adapter;
private ApiInterface api;
private ProgressBar progressLoadMore; private ProgressBar progressLoadMore;
@Override
protected int getLayoutResourceId() {
return R.layout.activity_commits;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
Toolbar toolbar = findViewById(R.id.toolbar); ActivityCommitsBinding activityCommitsBinding = ActivityCommitsBinding.inflate(getLayoutInflater());
setContentView(activityCommitsBinding.getRoot());
Toolbar toolbar = activityCommitsBinding.toolbar;
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
TinyDB tinyDb = new TinyDB(appCtx); String repoFullName = tinyDB.getString("repoFullName");
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
final String repoOwner = parts[0]; final String repoOwner = parts[0];
final String repoName = parts[1]; final String repoName = parts[1];
String branchName = getIntent().getStringExtra("branchName"); String branchName = getIntent().getStringExtra("branchName");
TextView toolbar_title = findViewById(R.id.toolbar_title); TextView toolbar_title = activityCommitsBinding.toolbarTitle;
toolbar_title.setMovementMethod(new ScrollingMovementMethod()); toolbar_title.setMovementMethod(new ScrollingMovementMethod());
toolbar_title.setText(branchName); toolbar_title.setText(branchName);
ImageView closeActivity = findViewById(R.id.close); ImageView closeActivity = activityCommitsBinding.close;
noData = findViewById(R.id.noDataCommits); noData = activityCommitsBinding.noDataCommits;
progressLoadMore = findViewById(R.id.progressLoadMore); progressLoadMore = activityCommitsBinding.progressLoadMore;
progressBar = findViewById(R.id.progress_bar); progressBar = activityCommitsBinding.progressBar;
SwipeRefreshLayout swipeRefresh = findViewById(R.id.pullToRefresh); SwipeRefreshLayout swipeRefresh = activityCommitsBinding.pullToRefresh;
initCloseListener(); initCloseListener();
closeActivity.setOnClickListener(onClickListener); closeActivity.setOnClickListener(onClickListener);
// if gitea is 1.12 or higher use the new limit (resultLimitNewGiteaInstances) // if gitea is 1.12 or higher use the new limit (resultLimitNewGiteaInstances)
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12")) { if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12")) {
resultLimit = StaticGlobalVariables.resultLimitNewGiteaInstances; resultLimit = Constants.resultLimitNewGiteaInstances;
} }
recyclerView = findViewById(R.id.recyclerView); recyclerView = activityCommitsBinding.recyclerView;
commitsList = new ArrayList<>(); commitsList = new ArrayList<>();
swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
swipeRefresh.setRefreshing(false); swipeRefresh.setRefreshing(false);
loadInitial(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, branchName, resultLimit); loadInitial(Authorization.get(ctx), repoOwner, repoName, branchName, resultLimit);
adapter.notifyDataChanged(); adapter.notifyDataChanged();
}, 200)); }, 200));
@ -116,7 +104,7 @@ public class CommitsActivity extends BaseActivity {
if(commitsList.size() == resultLimit || pageSize == resultLimit) { if(commitsList.size() == resultLimit || pageSize == resultLimit) {
int page = (commitsList.size() + resultLimit) / resultLimit; int page = (commitsList.size() + resultLimit) / resultLimit;
loadMore(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, page, branchName, resultLimit); loadMore(Authorization.get(ctx), repoOwner, repoName, page, branchName, resultLimit);
} }
})); }));
@ -124,13 +112,12 @@ public class CommitsActivity extends BaseActivity {
recyclerView.setLayoutManager(new LinearLayoutManager(ctx)); recyclerView.setLayoutManager(new LinearLayoutManager(ctx));
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
api = AppApiService.createService(ApiInterface.class, instanceUrl, ctx); loadInitial(Authorization.get(ctx), repoOwner, repoName, branchName, resultLimit);
loadInitial(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, branchName, resultLimit);
} }
private void loadInitial(String token, String repoOwner, String repoName, String branchName, int resultLimit) { private void loadInitial(String token, String repoOwner, String repoName, String branchName, int resultLimit) {
Call<List<Commits>> call = api.getRepositoryCommits(token, repoOwner, repoName, 1, branchName, resultLimit); Call<List<Commits>> call = RetrofitClient.getApiInterface(ctx).getRepositoryCommits(token, repoOwner, repoName, 1, branchName, resultLimit);
call.enqueue(new Callback<List<Commits>>() { call.enqueue(new Callback<List<Commits>>() {
@ -180,7 +167,7 @@ public class CommitsActivity extends BaseActivity {
progressLoadMore.setVisibility(View.VISIBLE); progressLoadMore.setVisibility(View.VISIBLE);
Call<List<Commits>> call = api.getRepositoryCommits(token, repoOwner, repoName, page, branchName, resultLimit); Call<List<Commits>> call = RetrofitClient.getApiInterface(ctx).getRepositoryCommits(token, repoOwner, repoName, page, branchName, resultLimit);
call.enqueue(new Callback<List<Commits>>() { call.enqueue(new Callback<List<Commits>>() {

View File

@ -8,24 +8,21 @@ import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import org.gitnex.tea4j.models.Branches;
import org.gitnex.tea4j.models.DeleteFile;
import org.gitnex.tea4j.models.EditFile;
import org.gitnex.tea4j.models.NewFile;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityCreateFileBinding;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.NetworkStatusObserver;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.Branches;
import org.mian.gitnex.models.DeleteFile;
import org.mian.gitnex.models.EditFile;
import org.mian.gitnex.models.NewFile;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import retrofit2.Call; import retrofit2.Call;
@ -37,259 +34,189 @@ import retrofit2.Callback;
public class CreateFileActivity extends BaseActivity { public class CreateFileActivity extends BaseActivity {
public ImageView closeActivity; private ActivityCreateFileBinding binding;
private View.OnClickListener onClickListener;
private Button newFileCreate; public static final int FILE_ACTION_CREATE = 0;
public static final int FILE_ACTION_DELETE = 1;
public static final int FILE_ACTION_EDIT = 2;
private int fileAction = FILE_ACTION_CREATE;
private EditText newFileName;
private EditText newFileContent;
private EditText newFileBranchName;
private EditText newFileCommitMessage;
private AutoCompleteTextView newFileBranchesSpinner;
private String filePath; private String filePath;
private String fileSha; private String fileSha;
private int fileAction = 0; // 0 = create, 1 = delete, 2 = edit
final Context ctx = this;
private Context appCtx;
private TinyDB tinyDb;
List<Branches> branchesList = new ArrayList<>(); private final List<String> branches = new ArrayList<>();
private String instanceUrl;
private String loginUid;
private String repoOwner; private String repoOwner;
private String repoName; private String repoName;
private String instanceToken;
private String selectedBranch;
@Override
protected int getLayoutResourceId(){
return R.layout.activity_new_file;
}
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
tinyDb = new TinyDB(appCtx);
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); binding = ActivityCreateFileBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); String repoFullName = tinyDB.getString("repoFullName");
instanceUrl = tinyDb.getString("instanceUrl");
loginUid = tinyDb.getString("loginUid");
String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
repoOwner = parts[0]; repoOwner = parts[0];
repoName = parts[1]; repoName = parts[1];
instanceToken = "token " + tinyDb.getString(loginUid + "-token");
closeActivity = findViewById(R.id.close); TextView toolbarTitle = binding.toolbarTitle;
newFileName = findViewById(R.id.newFileName);
newFileContent = findViewById(R.id.newFileContent);
newFileBranchName = findViewById(R.id.newFileBranchName);
newFileCommitMessage = findViewById(R.id.newFileCommitMessage);
TextView toolbarTitle = findViewById(R.id.toolbarTitle);
newFileName.requestFocus(); binding.newFileName.requestFocus();
assert imm != null;
imm.showSoftInput(newFileName, InputMethodManager.SHOW_IMPLICIT);
initCloseListener(); InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
closeActivity.setOnClickListener(onClickListener); assert inputMethodManager != null;
inputMethodManager.showSoftInput(binding.newFileName, InputMethodManager.SHOW_IMPLICIT);
newFileCreate = findViewById(R.id.newFileCreate); binding.close.setOnClickListener(view -> finish());
binding.newFileContent.setOnTouchListener((touchView, motionEvent) -> {
newFileContent.setOnTouchListener((touchView, motionEvent) -> {
touchView.getParent().requestDisallowInterceptTouchEvent(true); touchView.getParent().requestDisallowInterceptTouchEvent(true);
if ((motionEvent.getAction() & MotionEvent.ACTION_UP) != 0 && (motionEvent.getActionMasked() & MotionEvent.ACTION_UP) != 0) { if ((motionEvent.getAction() & MotionEvent.ACTION_UP) != 0 &&
(motionEvent.getActionMasked() & MotionEvent.ACTION_UP) != 0) {
touchView.getParent().requestDisallowInterceptTouchEvent(false); touchView.getParent().requestDisallowInterceptTouchEvent(false);
} }
return false; return false;
}); });
if(getIntent().getStringExtra("filePath") != null && getIntent().getIntExtra("fileAction", 1) == 1) { if(getIntent().getStringExtra("filePath") != null && getIntent().getIntExtra("fileAction", FILE_ACTION_DELETE) == FILE_ACTION_DELETE) {
fileAction = getIntent().getIntExtra("fileAction", 1);
fileAction = getIntent().getIntExtra("fileAction", FILE_ACTION_DELETE);
filePath = getIntent().getStringExtra("filePath"); filePath = getIntent().getStringExtra("filePath");
String fileContents = getIntent().getStringExtra("fileContents");
fileSha = getIntent().getStringExtra("fileSha"); fileSha = getIntent().getStringExtra("fileSha");
toolbarTitle.setText(getString(R.string.deleteFileText, filePath)); toolbarTitle.setText(getString(R.string.deleteFileText, filePath));
newFileCreate.setText(R.string.deleteFile); binding.newFileCreate.setText(R.string.deleteFile);
newFileName.setText(filePath);
newFileName.setEnabled(false); binding.newFileNameLayout.setVisibility(View.GONE);
newFileName.setFocusable(false); binding.newFileContentLayout.setVisibility(View.GONE);
newFileContent.setText(fileContents);
newFileContent.setEnabled(false);
newFileContent.setFocusable(false);
} }
if(getIntent().getStringExtra("filePath") != null && getIntent().getIntExtra("fileAction", 2) == 2) { if(getIntent().getStringExtra("filePath") != null && getIntent().getIntExtra("fileAction", FILE_ACTION_EDIT) == FILE_ACTION_EDIT) {
fileAction = getIntent().getIntExtra("fileAction", 2);
fileAction = getIntent().getIntExtra("fileAction", FILE_ACTION_EDIT);
filePath = getIntent().getStringExtra("filePath"); filePath = getIntent().getStringExtra("filePath");
String fileContents = getIntent().getStringExtra("fileContents");
fileSha = getIntent().getStringExtra("fileSha"); fileSha = getIntent().getStringExtra("fileSha");
toolbarTitle.setText(getString(R.string.editFileText, filePath)); toolbarTitle.setText(getString(R.string.editFileText, filePath));
newFileCreate.setText(R.string.editFile); binding.newFileCreate.setText(R.string.editFile);
newFileName.setText(filePath); binding.newFileName.setText(filePath);
newFileName.setEnabled(false); binding.newFileName.setEnabled(false);
newFileName.setFocusable(false); binding.newFileName.setFocusable(false);
binding.newFileContent.setText(getIntent().getStringExtra("fileContents"));
newFileContent.setText(fileContents);
} }
initCloseListener(); getBranches(repoOwner, repoName);
closeActivity.setOnClickListener(onClickListener);
newFileBranchesSpinner = findViewById(R.id.newFileBranchesSpinner);
getBranches(instanceUrl, instanceToken, repoOwner, repoName, loginUid);
disableProcessButton(); disableProcessButton();
if(!connToInternet) { NetworkStatusObserver networkStatusObserver = NetworkStatusObserver.getInstance(ctx);
networkStatusObserver.registerNetworkStatusListener(binding.newFileCreate::setEnabled);
newFileCreate.setEnabled(false); binding.newFileCreate.setOnClickListener(v -> processNewFile());
}
else {
newFileCreate.setOnClickListener(createFileListener);
}
} }
private final View.OnClickListener createFileListener = v -> processNewFile();
private void processNewFile() { private void processNewFile() {
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); String newFileName = binding.newFileName.getText() != null ? binding.newFileName.getText().toString() : "";
AppUtil appUtil = new AppUtil(); String newFileContent = binding.newFileContent.getText() != null ? binding.newFileContent.getText().toString() : "";
String newFileBranchName = binding.newFileBranches.getText() != null ? binding.newFileBranches.getText().toString() : "";
String newFileName_ = newFileName.getText().toString(); String newFileCommitMessage = binding.newFileCommitMessage.getText() != null ? binding.newFileCommitMessage.getText().toString() : "";
String newFileContent_ = newFileContent.getText().toString();
String newFileBranchName_ = newFileBranchName.getText().toString();
String newFileCommitMessage_ = newFileCommitMessage.getText().toString();
if(!connToInternet) {
if(!AppUtil.hasNetworkConnection(appCtx)) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection)); Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
return; return;
} }
if(newFileName_.equals("") || newFileContent_.equals("") || newFileCommitMessage_.equals("")) { if(((newFileName.isEmpty() || newFileContent.isEmpty()) && fileAction != FILE_ACTION_DELETE) || newFileCommitMessage.isEmpty()) {
Toasty.error(ctx, getString(R.string.newFileRequiredFields)); Toasty.error(ctx, getString(R.string.newFileRequiredFields));
return; return;
} }
if(selectedBranch.equals("No branch")) { if(!AppUtil.checkStringsWithDash(newFileBranchName)) {
if(newFileBranchName_.equals("")) {
Toasty.error(ctx, getString(R.string.newFileRequiredFieldNewBranchName));
return;
}
else {
if(!appUtil.checkStringsWithDash(newFileBranchName_)) {
Toasty.error(ctx, getString(R.string.newFileInvalidBranchName)); Toasty.error(ctx, getString(R.string.newFileInvalidBranchName));
return; return;
} }
}
}
if(appUtil.charactersLength(newFileCommitMessage_) > 255) {
if(newFileCommitMessage.length() > 255) {
Toasty.warning(ctx, getString(R.string.newFileCommitMessageError)); Toasty.warning(ctx, getString(R.string.newFileCommitMessageError));
return;
} }
else {
disableProcessButton(); disableProcessButton();
if(fileAction == 1) { switch(fileAction) {
deleteFile(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, filePath, case FILE_ACTION_CREATE:
newFileBranchName_, newFileCommitMessage_, selectedBranch, fileSha); createNewFile(repoOwner, repoName, newFileName, AppUtil.encodeBase64(newFileContent), newFileCommitMessage, newFileBranchName);
} break;
else if(fileAction == 2) {
editFile(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, filePath, case FILE_ACTION_DELETE:
appUtil.encodeBase64(newFileContent_), newFileBranchName_, newFileCommitMessage_, selectedBranch, fileSha); deleteFile(repoOwner, repoName, filePath, newFileCommitMessage, newFileBranchName, fileSha);
} break;
else {
createNewFile(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, newFileName_, case FILE_ACTION_EDIT:
appUtil.encodeBase64(newFileContent_), newFileBranchName_, newFileCommitMessage_, selectedBranch); editFile(repoOwner, repoName, filePath, AppUtil.encodeBase64(newFileContent), newFileCommitMessage, newFileBranchName, fileSha);
} break;
} }
} }
private void createNewFile(final String instanceUrl, final String token, String repoOwner, String repoName, String fileName, String fileContent, String fileBranchName, String fileCommitMessage, String currentBranch) { private void createNewFile(String repoOwner, String repoName, String fileName, String fileContent, String fileCommitMessage, String branchName) {
NewFile createNewFileJsonStr; NewFile createNewFileJsonStr = branches.contains(branchName) ?
if(currentBranch.equals("No branch")) { new NewFile(branchName, fileContent, fileCommitMessage, "") :
new NewFile("", fileContent, fileCommitMessage, branchName);
createNewFileJsonStr = new NewFile("", fileContent, fileCommitMessage, fileBranchName);
}
else {
createNewFileJsonStr = new NewFile(currentBranch, fileContent, fileCommitMessage, "");
}
Call<JsonElement> call = RetrofitClient Call<JsonElement> call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface() .createNewFile(Authorization.get(ctx), repoOwner, repoName, fileName, createNewFileJsonStr);
.createNewFile(token, repoOwner, repoName, fileName, createNewFileJsonStr);
call.enqueue(new Callback<JsonElement>() { call.enqueue(new Callback<JsonElement>() {
@Override @Override
public void onResponse(@NonNull Call<JsonElement> call, @NonNull retrofit2.Response<JsonElement> response) { public void onResponse(@NonNull Call<JsonElement> call, @NonNull retrofit2.Response<JsonElement> response) {
if(response.code() == 201) { switch(response.code()) {
case 201:
enableProcessButton(); enableProcessButton();
Toasty.success(ctx, getString(R.string.newFileSuccessMessage)); Toasty.success(ctx, getString(R.string.newFileSuccessMessage));
finish(); finish();
} break;
else if(response.code() == 401) {
case 401:
enableProcessButton(); enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx, getResources().getString(R.string.alertDialogTokenRevokedTitle), AlertDialogs.authorizationTokenRevokedDialog(ctx, getResources().getString(R.string.alertDialogTokenRevokedTitle),
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedMessage),
getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton)); getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
} break;
else {
if(response.code() == 404) {
case 404:
enableProcessButton(); enableProcessButton();
Toasty.warning(ctx, getString(R.string.apiNotFound)); Toasty.warning(ctx, getString(R.string.apiNotFound));
} break;
else {
default:
enableProcessButton(); enableProcessButton();
Toasty.error(ctx, getString(R.string.orgCreatedError)); Toasty.error(ctx, getString(R.string.orgCreatedError));
} break;
} }
} }
@ -298,66 +225,56 @@ public class CreateFileActivity extends BaseActivity {
Log.e("onFailure", t.toString()); Log.e("onFailure", t.toString());
enableProcessButton(); enableProcessButton();
} }
}); });
} }
private void deleteFile(final String instanceUrl, final String token, String repoOwner, String repoName, String fileName, String fileBranchName, String fileCommitMessage, String currentBranch, String fileSha) { private void deleteFile(String repoOwner, String repoName, String fileName, String fileCommitMessage, String branchName, String fileSha) {
String branchName; DeleteFile deleteFileJsonStr = branches.contains(branchName) ?
DeleteFile deleteFileJsonStr; new DeleteFile(branchName, fileCommitMessage, "", fileSha) :
new DeleteFile("", fileCommitMessage, branchName, fileSha);
if(currentBranch.equals("No branch")) {
branchName = fileBranchName;
deleteFileJsonStr = new DeleteFile("", fileCommitMessage, fileBranchName, fileSha);
}
else {
branchName = currentBranch;
deleteFileJsonStr = new DeleteFile(currentBranch, fileCommitMessage, "", fileSha);
}
Call<JsonElement> call = RetrofitClient Call<JsonElement> call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface() .deleteFile(Authorization.get(ctx), repoOwner, repoName, fileName, deleteFileJsonStr);
.deleteFile(token, repoOwner, repoName, fileName, deleteFileJsonStr);
call.enqueue(new Callback<JsonElement>() { call.enqueue(new Callback<JsonElement>() {
@Override @Override
public void onResponse(@NonNull Call<JsonElement> call, @NonNull retrofit2.Response<JsonElement> response) { public void onResponse(@NonNull Call<JsonElement> call, @NonNull retrofit2.Response<JsonElement> response) {
if(response.code() == 200) { switch(response.code()) {
case 200:
enableProcessButton(); enableProcessButton();
Toasty.info(ctx, getString(R.string.deleteFileMessage, branchName)); Toasty.info(ctx, getString(R.string.deleteFileMessage, tinyDB.getString("repoBranch")));
getIntent().removeExtra("filePath"); getIntent().removeExtra("filePath");
getIntent().removeExtra("fileSha"); getIntent().removeExtra("fileSha");
getIntent().removeExtra("fileContents"); getIntent().removeExtra("fileContents");
finish(); finish();
} break;
else if(response.code() == 401) {
case 401:
enableProcessButton(); enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx, getResources().getString(R.string.alertDialogTokenRevokedTitle), AlertDialogs.authorizationTokenRevokedDialog(ctx, getResources().getString(R.string.alertDialogTokenRevokedTitle),
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedMessage),
getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton)); getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
} break;
else {
if(response.code() == 404) {
case 404:
enableProcessButton(); enableProcessButton();
Toasty.info(ctx, getString(R.string.apiNotFound)); Toasty.info(ctx, getString(R.string.apiNotFound));
} break;
else {
default:
enableProcessButton(); enableProcessButton();
Toasty.info(ctx, getString(R.string.genericError)); Toasty.info(ctx, getString(R.string.genericError));
} break;
} }
} }
@ -371,62 +288,51 @@ public class CreateFileActivity extends BaseActivity {
} }
private void editFile(final String instanceUrl, final String token, String repoOwner, String repoName, String fileName, String fileContent, String fileBranchName, String fileCommitMessage, String currentBranch, String fileSha) { private void editFile(String repoOwner, String repoName, String fileName, String fileContent, String fileCommitMessage, String branchName, String fileSha) {
String branchName; EditFile editFileJsonStr = branches.contains(branchName) ?
EditFile editFileJsonStr; new EditFile(branchName, fileCommitMessage, "", fileSha, fileContent) :
new EditFile("", fileCommitMessage, branchName, fileSha, fileContent);
if(currentBranch.equals("No branch")) {
branchName = fileBranchName;
editFileJsonStr = new EditFile("", fileCommitMessage, fileBranchName, fileSha, fileContent);
}
else {
branchName = currentBranch;
editFileJsonStr = new EditFile(currentBranch, fileCommitMessage, "", fileSha, fileContent);
}
Call<JsonElement> call = RetrofitClient Call<JsonElement> call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface() .editFile(Authorization.get(ctx), repoOwner, repoName, fileName, editFileJsonStr);
.editFile(token, repoOwner, repoName, fileName, editFileJsonStr);
call.enqueue(new Callback<JsonElement>() { call.enqueue(new Callback<JsonElement>() {
@Override @Override
public void onResponse(@NonNull Call<JsonElement> call, @NonNull retrofit2.Response<JsonElement> response) { public void onResponse(@NonNull Call<JsonElement> call, @NonNull retrofit2.Response<JsonElement> response) {
if(response.code() == 200) { switch(response.code()) {
case 200:
enableProcessButton(); enableProcessButton();
Toasty.info(ctx, getString(R.string.editFileMessage, branchName)); Toasty.info(ctx, getString(R.string.editFileMessage, branchName));
getIntent().removeExtra("filePath"); getIntent().removeExtra("filePath");
getIntent().removeExtra("fileSha"); getIntent().removeExtra("fileSha");
getIntent().removeExtra("fileContents"); getIntent().removeExtra("fileContents");
tinyDb.putBoolean("fileModified", true); tinyDB.putBoolean("fileModified", true);
finish(); finish();
} break;
else if(response.code() == 401) {
case 401:
enableProcessButton(); enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx, getResources().getString(R.string.alertDialogTokenRevokedTitle), AlertDialogs.authorizationTokenRevokedDialog(ctx, getResources().getString(R.string.alertDialogTokenRevokedTitle),
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedMessage),
getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton)); getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
} break;
else {
if(response.code() == 404) {
case 404:
enableProcessButton(); enableProcessButton();
Toasty.info(ctx, getString(R.string.apiNotFound)); Toasty.info(ctx, getString(R.string.apiNotFound));
} break;
else {
default:
enableProcessButton(); enableProcessButton();
Toasty.info(ctx, getString(R.string.genericError)); Toasty.info(ctx, getString(R.string.genericError));
} break;
} }
} }
@ -435,65 +341,35 @@ public class CreateFileActivity extends BaseActivity {
Log.e("onFailure", t.toString()); Log.e("onFailure", t.toString());
enableProcessButton(); enableProcessButton();
} }
}); });
} }
private void getBranches(String instanceUrl, String instanceToken, String repoOwner, String repoName, String loginUid) { private void getBranches(String repoOwner, String repoName) {
Call<List<Branches>> call = RetrofitClient Call<List<Branches>> call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface() .getBranches(Authorization.get(ctx), repoOwner, repoName);
.getBranches(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName);
call.enqueue(new Callback<List<Branches>>() { call.enqueue(new Callback<List<Branches>>() {
@Override @Override
public void onResponse(@NonNull Call<List<Branches>> call, @NonNull retrofit2.Response<List<Branches>> response) { public void onResponse(@NonNull Call<List<Branches>> call, @NonNull retrofit2.Response<List<Branches>> response) {
if(response.isSuccessful()) {
if(response.code() == 200) { if(response.code() == 200) {
List<Branches> branchesList_ = response.body(); assert response.body() != null;
for(Branches branch : response.body()) branches.add(branch.getName());
branchesList.add(new Branches("No branch")); ArrayAdapter<String> adapter = new ArrayAdapter<>(CreateFileActivity.this, R.layout.list_spinner_items, branches);
assert branchesList_ != null;
if(branchesList_.size() > 0) { binding.newFileBranches.setAdapter(adapter);
binding.newFileBranches.setText(tinyDB.getString("repoBranch"), false);
for (int i = 0; i < branchesList_.size(); i++) {
Branches data = new Branches(branchesList_.get(i).getName());
branchesList.add(data);
}
}
ArrayAdapter<Branches> adapter = new ArrayAdapter<>(CreateFileActivity.this,
R.layout.list_spinner_items, branchesList);
newFileBranchesSpinner.setAdapter(adapter);
enableProcessButton(); enableProcessButton();
newFileBranchesSpinner.setOnItemClickListener ((parent, view, position, id) -> {
selectedBranch = branchesList.get(position).getName();
if(selectedBranch.equals("No branch")) {
newFileBranchName.setEnabled(true);
newFileBranchName.setVisibility(View.VISIBLE);
}
else {
newFileBranchName.setEnabled(false);
newFileBranchName.setVisibility(View.GONE);
newFileBranchName.setText("");
}
});
}
} }
} }
@ -506,19 +382,7 @@ public class CreateFileActivity extends BaseActivity {
} }
private void initCloseListener() { private void disableProcessButton() { binding.newFileCreate.setEnabled(false); }
private void enableProcessButton() { binding.newFileCreate.setEnabled(true); }
onClickListener = view -> finish();
}
private void disableProcessButton() {
newFileCreate.setEnabled(false);
}
private void enableProcessButton() {
newFileCreate.setEnabled(true);
}
} }

View File

@ -14,6 +14,10 @@ import android.view.inputmethod.InputMethodManager;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import org.gitnex.tea4j.models.Collaborators;
import org.gitnex.tea4j.models.CreateIssue;
import org.gitnex.tea4j.models.Labels;
import org.gitnex.tea4j.models.Milestones;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.actions.AssigneesActions; import org.mian.gitnex.actions.AssigneesActions;
import org.mian.gitnex.actions.LabelsActions; import org.mian.gitnex.actions.LabelsActions;
@ -26,14 +30,10 @@ import org.mian.gitnex.databinding.CustomLabelsSelectionDialogBinding;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.StaticGlobalVariables; import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version; import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.models.Collaborators;
import org.mian.gitnex.models.CreateIssue;
import org.mian.gitnex.models.Labels;
import org.mian.gitnex.models.Milestones;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.List; import java.util.List;
@ -51,19 +51,14 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
private CustomLabelsSelectionDialogBinding labelsBinding; private CustomLabelsSelectionDialogBinding labelsBinding;
private CustomAssigneesSelectionDialogBinding assigneesBinding; private CustomAssigneesSelectionDialogBinding assigneesBinding;
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
final Context ctx = this; private int resultLimit = Constants.resultLimitOldGiteaInstances;
private Context appCtx;
private TinyDB tinyDb;
private int resultLimit = StaticGlobalVariables.resultLimitOldGiteaInstances;
private Dialog dialogLabels; private Dialog dialogLabels;
private Dialog dialogAssignees; private Dialog dialogAssignees;
private String labelsSetter; private String labelsSetter;
private String assigneesSetter; private String assigneesSetter;
private int milestoneId; private int milestoneId;
private String instanceUrl;
private String loginUid; private String loginUid;
private String instanceToken;
private String repoOwner; private String repoOwner;
private String repoName; private String repoName;
@ -76,40 +71,29 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
private List<Collaborators> assigneesList = new ArrayList<>(); private List<Collaborators> assigneesList = new ArrayList<>();
private List<String> assigneesListData = new ArrayList<>(); private List<String> assigneesListData = new ArrayList<>();
@Override
protected int getLayoutResourceId() {
return R.layout.activity_create_issue;
}
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
tinyDb = new TinyDB(appCtx);
viewBinding = ActivityCreateIssueBinding.inflate(getLayoutInflater()); viewBinding = ActivityCreateIssueBinding.inflate(getLayoutInflater());
View view = viewBinding.getRoot(); setContentView(viewBinding.getRoot());
setContentView(view);
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
instanceUrl = tinyDb.getString("instanceUrl"); loginUid = tinyDB.getString("loginUid");
loginUid = tinyDb.getString("loginUid"); String repoFullName = tinyDB.getString("repoFullName");
final String loginFullName = tinyDb.getString("userFullname");
String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
repoOwner = parts[0]; repoOwner = parts[0];
repoName = parts[1]; repoName = parts[1];
instanceToken = "token " + tinyDb.getString(loginUid + "-token");
// require gitea 1.12 or higher // require gitea 1.12 or higher
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) { if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.0")) {
resultLimit = StaticGlobalVariables.resultLimitNewGiteaInstances; resultLimit = Constants.resultLimitNewGiteaInstances;
} }
viewBinding.newIssueTitle.requestFocus(); viewBinding.newIssueTitle.requestFocus();
@ -137,7 +121,7 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
viewBinding.newIssueLabels.setOnClickListener(this); viewBinding.newIssueLabels.setOnClickListener(this);
viewBinding.newIssueDueDate.setOnClickListener(this); viewBinding.newIssueDueDate.setOnClickListener(this);
getMilestones(instanceUrl, instanceToken, repoOwner, repoName, loginUid, resultLimit); getMilestones(repoOwner, repoName, resultLimit);
disableProcessButton(); disableProcessButton();
@ -194,7 +178,7 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
assigneesBinding.cancel.setOnClickListener(assigneesBinding_ -> dialogAssignees.dismiss()); assigneesBinding.cancel.setOnClickListener(assigneesBinding_ -> dialogAssignees.dismiss());
dialogAssignees.show(); dialogAssignees.show();
AssigneesActions.getRepositoryAssignees(ctx, instanceUrl, instanceToken, repoOwner, repoName, assigneesList, dialogAssignees, assigneesAdapter, assigneesBinding); AssigneesActions.getRepositoryAssignees(ctx, repoOwner, repoName, assigneesList, dialogAssignees, assigneesAdapter, assigneesBinding);
} }
private void showLabels() { private void showLabels() {
@ -214,7 +198,7 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
labelsBinding.cancel.setOnClickListener(labelsBinding_ -> dialogLabels.dismiss()); labelsBinding.cancel.setOnClickListener(labelsBinding_ -> dialogLabels.dismiss());
dialogLabels.show(); dialogLabels.show();
LabelsActions.getRepositoryLabels(ctx, instanceUrl, instanceToken, repoOwner, repoName, labelsList, dialogLabels, labelsAdapter, labelsBinding); LabelsActions.getRepositoryLabels(ctx, repoOwner, repoName, labelsList, dialogLabels, labelsAdapter, labelsBinding);
} }
private void processNewIssue() { private void processNewIssue() {
@ -247,19 +231,18 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
} }
disableProcessButton(); disableProcessButton();
createNewIssueFunc(instanceUrl, instanceToken, repoOwner, repoName, loginUid, newIssueDescriptionForm, newIssueDueDateForm, milestoneId, newIssueTitleForm); createNewIssueFunc(repoOwner, repoName, loginUid, newIssueDescriptionForm, newIssueDueDateForm, milestoneId, newIssueTitleForm);
} }
private void createNewIssueFunc(final String instanceUrl, final String instanceToken, String repoOwner, String repoName, String loginUid, String newIssueDescriptionForm, String newIssueDueDateForm, int newIssueMilestoneIdForm, String newIssueTitleForm) { private void createNewIssueFunc(String repoOwner, String repoName, String loginUid, String newIssueDescriptionForm, String newIssueDueDateForm, int newIssueMilestoneIdForm, String newIssueTitleForm) {
CreateIssue createNewIssueJson = new CreateIssue(loginUid, newIssueDescriptionForm, false, newIssueDueDateForm, newIssueMilestoneIdForm, newIssueTitleForm, assigneesListData, labelsIds); CreateIssue createNewIssueJson = new CreateIssue(loginUid, newIssueDescriptionForm, false, newIssueDueDateForm, newIssueMilestoneIdForm, newIssueTitleForm, assigneesListData, labelsIds);
Call<JsonElement> call3; Call<JsonElement> call3;
call3 = RetrofitClient call3 = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface() .createNewIssue(Authorization.get(ctx), repoOwner, repoName, createNewIssueJson);
.createNewIssue(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, createNewIssueJson);
call3.enqueue(new Callback<JsonElement>() { call3.enqueue(new Callback<JsonElement>() {
@ -268,7 +251,7 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
if(response2.code() == 201) { if(response2.code() == 201) {
TinyDB tinyDb = new TinyDB(appCtx); TinyDB tinyDb = TinyDB.getInstance(appCtx);
tinyDb.putBoolean("resumeIssues", true); tinyDb.putBoolean("resumeIssues", true);
Toasty.success(ctx, getString(R.string.issueCreated)); Toasty.success(ctx, getString(R.string.issueCreated));
@ -306,13 +289,12 @@ public class CreateIssueActivity extends BaseActivity implements View.OnClickLis
onClickListener = view -> finish(); onClickListener = view -> finish();
} }
private void getMilestones(String instanceUrl, String instanceToken, String repoOwner, String repoName, String loginUid, int resultLimit) { private void getMilestones(String repoOwner, String repoName, int resultLimit) {
String msState = "open"; String msState = "open";
Call<List<Milestones>> call = RetrofitClient Call<List<Milestones>> call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface() .getMilestones(Authorization.get(ctx), repoOwner, repoName, 1, resultLimit, msState);
.getMilestones(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, 1, resultLimit, msState);
call.enqueue(new Callback<List<Milestones>>() { call.enqueue(new Callback<List<Milestones>>() {

View File

@ -10,21 +10,21 @@ import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import com.pes.androidmaterialcolorpickerdialog.ColorPicker; import com.pes.androidmaterialcolorpickerdialog.ColorPicker;
import com.pes.androidmaterialcolorpickerdialog.ColorPickerCallback; import org.gitnex.tea4j.models.CreateLabel;
import org.gitnex.tea4j.models.Labels;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityCreateLabelBinding;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.CreateLabel;
import org.mian.gitnex.models.Labels;
import org.mian.gitnex.viewmodels.LabelsViewModel; import org.mian.gitnex.viewmodels.LabelsViewModel;
import org.mian.gitnex.viewmodels.OrganizationLabelsViewModel;
import java.util.Objects; import java.util.Objects;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
@ -39,45 +39,37 @@ public class CreateLabelActivity extends BaseActivity {
private TextView colorPicker; private TextView colorPicker;
private EditText labelName; private EditText labelName;
private Button createLabelButton; private Button createLabelButton;
final Context ctx = this; private TinyDB tinyDB;
private Context appCtx;
@Override
protected int getLayoutResourceId(){
return R.layout.activity_create_label;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
ActivityCreateLabelBinding activityCreateLabelBinding = ActivityCreateLabelBinding.inflate(getLayoutInflater());
setContentView(activityCreateLabelBinding.getRoot());
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
final TinyDB tinyDb = new TinyDB(appCtx); tinyDB = TinyDB.getInstance(appCtx);
String repoFullName = tinyDb.getString("repoFullName"); String repoFullName = tinyDB.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
final String repoOwner = parts[0]; final String repoOwner = parts[0];
final String repoName = parts[1]; final String repoName = parts[1];
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
if(getIntent().getStringExtra("labelAction") != null && Objects.requireNonNull(getIntent().getStringExtra("labelAction")).equals("delete")) { if(getIntent().getStringExtra("labelAction") != null && Objects.requireNonNull(getIntent().getStringExtra("labelAction")).equals("delete")) {
deleteLabel(instanceUrl, instanceToken, repoOwner, repoName, Integer.parseInt(Objects.requireNonNull(getIntent().getStringExtra("labelId"))), loginUid); deleteLabel(repoOwner, repoName, Integer.parseInt(Objects.requireNonNull(getIntent().getStringExtra("labelId"))));
finish(); finish();
return; return;
} }
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
ImageView closeActivity = findViewById(R.id.close); ImageView closeActivity = activityCreateLabelBinding.close;
colorPicker = findViewById(R.id.colorPicker); colorPicker = activityCreateLabelBinding.colorPicker;
labelName = findViewById(R.id.labelName); labelName = activityCreateLabelBinding.labelName;
createLabelButton = findViewById(R.id.createLabelButton); createLabelButton = activityCreateLabelBinding.createLabelButton;
labelName.requestFocus(); labelName.requestFocus();
assert imm != null; assert imm != null;
@ -93,7 +85,7 @@ public class CreateLabelActivity extends BaseActivity {
//Log.i("#Hex no alpha", String.format("#%06X", (0xFFFFFF & color))); //Log.i("#Hex no alpha", String.format("#%06X", (0xFFFFFF & color)));
colorPicker.setBackgroundColor(color); colorPicker.setBackgroundColor(color);
tinyDb.putString("labelColor", String.format("#%06X", (0xFFFFFF & color))); tinyDB.putString("labelColor", String.format("#%06X", (0xFFFFFF & color)));
cp.dismiss(); cp.dismiss();
}); });
@ -102,9 +94,9 @@ public class CreateLabelActivity extends BaseActivity {
labelName.setText(getIntent().getStringExtra("labelTitle")); labelName.setText(getIntent().getStringExtra("labelTitle"));
int labelColor_ = Color.parseColor("#" + getIntent().getStringExtra("labelColor")); int labelColor_ = Color.parseColor("#" + getIntent().getStringExtra("labelColor"));
colorPicker.setBackgroundColor(labelColor_); colorPicker.setBackgroundColor(labelColor_);
tinyDb.putString("labelColorDefault", "#" + getIntent().getStringExtra("labelColor")); tinyDB.putString("labelColorDefault", "#" + getIntent().getStringExtra("labelColor"));
TextView toolbar_title = findViewById(R.id.toolbar_title); TextView toolbar_title = activityCreateLabelBinding.toolbarTitle;
toolbar_title.setText(getResources().getString(R.string.pageTitleLabelUpdate)); toolbar_title.setText(getResources().getString(R.string.pageTitleLabelUpdate));
createLabelButton.setText(getResources().getString(R.string.newUpdateButtonCopy)); createLabelButton.setText(getResources().getString(R.string.newUpdateButtonCopy));
@ -129,27 +121,23 @@ public class CreateLabelActivity extends BaseActivity {
private void processUpdateLabel() { private void processUpdateLabel() {
final TinyDB tinyDb = new TinyDB(appCtx);
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
AppUtil appUtil = new AppUtil();
String repoFullName = tinyDb.getString("repoFullName"); String repoFullName = tinyDB.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
final String repoOwner = parts[0]; final String repoOwner = parts[0];
final String repoName = parts[1]; final String repoName = parts[1];
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String updateLabelName = labelName.getText().toString(); String updateLabelName = labelName.getText().toString();
String updateLabelColor; String updateLabelColor;
if(tinyDb.getString("labelColor").isEmpty()) { if(tinyDB.getString("labelColor").isEmpty()) {
updateLabelColor = tinyDb.getString("labelColorDefault"); updateLabelColor = tinyDB.getString("labelColorDefault");
} }
else { else {
updateLabelColor = tinyDb.getString("labelColor"); updateLabelColor = tinyDB.getString("labelColor");
} }
if(!connToInternet) { if(!connToInternet) {
@ -164,41 +152,37 @@ public class CreateLabelActivity extends BaseActivity {
return; return;
} }
if(!appUtil.checkStrings(updateLabelName)) { if(!AppUtil.checkStrings(updateLabelName)) {
Toasty.error(ctx, getString(R.string.labelNameError)); Toasty.error(ctx, getString(R.string.labelNameError));
return; return;
} }
disableProcessButton(); disableProcessButton();
patchLabel(instanceUrl, instanceToken, repoOwner, repoName, updateLabelName, updateLabelColor, Integer.parseInt( patchLabel(repoOwner, repoName, updateLabelName, updateLabelColor, Integer.parseInt(
Objects.requireNonNull(getIntent().getStringExtra("labelId"))), loginUid); Objects.requireNonNull(getIntent().getStringExtra("labelId"))));
} }
private void processCreateLabel() { private void processCreateLabel() {
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
AppUtil appUtil = new AppUtil();
TinyDB tinyDb = new TinyDB(appCtx); String repoFullName = tinyDB.getString("repoFullName");
String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
final String repoOwner = parts[0]; final String repoOwner = parts[0];
final String repoName = parts[1]; final String repoName = parts[1];
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String newLabelName = labelName.getText().toString(); String newLabelName = labelName.getText().toString();
String newLabelColor; String newLabelColor;
if(tinyDb.getString("labelColor").isEmpty()) { if(tinyDB.getString("labelColor").isEmpty()) {
newLabelColor = String.format("#%06X", (0xFFFFFF & ContextCompat.getColor(ctx, R.color.releasePre))); newLabelColor = String.format("#%06X", (0xFFFFFF & ContextCompat.getColor(ctx, R.color.releasePre)));
} }
else { else {
newLabelColor = tinyDb.getString("labelColor"); newLabelColor = tinyDB.getString("labelColor");
} }
if(!connToInternet) { if(!connToInternet) {
@ -213,27 +197,30 @@ public class CreateLabelActivity extends BaseActivity {
return; return;
} }
if(!appUtil.checkStrings(newLabelName)) { if(!AppUtil.checkStrings(newLabelName)) {
Toasty.error(ctx, getString(R.string.labelNameError)); Toasty.error(ctx, getString(R.string.labelNameError));
return; return;
} }
disableProcessButton(); disableProcessButton();
createNewLabel(instanceUrl, instanceToken, repoOwner, repoName, newLabelName, newLabelColor, loginUid); createNewLabel(repoOwner, repoName, newLabelName, newLabelColor);
} }
private void createNewLabel(final String instanceUrl, final String instanceToken, String repoOwner, String repoName, String newLabelName, String newLabelColor, String loginUid) { private void createNewLabel(String repoOwner, String repoName, String newLabelName, String newLabelColor) {
CreateLabel createLabelFunc = new CreateLabel(newLabelName, newLabelColor); CreateLabel createLabelFunc = new CreateLabel(newLabelName, newLabelColor);
final TinyDB tinyDb = new TinyDB(appCtx);
Call<CreateLabel> call; Call<CreateLabel> call;
call = RetrofitClient if(getIntent().getStringExtra("type") != null && Objects.requireNonNull(getIntent().getStringExtra("type")).equals("org")) {
.getInstance(instanceUrl, ctx)
.getApiInterface() call = RetrofitClient.getApiInterface(ctx).createOrganizationLabel(Authorization.get(ctx), getIntent().getStringExtra("orgName"), createLabelFunc);
.createLabel(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, createLabelFunc); }
else {
call = RetrofitClient.getApiInterface(ctx).createLabel(Authorization.get(ctx), repoOwner, repoName, createLabelFunc);
}
call.enqueue(new Callback<CreateLabel>() { call.enqueue(new Callback<CreateLabel>() {
@ -243,8 +230,8 @@ public class CreateLabelActivity extends BaseActivity {
if(response.code() == 201) { if(response.code() == 201) {
Toasty.success(ctx, getString(R.string.labelCreated)); Toasty.success(ctx, getString(R.string.labelCreated));
tinyDb.putString("labelColor", ""); tinyDB.putString("labelColor", "");
tinyDb.putBoolean("labelsRefresh", true); tinyDB.putBoolean("labelsRefresh", true);
finish(); finish();
} }
else if(response.code() == 401) { else if(response.code() == 401) {
@ -258,7 +245,7 @@ public class CreateLabelActivity extends BaseActivity {
else { else {
enableProcessButton(); enableProcessButton();
tinyDb.putString("labelColor", ""); tinyDB.putString("labelColor", "");
Toasty.error(ctx, getString(R.string.labelGeneralError)); Toasty.error(ctx, getString(R.string.labelGeneralError));
} }
} }
@ -266,7 +253,7 @@ public class CreateLabelActivity extends BaseActivity {
@Override @Override
public void onFailure(@NonNull Call<CreateLabel> call, @NonNull Throwable t) { public void onFailure(@NonNull Call<CreateLabel> call, @NonNull Throwable t) {
tinyDb.putString("labelColor", ""); tinyDB.putString("labelColor", "");
Log.e("onFailure", t.toString()); Log.e("onFailure", t.toString());
enableProcessButton(); enableProcessButton();
} }
@ -274,17 +261,20 @@ public class CreateLabelActivity extends BaseActivity {
} }
private void patchLabel(final String instanceUrl, final String instanceToken, String repoOwner, String repoName, String updateLabelName, String updateLabelColor, int labelId, String loginUid) { private void patchLabel(String repoOwner, String repoName, String updateLabelName, String updateLabelColor, int labelId) {
CreateLabel createLabelFunc = new CreateLabel(updateLabelName, updateLabelColor); CreateLabel createLabelFunc = new CreateLabel(updateLabelName, updateLabelColor);
final TinyDB tinyDb = new TinyDB(appCtx);
Call<CreateLabel> call; Call<CreateLabel> call;
call = RetrofitClient if(getIntent().getStringExtra("type") != null && Objects.requireNonNull(getIntent().getStringExtra("type")).equals("org")) {
.getInstance(instanceUrl, ctx)
.getApiInterface() call = RetrofitClient.getApiInterface(ctx).patchOrganizationLabel(Authorization.get(ctx), getIntent().getStringExtra("orgName"), labelId, createLabelFunc);
.patchLabel(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, labelId, createLabelFunc); }
else {
call = RetrofitClient.getApiInterface(appCtx).patchLabel(Authorization.get(ctx), repoOwner, repoName, labelId, createLabelFunc);
}
call.enqueue(new Callback<CreateLabel>() { call.enqueue(new Callback<CreateLabel>() {
@ -296,13 +286,14 @@ public class CreateLabelActivity extends BaseActivity {
if(response.code() == 200) { if(response.code() == 200) {
Toasty.success(ctx, getString(R.string.labelUpdated)); Toasty.success(ctx, getString(R.string.labelUpdated));
tinyDb.putString("labelColor", ""); tinyDB.putString("labelColor", "");
tinyDb.putBoolean("labelsRefresh", true); tinyDB.putBoolean("labelsRefresh", true);
tinyDb.putString("labelColorDefault", ""); tinyDB.putString("labelColorDefault", "");
getIntent().removeExtra("labelAction"); getIntent().removeExtra("labelAction");
getIntent().removeExtra("labelId"); getIntent().removeExtra("labelId");
getIntent().removeExtra("labelTitle"); getIntent().removeExtra("labelTitle");
getIntent().removeExtra("labelColor"); getIntent().removeExtra("labelColor");
getIntent().removeExtra("type");
finish(); finish();
} }
} }
@ -317,8 +308,8 @@ public class CreateLabelActivity extends BaseActivity {
else { else {
enableProcessButton(); enableProcessButton();
tinyDb.putString("labelColor", ""); tinyDB.putString("labelColor", "");
tinyDb.putString("labelColorDefault", ""); tinyDB.putString("labelColorDefault", "");
Toasty.error(ctx, getString(R.string.labelGeneralError)); Toasty.error(ctx, getString(R.string.labelGeneralError));
} }
} }
@ -326,8 +317,8 @@ public class CreateLabelActivity extends BaseActivity {
@Override @Override
public void onFailure(@NonNull Call<CreateLabel> call, @NonNull Throwable t) { public void onFailure(@NonNull Call<CreateLabel> call, @NonNull Throwable t) {
tinyDb.putString("labelColor", ""); tinyDB.putString("labelColor", "");
tinyDb.putString("labelColorDefault", ""); tinyDB.putString("labelColorDefault", "");
Log.e("onFailure", t.toString()); Log.e("onFailure", t.toString());
enableProcessButton(); enableProcessButton();
} }
@ -343,18 +334,23 @@ public class CreateLabelActivity extends BaseActivity {
getIntent().removeExtra("labelId"); getIntent().removeExtra("labelId");
getIntent().removeExtra("labelTitle"); getIntent().removeExtra("labelTitle");
getIntent().removeExtra("labelColor"); getIntent().removeExtra("labelColor");
getIntent().removeExtra("type");
finish(); finish();
}; };
} }
private void deleteLabel(final String instanceUrl, final String instanceToken, final String repoOwner, final String repoName, int labelId, String loginUid) { private void deleteLabel(final String repoOwner, final String repoName, int labelId) {
Call<Labels> call; Call<Labels> call;
call = RetrofitClient if(getIntent().getStringExtra("type") != null && Objects.requireNonNull(getIntent().getStringExtra("type")).equals("org")) {
.getInstance(instanceUrl, ctx)
.getApiInterface() call = RetrofitClient.getApiInterface(appCtx).deleteOrganizationLabel(Authorization.get(ctx), getIntent().getStringExtra("orgName"), labelId);
.deleteLabel(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, labelId); }
else {
call = RetrofitClient.getApiInterface(appCtx).deleteLabel(Authorization.get(ctx), repoOwner, repoName, labelId);
}
call.enqueue(new Callback<Labels>() { call.enqueue(new Callback<Labels>() {
@ -366,9 +362,17 @@ public class CreateLabelActivity extends BaseActivity {
if(response.code() == 204) { if(response.code() == 204) {
Toasty.success(ctx, getString(R.string.labelDeleteText)); Toasty.success(ctx, getString(R.string.labelDeleteText));
LabelsViewModel.loadLabelsList(instanceUrl, instanceToken, repoOwner, repoName, ctx); if(getIntent().getStringExtra("type") != null && Objects.requireNonNull(getIntent().getStringExtra("type")).equals("org")) {
OrganizationLabelsViewModel.loadOrgLabelsList(Authorization.get(ctx), getIntent().getStringExtra("orgName"), ctx, null, null);
}
else {
LabelsViewModel.loadLabelsList(Authorization.get(ctx), repoOwner, repoName, ctx);
}
getIntent().removeExtra("labelAction"); getIntent().removeExtra("labelAction");
getIntent().removeExtra("labelId"); getIntent().removeExtra("labelId");
getIntent().removeExtra("type");
} }
} }
else if(response.code() == 401) { else if(response.code() == 401) {

View File

@ -9,19 +9,19 @@ import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.Button; import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import org.gitnex.tea4j.models.Milestones;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityCreateMilestoneBinding;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version; import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.models.Milestones;
import java.util.Calendar; import java.util.Calendar;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
@ -37,30 +37,25 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic
private EditText milestoneTitle; private EditText milestoneTitle;
private EditText milestoneDescription; private EditText milestoneDescription;
private Button createNewMilestoneButton; private Button createNewMilestoneButton;
final Context ctx = this;
private Context appCtx;
@Override
protected int getLayoutResourceId(){
return R.layout.activity_new_milestone;
}
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
ActivityCreateMilestoneBinding activityCreateMilestoneBinding = ActivityCreateMilestoneBinding.inflate(getLayoutInflater());
setContentView(activityCreateMilestoneBinding.getRoot());
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
milestoneDueDate = findViewById(R.id.milestoneDueDate); milestoneDueDate = activityCreateMilestoneBinding.milestoneDueDate;
ImageView closeActivity = findViewById(R.id.close); ImageView closeActivity = activityCreateMilestoneBinding.close;
createNewMilestoneButton = findViewById(R.id.createNewMilestoneButton); createNewMilestoneButton = activityCreateMilestoneBinding.createNewMilestoneButton;
milestoneTitle = findViewById(R.id.milestoneTitle); milestoneTitle = activityCreateMilestoneBinding.milestoneTitle;
milestoneDescription = findViewById(R.id.milestoneDescription); milestoneDescription = activityCreateMilestoneBinding.milestoneDescription;
milestoneTitle.requestFocus(); milestoneTitle.requestFocus();
assert imm != null; assert imm != null;
@ -97,15 +92,12 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic
private void processNewMilestone() { private void processNewMilestone() {
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
AppUtil appUtil = new AppUtil();
TinyDB tinyDb = new TinyDB(appCtx); TinyDB tinyDb = TinyDB.getInstance(appCtx);
String repoFullName = tinyDb.getString("repoFullName"); String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
final String repoOwner = parts[0]; final String repoOwner = parts[0];
final String repoName = parts[1]; final String repoName = parts[1];
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String newMilestoneTitle = milestoneTitle.getText().toString(); String newMilestoneTitle = milestoneTitle.getText().toString();
String newMilestoneDescription = milestoneDescription.getText().toString(); String newMilestoneDescription = milestoneDescription.getText().toString();
@ -125,7 +117,7 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic
if(!newMilestoneDescription.equals("")) { if(!newMilestoneDescription.equals("")) {
if (appUtil.charactersLength(newMilestoneDescription) > 255) { if (newMilestoneDescription.length() > 255) {
Toasty.warning(ctx, getString(R.string.milestoneDescError)); Toasty.warning(ctx, getString(R.string.milestoneDescError));
return; return;
@ -146,18 +138,17 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic
} }
disableProcessButton(); disableProcessButton();
createNewMilestone(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, newMilestoneTitle, newMilestoneDescription, finalMilestoneDueDate); createNewMilestone(Authorization.get(ctx), repoOwner, repoName, newMilestoneTitle, newMilestoneDescription, finalMilestoneDueDate);
} }
private void createNewMilestone(final String instanceUrl, final String token, String repoOwner, String repoName, String newMilestoneTitle, String newMilestoneDescription, String newMilestoneDueDate) { private void createNewMilestone(final String token, String repoOwner, String repoName, String newMilestoneTitle, String newMilestoneDescription, String newMilestoneDueDate) {
Milestones createMilestone = new Milestones(newMilestoneDescription, newMilestoneTitle, newMilestoneDueDate); Milestones createMilestone = new Milestones(newMilestoneDescription, newMilestoneTitle, newMilestoneDueDate);
Call<Milestones> call; Call<Milestones> call;
call = RetrofitClient call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(appCtx)
.getApiInterface()
.createMilestone(token, repoOwner, repoName, createMilestone); .createMilestone(token, repoOwner, repoName, createMilestone);
call.enqueue(new Callback<Milestones>() { call.enqueue(new Callback<Milestones>() {
@ -169,7 +160,7 @@ public class CreateMilestoneActivity extends BaseActivity implements View.OnClic
if(response.code() == 201) { if(response.code() == 201) {
TinyDB tinyDb = new TinyDB(appCtx); TinyDB tinyDb = TinyDB.getInstance(appCtx);
tinyDb.putBoolean("milestoneCreated", true); tinyDb.putBoolean("milestoneCreated", true);
Toasty.success(ctx, getString(R.string.milestoneCreated)); Toasty.success(ctx, getString(R.string.milestoneCreated));
enableProcessButton(); enableProcessButton();

View File

@ -10,14 +10,14 @@ import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityCreateNewUserBinding;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.UserInfo;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
@ -33,30 +33,25 @@ public class CreateNewUserActivity extends BaseActivity {
private EditText userEmail; private EditText userEmail;
private EditText userPassword; private EditText userPassword;
private Button createUserButton; private Button createUserButton;
final Context ctx = this;
private Context appCtx;
@Override
protected int getLayoutResourceId(){
return R.layout.activity_create_new_user;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
ActivityCreateNewUserBinding activityCreateNewUserBinding = ActivityCreateNewUserBinding.inflate(getLayoutInflater());
setContentView(activityCreateNewUserBinding.getRoot());
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
ImageView closeActivity = findViewById(R.id.close); ImageView closeActivity = activityCreateNewUserBinding.close;
createUserButton = findViewById(R.id.createUserButton); createUserButton = activityCreateNewUserBinding.createUserButton;
fullName = findViewById(R.id.fullName); fullName = activityCreateNewUserBinding.fullName;
userUserName = findViewById(R.id.userUserName); userUserName = activityCreateNewUserBinding.userUserName;
userEmail = findViewById(R.id.userEmail); userEmail = activityCreateNewUserBinding.userEmail;
userPassword = findViewById(R.id.userPassword); userPassword = activityCreateNewUserBinding.userPassword;
fullName.requestFocus(); fullName.requestFocus();
assert imm != null; assert imm != null;
@ -78,11 +73,6 @@ public class CreateNewUserActivity extends BaseActivity {
private void processCreateNewUser() { private void processCreateNewUser() {
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
AppUtil appUtil = new AppUtil();
TinyDB tinyDb = new TinyDB(appCtx);
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String newFullName = fullName.getText().toString().trim(); String newFullName = fullName.getText().toString().trim();
String newUserName = userUserName.getText().toString().trim(); String newUserName = userUserName.getText().toString().trim();
@ -101,13 +91,13 @@ public class CreateNewUserActivity extends BaseActivity {
return; return;
} }
if(!appUtil.checkStrings(newFullName)) { if(!AppUtil.checkStrings(newFullName)) {
Toasty.error(ctx, getString(R.string.userInvalidFullName)); Toasty.error(ctx, getString(R.string.userInvalidFullName));
return; return;
} }
if(!appUtil.checkStringsWithAlphaNumeric(newUserName)) { if(!AppUtil.checkStringsWithAlphaNumeric(newUserName)) {
Toasty.error(ctx, getString(R.string.userInvalidUserName)); Toasty.error(ctx, getString(R.string.userInvalidUserName));
return; return;
@ -120,18 +110,17 @@ public class CreateNewUserActivity extends BaseActivity {
} }
disableProcessButton(); disableProcessButton();
createNewUser(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), newFullName, newUserName, newUserEmail, newUserPassword); createNewUser(Authorization.get(ctx), newFullName, newUserName, newUserEmail, newUserPassword);
} }
private void createNewUser(final String instanceUrl, final String instanceToken, String newFullName, String newUserName, String newUserEmail, String newUserPassword) { private void createNewUser(final String instanceToken, String newFullName, String newUserName, String newUserEmail, String newUserPassword) {
UserInfo createUser = new UserInfo(newUserEmail, newFullName, newUserName, newUserPassword, newUserName, 0, true); UserInfo createUser = new UserInfo(newUserEmail, newFullName, newUserName, newUserPassword, newUserName, 0, true);
Call<UserInfo> call; Call<UserInfo> call;
call = RetrofitClient call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(appCtx)
.getApiInterface()
.createNewUser(instanceToken, createUser); .createNewUser(instanceToken, createUser);
call.enqueue(new Callback<UserInfo>() { call.enqueue(new Callback<UserInfo>() {

View File

@ -11,14 +11,15 @@ import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import org.gitnex.tea4j.models.UserOrganizations;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityCreateOrganizationBinding;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.UserOrganizations;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
@ -34,28 +35,23 @@ public class CreateOrganizationActivity extends BaseActivity {
private EditText orgName; private EditText orgName;
private EditText orgDesc; private EditText orgDesc;
final Context ctx = this;
private Context appCtx;
@Override
protected int getLayoutResourceId(){
return R.layout.activity_new_organization;
}
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
ActivityCreateOrganizationBinding activityCreateOrganizationBinding = ActivityCreateOrganizationBinding.inflate(getLayoutInflater());
setContentView(activityCreateOrganizationBinding.getRoot());
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
closeActivity = findViewById(R.id.close); closeActivity = activityCreateOrganizationBinding.close;
orgName = findViewById(R.id.newOrganizationName); orgName = activityCreateOrganizationBinding.newOrganizationName;
orgDesc = findViewById(R.id.newOrganizationDescription); orgDesc = activityCreateOrganizationBinding.newOrganizationDescription;
orgName.requestFocus(); orgName.requestFocus();
assert imm != null; assert imm != null;
@ -75,7 +71,7 @@ public class CreateOrganizationActivity extends BaseActivity {
initCloseListener(); initCloseListener();
closeActivity.setOnClickListener(onClickListener); closeActivity.setOnClickListener(onClickListener);
createOrganizationButton = findViewById(R.id.createNewOrganizationButton); createOrganizationButton = activityCreateOrganizationBinding.createNewOrganizationButton;
if(!connToInternet) { if(!connToInternet) {
@ -98,11 +94,6 @@ public class CreateOrganizationActivity extends BaseActivity {
private void processNewOrganization() { private void processNewOrganization() {
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
AppUtil appUtil = new AppUtil();
TinyDB tinyDb = new TinyDB(appCtx);
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String newOrgName = orgName.getText().toString(); String newOrgName = orgName.getText().toString();
String newOrgDesc = orgDesc.getText().toString(); String newOrgDesc = orgDesc.getText().toString();
@ -115,7 +106,7 @@ public class CreateOrganizationActivity extends BaseActivity {
if(!newOrgDesc.equals("")) { if(!newOrgDesc.equals("")) {
if (appUtil.charactersLength(newOrgDesc) > 255) { if (newOrgDesc.length() > 255) {
Toasty.warning(ctx, getString(R.string.orgDescError)); Toasty.warning(ctx, getString(R.string.orgDescError));
return; return;
@ -126,25 +117,24 @@ public class CreateOrganizationActivity extends BaseActivity {
Toasty.error(ctx, getString(R.string.orgNameErrorEmpty)); Toasty.error(ctx, getString(R.string.orgNameErrorEmpty));
} }
else if(!appUtil.checkStrings(newOrgName)) { else if(!AppUtil.checkStrings(newOrgName)) {
Toasty.warning(ctx, getString(R.string.orgNameErrorInvalid)); Toasty.warning(ctx, getString(R.string.orgNameErrorInvalid));
} }
else { else {
disableProcessButton(); disableProcessButton();
createNewOrganization(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), newOrgName, newOrgDesc); createNewOrganization(Authorization.get(ctx), newOrgName, newOrgDesc);
} }
} }
private void createNewOrganization(final String instanceUrl, final String token, String orgName, String orgDesc) { private void createNewOrganization(final String token, String orgName, String orgDesc) {
UserOrganizations createOrganization = new UserOrganizations(orgName, null, orgDesc, null, null); UserOrganizations createOrganization = new UserOrganizations(orgName, null, orgDesc, null, null);
Call<UserOrganizations> call = RetrofitClient Call<UserOrganizations> call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(appCtx)
.getApiInterface()
.createNewOrganization(token, createOrganization); .createNewOrganization(token, createOrganization);
call.enqueue(new Callback<UserOrganizations>() { call.enqueue(new Callback<UserOrganizations>() {
@ -154,7 +144,7 @@ public class CreateOrganizationActivity extends BaseActivity {
if(response.code() == 201) { if(response.code() == 201) {
TinyDB tinyDb = new TinyDB(appCtx); TinyDB tinyDb = TinyDB.getInstance(appCtx);
tinyDb.putBoolean("orgCreated", true); tinyDb.putBoolean("orgCreated", true);
enableProcessButton(); enableProcessButton();
Toasty.success(ctx, getString(R.string.orgCreated)); Toasty.success(ctx, getString(R.string.orgCreated));

View File

@ -3,7 +3,6 @@ package org.mian.gitnex.activities;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.DatePickerDialog; import android.app.DatePickerDialog;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.os.Bundle; import android.os.Bundle;
@ -13,6 +12,10 @@ import android.view.View;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.ImageView; import android.widget.ImageView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import org.gitnex.tea4j.models.Branches;
import org.gitnex.tea4j.models.CreatePullRequest;
import org.gitnex.tea4j.models.Labels;
import org.gitnex.tea4j.models.Milestones;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.actions.LabelsActions; import org.mian.gitnex.actions.LabelsActions;
import org.mian.gitnex.adapters.LabelsListAdapter; import org.mian.gitnex.adapters.LabelsListAdapter;
@ -21,18 +24,12 @@ import org.mian.gitnex.databinding.ActivityCreatePrBinding;
import org.mian.gitnex.databinding.CustomLabelsSelectionDialogBinding; import org.mian.gitnex.databinding.CustomLabelsSelectionDialogBinding;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.StaticGlobalVariables; import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version; import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.models.Branches;
import org.mian.gitnex.models.CreatePullRequest;
import org.mian.gitnex.models.Labels;
import org.mian.gitnex.models.Milestones;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.List; import java.util.List;
import okhttp3.ResponseBody;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
@ -43,19 +40,15 @@ import retrofit2.Callback;
public class CreatePullRequestActivity extends BaseActivity implements LabelsListAdapter.LabelsListAdapterListener { public class CreatePullRequestActivity extends BaseActivity implements LabelsListAdapter.LabelsListAdapterListener {
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
private Context ctx = this;
private Context appCtx;
private TinyDB tinyDb;
private ActivityCreatePrBinding viewBinding; private ActivityCreatePrBinding viewBinding;
private CustomLabelsSelectionDialogBinding labelsBinding; private CustomLabelsSelectionDialogBinding labelsBinding;
private int resultLimit = StaticGlobalVariables.resultLimitOldGiteaInstances; private int resultLimit = Constants.resultLimitOldGiteaInstances;
private Dialog dialogLabels; private Dialog dialogLabels;
private String labelsSetter; private String labelsSetter;
private List<Integer> labelsIds = new ArrayList<>(); private List<Integer> labelsIds = new ArrayList<>();
private List<String> assignees = new ArrayList<>(); private List<String> assignees = new ArrayList<>();
private int milestoneId; private int milestoneId;
private String instanceUrl;
private String loginUid; private String loginUid;
private String instanceToken; private String instanceToken;
private String repoOwner; private String repoOwner;
@ -67,38 +60,26 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis
List<Branches> branchesList = new ArrayList<>(); List<Branches> branchesList = new ArrayList<>();
List<Labels> labelsList = new ArrayList<>(); List<Labels> labelsList = new ArrayList<>();
public CreatePullRequestActivity() {
}
@Override
protected int getLayoutResourceId(){
return R.layout.activity_create_pr;
}
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
tinyDb = new TinyDB(appCtx);
viewBinding = ActivityCreatePrBinding.inflate(getLayoutInflater()); viewBinding = ActivityCreatePrBinding.inflate(getLayoutInflater());
View view = viewBinding.getRoot(); setContentView(viewBinding.getRoot());
setContentView(view);
instanceUrl = tinyDb.getString("instanceUrl"); loginUid = tinyDB.getString("loginUid");
loginUid = tinyDb.getString("loginUid"); String repoFullName = tinyDB.getString("repoFullName");
String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
repoOwner = parts[0]; repoOwner = parts[0];
repoName = parts[1]; repoName = parts[1];
instanceToken = "token " + tinyDb.getString(loginUid + "-token"); instanceToken = "token " + tinyDB.getString(loginUid + "-token");
// require gitea 1.12 or higher // require gitea 1.12 or higher
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) { if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.0")) {
resultLimit = StaticGlobalVariables.resultLimitNewGiteaInstances; resultLimit = Constants.resultLimitNewGiteaInstances;
} }
viewBinding.prBody.setOnTouchListener((touchView, motionEvent) -> { viewBinding.prBody.setOnTouchListener((touchView, motionEvent) -> {
@ -125,8 +106,8 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis
disableProcessButton(); disableProcessButton();
getMilestones(instanceUrl, instanceToken, repoOwner, repoName, loginUid, resultLimit); getMilestones(repoOwner, repoName, resultLimit);
getBranches(instanceUrl, instanceToken, repoOwner, repoName, loginUid); getBranches(repoOwner, repoName);
viewBinding.prLabels.setOnClickListener(prLabels -> showLabels()); viewBinding.prLabels.setOnClickListener(prLabels -> showLabels());
@ -183,15 +164,14 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis
CreatePullRequest createPullRequest = new CreatePullRequest(prTitle, prDescription, loginUid, mergeInto, pullFrom, milestoneId, dueDate, assignees, labelsIds); CreatePullRequest createPullRequest = new CreatePullRequest(prTitle, prDescription, loginUid, mergeInto, pullFrom, milestoneId, dueDate, assignees, labelsIds);
Call<ResponseBody> transferCall = RetrofitClient Call<Void> transferCall = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(appCtx)
.getApiInterface()
.createPullRequest(instanceToken, repoOwner, repoName, createPullRequest); .createPullRequest(instanceToken, repoOwner, repoName, createPullRequest);
transferCall.enqueue(new Callback<ResponseBody>() { transferCall.enqueue(new Callback<Void>() {
@Override @Override
public void onResponse(@NonNull Call<ResponseBody> call, @NonNull retrofit2.Response<ResponseBody> response) { public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
disableProcessButton(); disableProcessButton();
@ -218,7 +198,7 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis
} }
@Override @Override
public void onFailure(@NonNull Call<ResponseBody> call, @NonNull Throwable t) { public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
enableProcessButton(); enableProcessButton();
Toasty.error(ctx, getString(R.string.genericServerResponseError)); Toasty.error(ctx, getString(R.string.genericServerResponseError));
@ -256,15 +236,14 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis
labelsBinding.cancel.setOnClickListener(editProperties -> dialogLabels.dismiss()); labelsBinding.cancel.setOnClickListener(editProperties -> dialogLabels.dismiss());
dialogLabels.show(); dialogLabels.show();
LabelsActions.getRepositoryLabels(ctx, instanceUrl, instanceToken, repoOwner, repoName, labelsList, dialogLabels, labelsAdapter, labelsBinding); LabelsActions.getRepositoryLabels(ctx, repoOwner, repoName, labelsList, dialogLabels, labelsAdapter, labelsBinding);
} }
private void getBranches(String instanceUrl, String instanceToken, String repoOwner, String repoName, String loginUid) { private void getBranches(String repoOwner, String repoName) {
Call<List<Branches>> call = RetrofitClient Call<List<Branches>> call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface() .getBranches(Authorization.get(ctx), repoOwner, repoName);
.getBranches(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName);
call.enqueue(new Callback<List<Branches>>() { call.enqueue(new Callback<List<Branches>>() {
@ -308,13 +287,12 @@ public class CreatePullRequestActivity extends BaseActivity implements LabelsLis
} }
private void getMilestones(String instanceUrl, String instanceToken, String repoOwner, String repoName, String loginUid, int resultLimit) { private void getMilestones(String repoOwner, String repoName, int resultLimit) {
String msState = "open"; String msState = "open";
Call<List<Milestones>> call = RetrofitClient Call<List<Milestones>> call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(appCtx)
.getApiInterface() .getMilestones(Authorization.get(ctx), repoOwner, repoName, 1, resultLimit, msState);
.getMilestones(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, 1, resultLimit, msState);
call.enqueue(new Callback<List<Milestones>>() { call.enqueue(new Callback<List<Milestones>>() {

View File

@ -14,15 +14,15 @@ import android.widget.CheckBox;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import org.gitnex.tea4j.models.Branches;
import org.gitnex.tea4j.models.Releases;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityCreateReleaseBinding;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.Branches;
import org.mian.gitnex.models.Releases;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import retrofit2.Call; import retrofit2.Call;
@ -43,50 +43,37 @@ public class CreateReleaseActivity extends BaseActivity {
private CheckBox releaseType; private CheckBox releaseType;
private CheckBox releaseDraft; private CheckBox releaseDraft;
private Button createNewRelease; private Button createNewRelease;
final Context ctx = this;
private Context appCtx;
private TinyDB tinyDb;
private String selectedBranch; private String selectedBranch;
private String instanceUrl;
private String loginUid;
private String instanceToken;
private String repoOwner; private String repoOwner;
private String repoName; private String repoName;
List<Branches> branchesList = new ArrayList<>(); List<Branches> branchesList = new ArrayList<>();
@Override
protected int getLayoutResourceId(){
return R.layout.activity_create_release;
}
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
tinyDb = new TinyDB(appCtx); ActivityCreateReleaseBinding activityCreateReleaseBinding = ActivityCreateReleaseBinding.inflate(getLayoutInflater());
setContentView(activityCreateReleaseBinding.getRoot());
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
instanceUrl = tinyDb.getString("instanceUrl"); String repoFullName = tinyDB.getString("repoFullName");
loginUid = tinyDb.getString("loginUid");
instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
repoOwner = parts[0]; repoOwner = parts[0];
repoName = parts[1]; repoName = parts[1];
closeActivity = findViewById(R.id.close); closeActivity = activityCreateReleaseBinding.close;
releaseTagName = findViewById(R.id.releaseTagName); releaseTagName = activityCreateReleaseBinding.releaseTagName;
releaseTitle = findViewById(R.id.releaseTitle); releaseTitle = activityCreateReleaseBinding.releaseTitle;
releaseContent = findViewById(R.id.releaseContent); releaseContent = activityCreateReleaseBinding.releaseContent;
releaseType = findViewById(R.id.releaseType); releaseType = activityCreateReleaseBinding.releaseType;
releaseDraft = findViewById(R.id.releaseDraft); releaseDraft = activityCreateReleaseBinding.releaseDraft;
releaseTitle.requestFocus(); releaseTitle.requestFocus();
assert imm != null; assert imm != null;
@ -106,10 +93,10 @@ public class CreateReleaseActivity extends BaseActivity {
initCloseListener(); initCloseListener();
closeActivity.setOnClickListener(onClickListener); closeActivity.setOnClickListener(onClickListener);
releaseBranch = findViewById(R.id.releaseBranch); releaseBranch = activityCreateReleaseBinding.releaseBranch;
getBranches(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName); getBranches(Authorization.get(ctx), repoOwner, repoName);
createNewRelease = findViewById(R.id.createNewRelease); createNewRelease = activityCreateReleaseBinding.createNewRelease;
disableProcessButton(); disableProcessButton();
if(!connToInternet) { if(!connToInternet) {
@ -161,18 +148,17 @@ public class CreateReleaseActivity extends BaseActivity {
} }
disableProcessButton(); disableProcessButton();
createNewReleaseFunc(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, newReleaseTagName, newReleaseTitle, newReleaseContent, selectedBranch, newReleaseType, newReleaseDraft); createNewReleaseFunc(Authorization.get(ctx), repoOwner, repoName, newReleaseTagName, newReleaseTitle, newReleaseContent, selectedBranch, newReleaseType, newReleaseDraft);
} }
private void createNewReleaseFunc(final String instanceUrl, final String token, String repoOwner, String repoName, String newReleaseTagName, String newReleaseTitle, String newReleaseContent, String selectedBranch, boolean newReleaseType, boolean newReleaseDraft) { private void createNewReleaseFunc(final String token, String repoOwner, String repoName, String newReleaseTagName, String newReleaseTitle, String newReleaseContent, String selectedBranch, boolean newReleaseType, boolean newReleaseDraft) {
Releases createReleaseJson = new Releases(newReleaseContent, newReleaseDraft, newReleaseTitle, newReleaseType, newReleaseTagName, selectedBranch); Releases createReleaseJson = new Releases(newReleaseContent, newReleaseDraft, newReleaseTitle, newReleaseType, newReleaseTagName, selectedBranch);
Call<Releases> call; Call<Releases> call;
call = RetrofitClient call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface()
.createNewRelease(token, repoOwner, repoName, createReleaseJson); .createNewRelease(token, repoOwner, repoName, createReleaseJson);
call.enqueue(new Callback<Releases>() { call.enqueue(new Callback<Releases>() {
@ -182,7 +168,7 @@ public class CreateReleaseActivity extends BaseActivity {
if (response.code() == 201) { if (response.code() == 201) {
tinyDb.putBoolean("updateReleases", true); tinyDB.putBoolean("updateReleases", true);
Toasty.success(ctx, getString(R.string.releaseCreatedText)); Toasty.success(ctx, getString(R.string.releaseCreatedText));
enableProcessButton(); enableProcessButton();
finish(); finish();
@ -222,11 +208,10 @@ public class CreateReleaseActivity extends BaseActivity {
} }
private void getBranches(String instanceUrl, String instanceToken, final String repoOwner, final String repoName) { private void getBranches(String instanceToken, final String repoOwner, final String repoName) {
Call<List<Branches>> call = RetrofitClient Call<List<Branches>> call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface()
.getBranches(instanceToken, repoOwner, repoName); .getBranches(instanceToken, repoOwner, repoName);
call.enqueue(new Callback<List<Branches>>() { call.enqueue(new Callback<List<Branches>>() {

View File

@ -14,15 +14,16 @@ import android.widget.CheckBox;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import org.gitnex.tea4j.models.OrgOwner;
import org.gitnex.tea4j.models.OrganizationRepository;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityCreateRepoBinding;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.OrgOwner;
import org.mian.gitnex.models.OrganizationRepository;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -43,14 +44,9 @@ public class CreateRepoActivity extends BaseActivity {
private EditText repoName; private EditText repoName;
private EditText repoDesc; private EditText repoDesc;
private CheckBox repoAccess; private CheckBox repoAccess;
final Context ctx = this;
private Context appCtx;
private TinyDB tinyDb;
private String instanceUrl;
private String loginUid; private String loginUid;
private String userLogin; private String userLogin;
private String instanceToken;
private String selectedOwner; private String selectedOwner;
@ -60,31 +56,25 @@ public class CreateRepoActivity extends BaseActivity {
final List<String> reservedRepoNames = Arrays.asList(".", ".."); final List<String> reservedRepoNames = Arrays.asList(".", "..");
final Pattern reservedRepoPatterns = Pattern.compile("\\.(git|wiki)$"); final Pattern reservedRepoPatterns = Pattern.compile("\\.(git|wiki)$");
@Override
protected int getLayoutResourceId(){
return R.layout.activity_new_repo;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
tinyDb = new TinyDB(appCtx); ActivityCreateRepoBinding activityCreateRepoBinding = ActivityCreateRepoBinding.inflate(getLayoutInflater());
setContentView(activityCreateRepoBinding.getRoot());
boolean connToInternet = AppUtil.hasNetworkConnection(ctx); boolean connToInternet = AppUtil.hasNetworkConnection(ctx);
instanceUrl = tinyDb.getString("instanceUrl"); loginUid = tinyDB.getString("loginUid");
loginUid = tinyDb.getString("loginUid"); userLogin = tinyDB.getString("userLogin");
userLogin = tinyDb.getString("userLogin");
instanceToken = "token " + tinyDb.getString(loginUid + "-token");
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
closeActivity = findViewById(R.id.close); closeActivity = activityCreateRepoBinding.close;
repoName = findViewById(R.id.newRepoName); repoName = activityCreateRepoBinding.newRepoName;
repoDesc = findViewById(R.id.newRepoDescription); repoDesc = activityCreateRepoBinding.newRepoDescription;
repoAccess = findViewById(R.id.newRepoPrivate); repoAccess = activityCreateRepoBinding.newRepoPrivate;
repoName.requestFocus(); repoName.requestFocus();
assert imm != null; assert imm != null;
@ -93,10 +83,10 @@ public class CreateRepoActivity extends BaseActivity {
initCloseListener(); initCloseListener();
closeActivity.setOnClickListener(onClickListener); closeActivity.setOnClickListener(onClickListener);
spinner = findViewById(R.id.ownerSpinner); spinner = activityCreateRepoBinding.ownerSpinner;
getOrganizations(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), userLogin); getOrganizations(Authorization.get(ctx), userLogin);
createRepo = findViewById(R.id.createNewRepoButton); createRepo = activityCreateRepoBinding.createNewRepoButton;
disableProcessButton(); disableProcessButton();
if(!connToInternet) { if(!connToInternet) {
@ -114,7 +104,6 @@ public class CreateRepoActivity extends BaseActivity {
private void processNewRepo() { private void processNewRepo() {
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
AppUtil appUtil = new AppUtil();
String newRepoName = repoName.getText().toString(); String newRepoName = repoName.getText().toString();
String newRepoDesc = repoDesc.getText().toString(); String newRepoDesc = repoDesc.getText().toString();
@ -128,7 +117,7 @@ public class CreateRepoActivity extends BaseActivity {
if(!newRepoDesc.equals("")) { if(!newRepoDesc.equals("")) {
if (appUtil.charactersLength(newRepoDesc) > 255) { if (newRepoDesc.length() > 255) {
Toasty.warning(ctx, getString(R.string.repoDescError)); Toasty.warning(ctx, getString(R.string.repoDescError));
return; return;
@ -139,7 +128,7 @@ public class CreateRepoActivity extends BaseActivity {
Toasty.error(ctx, getString(R.string.repoNameErrorEmpty)); Toasty.error(ctx, getString(R.string.repoNameErrorEmpty));
} }
else if(!appUtil.checkStrings(newRepoName)) { else if(!AppUtil.checkStrings(newRepoName)) {
Toasty.warning(ctx, getString(R.string.repoNameErrorInvalid)); Toasty.warning(ctx, getString(R.string.repoNameErrorInvalid));
} }
@ -158,11 +147,11 @@ public class CreateRepoActivity extends BaseActivity {
else { else {
disableProcessButton(); disableProcessButton();
createNewRepository(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), loginUid, newRepoName, newRepoDesc, selectedOwner, newRepoAccess); createNewRepository(Authorization.get(ctx), loginUid, newRepoName, newRepoDesc, selectedOwner, newRepoAccess);
} }
} }
private void createNewRepository(final String instanceUrl, final String token, String loginUid, String repoName, String repoDesc, String selectedOwner, boolean isPrivate) { private void createNewRepository(final String token, String loginUid, String repoName, String repoDesc, String selectedOwner, boolean isPrivate) {
OrganizationRepository createRepository = new OrganizationRepository(true, repoDesc, null, null, repoName, isPrivate, "Default"); OrganizationRepository createRepository = new OrganizationRepository(true, repoDesc, null, null, repoName, isPrivate, "Default");
@ -170,15 +159,13 @@ public class CreateRepoActivity extends BaseActivity {
if(selectedOwner.equals(loginUid)) { if(selectedOwner.equals(loginUid)) {
call = RetrofitClient call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface()
.createNewUserRepository(token, createRepository); .createNewUserRepository(token, createRepository);
} }
else { else {
call = RetrofitClient call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface()
.createNewUserOrgRepository(token, selectedOwner, createRepository); .createNewUserOrgRepository(token, selectedOwner, createRepository);
} }
@ -189,7 +176,7 @@ public class CreateRepoActivity extends BaseActivity {
if(response.code() == 201) { if(response.code() == 201) {
TinyDB tinyDb = new TinyDB(appCtx); TinyDB tinyDb = TinyDB.getInstance(appCtx);
tinyDb.putBoolean("repoCreated", true); tinyDb.putBoolean("repoCreated", true);
Toasty.success(ctx, getString(R.string.repoCreated)); Toasty.success(ctx, getString(R.string.repoCreated));
enableProcessButton(); enableProcessButton();
@ -224,11 +211,10 @@ public class CreateRepoActivity extends BaseActivity {
}); });
} }
private void getOrganizations(String instanceUrl, String instanceToken, final String userLogin) { private void getOrganizations(String instanceToken, final String userLogin) {
Call<List<OrgOwner>> call = RetrofitClient Call<List<OrgOwner>> call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface()
.getOrgOwners(instanceToken); .getOrgOwners(instanceToken);
call.enqueue(new Callback<List<OrgOwner>>() { call.enqueue(new Callback<List<OrgOwner>>() {
@ -249,9 +235,9 @@ public class CreateRepoActivity extends BaseActivity {
for(int i = 0; i < organizationsList_.size(); i++) { for(int i = 0; i < organizationsList_.size(); i++) {
if(!tinyDb.getString("organizationId").isEmpty()) { if(!tinyDB.getString("organizationId").isEmpty()) {
if(Integer.parseInt(tinyDb.getString("organizationId")) == organizationsList_.get(i).getId()) { if(Integer.parseInt(tinyDB.getString("organizationId")) == organizationsList_.get(i).getId()) {
organizationId = i + 1; organizationId = i + 1;
} }
} }
@ -267,7 +253,7 @@ public class CreateRepoActivity extends BaseActivity {
spinner.setOnItemClickListener ((parent, view, position, id) -> selectedOwner = organizationsList.get(position).getUsername()); spinner.setOnItemClickListener ((parent, view, position, id) -> selectedOwner = organizationsList.get(position).getUsername());
if(tinyDb.getBoolean("organizationAction") & organizationId != 0) { if(tinyDB.getBoolean("organizationAction") & organizationId != 0) {
int selectOwnerById = organizationId; int selectOwnerById = organizationId;
new Handler(Looper.getMainLooper()).postDelayed(() -> { new Handler(Looper.getMainLooper()).postDelayed(() -> {
@ -276,7 +262,7 @@ public class CreateRepoActivity extends BaseActivity {
selectedOwner = organizationsList.get(selectOwnerById).getUsername(); selectedOwner = organizationsList.get(selectOwnerById).getUsername();
}, 500); }, 500);
tinyDb.putBoolean("organizationAction", false); tinyDB.putBoolean("organizationAction", false);
} }
enableProcessButton(); enableProcessButton();

View File

@ -11,14 +11,16 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.core.content.res.ResourcesCompat;
import org.gitnex.tea4j.models.Teams;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityCreateTeamByOrgBinding;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.Teams;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -31,8 +33,6 @@ import retrofit2.Callback;
public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClickListener { public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClickListener {
final Context ctx = CreateTeamByOrgActivity.this;
private Context appCtx;
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
private TextView teamName; private TextView teamName;
private TextView teamDesc; private TextView teamDesc;
@ -44,11 +44,6 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic
private final String[] permissionList = {"Read", "Write", "Admin"}; private final String[] permissionList = {"Read", "Write", "Admin"};
public int permissionSelectedChoice = -1; public int permissionSelectedChoice = -1;
@Override
protected int getLayoutResourceId(){
return R.layout.activity_create_team_by_org;
}
private final String[] accessControlsList = new String[] { private final String[] accessControlsList = new String[] {
"Code", "Code",
"Issues", "Issues",
@ -75,20 +70,22 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
ActivityCreateTeamByOrgBinding activityCreateTeamByOrgBinding = ActivityCreateTeamByOrgBinding.inflate(getLayoutInflater());
setContentView(activityCreateTeamByOrgBinding.getRoot());
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
ImageView closeActivity = findViewById(R.id.close); ImageView closeActivity = activityCreateTeamByOrgBinding.close;
teamName = findViewById(R.id.teamName); teamName = activityCreateTeamByOrgBinding.teamName;
teamDesc = findViewById(R.id.teamDesc); teamDesc = activityCreateTeamByOrgBinding.teamDesc;
teamPermission = findViewById(R.id.teamPermission); teamPermission = activityCreateTeamByOrgBinding.teamPermission;
teamPermissionDetail = findViewById(R.id.teamPermissionDetail); teamPermissionDetail = activityCreateTeamByOrgBinding.teamPermissionDetail;
teamAccessControls = findViewById(R.id.teamAccessControls); teamAccessControls = activityCreateTeamByOrgBinding.teamAccessControls;
teamAccessControlsArray = findViewById(R.id.teamAccessControlsArray); teamAccessControlsArray = activityCreateTeamByOrgBinding.teamAccessControlsArray;
createTeamButton = findViewById(R.id.createTeamButton); createTeamButton = activityCreateTeamByOrgBinding.createTeamButton;
teamName.requestFocus(); teamName.requestFocus();
assert imm != null; assert imm != null;
@ -214,8 +211,8 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic
createTeamButton.setEnabled(false); createTeamButton.setEnabled(false);
GradientDrawable shape = new GradientDrawable(); GradientDrawable shape = new GradientDrawable();
shape.setCornerRadius( 8 ); shape.setCornerRadius(8);
shape.setColor(getResources().getColor(R.color.hintColor)); shape.setColor(ResourcesCompat.getColor(getResources(), R.color.hintColor, null));
createTeamButton.setBackground(shape); createTeamButton.setBackground(shape);
} }
else { else {
@ -227,9 +224,7 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic
private void processCreateTeam() { private void processCreateTeam() {
AppUtil appUtil = new AppUtil(); final TinyDB tinyDb = TinyDB.getInstance(appCtx);
final TinyDB tinyDb = new TinyDB(appCtx);
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid"); final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
final String orgName = tinyDb.getString("orgName");; final String orgName = tinyDb.getString("orgName");;
@ -252,7 +247,7 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic
return; return;
} }
if(!appUtil.checkStringsWithAlphaNumericDashDotUnderscore(newTeamName)) { if(!AppUtil.checkStringsWithAlphaNumericDashDotUnderscore(newTeamName)) {
Toasty.warning(ctx, getString(R.string.teamNameError)); Toasty.warning(ctx, getString(R.string.teamNameError));
return; return;
@ -260,7 +255,7 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic
if(!newTeamDesc.equals("")) { if(!newTeamDesc.equals("")) {
if(!appUtil.checkStrings(newTeamDesc)) { if(!AppUtil.checkStrings(newTeamDesc)) {
Toasty.warning(ctx, getString(R.string.teamDescError)); Toasty.warning(ctx, getString(R.string.teamDescError));
return; return;
@ -286,19 +281,18 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic
newTeamAccessControls_.set(i, newTeamAccessControls_.get(i).trim()); newTeamAccessControls_.set(i, newTeamAccessControls_.get(i).trim());
} }
createNewTeamCall(instanceUrl, instanceToken, orgName, newTeamName, newTeamDesc, newTeamPermission, newTeamAccessControls_, loginUid); createNewTeamCall(instanceToken, orgName, newTeamName, newTeamDesc, newTeamPermission, newTeamAccessControls_, loginUid);
} }
private void createNewTeamCall(final String instanceUrl, final String instanceToken, String orgName, String newTeamName, String newTeamDesc, String newTeamPermission, List<String> newTeamAccessControls, String loginUid) { private void createNewTeamCall(final String instanceToken, String orgName, String newTeamName, String newTeamDesc, String newTeamPermission, List<String> newTeamAccessControls, String loginUid) {
Teams createNewTeamJson = new Teams(newTeamName, newTeamDesc, newTeamPermission, newTeamAccessControls); Teams createNewTeamJson = new Teams(newTeamName, newTeamDesc, newTeamPermission, newTeamAccessControls);
Call<Teams> call3; Call<Teams> call3;
call3 = RetrofitClient call3 = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface() .createTeamsByOrg(Authorization.get(ctx), orgName, createNewTeamJson);
.createTeamsByOrg(Authorization.returnAuthentication(ctx, loginUid, instanceToken), orgName, createNewTeamJson);
call3.enqueue(new Callback<Teams>() { call3.enqueue(new Callback<Teams>() {
@ -309,7 +303,7 @@ public class CreateTeamByOrgActivity extends BaseActivity implements View.OnClic
if(response2.code() == 201) { if(response2.code() == 201) {
TinyDB tinyDb = new TinyDB(appCtx); TinyDB tinyDb = TinyDB.getInstance(appCtx);
tinyDb.putBoolean("resumeTeams", true); tinyDb.putBoolean("resumeTeams", true);
Toasty.success(ctx, getString(R.string.teamCreated)); Toasty.success(ctx, getString(R.string.teamCreated));

View File

@ -1,6 +1,5 @@
package org.mian.gitnex.activities; package org.mian.gitnex.activities;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
@ -10,6 +9,8 @@ import android.util.Log;
import android.view.View; import android.view.View;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.gitnex.tea4j.models.PullRequests;
import org.gitnex.tea4j.models.UserRepositories;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.database.api.RepositoriesApi; import org.mian.gitnex.database.api.RepositoriesApi;
@ -17,13 +18,7 @@ import org.mian.gitnex.database.api.UserAccountsApi;
import org.mian.gitnex.database.models.Repository; import org.mian.gitnex.database.models.Repository;
import org.mian.gitnex.database.models.UserAccount; import org.mian.gitnex.database.models.UserAccount;
import org.mian.gitnex.databinding.ActivityDeeplinksBinding; import org.mian.gitnex.databinding.ActivityDeeplinksBinding;
import org.mian.gitnex.helpers.PathsHelper;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.UrlHelper; import org.mian.gitnex.helpers.UrlHelper;
import org.mian.gitnex.models.GiteaVersion;
import org.mian.gitnex.models.PullRequests;
import org.mian.gitnex.models.UserRepositories;
import java.net.URI; import java.net.URI;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@ -38,33 +33,21 @@ import retrofit2.Callback;
public class DeepLinksActivity extends BaseActivity { public class DeepLinksActivity extends BaseActivity {
private ActivityDeeplinksBinding viewBinding; private ActivityDeeplinksBinding viewBinding;
private Context ctx = this;
private Context appCtx;
private TinyDB tinyDb;
private String currentInstance; private String currentInstance;
private String instanceToken; private String instanceToken;
private boolean noAccountFound = false; private boolean accountFound = false;
private Intent mainIntent; private Intent mainIntent;
private Intent issueIntent; private Intent issueIntent;
private Intent repoIntent; private Intent repoIntent;
@Override
protected int getLayoutResourceId() {
return R.layout.activity_deeplinks;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
tinyDb = new TinyDB(appCtx);
viewBinding = ActivityDeeplinksBinding.inflate(getLayoutInflater()); viewBinding = ActivityDeeplinksBinding.inflate(getLayoutInflater());
View view = viewBinding.getRoot(); setContentView(viewBinding.getRoot());
setContentView(view);
mainIntent = new Intent(ctx, MainActivity.class); mainIntent = new Intent(ctx, MainActivity.class);
issueIntent = new Intent(ctx, IssueDetailActivity.class); issueIntent = new Intent(ctx, IssueDetailActivity.class);
@ -75,7 +58,7 @@ public class DeepLinksActivity extends BaseActivity {
assert data != null; assert data != null;
// check for login // check for login
if(!tinyDb.getBoolean("loggedInMode")) { if(!tinyDB.getBoolean("loggedInMode")) {
finish(); finish();
ctx.startActivity(new Intent(ctx, LoginActivity.class)); ctx.startActivity(new Intent(ctx, LoginActivity.class));
@ -85,31 +68,28 @@ public class DeepLinksActivity extends BaseActivity {
UserAccountsApi userAccountsApi = new UserAccountsApi(ctx); UserAccountsApi userAccountsApi = new UserAccountsApi(ctx);
List<UserAccount> userAccounts = userAccountsApi.usersAccounts(); List<UserAccount> userAccounts = userAccountsApi.usersAccounts();
if(userAccounts.size() > 0) { for(UserAccount userAccount : userAccounts) {
String hostUri; String hostUri = userAccount.getInstanceUrl();
for(int i = 0; i < userAccounts.size(); i++) {
hostUri = userAccounts.get(i).getInstanceUrl(); currentInstance = userAccount.getInstanceUrl();
instanceToken = userAccount.getToken();
currentInstance = userAccounts.get(i).getInstanceUrl();
instanceToken = userAccounts.get(i).getToken();
if(hostUri.toLowerCase().contains(Objects.requireNonNull(data.getHost().toLowerCase()))) { if(hostUri.toLowerCase().contains(Objects.requireNonNull(data.getHost().toLowerCase()))) {
noAccountFound = false; accountFound = true;
tinyDB.putString("loginUid", userAccount.getUserName());
tinyDB.putString("userLogin", userAccount.getUserName());
tinyDB.putString(userAccount.getUserName() + "-token", userAccount.getToken());
tinyDB.putString("instanceUrl", userAccount.getInstanceUrl());
tinyDB.putInt("currentActiveAccountId", userAccount.getAccountId());
break; break;
} }
noAccountFound = true;
}
} }
if(noAccountFound) { if(accountFound) {
checkInstance(data);
return;
}
// redirect to proper fragment/activity, If no action is there, show options where user to want to go like repos, profile, notifications etc // redirect to proper fragment/activity, If no action is there, show options where user to want to go like repos, profile, notifications etc
if(data.getPathSegments().size() > 0) { if(data.getPathSegments().size() > 0) {
@ -123,15 +103,15 @@ public class DeepLinksActivity extends BaseActivity {
issueIntent.putExtra("issueNumber", data.getLastPathSegment()); issueIntent.putExtra("issueNumber", data.getLastPathSegment());
tinyDb.putString("issueNumber", data.getLastPathSegment()); tinyDB.putString("issueNumber", data.getLastPathSegment());
tinyDb.putString("issueType", "Issue"); tinyDB.putString("issueType", "Issue");
tinyDb.putString("repoFullName", restOfUrl[restOfUrl.length - 4] + "/" + restOfUrl[restOfUrl.length - 3]); tinyDB.putString("repoFullName", restOfUrl[restOfUrl.length - 4] + "/" + restOfUrl[restOfUrl.length - 3]);
final String repoOwner = restOfUrl[restOfUrl.length - 4]; final String repoOwner = restOfUrl[restOfUrl.length - 4];
final String repoName = restOfUrl[restOfUrl.length - 3]; final String repoName = restOfUrl[restOfUrl.length - 3];
int currentActiveAccountId = tinyDb.getInt("currentActiveAccountId"); int currentActiveAccountId = tinyDB.getInt("currentActiveAccountId");
RepositoriesApi repositoryData = new RepositoriesApi(ctx); RepositoriesApi repositoryData = new RepositoriesApi(ctx);
Integer count = repositoryData.checkRepository(currentActiveAccountId, repoOwner, repoName); Integer count = repositoryData.checkRepository(currentActiveAccountId, repoOwner, repoName);
@ -139,12 +119,12 @@ public class DeepLinksActivity extends BaseActivity {
if(count == 0) { if(count == 0) {
long id = repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName); long id = repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName);
tinyDb.putLong("repositoryId", id); tinyDB.putLong("repositoryId", id);
} }
else { else {
Repository dataRepo = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName); Repository dataRepo = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName);
tinyDb.putLong("repositoryId", dataRepo.getRepositoryId()); tinyDB.putLong("repositoryId", dataRepo.getRepositoryId());
} }
ctx.startActivity(issueIntent); ctx.startActivity(issueIntent);
@ -169,8 +149,7 @@ public class DeepLinksActivity extends BaseActivity {
new Handler(Looper.getMainLooper()).postDelayed(() -> { new Handler(Looper.getMainLooper()).postDelayed(() -> {
getPullRequest(currentInstance, instanceToken, restOfUrl[restOfUrl.length - 4], restOfUrl[restOfUrl.length - 3], getPullRequest(currentInstance, instanceToken, restOfUrl[restOfUrl.length - 4], restOfUrl[restOfUrl.length - 3], Integer.parseInt(data.getLastPathSegment()));
Integer.parseInt(data.getLastPathSegment()));
}, 500); }, 500);
} }
@ -186,7 +165,13 @@ public class DeepLinksActivity extends BaseActivity {
ctx.startActivity(mainIntent); ctx.startActivity(mainIntent);
finish(); finish();
} }
}
else if(data.getPathSegments().contains("commit")) { // commits (no API yet to properly implement)
new Handler(Looper.getMainLooper()).postDelayed(() -> {
goToRepoSection(currentInstance, instanceToken, restOfUrl[restOfUrl.length - 4], restOfUrl[restOfUrl.length - 3], "pull");
}, 500);
} }
else if(!restOfUrl[restOfUrl.length - 2].equals("") & !restOfUrl[restOfUrl.length - 1].equals("")) { // go to repo else if(!restOfUrl[restOfUrl.length - 2].equals("") & !restOfUrl[restOfUrl.length - 1].equals("")) { // go to repo
@ -197,38 +182,38 @@ public class DeepLinksActivity extends BaseActivity {
} }
else { // no action, show options else { // no action, show options
if(tinyDb.getInt("defaultScreenId") == 1) { // repos if(tinyDB.getInt("defaultScreenId") == 1) { // repos
mainIntent.putExtra("launchFragmentByLinkHandler", "repos"); mainIntent.putExtra("launchFragmentByLinkHandler", "repos");
ctx.startActivity(mainIntent); ctx.startActivity(mainIntent);
finish(); finish();
} }
else if(tinyDb.getInt("defaultScreenId") == 2) { // org else if(tinyDB.getInt("defaultScreenId") == 2) { // org
mainIntent.putExtra("launchFragmentByLinkHandler", "org"); mainIntent.putExtra("launchFragmentByLinkHandler", "org");
ctx.startActivity(mainIntent); ctx.startActivity(mainIntent);
finish(); finish();
} }
else if(tinyDb.getInt("defaultScreenId") == 3) { // notifications else if(tinyDB.getInt("defaultScreenId") == 3) { // notifications
mainIntent.putExtra("launchFragmentByLinkHandler", "notification"); mainIntent.putExtra("launchFragmentByLinkHandler", "notification");
ctx.startActivity(mainIntent); ctx.startActivity(mainIntent);
finish(); finish();
} }
else if(tinyDb.getInt("defaultScreenId") == 4) { // explore else if(tinyDB.getInt("defaultScreenId") == 4) { // explore
mainIntent.putExtra("launchFragmentByLinkHandler", "explore"); mainIntent.putExtra("launchFragmentByLinkHandler", "explore");
ctx.startActivity(mainIntent); ctx.startActivity(mainIntent);
finish(); finish();
} }
else if(tinyDb.getInt("defaultScreenId") == 0) { // show options else if(tinyDB.getInt("defaultScreenId") == 0) { // show options
viewBinding.noActionFrame.setVisibility(View.VISIBLE); viewBinding.noActionFrame.setVisibility(View.VISIBLE);
viewBinding.addNewAccountFrame.setVisibility(View.GONE); viewBinding.addNewAccountFrame.setVisibility(View.GONE);
viewBinding.repository.setOnClickListener(repository -> { viewBinding.repository.setOnClickListener(repository -> {
tinyDb.putInt("defaultScreenId", 1); tinyDB.putInt("defaultScreenId", 1);
mainIntent.putExtra("launchFragmentByLinkHandler", "repos"); mainIntent.putExtra("launchFragmentByLinkHandler", "repos");
ctx.startActivity(mainIntent); ctx.startActivity(mainIntent);
finish(); finish();
@ -236,7 +221,7 @@ public class DeepLinksActivity extends BaseActivity {
viewBinding.organization.setOnClickListener(organization -> { viewBinding.organization.setOnClickListener(organization -> {
tinyDb.putInt("defaultScreenId", 2); tinyDB.putInt("defaultScreenId", 2);
mainIntent.putExtra("launchFragmentByLinkHandler", "org"); mainIntent.putExtra("launchFragmentByLinkHandler", "org");
ctx.startActivity(mainIntent); ctx.startActivity(mainIntent);
finish(); finish();
@ -244,7 +229,7 @@ public class DeepLinksActivity extends BaseActivity {
viewBinding.notification.setOnClickListener(notification -> { viewBinding.notification.setOnClickListener(notification -> {
tinyDb.putInt("defaultScreenId", 3); tinyDB.putInt("defaultScreenId", 3);
mainIntent.putExtra("launchFragmentByLinkHandler", "notification"); mainIntent.putExtra("launchFragmentByLinkHandler", "notification");
ctx.startActivity(mainIntent); ctx.startActivity(mainIntent);
finish(); finish();
@ -252,7 +237,7 @@ public class DeepLinksActivity extends BaseActivity {
viewBinding.explore.setOnClickListener(explore -> { viewBinding.explore.setOnClickListener(explore -> {
tinyDb.putInt("defaultScreenId", 4); tinyDB.putInt("defaultScreenId", 4);
mainIntent.putExtra("launchFragmentByLinkHandler", "explore"); mainIntent.putExtra("launchFragmentByLinkHandler", "explore");
ctx.startActivity(mainIntent); ctx.startActivity(mainIntent);
finish(); finish();
@ -260,7 +245,7 @@ public class DeepLinksActivity extends BaseActivity {
viewBinding.launchApp2.setOnClickListener(launchApp2 -> { viewBinding.launchApp2.setOnClickListener(launchApp2 -> {
tinyDb.putInt("defaultScreenId", 0); tinyDB.putInt("defaultScreenId", 0);
ctx.startActivity(mainIntent); ctx.startActivity(mainIntent);
finish(); finish();
}); });
@ -269,36 +254,12 @@ public class DeepLinksActivity extends BaseActivity {
} }
else { else {
ctx.startActivity(mainIntent); startActivity(mainIntent);
finish(); finish();
} }
} }
private void checkInstance(Uri data) {
URI host;
if(data.getPort() > 0) {
host = UrlBuilder.fromString(UrlHelper.fixScheme(data.getHost(), "https")).withPort(data.getPort()).toUri();
}
else { else {
host = UrlBuilder.fromString(UrlHelper.fixScheme(data.getHost(), "https")).toUri();
}
URI instanceUrl = UrlBuilder.fromUri(host).withScheme(data.getScheme().toLowerCase()).withPath(PathsHelper.join(host.getPath(), "/api/v1/"))
.toUri();
Call<GiteaVersion> callVersion;
callVersion = RetrofitClient.getInstance(String.valueOf(instanceUrl), ctx).getApiInterface().getGiteaVersion();
callVersion.enqueue(new Callback<GiteaVersion>() {
@Override
public void onResponse(@NonNull final Call<GiteaVersion> callVersion, @NonNull retrofit2.Response<GiteaVersion> responseVersion) {
if(responseVersion.isSuccessful() || responseVersion.code() == 403) {
viewBinding.progressBar.setVisibility(View.GONE); viewBinding.progressBar.setVisibility(View.GONE);
viewBinding.addNewAccountFrame.setVisibility(View.VISIBLE); viewBinding.addNewAccountFrame.setVisibility(View.VISIBLE);
viewBinding.noActionFrame.setVisibility(View.GONE); viewBinding.noActionFrame.setVisibility(View.GONE);
@ -313,12 +274,21 @@ public class DeepLinksActivity extends BaseActivity {
viewBinding.openInBrowser.setOnClickListener(addNewAccount -> { viewBinding.openInBrowser.setOnClickListener(addNewAccount -> {
Integer port = data.getPort() >= 0 ? data.getPort() : null;
URI host = UrlBuilder.fromString(UrlHelper.fixScheme(data.getHost(), "https"))
.withPort(port)
.toUri();
Intent intentBrowser = new Intent(); Intent intentBrowser = new Intent();
intentBrowser.setAction(Intent.ACTION_VIEW); intentBrowser.setAction(Intent.ACTION_VIEW);
intentBrowser.addCategory(Intent.CATEGORY_BROWSABLE); intentBrowser.addCategory(Intent.CATEGORY_BROWSABLE);
intentBrowser.setData(Uri.parse(String.valueOf(host))); intentBrowser.setData(Uri.parse(String.valueOf(host)));
startActivity(intentBrowser); startActivity(intentBrowser);
finish(); finish();
}); });
viewBinding.launchApp.setOnClickListener(launchApp -> { viewBinding.launchApp.setOnClickListener(launchApp -> {
@ -327,27 +297,12 @@ public class DeepLinksActivity extends BaseActivity {
finish(); finish();
}); });
} }
else {
Toasty.error(ctx, getResources().getString(R.string.versionUnknown));
finish();
}
}
@Override
public void onFailure(@NonNull Call<GiteaVersion> callVersion, @NonNull Throwable t) {
Toasty.error(ctx, getResources().getString(R.string.versionUnknown));
finish();
}
});
} }
private void getPullRequest(String url, String token, String repoOwner, String repoName, int index) { private void getPullRequest(String url, String token, String repoOwner, String repoName, int index) {
Call<PullRequests> call = RetrofitClient Call<PullRequests> call = RetrofitClient
.getInstance(url, ctx) .getApiInterface(ctx, url)
.getApiInterface()
.getPullRequestByIndex(token, repoOwner, repoName, index); .getPullRequestByIndex(token, repoOwner, repoName, index);
call.enqueue(new Callback<PullRequests>() { call.enqueue(new Callback<PullRequests>() {
@ -367,28 +322,28 @@ public class DeepLinksActivity extends BaseActivity {
if(prInfo.getHead() != null) { if(prInfo.getHead() != null) {
issueIntent.putExtra("prHeadBranch", prInfo.getHead().getRef()); issueIntent.putExtra("prHeadBranch", prInfo.getHead().getRef());
tinyDb.putString("prHeadBranch", prInfo.getHead().getRef()); tinyDB.putString("prHeadBranch", prInfo.getHead().getRef());
if(prInfo.getHead().getRepo() != null) { if(prInfo.getHead().getRepo() != null) {
tinyDb.putString("prIsFork", String.valueOf(prInfo.getHead().getRepo().isFork())); tinyDB.putString("prIsFork", String.valueOf(prInfo.getHead().getRepo().isFork()));
tinyDb.putString("prForkFullName", prInfo.getHead().getRepo().getFull_name()); tinyDB.putString("prForkFullName", prInfo.getHead().getRepo().getFull_name());
} }
else { else {
// pull was done from a deleted fork // pull was done from a deleted fork
tinyDb.putString("prIsFork", "true"); tinyDB.putString("prIsFork", "true");
tinyDb.putString("prForkFullName", ctx.getString(R.string.prDeletedFrok)); tinyDB.putString("prForkFullName", ctx.getString(R.string.prDeletedFork));
} }
} }
tinyDb.putString("issueNumber", String.valueOf(index)); tinyDB.putString("issueNumber", String.valueOf(index));
tinyDb.putString("prMergeable", String.valueOf(prInfo.isMergeable())); tinyDB.putString("prMergeable", String.valueOf(prInfo.isMergeable()));
tinyDb.putString("issueType", "Pull"); tinyDB.putString("issueType", "Pull");
tinyDb.putString("repoFullName", repoOwner + "/" + repoName); tinyDB.putString("repoFullName", repoOwner + "/" + repoName);
int currentActiveAccountId = tinyDb.getInt("currentActiveAccountId"); int currentActiveAccountId = tinyDB.getInt("currentActiveAccountId");
RepositoriesApi repositoryData = new RepositoriesApi(ctx); RepositoriesApi repositoryData = new RepositoriesApi(ctx);
Integer count = repositoryData.checkRepository(currentActiveAccountId, repoOwner, repoName); Integer count = repositoryData.checkRepository(currentActiveAccountId, repoOwner, repoName);
@ -396,12 +351,12 @@ public class DeepLinksActivity extends BaseActivity {
if(count == 0) { if(count == 0) {
long id = repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName); long id = repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName);
tinyDb.putLong("repositoryId", id); tinyDB.putLong("repositoryId", id);
} }
else { else {
Repository dataRepo = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName); Repository dataRepo = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName);
tinyDb.putLong("repositoryId", dataRepo.getRepositoryId()); tinyDB.putLong("repositoryId", dataRepo.getRepositoryId());
} }
ctx.startActivity(issueIntent); ctx.startActivity(issueIntent);
@ -410,6 +365,8 @@ public class DeepLinksActivity extends BaseActivity {
else { else {
ctx.startActivity(issueIntent);
finish();
Log.e("onFailure-links-pr", String.valueOf(response.code())); Log.e("onFailure-links-pr", String.valueOf(response.code()));
} }
} }
@ -417,6 +374,8 @@ public class DeepLinksActivity extends BaseActivity {
@Override @Override
public void onFailure(@NonNull Call<PullRequests> call, @NonNull Throwable t) { public void onFailure(@NonNull Call<PullRequests> call, @NonNull Throwable t) {
ctx.startActivity(issueIntent);
finish();
Log.e("onFailure-links-pr", t.toString()); Log.e("onFailure-links-pr", t.toString());
} }
}); });
@ -425,8 +384,7 @@ public class DeepLinksActivity extends BaseActivity {
private void goToRepoSection(String url, String token, String repoOwner, String repoName, String type) { private void goToRepoSection(String url, String token, String repoOwner, String repoName, String type) {
Call<UserRepositories> call = RetrofitClient Call<UserRepositories> call = RetrofitClient
.getInstance(url, ctx) .getApiInterface(ctx, url)
.getApiInterface()
.getUserRepository(token, repoOwner, repoName); .getUserRepository(token, repoOwner, repoName);
call.enqueue(new Callback<UserRepositories>() { call.enqueue(new Callback<UserRepositories>() {
@ -444,19 +402,19 @@ public class DeepLinksActivity extends BaseActivity {
repoIntent.putExtra("goToSection", "yes"); repoIntent.putExtra("goToSection", "yes");
repoIntent.putExtra("goToSectionType", type); repoIntent.putExtra("goToSectionType", type);
tinyDb.putString("repoFullName", repoInfo.getFullName()); tinyDB.putString("repoFullName", repoInfo.getFullName());
if(repoInfo.getPrivateFlag()) { if(repoInfo.getPrivateFlag()) {
tinyDb.putString("repoType", getResources().getString(R.string.strPrivate)); tinyDB.putString("repoType", getResources().getString(R.string.strPrivate));
} }
else { else {
tinyDb.putString("repoType", getResources().getString(R.string.strPublic)); tinyDB.putString("repoType", getResources().getString(R.string.strPublic));
} }
tinyDb.putBoolean("isRepoAdmin", repoInfo.getPermissions().isAdmin()); tinyDB.putBoolean("isRepoAdmin", repoInfo.getPermissions().isAdmin());
tinyDb.putString("repoBranch", repoInfo.getDefault_branch()); tinyDB.putString("repoBranch", repoInfo.getDefault_branch());
int currentActiveAccountId = tinyDb.getInt("currentActiveAccountId"); int currentActiveAccountId = tinyDB.getInt("currentActiveAccountId");
RepositoriesApi repositoryData = new RepositoriesApi(ctx); RepositoriesApi repositoryData = new RepositoriesApi(ctx);
Integer count = repositoryData.checkRepository(currentActiveAccountId, repoOwner, repoName); Integer count = repositoryData.checkRepository(currentActiveAccountId, repoOwner, repoName);
@ -464,12 +422,12 @@ public class DeepLinksActivity extends BaseActivity {
if(count == 0) { if(count == 0) {
long id = repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName); long id = repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName);
tinyDb.putLong("repositoryId", id); tinyDB.putLong("repositoryId", id);
} }
else { else {
Repository data = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName); Repository data = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName);
tinyDb.putLong("repositoryId", data.getRepositoryId()); tinyDB.putLong("repositoryId", data.getRepositoryId());
} }
ctx.startActivity(repoIntent); ctx.startActivity(repoIntent);
@ -478,7 +436,9 @@ public class DeepLinksActivity extends BaseActivity {
else { else {
Log.e("onFailure-links", String.valueOf(response.code())); ctx.startActivity(mainIntent);
finish();
Log.e("onFailure-goToRepo", String.valueOf(response.code()));
} }
} }
@ -486,7 +446,9 @@ public class DeepLinksActivity extends BaseActivity {
@Override @Override
public void onFailure(@NonNull Call<UserRepositories> call, @NonNull Throwable t) { public void onFailure(@NonNull Call<UserRepositories> call, @NonNull Throwable t) {
Log.e("onFailure-links", t.toString()); ctx.startActivity(mainIntent);
finish();
Log.e("onFailure-goToRepo", t.toString());
} }
}); });
} }

View File

@ -18,18 +18,18 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import org.gitnex.tea4j.models.CreateIssue;
import org.gitnex.tea4j.models.Issues;
import org.gitnex.tea4j.models.Milestones;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityEditIssueBinding;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.StaticGlobalVariables; import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version; import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.models.CreateIssue;
import org.mian.gitnex.models.Issues;
import org.mian.gitnex.models.Milestones;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
@ -44,11 +44,8 @@ import retrofit2.Callback;
public class EditIssueActivity extends BaseActivity implements View.OnClickListener { public class EditIssueActivity extends BaseActivity implements View.OnClickListener {
final Context ctx = this;
private Context appCtx;
private TinyDB tinyDb;
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
private int resultLimit = StaticGlobalVariables.resultLimitOldGiteaInstances; private int resultLimit = Constants.resultLimitOldGiteaInstances;
private EditText editIssueTitle; private EditText editIssueTitle;
private EditText editIssueDescription; private EditText editIssueDescription;
@ -61,48 +58,42 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe
List<Milestones> milestonesList = new ArrayList<>(); List<Milestones> milestonesList = new ArrayList<>();
private String instanceUrl;
private String loginUid; private String loginUid;
private String instanceToken; private String instanceToken;
private String repoOwner; private String repoOwner;
private String repoName; private String repoName;
private int issueIndex; private int issueIndex;
@Override
protected int getLayoutResourceId(){
return R.layout.activity_edit_issue;
}
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
tinyDb = new TinyDB(appCtx); ActivityEditIssueBinding activityEditIssueBinding = ActivityEditIssueBinding.inflate(getLayoutInflater());
setContentView(activityEditIssueBinding.getRoot());
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
instanceUrl = tinyDb.getString("instanceUrl"); loginUid = tinyDB.getString("loginUid");
loginUid = tinyDb.getString("loginUid"); instanceToken = "token " + tinyDB.getString(loginUid + "-token");
instanceToken = "token " + tinyDb.getString(loginUid + "-token"); String repoFullName = tinyDB.getString("repoFullName");
String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
repoOwner = parts[0]; repoOwner = parts[0];
repoName = parts[1]; repoName = parts[1];
issueIndex = Integer.parseInt(tinyDb.getString("issueNumber")); issueIndex = Integer.parseInt(tinyDB.getString("issueNumber"));
ImageView closeActivity = findViewById(R.id.close); ImageView closeActivity = activityEditIssueBinding.close;
editIssueButton = findViewById(R.id.editIssueButton); editIssueButton = activityEditIssueBinding.editIssueButton;
TextView toolbar_title = findViewById(R.id.toolbar_title); TextView toolbar_title = activityEditIssueBinding.toolbarTitle;
editIssueTitle = findViewById(R.id.editIssueTitle); editIssueTitle = activityEditIssueBinding.editIssueTitle;
editIssueDescription = findViewById(R.id.editIssueDescription); editIssueDescription = activityEditIssueBinding.editIssueDescription;
editIssueDueDate = findViewById(R.id.editIssueDueDate); editIssueDueDate = activityEditIssueBinding.editIssueDueDate;
// if gitea is 1.12 or higher use the new limit // if gitea is 1.12 or higher use the new limit
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) { if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.0")) {
resultLimit = StaticGlobalVariables.resultLimitNewGiteaInstances; resultLimit = Constants.resultLimitNewGiteaInstances;
} }
editIssueTitle.requestFocus(); editIssueTitle.requestFocus();
@ -128,9 +119,9 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe
editIssueDueDate.setOnClickListener(this); editIssueDueDate.setOnClickListener(this);
editIssueButton.setOnClickListener(this); editIssueButton.setOnClickListener(this);
if(!tinyDb.getString("issueNumber").isEmpty()) { if(!tinyDB.getString("issueNumber").isEmpty()) {
if(tinyDb.getString("issueType").equalsIgnoreCase("Pull")) { if(tinyDB.getString("issueType").equalsIgnoreCase("Pull")) {
toolbar_title.setText(getString(R.string.editPrNavHeader, String.valueOf(issueIndex))); toolbar_title.setText(getString(R.string.editPrNavHeader, String.valueOf(issueIndex)));
} }
@ -141,7 +132,7 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe
} }
disableProcessButton(); disableProcessButton();
getIssue(instanceUrl, instanceToken, loginUid, repoOwner, repoName, issueIndex, resultLimit); getIssue(instanceToken, loginUid, repoOwner, repoName, issueIndex, resultLimit);
} }
private void initCloseListener() { private void initCloseListener() {
@ -179,17 +170,16 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe
} }
disableProcessButton(); disableProcessButton();
editIssue(instanceUrl, instanceToken, repoOwner, repoName, issueIndex, loginUid, editIssueTitleForm, editIssueDescriptionForm, editIssueDueDateForm, milestoneId); editIssue(instanceToken, repoOwner, repoName, issueIndex, loginUid, editIssueTitleForm, editIssueDescriptionForm, editIssueDueDateForm, milestoneId);
} }
private void editIssue(String instanceUrl, String instanceToken, String repoOwner, String repoName, int issueIndex, String loginUid, String title, String description, String dueDate, int milestoneId) { private void editIssue(String instanceToken, String repoOwner, String repoName, int issueIndex, String loginUid, String title, String description, String dueDate, int milestoneId) {
CreateIssue issueData = new CreateIssue(title, description, dueDate, milestoneId); CreateIssue issueData = new CreateIssue(title, description, dueDate, milestoneId);
Call<JsonElement> call = RetrofitClient Call<JsonElement> call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface() .patchIssue(Authorization.get(ctx), repoOwner, repoName, issueIndex, issueData);
.patchIssue(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, issueIndex, issueData);
call.enqueue(new Callback<JsonElement>() { call.enqueue(new Callback<JsonElement>() {
@ -198,7 +188,7 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe
if(response.code() == 201) { if(response.code() == 201) {
if(tinyDb.getString("issueType").equalsIgnoreCase("Pull")) { if(tinyDB.getString("issueType").equalsIgnoreCase("Pull")) {
Toasty.success(ctx, getString(R.string.editPrSuccessMessage)); Toasty.success(ctx, getString(R.string.editPrSuccessMessage));
} }
@ -207,8 +197,8 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe
Toasty.success(ctx, getString(R.string.editIssueSuccessMessage)); Toasty.success(ctx, getString(R.string.editIssueSuccessMessage));
} }
tinyDb.putBoolean("issueEdited", true); tinyDB.putBoolean("issueEdited", true);
tinyDb.putBoolean("resumeIssues", true); tinyDB.putBoolean("resumeIssues", true);
finish(); finish();
} }
else if(response.code() == 401) { else if(response.code() == 401) {
@ -257,12 +247,11 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe
} }
private void getIssue(final String instanceUrl, final String instanceToken, final String loginUid, final String repoOwner, final String repoName, int issueIndex, int resultLimit) { private void getIssue(final String instanceToken, final String loginUid, final String repoOwner, final String repoName, int issueIndex, int resultLimit) {
Call<Issues> call = RetrofitClient Call<Issues> call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface() .getIssueByIndex(Authorization.get(ctx), repoOwner, repoName, issueIndex);
.getIssueByIndex(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, issueIndex);
call.enqueue(new Callback<Issues>() { call.enqueue(new Callback<Issues>() {
@ -285,9 +274,8 @@ public class EditIssueActivity extends BaseActivity implements View.OnClickListe
if(response.body().getId() > 0) { if(response.body().getId() > 0) {
Call<List<Milestones>> call_ = RetrofitClient Call<List<Milestones>> call_ = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface() .getMilestones(Authorization.get(ctx), repoOwner, repoName, 1, resultLimit, msState);
.getMilestones(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, 1, resultLimit, msState);
int checkMilestoneId = currentMilestoneId; int checkMilestoneId = currentMilestoneId;

View File

@ -1,30 +1,28 @@
package org.mian.gitnex.activities; package org.mian.gitnex.activities;
import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.ListView; import android.widget.ListView;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import org.gitnex.tea4j.models.FileDiffView;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.adapters.FilesDiffAdapter; import org.mian.gitnex.adapters.FilesDiffAdapter;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityFileDiffBinding;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.ParseDiff; import org.mian.gitnex.helpers.ParseDiff;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version; import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.models.FileDiffView;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import okhttp3.ResponseBody; import okhttp3.ResponseBody;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Response;
/** /**
* Author M M Arif * Author M M Arif
@ -36,36 +34,28 @@ public class FileDiffActivity extends BaseActivity {
private TextView toolbarTitle; private TextView toolbarTitle;
private ListView mListView; private ListView mListView;
private ProgressBar mProgressBar; private ProgressBar mProgressBar;
final Context ctx = this;
private Context appCtx;
@Override
protected int getLayoutResourceId() {
return R.layout.activity_file_diff;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
Toolbar toolbar = findViewById(R.id.toolbar); ActivityFileDiffBinding activityFileDiffBinding = ActivityFileDiffBinding.inflate(getLayoutInflater());
setContentView(activityFileDiffBinding.getRoot());
Toolbar toolbar = activityFileDiffBinding.toolbar;
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
final TinyDB tinyDb = new TinyDB(appCtx); final TinyDB tinyDb = TinyDB.getInstance(appCtx);
String repoFullName = tinyDb.getString("repoFullName"); String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
final String repoOwner = parts[0]; final String repoOwner = parts[0];
final String repoName = parts[1]; final String repoName = parts[1];
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
ImageView closeActivity = findViewById(R.id.close); ImageView closeActivity = activityFileDiffBinding.close;
toolbarTitle = findViewById(R.id.toolbar_title); toolbarTitle = activityFileDiffBinding.toolbarTitle;
mListView = findViewById(R.id.listView); mListView = activityFileDiffBinding.listView;
mProgressBar = findViewById(R.id.progress_bar); mProgressBar = activityFileDiffBinding.progressBar;
mListView.setDivider(null); mListView.setDivider(null);
@ -77,88 +67,69 @@ public class FileDiffActivity extends BaseActivity {
String pullIndex = tinyDb.getString("issueNumber"); String pullIndex = tinyDb.getString("issueNumber");
boolean apiCall = true; boolean apiCall = !new Version(tinyDb.getString("giteaVersion")).less("1.13.0");
String instanceUrl = tinyDb.getString("instanceUrl"); getPullDiffContent(repoOwner, repoName, pullIndex, apiCall);
// fallback for old gitea instances
if(new Version(tinyDb.getString("giteaVersion")).less("1.13.0")) {
apiCall = false;
instanceUrl = instanceUrl.substring(0, instanceUrl.lastIndexOf("api/v1/"));
} }
getPullDiffContent(instanceUrl, repoOwner, repoName, pullIndex, instanceToken, apiCall); private void getPullDiffContent(String owner, String repo, String pullIndex, boolean apiCall) {
}
private void getPullDiffContent(String instanceUrl, String owner, String repo, String pullIndex, String token, boolean apiCall) { Thread thread = new Thread(() -> {
Call<ResponseBody> call; Call<ResponseBody> call = apiCall ?
if(apiCall) { RetrofitClient.getApiInterface(ctx).getPullDiffContent(Authorization.get(ctx), owner, repo, pullIndex) :
RetrofitClient.getWebInterface(ctx).getPullDiffContent(Authorization.getWeb(ctx), owner, repo, pullIndex);
call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getPullDiffContent(token, owner, repo, pullIndex);
}
else {
call = RetrofitClient.getInstance(instanceUrl, ctx).getWebInterface().getPullDiffContent(owner, repo, pullIndex);
}
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(@NonNull Call<ResponseBody> call, @NonNull retrofit2.Response<ResponseBody> response) {
if(response.code() == 200) {
try { try {
Response<ResponseBody> response = call.execute();
assert response.body() != null; assert response.body() != null;
List<FileDiffView> fileContentsArray = ParseDiff.getFileDiffViewArray(response.body().string()); switch(response.code()) {
int filesCount = fileContentsArray.size(); case 200:
if(filesCount > 1) { List<FileDiffView> fileDiffViews = ParseDiff.getFileDiffViewArray(response.body().string());
toolbarTitle.setText(getResources().getString(R.string.fileDiffViewHeader, Integer.toString(filesCount))); int filesCount = fileDiffViews.size();
}
else {
toolbarTitle.setText(getResources().getString(R.string.fileDiffViewHeaderSingle, Integer.toString(filesCount))); String toolbarTitleText = (filesCount > 1) ?
} getResources().getString(R.string.fileDiffViewHeader, Integer.toString(filesCount)) :
getResources().getString(R.string.fileDiffViewHeaderSingle, Integer.toString(filesCount));
FilesDiffAdapter adapter = new FilesDiffAdapter(ctx, getSupportFragmentManager(), fileContentsArray); FilesDiffAdapter adapter = new FilesDiffAdapter(ctx, getSupportFragmentManager(), fileDiffViews);
runOnUiThread(() -> {
toolbarTitle.setText(toolbarTitleText);
mListView.setAdapter(adapter); mListView.setAdapter(adapter);
mProgressBar.setVisibility(View.GONE); mProgressBar.setVisibility(View.GONE);
}
catch(IOException e) {
e.printStackTrace();
}
}
else if(response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx, getResources().getString(R.string.alertDialogTokenRevokedTitle), getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
}
else if(response.code() == 403) {
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
}
else {
Toasty.error(ctx, getString(R.string.labelGeneralError));
}
}
@Override
public void onFailure(@NonNull Call<ResponseBody> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
}
}); });
break;
case 401:
runOnUiThread(() -> AlertDialogs.authorizationTokenRevokedDialog(ctx,
getString(R.string.alertDialogTokenRevokedTitle),
getString(R.string.alertDialogTokenRevokedMessage),
getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
getString(R.string.alertDialogTokenRevokedCopyPositiveButton)));
break;
case 403:
runOnUiThread(() -> Toasty.error(ctx, ctx.getString(R.string.authorizeError)));
break;
case 404:
runOnUiThread(() -> Toasty.warning(ctx, ctx.getString(R.string.apiNotFound)));
break;
default:
runOnUiThread(() -> Toasty.error(ctx, getString(R.string.labelGeneralError)));
}
} catch(IOException ignored) {}
});
thread.start();
} }
@ -168,6 +139,7 @@ public class FileDiffActivity extends BaseActivity {
getIntent().removeExtra("singleFileName"); getIntent().removeExtra("singleFileName");
finish(); finish();
}; };
} }

View File

@ -1,73 +1,42 @@
package org.mian.gitnex.activities; package org.mian.gitnex.activities;
import android.app.Activity; import android.app.Activity;
import android.app.NotificationManager;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.text.Spanned;
import android.text.method.ScrollingMovementMethod; import android.text.method.ScrollingMovementMethod;
import android.util.Base64;
import android.util.Log;
import android.view.Gravity; import android.view.Gravity;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts; import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull; import androidx.core.app.NotificationCompat;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import com.github.barteksc.pdfviewer.PDFView;
import com.github.barteksc.pdfviewer.util.FitPolicy; import com.github.barteksc.pdfviewer.util.FitPolicy;
import com.github.chrisbanes.photoview.PhotoView; import com.vdurmont.emoji.EmojiParser;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.gitnex.tea4j.models.Files;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityFileViewBinding;
import org.mian.gitnex.fragments.BottomSheetFileViewerFragment; import org.mian.gitnex.fragments.BottomSheetFileViewerFragment;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.Images;
import org.mian.gitnex.helpers.Markdown;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.highlightjs.HighlightJsView; import org.mian.gitnex.notifications.Notifications;
import org.mian.gitnex.helpers.highlightjs.models.Theme;
import org.mian.gitnex.models.Files;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.UnsupportedEncodingException; import java.util.Arrays;
import java.net.URLDecoder; import okhttp3.ResponseBody;
import java.util.Collection;
import java.util.Collections;
import java.util.Objects;
import io.noties.markwon.AbstractMarkwonPlugin;
import io.noties.markwon.Markwon;
import io.noties.markwon.core.CorePlugin;
import io.noties.markwon.core.MarkwonTheme;
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
import io.noties.markwon.ext.tables.TablePlugin;
import io.noties.markwon.ext.tasklist.TaskListPlugin;
import io.noties.markwon.html.HtmlPlugin;
import io.noties.markwon.image.DefaultMediaDecoder;
import io.noties.markwon.image.ImageItem;
import io.noties.markwon.image.ImagesPlugin;
import io.noties.markwon.image.SchemeHandler;
import io.noties.markwon.image.gif.GifMediaDecoder;
import io.noties.markwon.image.svg.SvgMediaDecoder;
import io.noties.markwon.linkify.LinkifyPlugin;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Response;
/** /**
* Author M M Arif * Author M M Arif
@ -75,85 +44,38 @@ import retrofit2.Callback;
public class FileViewActivity extends BaseActivity implements BottomSheetFileViewerFragment.BottomSheetListener { public class FileViewActivity extends BaseActivity implements BottomSheetFileViewerFragment.BottomSheetListener {
private View.OnClickListener onClickListener; private ActivityFileViewBinding binding;
private TextView singleFileContents;
private LinearLayout singleFileContentsFrame;
private HighlightJsView singleCodeContents;
private PhotoView imageView;
final Context ctx = this;
private Context appCtx;
private ProgressBar mProgressBar;
private byte[] imageData;
private PDFView pdfView;
private LinearLayout pdfViewFrame;
private byte[] decodedPdf;
private Boolean pdfNightMode; private Boolean pdfNightMode;
private String singleFileName;
private String fileSha;
private AppUtil appUtil;
private TinyDB tinyDb;
@Override private Files file;
protected int getLayoutResourceId() {
return R.layout.activity_file_view;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
appUtil = new AppUtil();
tinyDb = new TinyDB(appCtx);
Toolbar toolbar = findViewById(R.id.toolbar); binding = ActivityFileViewBinding.inflate(getLayoutInflater());
setSupportActionBar(toolbar); setContentView(binding.getRoot());
String repoFullName = tinyDb.getString("repoFullName"); setSupportActionBar(binding.toolbar);
String repoBranch = tinyDb.getString("repoBranch");
tinyDB.putBoolean("enableMarkdownInFileView", false);
file = (Files) getIntent().getSerializableExtra("file");
binding.close.setOnClickListener(view -> finish());
binding.toolbarTitle.setMovementMethod(new ScrollingMovementMethod());
binding.toolbarTitle.setText(file.getPath());
String repoFullName = tinyDB.getString("repoFullName");
String repoBranch = tinyDB.getString("repoBranch");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
final String repoOwner = parts[0]; String repoOwner = parts[0];
final String repoName = parts[1]; String repoName = parts[1];
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
tinyDb.putBoolean("enableMarkdownInFileView", false); getSingleFileContents(repoOwner, repoName, file.getPath(), repoBranch);
ImageView closeActivity = findViewById(R.id.close);
singleFileContents = findViewById(R.id.singleFileContents);
singleCodeContents = findViewById(R.id.singleCodeContents);
imageView = findViewById(R.id.imageView);
mProgressBar = findViewById(R.id.progress_bar);
pdfView = findViewById(R.id.pdfView);
pdfViewFrame = findViewById(R.id.pdfViewFrame);
singleFileContentsFrame = findViewById(R.id.singleFileContentsFrame);
singleFileName = getIntent().getStringExtra("singleFileName");
TextView toolbar_title = findViewById(R.id.toolbar_title);
toolbar_title.setMovementMethod(new ScrollingMovementMethod());
initCloseListener();
closeActivity.setOnClickListener(onClickListener);
tinyDb.putString("downloadFileContents", "");
try {
singleFileName = URLDecoder.decode(singleFileName, "UTF-8");
singleFileName = singleFileName.replaceAll("//", "/");
singleFileName = singleFileName.startsWith("/") ? singleFileName.substring(1) : singleFileName;
}
catch(UnsupportedEncodingException e) {
Log.i("singleFileName", singleFileName);
}
toolbar_title.setText(singleFileName);
getSingleFileContents(instanceUrl, instanceToken, repoOwner, repoName, singleFileName, repoBranch);
} }
@Override @Override
@ -161,158 +83,188 @@ public class FileViewActivity extends BaseActivity implements BottomSheetFileVie
super.onResume(); super.onResume();
String repoFullName = tinyDb.getString("repoFullName"); if(tinyDB.getBoolean("fileModified")) {
String repoBranch = tinyDb.getString("repoBranch");
String repoFullName = tinyDB.getString("repoFullName");
String repoBranch = tinyDB.getString("repoBranch");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
String repoOwner = parts[0]; String repoOwner = parts[0];
String repoName = parts[1]; String repoName = parts[1];
String instanceUrl = tinyDb.getString("instanceUrl");
String loginUid = tinyDb.getString("loginUid");
String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
if(tinyDb.getBoolean("fileModified")) { getSingleFileContents(repoOwner, repoName, file.getPath(), repoBranch);
tinyDB.putBoolean("fileModified", false);
getSingleFileContents(instanceUrl, instanceToken, repoOwner, repoName, singleFileName, repoBranch);
tinyDb.putBoolean("fileModified", false);
} }
} }
private void getSingleFileContents(final String owner, String repo, final String filename, String ref) {
private void getSingleFileContents(String instanceUrl, String token, final String owner, String repo, final String filename, String ref) { Thread thread = new Thread(() -> {
Call<Files> call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getSingleFileContents(token, owner, repo, filename, ref); Call<ResponseBody> call = RetrofitClient
.getWebInterface(ctx)
.getFileContents(Authorization.getWeb(ctx), owner, repo, ref, filename);
call.enqueue(new Callback<Files>() { try {
@Override Response<ResponseBody> response = call.execute();
public void onResponse(@NonNull Call<Files> call, @NonNull retrofit2.Response<Files> response) {
if(response.code() == 200) { if(response.code() == 200) {
assert response.body() != null; ResponseBody responseBody = response.body();
if(!response.body().getContent().equals("")) { if(responseBody != null) {
runOnUiThread(() -> binding.progressBar.setVisibility(View.GONE));
String fileExtension = FileUtils.getExtension(filename); String fileExtension = FileUtils.getExtension(filename);
mProgressBar.setVisibility(View.GONE);
fileSha = response.body().getSha(); boolean processable = false;
// download file meta switch(AppUtil.getFileType(fileExtension)) {
tinyDb.putString("downloadFileName", filename);
tinyDb.putString("downloadFileContents", response.body().getContent());
if(appUtil.imageExtension(fileExtension)) { // file is image case IMAGE:
singleFileContentsFrame.setVisibility(View.GONE); // See https://developer.android.com/guide/topics/media/media-formats#core
singleCodeContents.setVisibility(View.GONE); if(Arrays.asList("bmp", "gif", "jpg", "jpeg", "png", "webp", "heic", "heif").contains(fileExtension.toLowerCase())) {
pdfViewFrame.setVisibility(View.GONE);
imageView.setVisibility(View.VISIBLE);
imageData = Base64.decode(response.body().getContent(), Base64.DEFAULT); processable = true;
Drawable imageDrawable = new BitmapDrawable(getResources(), BitmapFactory.decodeByteArray(imageData, 0, imageData.length));
imageView.setImageDrawable(imageDrawable);
}
else if(appUtil.sourceCodeExtension(fileExtension)) { // file is sourcecode
imageView.setVisibility(View.GONE); byte[] pictureBytes = responseBody.bytes();
singleFileContentsFrame.setVisibility(View.GONE);
pdfViewFrame.setVisibility(View.GONE);
singleCodeContents.setVisibility(View.VISIBLE);
switch(tinyDb.getInt("fileviewerSourceCodeThemeId")) { runOnUiThread(() -> {
case 1: binding.contents.setVisibility(View.GONE);
binding.pdfViewFrame.setVisibility(View.GONE);
binding.markdownFrame.setVisibility(View.GONE);
singleCodeContents.setTheme(Theme.ARDUINO_LIGHT); binding.photoView.setVisibility(View.VISIBLE);
break; binding.photoView.setImageBitmap(Images.scaleImage(pictureBytes, 1920));
case 2:
singleCodeContents.setTheme(Theme.GITHUB);
break;
case 3:
singleCodeContents.setTheme(Theme.FAR);
break;
case 4:
singleCodeContents.setTheme(Theme.IR_BLACK);
break;
case 5:
singleCodeContents.setTheme(Theme.ANDROID_STUDIO);
break;
default:
singleCodeContents.setTheme(Theme.MONOKAI_SUBLIME);
}
singleCodeContents.setSource(appUtil.decodeBase64(response.body().getContent()));
}
else if(appUtil.pdfExtension(fileExtension)) { // file is pdf
imageView.setVisibility(View.GONE);
singleFileContentsFrame.setVisibility(View.GONE);
singleCodeContents.setVisibility(View.GONE);
pdfViewFrame.setVisibility(View.VISIBLE);
pdfNightMode = tinyDb.getBoolean("enablePdfMode");
decodedPdf = Base64.decode(response.body().getContent(), Base64.DEFAULT);
pdfView.fromBytes(decodedPdf).enableSwipe(true).swipeHorizontal(false).enableDoubletap(true).defaultPage(0).enableAnnotationRendering(false).password(null).scrollHandle(null).enableAntialiasing(true).spacing(0).autoSpacing(true).pageFitPolicy(FitPolicy.WIDTH).fitEachPage(true).pageSnap(false).pageFling(true).nightMode(pdfNightMode).load();
}
else if(appUtil.excludeFilesInFileViewerExtension(fileExtension)) { // files need to be excluded
imageView.setVisibility(View.GONE);
singleCodeContents.setVisibility(View.GONE);
pdfViewFrame.setVisibility(View.GONE);
singleFileContentsFrame.setVisibility(View.VISIBLE);
singleFileContents.setText(getResources().getString(R.string.excludeFilesInFileviewer));
singleFileContents.setGravity(Gravity.CENTER);
singleFileContents.setTypeface(null, Typeface.BOLD);
}
else { // file type not known - plain text view
imageView.setVisibility(View.GONE);
singleCodeContents.setVisibility(View.GONE);
pdfViewFrame.setVisibility(View.GONE);
singleFileContentsFrame.setVisibility(View.VISIBLE);
singleFileContents.setText(appUtil.decodeBase64(response.body().getContent()));
}
}
else {
singleFileContents.setText("");
mProgressBar.setVisibility(View.GONE);
}
}
else if(response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx, getResources().getString(R.string.alertDialogTokenRevokedTitle), getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
}
else if(response.code() == 403) {
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
}
else if(response.code() == 404) {
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
}
else {
Toasty.error(ctx, getString(R.string.labelGeneralError));
}
}
@Override
public void onFailure(@NonNull Call<Files> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString());
}
}); });
}
break;
case UNKNOWN:
case TEXT:
if(file.getSize() > Constants.maximumFileViewerSize) {
break;
}
processable = true;
String text = responseBody.string();
runOnUiThread(() -> {
binding.photoView.setVisibility(View.GONE);
binding.markdownFrame.setVisibility(View.GONE);
binding.pdfViewFrame.setVisibility(View.GONE);
binding.contents.setVisibility(View.VISIBLE);
binding.contents.setContent(text, fileExtension);
});
break;
case DOCUMENT:
if(fileExtension.equalsIgnoreCase("pdf")) {
processable = true;
byte[] documentBytes = responseBody.bytes();
runOnUiThread(() -> {
binding.photoView.setVisibility(View.GONE);
binding.markdownFrame.setVisibility(View.GONE);
binding.contents.setVisibility(View.GONE);
pdfNightMode = tinyDB.getBoolean("enablePdfMode");
binding.pdfViewFrame.setVisibility(View.VISIBLE);
binding.pdfView.fromBytes(documentBytes)
.enableSwipe(true)
.swipeHorizontal(false)
.enableDoubletap(true)
.defaultPage(0)
.enableAnnotationRendering(false)
.password(null)
.scrollHandle(null)
.enableAntialiasing(true)
.spacing(0)
.autoSpacing(true)
.pageFitPolicy(FitPolicy.WIDTH)
.fitEachPage(true)
.pageSnap(false)
.pageFling(true)
.nightMode(pdfNightMode).load();
});
}
break;
}
if(!processable) { // While the file could still be non-binary,
// it's better we don't show it (to prevent any crashes and/or unwanted behavior) and let the user download it instead.
responseBody.close();
runOnUiThread(() -> {
binding.photoView.setVisibility(View.GONE);
binding.contents.setVisibility(View.GONE);
binding.pdfViewFrame.setVisibility(View.GONE);
binding.markdownFrame.setVisibility(View.VISIBLE);
binding.markdown.setText(getString(R.string.excludeFilesInFileViewer));
binding.markdown.setGravity(Gravity.CENTER);
binding.markdown.setTypeface(null, Typeface.BOLD);
});
}
} else {
runOnUiThread(() -> {
binding.markdown.setText("");
binding.progressBar.setVisibility(View.GONE);
});
}
} else {
switch(response.code()) {
case 401:
runOnUiThread(() -> AlertDialogs.authorizationTokenRevokedDialog(ctx,
getResources().getString(R.string.alertDialogTokenRevokedTitle),
getResources().getString(R.string.alertDialogTokenRevokedMessage),
getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton)));
break;
case 403:
runOnUiThread(() -> Toasty.error(ctx, ctx.getString(R.string.authorizeError)));
break;
case 404:
runOnUiThread(() -> Toasty.warning(ctx, ctx.getString(R.string.apiNotFound)));
break;
default:
runOnUiThread(() -> Toasty.error(ctx, getString(R.string.labelGeneralError)));
}
}
} catch(IOException ignored) {}
});
thread.start();
} }
@ -323,11 +275,11 @@ public class FileViewActivity extends BaseActivity implements BottomSheetFileVie
inflater.inflate(R.menu.generic_nav_dotted_menu, menu); inflater.inflate(R.menu.generic_nav_dotted_menu, menu);
inflater.inflate(R.menu.files_view_menu, menu); inflater.inflate(R.menu.files_view_menu, menu);
String fileExtension = FileUtils.getExtension(singleFileName); if(!FileUtils.getExtension(file.getName())
.equalsIgnoreCase("md")) {
if(!fileExtension.equalsIgnoreCase("md")) { menu.getItem(0)
.setVisible(false);
menu.getItem(0).setVisible(false);
} }
return true; return true;
@ -342,83 +294,36 @@ public class FileViewActivity extends BaseActivity implements BottomSheetFileVie
finish(); finish();
return true; return true;
}
else if(id == R.id.genericMenu) { } else if(id == R.id.genericMenu) {
BottomSheetFileViewerFragment bottomSheet = new BottomSheetFileViewerFragment(); BottomSheetFileViewerFragment bottomSheet = new BottomSheetFileViewerFragment();
bottomSheet.show(getSupportFragmentManager(), "fileViewerBottomSheet"); bottomSheet.show(getSupportFragmentManager(), "fileViewerBottomSheet");
return true; return true;
}
else if(id == R.id.markdown) {
final Markwon markwon = Markwon.builder(Objects.requireNonNull(ctx)).usePlugin(CorePlugin.create()) } else if(id == R.id.markdown) {
.usePlugin(ImagesPlugin.create(plugin -> {
plugin.addSchemeHandler(new SchemeHandler() {
@NonNull if(!tinyDB.getBoolean("enableMarkdownInFileView")) {
@Override
public ImageItem handle(@NonNull String raw, @NonNull Uri uri) {
final int resourceId = ctx.getResources().getIdentifier( new Markdown(ctx, EmojiParser.parseToUnicode(binding.contents.getContent()), binding.markdown);
raw.substring("drawable://".length()),
"drawable",
ctx.getPackageName());
final Drawable drawable = ContextCompat.getDrawable(ctx, resourceId); binding.contents.setVisibility(View.GONE);
binding.markdownFrame.setVisibility(View.VISIBLE);
tinyDB.putBoolean("enableMarkdownInFileView", true);
} else {
binding.markdownFrame.setVisibility(View.GONE);
binding.contents.setVisibility(View.VISIBLE);
tinyDB.putBoolean("enableMarkdownInFileView", false);
assert drawable != null;
return ImageItem.withResult(drawable);
} }
@NonNull
@Override
public Collection<String> supportedSchemes() {
return Collections.singleton("drawable");
}
});
plugin.placeholderProvider(drawable -> null);
plugin.addMediaDecoder(GifMediaDecoder.create(false));
plugin.addMediaDecoder(SvgMediaDecoder.create(ctx.getResources()));
plugin.addMediaDecoder(SvgMediaDecoder.create());
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(ctx.getResources()));
plugin.defaultMediaDecoder(DefaultMediaDecoder.create());
}))
.usePlugin(new AbstractMarkwonPlugin() {
@Override
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
builder.codeTextColor(tinyDb.getInt("codeBlockColor")).codeBackgroundColor(tinyDb.getInt("codeBlockBackground"))
.linkColor(getResources().getColor(R.color.lightBlue));
}
})
.usePlugin(TablePlugin.create(ctx))
.usePlugin(TaskListPlugin.create(ctx))
.usePlugin(HtmlPlugin.create())
.usePlugin(StrikethroughPlugin.create())
.usePlugin(LinkifyPlugin.create())
.build();
if(!tinyDb.getBoolean("enableMarkdownInFileView")) {
singleCodeContents.setVisibility(View.GONE);
singleFileContentsFrame.setVisibility(View.VISIBLE);
singleFileContents.setVisibility(View.VISIBLE);
Spanned bodyWithMD = markwon.toMarkdown(appUtil.decodeBase64(tinyDb.getString("downloadFileContents")));
markwon.setParsedMarkdown(singleFileContents, bodyWithMD);
tinyDb.putBoolean("enableMarkdownInFileView", true);
}
else {
singleCodeContents.setVisibility(View.VISIBLE);
singleFileContentsFrame.setVisibility(View.GONE);
singleFileContents.setVisibility(View.GONE);
singleCodeContents.setSource(appUtil.decodeBase64(tinyDb.getString("downloadFileContents")));
tinyDb.putBoolean("enableMarkdownInFileView", false);
}
return true; return true;
}
else { } else {
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
@ -434,110 +339,118 @@ public class FileViewActivity extends BaseActivity implements BottomSheetFileVie
if("deleteFile".equals(text)) { if("deleteFile".equals(text)) {
String fileExtension = FileUtils.getExtension(singleFileName);
String data = appUtil.decodeBase64(tinyDb.getString("downloadFileContents"));
Intent intent = new Intent(ctx, CreateFileActivity.class); Intent intent = new Intent(ctx, CreateFileActivity.class);
intent.putExtra("fileAction", 1); intent.putExtra("fileAction", CreateFileActivity.FILE_ACTION_DELETE);
intent.putExtra("filePath", singleFileName); intent.putExtra("filePath", file.getPath());
intent.putExtra("fileSha", fileSha); intent.putExtra("fileSha", file.getSha());
if(!appUtil.imageExtension(fileExtension)) {
intent.putExtra("fileContents", data);
}
else {
intent.putExtra("fileContents", "");
}
ctx.startActivity(intent); ctx.startActivity(intent);
} }
if("editFile".equals(text)) { if("editFile".equals(text)) {
String fileExtension = FileUtils.getExtension(singleFileName); if(binding.contents.getContent() != null &&
String data = appUtil.decodeBase64(tinyDb.getString("downloadFileContents")); !binding.contents.getContent().isEmpty()) {
Intent intent = new Intent(ctx, CreateFileActivity.class); Intent intent = new Intent(ctx, CreateFileActivity.class);
intent.putExtra("fileAction", 2);
intent.putExtra("filePath", singleFileName);
intent.putExtra("fileSha", fileSha);
if(!appUtil.imageExtension(fileExtension)) { intent.putExtra("fileAction", CreateFileActivity.FILE_ACTION_EDIT);
intent.putExtra("filePath", file.getPath());
intent.putExtra("fileContents", data); intent.putExtra("fileSha", file.getSha());
} intent.putExtra("fileContents", binding.contents.getContent());
else {
intent.putExtra("fileContents", "");
}
ctx.startActivity(intent); ctx.startActivity(intent);
}
} else {
Toasty.error(ctx, getString(R.string.fileTypeCannotBeEdited));
}
}
} }
private void requestFileDownload() { private void requestFileDownload() {
if(!tinyDb.getString("downloadFileContents").isEmpty()) {
File outputFileName = new File(tinyDb.getString("downloadFileName"));
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE); intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.putExtra(Intent.EXTRA_TITLE, file.getName());
intent.setType("*/*"); intent.setType("*/*");
intent.putExtra(Intent.EXTRA_TITLE, outputFileName.getName());
fileDownloadActivityResultLauncher.launch(intent); activityResultLauncher.launch(intent);
}
else {
Toasty.warning(ctx, getString(R.string.waitLoadingDownloadFile));
}
} }
ActivityResultLauncher<Intent> fileDownloadActivityResultLauncher = registerForActivityResult( ActivityResultLauncher<Intent> activityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode() == Activity.RESULT_OK) { if (result.getResultCode() == Activity.RESULT_OK) {
Intent data = result.getData(); assert result.getData() != null;
try { try {
assert data != null; OutputStream outputStream = getContentResolver().openOutputStream(result.getData().getData());
Uri uri = data.getData();
assert uri != null; NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx, ctx.getPackageName())
OutputStream outputStream = getContentResolver().openOutputStream(uri); .setContentTitle(getString(R.string.fileViewerNotificationTitleStarted))
.setContentText(getString(R.string.fileViewerNotificationDescriptionStarted, file.getName()))
.setSmallIcon(R.drawable.gitnex_transparent)
.setPriority(NotificationCompat.PRIORITY_LOW)
.setChannelId(Constants.downloadNotificationChannelId)
.setProgress(100, 0, false)
.setOngoing(true);
byte[] dataAsBytes = Base64.decode(tinyDb.getString("downloadFileContents"), 0); int notificationId = Notifications.uniqueNotificationId(ctx);
assert outputStream != null; NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);;
outputStream.write(dataAsBytes); notificationManager.notify(notificationId, builder.build());
outputStream.close();
Toasty.success(ctx, getString(R.string.downloadFileSaved)); String repoFullName = tinyDB.getString("repoFullName");
String repoBranch = tinyDB.getString("repoBranch");
String[] parts = repoFullName.split("/");
String repoOwner = parts[0];
String repoName = parts[1];
} Thread thread = new Thread(() -> {
catch(IOException e) {
try {
Call<ResponseBody> call = RetrofitClient
.getWebInterface(ctx)
.getFileContents(Authorization.getWeb(ctx), repoOwner, repoName, repoBranch, file.getPath());
Response<ResponseBody> response = call.execute();
assert response.body() != null;
AppUtil.copyProgress(response.body().byteStream(), outputStream, file.getSize(), progress -> {
builder.setProgress(100, progress, false);
notificationManager.notify(notificationId, builder.build());
});
builder.setContentTitle(getString(R.string.fileViewerNotificationTitleFinished))
.setContentText(getString(R.string.fileViewerNotificationDescriptionFinished, file.getName()));
} catch(IOException ignored) {
builder.setContentTitle(getString(R.string.fileViewerNotificationTitleFailed))
.setContentText(getString(R.string.fileViewerNotificationDescriptionFailed, file.getName()));
} finally {
builder.setProgress(0,0,false)
.setOngoing(false);
notificationManager.notify(notificationId, builder.build());
Log.e("errorFileDownloading", Objects.requireNonNull(e.getMessage()));
}
}
} }
}); });
private void initCloseListener() { thread.start();
onClickListener = view -> { } catch(IOException ignored) {}
getIntent().removeExtra("singleFileName");
finish();
};
} }
});
} }

View File

@ -1,19 +1,14 @@
package org.mian.gitnex.activities; package org.mian.gitnex.activities;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.text.Html;
import android.text.Spanned;
import android.util.Log; import android.util.Log;
import android.view.Gravity; import android.view.Gravity;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -26,13 +21,19 @@ import android.widget.LinearLayout;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import android.widget.ScrollView; import android.widget.ScrollView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat; import androidx.core.content.res.ResourcesCompat;
import androidx.core.text.HtmlCompat;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.TextDrawable;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.vdurmont.emoji.EmojiParser; import com.vdurmont.emoji.EmojiParser;
import org.gitnex.tea4j.models.Collaborators;
import org.gitnex.tea4j.models.Issues;
import org.gitnex.tea4j.models.Labels;
import org.gitnex.tea4j.models.UpdateIssueAssignees;
import org.gitnex.tea4j.models.WatchInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.actions.AssigneesActions; import org.mian.gitnex.actions.AssigneesActions;
import org.mian.gitnex.actions.LabelsActions; import org.mian.gitnex.actions.LabelsActions;
@ -52,42 +53,22 @@ import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.ClickListener;
import org.mian.gitnex.helpers.ColorInverter; import org.mian.gitnex.helpers.ColorInverter;
import org.mian.gitnex.helpers.LabelWidthCalculator; import org.mian.gitnex.helpers.LabelWidthCalculator;
import org.mian.gitnex.helpers.Markdown;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.UserMentions;
import org.mian.gitnex.helpers.Version; import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.models.Collaborators;
import org.mian.gitnex.models.Issues;
import org.mian.gitnex.models.Labels;
import org.mian.gitnex.models.UpdateIssueAssignees;
import org.mian.gitnex.models.WatchInfo;
import org.mian.gitnex.viewmodels.IssueCommentsViewModel; import org.mian.gitnex.viewmodels.IssueCommentsViewModel;
import org.mian.gitnex.views.ReactionList;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects; import java.util.Objects;
import io.noties.markwon.AbstractMarkwonPlugin;
import io.noties.markwon.Markwon;
import io.noties.markwon.core.CorePlugin;
import io.noties.markwon.core.MarkwonTheme;
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
import io.noties.markwon.ext.tables.TablePlugin;
import io.noties.markwon.ext.tasklist.TaskListPlugin;
import io.noties.markwon.html.HtmlPlugin;
import io.noties.markwon.image.DefaultMediaDecoder;
import io.noties.markwon.image.ImageItem;
import io.noties.markwon.image.ImagesPlugin;
import io.noties.markwon.image.SchemeHandler;
import io.noties.markwon.image.gif.GifMediaDecoder;
import io.noties.markwon.image.svg.SvgMediaDecoder;
import io.noties.markwon.linkify.LinkifyPlugin;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
import retrofit2.Response; import retrofit2.Response;
@ -99,13 +80,7 @@ import retrofit2.Response;
public class IssueDetailActivity extends BaseActivity implements LabelsListAdapter.LabelsListAdapterListener, AssigneesListAdapter.AssigneesListAdapterListener, BottomSheetSingleIssueFragment.BottomSheetListener { public class IssueDetailActivity extends BaseActivity implements LabelsListAdapter.LabelsListAdapterListener, AssigneesListAdapter.AssigneesListAdapterListener, BottomSheetSingleIssueFragment.BottomSheetListener {
private IssueCommentsAdapter adapter; private IssueCommentsAdapter adapter;
final Context ctx = this;
private Context appCtx;
private TinyDB tinyDb;
private String instanceUrl;
private String loginUid;
private String instanceToken;
private String repoOwner; private String repoOwner;
private String repoName; private String repoName;
private int issueIndex; private int issueIndex;
@ -115,8 +90,8 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
private List<Integer> currentLabelsIds = new ArrayList<>(); private List<Integer> currentLabelsIds = new ArrayList<>();
private List<Integer> labelsIds = new ArrayList<>(); private List<Integer> labelsIds = new ArrayList<>();
private List<Labels> labelsList = new ArrayList<>(); private final List<Labels> labelsList = new ArrayList<>();
private List<Collaborators> assigneesList = new ArrayList<>(); private final List<Collaborators> assigneesList = new ArrayList<>();
private List<String> assigneesListData = new ArrayList<>(); private List<String> assigneesListData = new ArrayList<>();
private List<String> currentAssignees = new ArrayList<>(); private List<String> currentAssignees = new ArrayList<>();
@ -127,31 +102,19 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
private CustomAssigneesSelectionDialogBinding assigneesBinding; private CustomAssigneesSelectionDialogBinding assigneesBinding;
private ActivityIssueDetailBinding viewBinding; private ActivityIssueDetailBinding viewBinding;
@Override
protected int getLayoutResourceId() {
return R.layout.activity_issue_detail;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
tinyDb = new TinyDB(appCtx);
viewBinding = ActivityIssueDetailBinding.inflate(getLayoutInflater()); viewBinding = ActivityIssueDetailBinding.inflate(getLayoutInflater());
View view = viewBinding.getRoot(); setContentView(viewBinding.getRoot());
setContentView(view);
instanceUrl = tinyDb.getString("instanceUrl"); String repoFullName = tinyDB.getString("repoFullName");
loginUid = tinyDb.getString("loginUid");
instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
repoOwner = parts[0]; repoOwner = parts[0];
repoName = parts[1]; repoName = parts[1];
issueIndex = Integer.parseInt(tinyDb.getString("issueNumber")); issueIndex = Integer.parseInt(tinyDB.getString("issueNumber"));
setSupportActionBar(viewBinding.toolbar); setSupportActionBar(viewBinding.toolbar);
Objects.requireNonNull(getSupportActionBar()).setTitle(repoName); Objects.requireNonNull(getSupportActionBar()).setTitle(repoName);
@ -164,12 +127,18 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(viewBinding.recyclerView.getContext(), DividerItemDecoration.VERTICAL); DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(viewBinding.recyclerView.getContext(), DividerItemDecoration.VERTICAL);
viewBinding.recyclerView.addItemDecoration(dividerItemDecoration); viewBinding.recyclerView.addItemDecoration(dividerItemDecoration);
viewBinding.addNewComment.setOnClickListener(v -> BottomSheetReplyFragment.newInstance(new Bundle()).show(getSupportFragmentManager(), "replyBottomSheet")); viewBinding.addNewComment.setOnClickListener(v -> {
BottomSheetReplyFragment bottomSheetReplyFragment = BottomSheetReplyFragment.newInstance(new Bundle());
bottomSheetReplyFragment.setOnInteractedListener(this::onResume);
bottomSheetReplyFragment.show(getSupportFragmentManager(), "replyBottomSheet");
});
labelsAdapter = new LabelsListAdapter(labelsList, IssueDetailActivity.this, currentLabelsIds); labelsAdapter = new LabelsListAdapter(labelsList, IssueDetailActivity.this, currentLabelsIds);
assigneesAdapter = new AssigneesListAdapter(ctx, assigneesList, IssueDetailActivity.this, currentAssignees); assigneesAdapter = new AssigneesListAdapter(ctx, assigneesList, IssueDetailActivity.this, currentAssignees);
LabelsActions.getCurrentIssueLabels(ctx, instanceUrl, loginUid, instanceToken, repoOwner, repoName, issueIndex, currentLabelsIds); LabelsActions.getCurrentIssueLabels(ctx, repoOwner, repoName, issueIndex, currentLabelsIds);
AssigneesActions.getCurrentIssueAssignees(ctx, instanceUrl, loginUid, instanceToken, repoOwner, repoName, issueIndex, currentAssignees); AssigneesActions.getCurrentIssueAssignees(ctx, repoOwner, repoName, issueIndex, currentAssignees);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
@ -198,14 +167,14 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
viewBinding.pullToRefresh.setRefreshing(false); viewBinding.pullToRefresh.setRefreshing(false);
IssueCommentsViewModel IssueCommentsViewModel
.loadIssueComments(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, issueIndex, .loadIssueComments(Authorization.get(ctx), repoOwner, repoName, issueIndex,
ctx); ctx);
}, 500)); }, 500));
Typeface myTypeface; Typeface myTypeface;
switch(tinyDb.getInt("customFontId", -1)) { switch(tinyDB.getInt("customFontId", -1)) {
case 1: case 1:
myTypeface = Typeface.createFromAsset(Objects.requireNonNull(ctx).getAssets(), "fonts/manroperegular.ttf"); myTypeface = Typeface.createFromAsset(Objects.requireNonNull(ctx).getAssets(), "fonts/manroperegular.ttf");
@ -224,8 +193,8 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
viewBinding.toolbarTitle.setTypeface(myTypeface); viewBinding.toolbarTitle.setTypeface(myTypeface);
viewBinding.toolbarTitle.setText(repoName); viewBinding.toolbarTitle.setText(repoName);
getSingleIssue(instanceUrl, instanceToken, repoOwner, repoName, issueIndex, loginUid); getSingleIssue(repoOwner, repoName, issueIndex);
fetchDataAsync(instanceUrl, instanceToken, repoOwner, repoName, issueIndex, loginUid); fetchDataAsync(repoOwner, repoName, issueIndex);
} }
@ -234,6 +203,10 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
switch(text) { switch(text) {
case "onResume":
onResume();
break;
case "showLabels": case "showLabels":
showLabels(); showLabels();
break; break;
@ -295,7 +268,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
}); });
dialogAssignees.show(); dialogAssignees.show();
AssigneesActions.getRepositoryAssignees(ctx, instanceUrl, instanceToken, repoOwner, repoName, assigneesList, dialogAssignees, assigneesAdapter, assigneesBinding); AssigneesActions.getRepositoryAssignees(ctx, repoOwner, repoName, assigneesList, dialogAssignees, assigneesAdapter, assigneesBinding);
} }
public void showLabels() { public void showLabels() {
@ -332,7 +305,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
}); });
dialogLabels.show(); dialogLabels.show();
LabelsActions.getRepositoryLabels(ctx, instanceUrl, instanceToken, repoOwner, repoName, labelsList, dialogLabels, labelsAdapter, labelsBinding); LabelsActions.getRepositoryLabels(ctx, repoOwner, repoName, labelsList, dialogLabels, labelsAdapter, labelsBinding);
} }
private void updateIssueAssignees() { private void updateIssueAssignees() {
@ -342,9 +315,8 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
Call<JsonElement> call3; Call<JsonElement> call3;
call3 = RetrofitClient call3 = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface() .patchIssueAssignees(Authorization.get(ctx), repoOwner, repoName, issueIndex, updateAssigneeJson);
.patchIssueAssignees(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, issueIndex, updateAssigneeJson);
call3.enqueue(new Callback<JsonElement>() { call3.enqueue(new Callback<JsonElement>() {
@ -359,9 +331,9 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
viewBinding.frameAssignees.removeAllViews(); viewBinding.frameAssignees.removeAllViews();
viewBinding.frameLabels.removeAllViews(); viewBinding.frameLabels.removeAllViews();
getSingleIssue(instanceUrl, instanceToken, repoOwner, repoName, issueIndex, loginUid); getSingleIssue(repoOwner, repoName, issueIndex);
currentAssignees.clear(); currentAssignees.clear();
new Handler(Looper.getMainLooper()).postDelayed(() -> AssigneesActions.getCurrentIssueAssignees(ctx, instanceUrl, loginUid, instanceToken, repoOwner, repoName, issueIndex, currentAssignees), 1000); new Handler(Looper.getMainLooper()).postDelayed(() -> AssigneesActions.getCurrentIssueAssignees(ctx, repoOwner, repoName, issueIndex, currentAssignees), 1000);
} }
else if(response2.code() == 401) { else if(response2.code() == 401) {
@ -398,9 +370,8 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
Labels patchIssueLabels = new Labels(labelsIds); Labels patchIssueLabels = new Labels(labelsIds);
Call<JsonElement> call = RetrofitClient Call<JsonElement> call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface() .updateIssueLabels(Authorization.get(ctx), repoOwner, repoName, issueIndex, patchIssueLabels);
.updateIssueLabels(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, issueIndex, patchIssueLabels);
call.enqueue(new Callback<JsonElement>() { call.enqueue(new Callback<JsonElement>() {
@ -414,9 +385,9 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
viewBinding.frameAssignees.removeAllViews(); viewBinding.frameAssignees.removeAllViews();
viewBinding.frameLabels.removeAllViews(); viewBinding.frameLabels.removeAllViews();
getSingleIssue(instanceUrl, instanceToken, repoOwner, repoName, issueIndex, loginUid); getSingleIssue(repoOwner, repoName, issueIndex);
currentLabelsIds.clear(); currentLabelsIds.clear();
new Handler(Looper.getMainLooper()).postDelayed(() -> LabelsActions.getCurrentIssueLabels(ctx, instanceUrl, loginUid, instanceToken, repoOwner, repoName, issueIndex, currentLabelsIds), 1000); new Handler(Looper.getMainLooper()).postDelayed(() -> LabelsActions.getCurrentIssueLabels(ctx, repoOwner, repoName, issueIndex, currentLabelsIds), 1000);
} }
else if(response.code() == 401) { else if(response.code() == 401) {
@ -483,61 +454,61 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
super.onResume(); super.onResume();
if(tinyDb.getBoolean("commentPosted")) { if(tinyDB.getBoolean("commentPosted")) {
viewBinding.scrollViewComments.post(() -> { viewBinding.scrollViewComments.post(() -> {
IssueCommentsViewModel IssueCommentsViewModel
.loadIssueComments(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, issueIndex, .loadIssueComments(Authorization.get(ctx), repoOwner, repoName, issueIndex,
ctx); ctx);
new Handler(Looper.getMainLooper()).postDelayed(() -> viewBinding.scrollViewComments.fullScroll(ScrollView.FOCUS_DOWN), 1000); new Handler(Looper.getMainLooper()).postDelayed(() -> viewBinding.scrollViewComments.fullScroll(ScrollView.FOCUS_DOWN), 1000);
tinyDb.putBoolean("commentPosted", false); tinyDB.putBoolean("commentPosted", false);
}); });
} }
if(tinyDb.getBoolean("commentEdited")) { if(tinyDB.getBoolean("commentEdited")) {
viewBinding.scrollViewComments.post(() -> { viewBinding.scrollViewComments.post(() -> {
IssueCommentsViewModel IssueCommentsViewModel
.loadIssueComments(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, issueIndex, .loadIssueComments(Authorization.get(ctx), repoOwner, repoName, issueIndex,
ctx); ctx);
tinyDb.putBoolean("commentEdited", false); tinyDB.putBoolean("commentEdited", false);
}); });
} }
if(tinyDb.getBoolean("singleIssueUpdate")) { if(tinyDB.getBoolean("singleIssueUpdate")) {
new Handler(Looper.getMainLooper()).postDelayed(() -> { new Handler(Looper.getMainLooper()).postDelayed(() -> {
viewBinding.frameAssignees.removeAllViews(); viewBinding.frameAssignees.removeAllViews();
viewBinding.frameLabels.removeAllViews(); viewBinding.frameLabels.removeAllViews();
getSingleIssue(instanceUrl, instanceToken, repoOwner, repoName, issueIndex, loginUid); getSingleIssue(repoOwner, repoName, issueIndex);
tinyDb.putBoolean("singleIssueUpdate", false); tinyDB.putBoolean("singleIssueUpdate", false);
}, 500); }, 500);
} }
if(tinyDb.getBoolean("issueEdited")) { if(tinyDB.getBoolean("issueEdited")) {
new Handler(Looper.getMainLooper()).postDelayed(() -> { new Handler(Looper.getMainLooper()).postDelayed(() -> {
viewBinding.frameAssignees.removeAllViews(); viewBinding.frameAssignees.removeAllViews();
viewBinding.frameLabels.removeAllViews(); viewBinding.frameLabels.removeAllViews();
getSingleIssue(instanceUrl, instanceToken, repoOwner, repoName, issueIndex, loginUid); getSingleIssue(repoOwner, repoName, issueIndex);
tinyDb.putBoolean("issueEdited", false); tinyDB.putBoolean("issueEdited", false);
}, 500); }, 500);
} }
} }
private void fetchDataAsync(String instanceUrl, String instanceToken, String owner, String repo, int index, String loginUid) { private void fetchDataAsync(String owner, String repo, int index) {
IssueCommentsViewModel issueCommentsModel = new ViewModelProvider(this).get(IssueCommentsViewModel.class); IssueCommentsViewModel issueCommentsModel = new ViewModelProvider(this).get(IssueCommentsViewModel.class);
issueCommentsModel.getIssueCommentList(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), owner, repo, index, ctx) issueCommentsModel.getIssueCommentList(Authorization.get(ctx), owner, repo, index, ctx)
.observe(this, issueCommentsMain -> { .observe(this, issueCommentsMain -> {
assert issueCommentsMain != null; assert issueCommentsMain != null;
@ -547,16 +518,23 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
viewBinding.divider.setVisibility(View.VISIBLE); viewBinding.divider.setVisibility(View.VISIBLE);
} }
adapter = new IssueCommentsAdapter(ctx, getSupportFragmentManager(), issueCommentsMain); Bundle bundle = new Bundle();
bundle.putString("repoOwner", repoOwner);
bundle.putString("repoName", repoName);
bundle.putInt("issueNumber", issueIndex);
adapter = new IssueCommentsAdapter(ctx, bundle, issueCommentsMain, getSupportFragmentManager(), this::onResume);
viewBinding.recyclerView.setAdapter(adapter); viewBinding.recyclerView.setAdapter(adapter);
}); });
} }
private void getSingleIssue(String instanceUrl, String instanceToken, String repoOwner, String repoName, int issueIndex, String loginUid) { private void getSingleIssue(String repoOwner, String repoName, int issueIndex) {
final TinyDB tinyDb = new TinyDB(appCtx); final TinyDB tinyDb = TinyDB.getInstance(appCtx);
Call<Issues> call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface() Call<Issues> call = RetrofitClient.getApiInterface(ctx)
.getIssueByIndex(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, issueIndex); .getIssueByIndex(Authorization.get(ctx), repoOwner, repoName, issueIndex);
call.enqueue(new Callback<Issues>() { call.enqueue(new Callback<Issues>() {
@ -590,49 +568,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
viewBinding.issuePrState.setImageResource(R.drawable.ic_issue_closed_red); viewBinding.issuePrState.setImageResource(R.drawable.ic_issue_closed_red);
} }
final Markwon markwon = Markwon.builder(Objects.requireNonNull(ctx)).usePlugin(CorePlugin.create()) TinyDB tinyDb = TinyDB.getInstance(appCtx);
.usePlugin(ImagesPlugin.create(plugin -> {
plugin.addSchemeHandler(new SchemeHandler() {
@NonNull
@Override
public ImageItem handle(@NonNull String raw, @NonNull Uri uri) {
final int resourceId = ctx.getResources()
.getIdentifier(raw.substring("drawable://".length()), "drawable", ctx.getPackageName());
final Drawable drawable = ContextCompat.getDrawable(ctx, resourceId);
assert drawable != null;
return ImageItem.withResult(drawable);
}
@NonNull
@Override
public Collection<String> supportedSchemes() {
return Collections.singleton("drawable");
}
});
plugin.placeholderProvider(drawable -> null);
plugin.addMediaDecoder(GifMediaDecoder.create(false));
plugin.addMediaDecoder(SvgMediaDecoder.create(ctx.getResources()));
plugin.addMediaDecoder(SvgMediaDecoder.create());
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(ctx.getResources()));
plugin.defaultMediaDecoder(DefaultMediaDecoder.create());
})).usePlugin(new AbstractMarkwonPlugin() {
@Override
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
builder.codeTextColor(tinyDb.getInt("codeBlockColor")).codeBackgroundColor(tinyDb.getInt("codeBlockBackground"))
.linkColor(getResources().getColor(R.color.lightBlue));
}
}).usePlugin(TablePlugin.create(ctx)).usePlugin(TaskListPlugin.create(ctx)).usePlugin(HtmlPlugin.create())
.usePlugin(StrikethroughPlugin.create()).usePlugin(LinkifyPlugin.create()).build();
TinyDB tinyDb = new TinyDB(appCtx);
final String locale = tinyDb.getString("locale"); final String locale = tinyDb.getString("locale");
final String timeFormat = tinyDb.getString("dateFormat"); final String timeFormat = tinyDb.getString("dateFormat");
tinyDb.putString("issueState", singleIssue.getState()); tinyDb.putString("issueState", singleIssue.getState());
@ -641,12 +577,12 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
PicassoService.getInstance(ctx).get().load(singleIssue.getUser().getAvatar_url()).placeholder(R.drawable.loader_animated) PicassoService.getInstance(ctx).get().load(singleIssue.getUser().getAvatar_url()).placeholder(R.drawable.loader_animated)
.transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(viewBinding.assigneeAvatar); .transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(viewBinding.assigneeAvatar);
String issueNumber_ = "<font color='" + appCtx.getResources().getColor(R.color.lightGray) + "'>" + appCtx.getResources() String issueNumber_ = "<font color='" + ResourcesCompat.getColor(getResources(), R.color.lightGray, null) + "'>" + appCtx.getResources()
.getString(R.string.hash) + singleIssue.getNumber() + "</font>"; .getString(R.string.hash) + singleIssue.getNumber() + "</font>";
viewBinding.issueTitle.setText(Html.fromHtml(issueNumber_ + " " + singleIssue.getTitle())); viewBinding.issueTitle.setText(HtmlCompat.fromHtml(issueNumber_ + " " + EmojiParser.parseToUnicode(singleIssue.getTitle()), HtmlCompat.FROM_HTML_MODE_LEGACY));
String cleanIssueDescription = singleIssue.getBody().trim(); String cleanIssueDescription = singleIssue.getBody().trim();
Spanned bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(cleanIssueDescription));
markwon.setParsedMarkdown(viewBinding.issueDescription, UserMentions.UserMentionsFunc(ctx, bodyWithMD, cleanIssueDescription)); new Markdown(ctx, EmojiParser.parseToUnicode(cleanIssueDescription), viewBinding.issueDescription);
RelativeLayout.LayoutParams paramsDesc = (RelativeLayout.LayoutParams) viewBinding.issueDescription.getLayoutParams(); RelativeLayout.LayoutParams paramsDesc = (RelativeLayout.LayoutParams) viewBinding.issueDescription.getLayoutParams();
@ -787,6 +723,23 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(singleIssue.getCreated_at()), ctx)); .setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(singleIssue.getCreated_at()), ctx));
} }
Bundle bundle = new Bundle();
bundle.putString("repoOwner", repoOwner);
bundle.putString("repoName", repoName);
bundle.putInt("issueId", singleIssue.getNumber());
ReactionList reactionList = new ReactionList(ctx, bundle);
viewBinding.commentReactionBadges.removeAllViews();
viewBinding.commentReactionBadges.addView(reactionList);
reactionList.setOnReactionAddedListener(() -> {
if(viewBinding.commentReactionBadges.getVisibility() != View.VISIBLE) {
viewBinding.commentReactionBadges.post(() -> viewBinding.commentReactionBadges.setVisibility(View.VISIBLE));
}
});
if(singleIssue.getMilestone() != null) { if(singleIssue.getMilestone() != null) {
viewBinding.issueMilestone.setVisibility(View.VISIBLE); viewBinding.issueMilestone.setVisibility(View.VISIBLE);
@ -845,8 +798,8 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) { if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) {
Call<WatchInfo> call2 = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface() Call<WatchInfo> call2 = RetrofitClient.getApiInterface(appCtx)
.checkIssueWatchStatus(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, issueIndex); .checkIssueWatchStatus(Authorization.get(ctx), repoOwner, repoName, issueIndex);
call2.enqueue(new Callback<WatchInfo>() { call2.enqueue(new Callback<WatchInfo>() {

View File

@ -1,8 +1,8 @@
package org.mian.gitnex.activities; package org.mian.gitnex.activities;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
@ -10,23 +10,23 @@ import android.widget.AutoCompleteTextView;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.RadioGroup; import android.widget.RadioGroup;
import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import org.gitnex.tea4j.models.GiteaVersion;
import org.gitnex.tea4j.models.UserInfo;
import org.gitnex.tea4j.models.UserTokens;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.database.api.UserAccountsApi; import org.mian.gitnex.database.api.UserAccountsApi;
import org.mian.gitnex.database.models.UserAccount; import org.mian.gitnex.database.models.UserAccount;
import org.mian.gitnex.databinding.ActivityLoginBinding;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.NetworkObserver; import org.mian.gitnex.helpers.NetworkStatusObserver;
import org.mian.gitnex.helpers.PathsHelper; import org.mian.gitnex.helpers.PathsHelper;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.UrlHelper; import org.mian.gitnex.helpers.UrlHelper;
import org.mian.gitnex.helpers.Version; import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.models.GiteaVersion;
import org.mian.gitnex.models.UserInfo;
import org.mian.gitnex.models.UserTokens;
import java.net.URI; import java.net.URI;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.List; import java.util.List;
@ -46,10 +46,6 @@ public class LoginActivity extends BaseActivity {
private enum LoginType {BASIC, TOKEN} private enum LoginType {BASIC, TOKEN}
private Context appCtx;
private Context ctx = this;
private TinyDB tinyDB;
private Button loginButton; private Button loginButton;
private EditText instanceUrlET, loginUidET, loginPassword, otpCode, loginTokenCode; private EditText instanceUrlET, loginUidET, loginPassword, otpCode, loginTokenCode;
private AutoCompleteTextView protocolSpinner; private AutoCompleteTextView protocolSpinner;
@ -57,36 +53,31 @@ public class LoginActivity extends BaseActivity {
private String device_id = "token"; private String device_id = "token";
private String selectedProtocol; private String selectedProtocol;
@Override
protected int getLayoutResourceId() {
return R.layout.activity_login;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
tinyDB = new TinyDB(appCtx); ActivityLoginBinding activityLoginBinding = ActivityLoginBinding.inflate(getLayoutInflater());
NetworkObserver networkMonitor = new NetworkObserver(ctx); setContentView(activityLoginBinding.getRoot());
loginButton = findViewById(R.id.login_button); NetworkStatusObserver networkStatusObserver = NetworkStatusObserver.getInstance(ctx);
instanceUrlET = findViewById(R.id.instance_url);
loginUidET = findViewById(R.id.login_uid);
loginPassword = findViewById(R.id.login_passwd);
otpCode = findViewById(R.id.otpCode);
protocolSpinner = findViewById(R.id.httpsSpinner);
loginMethod = findViewById(R.id.loginMethod);
loginTokenCode = findViewById(R.id.loginTokenCode);
((TextView) findViewById(R.id.appVersion)).setText(AppUtil.getAppVersion(appCtx)); loginButton = activityLoginBinding.loginButton;
instanceUrlET = activityLoginBinding.instanceUrl;
loginUidET = activityLoginBinding.loginUid;
loginPassword = activityLoginBinding.loginPasswd;
otpCode = activityLoginBinding.otpCode;
protocolSpinner = activityLoginBinding.httpsSpinner;
loginMethod = activityLoginBinding.loginMethod;
loginTokenCode = activityLoginBinding.loginTokenCode;
activityLoginBinding.appVersion.setText(AppUtil.getAppVersion(appCtx));
ArrayAdapter<Protocol> adapterProtocols = new ArrayAdapter<>(LoginActivity.this, R.layout.list_spinner_items, Protocol.values()); ArrayAdapter<Protocol> adapterProtocols = new ArrayAdapter<>(LoginActivity.this, R.layout.list_spinner_items, Protocol.values());
protocolSpinner.setAdapter(adapterProtocols); protocolSpinner.setAdapter(adapterProtocols);
protocolSpinner.setSelection(0);
protocolSpinner.setOnItemClickListener((parent, view, position, id) -> { protocolSpinner.setOnItemClickListener((parent, view, position, id) -> {
selectedProtocol = String.valueOf(parent.getItemAtPosition(position)); selectedProtocol = String.valueOf(parent.getItemAtPosition(position));
@ -122,9 +113,13 @@ public class LoginActivity extends BaseActivity {
} }
}); });
networkMonitor.onInternetStateListener(isAvailable -> { Handler handler = new Handler(getMainLooper());
if(isAvailable) { networkStatusObserver.registerNetworkStatusListener(hasNetworkConnection -> {
handler.post(() -> {
if(hasNetworkConnection) {
enableProcessButton(); enableProcessButton();
} }
@ -134,6 +129,8 @@ public class LoginActivity extends BaseActivity {
loginButton.setText(getResources().getString(R.string.btnLogin)); loginButton.setText(getResources().getString(R.string.btnLogin));
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection)); Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
} }
});
}); });
loadDefaults(); loadDefaults();
@ -210,7 +207,7 @@ public class LoginActivity extends BaseActivity {
int loginOTP = (otpCode.length() > 0) ? Integer.parseInt(otpCode.getText().toString().trim()) : 0; int loginOTP = (otpCode.length() > 0) ? Integer.parseInt(otpCode.getText().toString().trim()) : 0;
tinyDB.putString("loginUid", loginUid); tinyDB.putString("loginUid", loginUid);
versionCheck(instanceUrl.toString(), loginUid, loginPass, loginOTP, loginToken, loginType); versionCheck(loginUid, loginPass, loginOTP, loginToken, loginType);
} }
else { else {
@ -222,7 +219,7 @@ public class LoginActivity extends BaseActivity {
return; return;
} }
versionCheck(instanceUrl.toString(), loginUid, loginPass, 123, loginToken, loginType); versionCheck(loginUid, loginPass, 123, loginToken, loginType);
} }
} }
@ -234,22 +231,22 @@ public class LoginActivity extends BaseActivity {
} }
} }
private void versionCheck(final String instanceUrl, final String loginUid, final String loginPass, final int loginOTP, final String loginToken, private void versionCheck(final String loginUid, final String loginPass, final int loginOTP, final String loginToken,
final LoginType loginType) { final LoginType loginType) {
Call<GiteaVersion> callVersion; Call<GiteaVersion> callVersion;
if(!loginToken.equals("")) { if(!loginToken.equals("")) {
callVersion = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getGiteaVersionWithToken("token " + loginToken); callVersion = RetrofitClient.getApiInterface(appCtx).getGiteaVersionWithToken("token " + loginToken);
} }
else { else {
String credential = Credentials.basic(loginUid, loginPass, StandardCharsets.UTF_8); String credential = Credentials.basic(loginUid, loginPass, StandardCharsets.UTF_8);
callVersion = callVersion =
(loginOTP != 0) ? RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getGiteaVersionWithOTP(credential, loginOTP) : (loginOTP != 0) ? RetrofitClient.getApiInterface(appCtx).getGiteaVersionWithOTP(credential, loginOTP) :
RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getGiteaVersionWithBasic(credential); RetrofitClient.getApiInterface(appCtx).getGiteaVersionWithBasic(credential);
} }
callVersion.enqueue(new Callback<GiteaVersion>() { callVersion.enqueue(new Callback<GiteaVersion>() {
@ -274,8 +271,10 @@ public class LoginActivity extends BaseActivity {
if(gitea_version.less(getString(R.string.versionLow))) { if(gitea_version.less(getString(R.string.versionLow))) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ctx).setTitle(getString(R.string.versionAlertDialogHeader)) AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ctx)
.setMessage(getResources().getString(R.string.versionUnsupportedOld, version.getVersion())).setIcon(R.drawable.ic_warning) .setTitle(getString(R.string.versionAlertDialogHeader))
.setMessage(getResources().getString(R.string.versionUnsupportedOld, version.getVersion()))
.setIcon(R.drawable.ic_warning)
.setCancelable(true); .setCancelable(true);
alertDialogBuilder.setNegativeButton(getString(R.string.cancelButton), (dialog, which) -> { alertDialogBuilder.setNegativeButton(getString(R.string.cancelButton), (dialog, which) -> {
@ -287,7 +286,7 @@ public class LoginActivity extends BaseActivity {
alertDialogBuilder.setPositiveButton(getString(R.string.textContinue), (dialog, which) -> { alertDialogBuilder.setPositiveButton(getString(R.string.textContinue), (dialog, which) -> {
dialog.dismiss(); dialog.dismiss();
login(loginType, instanceUrl, loginUid, loginPass, loginOTP, loginToken); login(loginType, loginUid, loginPass, loginOTP, loginToken);
}); });
alertDialogBuilder.create().show(); alertDialogBuilder.create().show();
@ -295,34 +294,34 @@ public class LoginActivity extends BaseActivity {
} }
else if(gitea_version.lessOrEqual(getString(R.string.versionHigh))) { else if(gitea_version.lessOrEqual(getString(R.string.versionHigh))) {
login(loginType, instanceUrl, loginUid, loginPass, loginOTP, loginToken); login(loginType, loginUid, loginPass, loginOTP, loginToken);
} }
else { else {
Toasty.warning(ctx, getResources().getString(R.string.versionUnsupportedNew)); Toasty.warning(ctx, getResources().getString(R.string.versionUnsupportedNew));
login(loginType, instanceUrl, loginUid, loginPass, loginOTP, loginToken); login(loginType, loginUid, loginPass, loginOTP, loginToken);
} }
} }
else if(responseVersion.code() == 403) { else if(responseVersion.code() == 403) {
login(loginType, instanceUrl, loginUid, loginPass, loginOTP, loginToken); login(loginType, loginUid, loginPass, loginOTP, loginToken);
} }
} }
private void login(LoginType loginType, String instanceUrl, String loginUid, String loginPass, int loginOTP, String loginToken) { private void login(LoginType loginType, String loginUid, String loginPass, int loginOTP, String loginToken) {
// ToDo: before store/create token: get UserInfo to check DB/AccountManager if there already exist a token // ToDo: before store/create token: get UserInfo to check DB/AccountManager if there already exist a token
// the setup methods then can better handle all different cases // the setup methods then can better handle all different cases
if(loginType == LoginType.BASIC) { if(loginType == LoginType.BASIC) {
setup(instanceUrl, loginUid, loginPass, loginOTP); setup(loginUid, loginPass, loginOTP);
} }
else if(loginType == LoginType.TOKEN) { // Token else if(loginType == LoginType.TOKEN) { // Token
setupUsingExistingToken(instanceUrl, loginToken); setupUsingExistingToken(loginToken);
} }
} }
@ -336,9 +335,9 @@ public class LoginActivity extends BaseActivity {
}); });
} }
private void setupUsingExistingToken(String instanceUrl, final String loginToken) { private void setupUsingExistingToken(final String loginToken) {
Call<UserInfo> call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getUserInfo("token " + loginToken); Call<UserInfo> call = RetrofitClient.getApiInterface(appCtx).getUserInfo("token " + loginToken);
call.enqueue(new Callback<UserInfo>() { call.enqueue(new Callback<UserInfo>() {
@ -358,14 +357,14 @@ public class LoginActivity extends BaseActivity {
tinyDB.putString("userLogin", userDetails.getUsername()); tinyDB.putString("userLogin", userDetails.getUsername());
// insert new account to db if does not exist // insert new account to db if does not exist
String accountName = userDetails.getUsername() + "@" + instanceUrl; String accountName = userDetails.getUsername() + "@" + TinyDB.getInstance(ctx).getString("instanceUrl");
UserAccountsApi userAccountsApi = new UserAccountsApi(ctx); UserAccountsApi userAccountsApi = new UserAccountsApi(ctx);
int checkAccount = userAccountsApi.getCount(accountName); int checkAccount = userAccountsApi.getCount(accountName);
long accountId; long accountId;
if(checkAccount == 0) { if(checkAccount == 0) {
accountId = userAccountsApi.insertNewAccount(accountName, instanceUrl, userDetails.getUsername(), loginToken, ""); accountId = userAccountsApi.insertNewAccount(accountName, TinyDB.getInstance(ctx).getString("instanceUrl"), userDetails.getUsername(), loginToken, "");
tinyDB.putInt("currentActiveAccountId", (int) accountId); tinyDB.putInt("currentActiveAccountId", (int) accountId);
} }
else { else {
@ -402,7 +401,7 @@ public class LoginActivity extends BaseActivity {
} }
private void setup(final String instanceUrl, final String loginUid, final String loginPass, final int loginOTP) { private void setup(final String loginUid, final String loginPass, final int loginOTP) {
final String credential = Credentials.basic(loginUid, loginPass, StandardCharsets.UTF_8); final String credential = Credentials.basic(loginUid, loginPass, StandardCharsets.UTF_8);
final String tokenName = "gitnex-app-" + device_id; final String tokenName = "gitnex-app-" + device_id;
@ -410,11 +409,11 @@ public class LoginActivity extends BaseActivity {
Call<List<UserTokens>> call; Call<List<UserTokens>> call;
if(loginOTP != 0) { if(loginOTP != 0) {
call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getUserTokensWithOTP(credential, loginOTP, loginUid); call = RetrofitClient.getApiInterface(appCtx).getUserTokensWithOTP(credential, loginOTP, loginUid);
} }
else { else {
call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getUserTokens(credential, loginUid); call = RetrofitClient.getApiInterface(appCtx).getUserTokens(credential, loginUid);
} }
call.enqueue(new Callback<List<UserTokens>>() { call.enqueue(new Callback<List<UserTokens>>() {
@ -438,12 +437,12 @@ public class LoginActivity extends BaseActivity {
Call<Void> delcall; Call<Void> delcall;
if(loginOTP != 0) { if(loginOTP != 0) {
delcall = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface() delcall = RetrofitClient.getApiInterface(ctx)
.deleteTokenWithOTP(credential, loginOTP, loginUid, t.getId()); .deleteTokenWithOTP(credential, loginOTP, loginUid, t.getId());
} }
else { else {
delcall = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().deleteToken(credential, loginUid, t.getId()); delcall = RetrofitClient.getApiInterface(ctx).deleteToken(credential, loginUid, t.getId());
} }
delcall.enqueue(new Callback<Void>() { delcall.enqueue(new Callback<Void>() {
@ -453,7 +452,7 @@ public class LoginActivity extends BaseActivity {
if(response.code() == 204) { if(response.code() == 204) {
setupToken(instanceUrl, loginUid, loginPass, loginOTP, tokenName); setupToken(loginUid, loginPass, loginOTP, tokenName);
} }
else { else {
@ -474,7 +473,7 @@ public class LoginActivity extends BaseActivity {
} }
} }
setupToken(instanceUrl, loginUid, loginPass, loginOTP, tokenName); setupToken(loginUid, loginPass, loginOTP, tokenName);
} }
else { else {
@ -494,7 +493,7 @@ public class LoginActivity extends BaseActivity {
} }
private void setupToken(final String instanceUrl, final String loginUid, final String loginPass, final int loginOTP, final String tokenName) { private void setupToken(final String loginUid, final String loginPass, final int loginOTP, final String tokenName) {
final String credential = Credentials.basic(loginUid, loginPass, StandardCharsets.UTF_8); final String credential = Credentials.basic(loginUid, loginPass, StandardCharsets.UTF_8);
@ -503,12 +502,13 @@ public class LoginActivity extends BaseActivity {
if(loginOTP != 0) { if(loginOTP != 0) {
callCreateToken = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface() callCreateToken = RetrofitClient.getApiInterface(ctx)
.createNewTokenWithOTP(credential, loginOTP, loginUid, createUserToken); .createNewTokenWithOTP(credential, loginOTP, loginUid, createUserToken);
} }
else { else {
callCreateToken = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().createNewToken(credential, loginUid, createUserToken); callCreateToken = RetrofitClient.getApiInterface(ctx)
.createNewToken(credential, loginUid, createUserToken);
} }
callCreateToken.enqueue(new Callback<UserTokens>() { callCreateToken.enqueue(new Callback<UserTokens>() {
@ -523,7 +523,7 @@ public class LoginActivity extends BaseActivity {
if(!newToken.getSha1().equals("")) { if(!newToken.getSha1().equals("")) {
Call<UserInfo> call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface() Call<UserInfo> call = RetrofitClient.getApiInterface(ctx)
.getUserInfo("token " + newToken.getSha1()); .getUserInfo("token " + newToken.getSha1());
call.enqueue(new Callback<UserInfo>() { call.enqueue(new Callback<UserInfo>() {
@ -545,7 +545,7 @@ public class LoginActivity extends BaseActivity {
tinyDB.putString(loginUid + "-token-last-eight", newToken.getToken_last_eight()); tinyDB.putString(loginUid + "-token-last-eight", newToken.getToken_last_eight());
// insert new account to db if does not exist // insert new account to db if does not exist
String accountName = userDetails.getUsername() + "@" + instanceUrl; String accountName = userDetails.getUsername() + "@" + TinyDB.getInstance(ctx).getString("instanceUrl");
UserAccountsApi userAccountsApi = new UserAccountsApi(ctx); UserAccountsApi userAccountsApi = new UserAccountsApi(ctx);
int checkAccount = userAccountsApi.getCount(accountName); int checkAccount = userAccountsApi.getCount(accountName);
long accountId; long accountId;
@ -553,7 +553,7 @@ public class LoginActivity extends BaseActivity {
if(checkAccount == 0) { if(checkAccount == 0) {
accountId = userAccountsApi accountId = userAccountsApi
.insertNewAccount(accountName, instanceUrl, userDetails.getUsername(), newToken.getSha1(), ""); .insertNewAccount(accountName, TinyDB.getInstance(ctx).getString("instanceUrl"), userDetails.getUsername(), newToken.getSha1(), "");
tinyDB.putInt("currentActiveAccountId", (int) accountId); tinyDB.putInt("currentActiveAccountId", (int) accountId);
} }
else { else {

View File

@ -3,15 +3,13 @@ package org.mian.gitnex.activities;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.os.Bundle; import android.os.Bundle;
import android.text.Html;
import android.util.Log; import android.util.Log;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -19,18 +17,25 @@ import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.biometric.BiometricPrompt;
import androidx.core.content.ContextCompat;
import androidx.core.content.res.ResourcesCompat;
import androidx.core.view.GravityCompat; import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout; import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.navigation.NavigationView; import com.google.android.material.navigation.NavigationView;
import org.gitnex.tea4j.models.GiteaVersion;
import org.gitnex.tea4j.models.NotificationCount;
import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.adapters.UserAccountsNavAdapter; import org.mian.gitnex.adapters.UserAccountsNavAdapter;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.database.api.UserAccountsApi; import org.mian.gitnex.database.api.UserAccountsApi;
import org.mian.gitnex.database.models.UserAccount; import org.mian.gitnex.database.models.UserAccount;
import org.mian.gitnex.databinding.ActivityMainBinding;
import org.mian.gitnex.fragments.AdministrationFragment; import org.mian.gitnex.fragments.AdministrationFragment;
import org.mian.gitnex.fragments.BottomSheetDraftsFragment; import org.mian.gitnex.fragments.BottomSheetDraftsFragment;
import org.mian.gitnex.fragments.DraftsFragment; import org.mian.gitnex.fragments.DraftsFragment;
@ -52,14 +57,10 @@ import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version; import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.models.GiteaVersion;
import org.mian.gitnex.models.NotificationCount;
import org.mian.gitnex.models.UserInfo;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.concurrent.Executor;
import eightbitlab.com.blurview.BlurView; import jp.wasabeef.picasso.transformations.BlurTransformation;
import eightbitlab.com.blurview.RenderScriptBlur;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
@ -70,19 +71,13 @@ import retrofit2.Callback;
public class MainActivity extends BaseActivity implements NavigationView.OnNavigationItemSelectedListener, BottomSheetDraftsFragment.BottomSheetListener { public class MainActivity extends BaseActivity implements NavigationView.OnNavigationItemSelectedListener, BottomSheetDraftsFragment.BottomSheetListener {
private DrawerLayout drawer; private DrawerLayout drawer;
private BlurView blurView;
private TextView userFullName; private TextView userFullName;
private TextView userEmail; private TextView userEmail;
private ImageView userAvatar; private ImageView userAvatar;
private ImageView userAvatarBackground; private ImageView userAvatarBackground;
private ViewGroup navHeaderFrame;
private TextView toolbarTitle; private TextView toolbarTitle;
final Context ctx = this;
private Context appCtx;
private static TinyDB tinyDb;
private Typeface myTypeface; private Typeface myTypeface;
private String instanceUrl;
private String loginUid; private String loginUid;
private String instanceToken; private String instanceToken;
@ -90,67 +85,63 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
private MenuItem navNotifications; private MenuItem navNotifications;
private TextView notificationCounter; private TextView notificationCounter;
@Override
protected int getLayoutResourceId() {
return R.layout.activity_main;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
tinyDb = new TinyDB(appCtx); ActivityMainBinding activityMainBinding = ActivityMainBinding.inflate(getLayoutInflater());
tinyDb.putBoolean("noConnection", false); setContentView(activityMainBinding.getRoot());
tinyDB.putBoolean("noConnection", false);
String currentVersion = tinyDB.getString("giteaVersion");
Intent mainIntent = getIntent(); Intent mainIntent = getIntent();
String launchFragment = mainIntent.getStringExtra("launchFragment"); String launchFragment = mainIntent.getStringExtra("launchFragment");
instanceUrl = tinyDb.getString("instanceUrl"); loginUid = tinyDB.getString("loginUid");
loginUid = tinyDb.getString("loginUid"); instanceToken = "token " + tinyDB.getString(loginUid + "-token");
instanceToken = "token " + tinyDb.getString(loginUid + "-token");
if(tinyDb.getString("dateFormat").isEmpty()) { if(tinyDB.getString("dateFormat").isEmpty()) {
tinyDb.putString("dateFormat", "pretty"); tinyDB.putString("dateFormat", "pretty");
} }
if(tinyDb.getString("codeBlockStr").isEmpty()) { if(tinyDB.getString("codeBlockStr").isEmpty()) {
tinyDb.putInt("codeBlockColor", getResources().getColor(R.color.colorLightGreen)); tinyDB.putInt("codeBlockColor", ResourcesCompat.getColor(getResources(), R.color.colorLightGreen, null));
tinyDb.putInt("codeBlockBackground", getResources().getColor(R.color.black)); tinyDB.putInt("codeBlockBackground", ResourcesCompat.getColor(getResources(), R.color.black, null));
} }
if(tinyDb.getString("enableCounterIssueBadgeInit").isEmpty()) { if(tinyDB.getString("enableCounterIssueBadgeInit").isEmpty()) {
tinyDb.putBoolean("enableCounterIssueBadge", true); tinyDB.putBoolean("enableCounterIssueBadge", true);
} }
if(tinyDb.getString("homeScreenStr").isEmpty()) { if(tinyDB.getString("homeScreenStr").isEmpty()) {
tinyDb.putString("homeScreenStr", "yes"); tinyDB.putString("homeScreenStr", "yes");
tinyDb.putInt("homeScreenId", 0); tinyDB.putInt("homeScreenId", 0);
} }
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
if(!tinyDb.getBoolean("loggedInMode")) { if(!tinyDB.getBoolean("loggedInMode")) {
logout(this, ctx); logout(this, ctx);
return; return;
} }
if(tinyDb.getInt("currentActiveAccountId") <= 0) { if(tinyDB.getInt("currentActiveAccountId") <= 0) {
AlertDialogs.forceLogoutDialog(ctx, getResources().getString(R.string.forceLogoutDialogHeader), getResources().getString(R.string.forceLogoutDialogDescription), getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton)); AlertDialogs.forceLogoutDialog(ctx, getResources().getString(R.string.forceLogoutDialogHeader), getResources().getString(R.string.forceLogoutDialogDescription), getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
} }
Toolbar toolbar = findViewById(R.id.toolbar); Toolbar toolbar = activityMainBinding.toolbar;
toolbarTitle = toolbar.findViewById(R.id.toolbar_title); toolbarTitle = activityMainBinding.toolbarTitle;
switch(tinyDb.getInt("customFontId", -1)) { switch(tinyDB.getInt("customFontId", -1)) {
case 0: case 0:
@ -166,6 +157,43 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
break; break;
} }
// biometric auth
if(tinyDB.getBoolean("biometricStatus")) {
Executor executor = ContextCompat.getMainExecutor(this);
BiometricPrompt biometricPrompt = new BiometricPrompt(this, executor, new BiometricPrompt.AuthenticationCallback() {
@Override
public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) {
super.onAuthenticationError(errorCode, errString);
// Authentication error, close the app
if(errorCode == BiometricPrompt.ERROR_USER_CANCELED ||
errorCode == BiometricPrompt.ERROR_NEGATIVE_BUTTON) {
finish();
}
}
// Authentication succeeded, continue to app
@Override public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) { super.onAuthenticationSucceeded(result); }
// Authentication failed, close the app
@Override public void onAuthenticationFailed() { super.onAuthenticationFailed(); }
});
BiometricPrompt.PromptInfo biometricPromptBuilder = new BiometricPrompt.PromptInfo.Builder()
.setTitle(getString(R.string.biometricAuthTitle))
.setSubtitle(getString(R.string.biometricAuthSubTitle))
.setNegativeButtonText(getString(R.string.cancelButton)).build();
biometricPrompt.authenticate(biometricPromptBuilder);
}
toolbarTitle.setTypeface(myTypeface); toolbarTitle.setTypeface(myTypeface);
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
@ -213,17 +241,17 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
toolbarTitle.setText(getResources().getString(R.string.pageTitleUserAccounts)); toolbarTitle.setText(getResources().getString(R.string.pageTitleUserAccounts));
} }
getNotificationsCount(instanceUrl, instanceToken); getNotificationsCount(instanceToken);
drawer = findViewById(R.id.drawer_layout); drawer = activityMainBinding.drawerLayout;
NavigationView navigationView = findViewById(R.id.nav_view); NavigationView navigationView = activityMainBinding.navView;
navigationView.setNavigationItemSelectedListener(this); navigationView.setNavigationItemSelectedListener(this);
hView = navigationView.getHeaderView(0); hView = navigationView.getHeaderView(0);
Menu menu = navigationView.getMenu(); Menu menu = navigationView.getMenu();
navNotifications = menu.findItem(R.id.nav_notifications); navNotifications = menu.findItem(R.id.nav_notifications);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigationDrawerOpen, R.string.navigationDrawerClose);
drawer.addDrawerListener(toggle); drawer.addDrawerListener(toggle);
drawer.addDrawerListener(new DrawerLayout.DrawerListener() { drawer.addDrawerListener(new DrawerLayout.DrawerListener() {
@ -231,28 +259,20 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
@Override @Override
public void onDrawerOpened(@NonNull View drawerView) { public void onDrawerOpened(@NonNull View drawerView) {
getNotificationsCount(instanceUrl, instanceToken); if(tinyDB.getBoolean("noConnection")) {
}
@Override
public void onDrawerSlide(@NonNull View drawerView, float slideOffset) {
if(tinyDb.getBoolean("noConnection")) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection)); Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
tinyDb.putBoolean("noConnection", false); tinyDB.putBoolean("noConnection", false);
} }
String userEmailNav = tinyDb.getString("userEmail"); String userEmailNav = tinyDB.getString("userEmail");
String userFullNameNav = tinyDb.getString("userFullname"); String userFullNameNav = tinyDB.getString("userFullname");
String userAvatarNav = tinyDb.getString("userAvatar"); String userAvatarNav = tinyDB.getString("userAvatar");
blurView = hView.findViewById(R.id.blurView);
userEmail = hView.findViewById(R.id.userEmail); userEmail = hView.findViewById(R.id.userEmail);
userFullName = hView.findViewById(R.id.userFullname); userFullName = hView.findViewById(R.id.userFullname);
userAvatar = hView.findViewById(R.id.userAvatar); userAvatar = hView.findViewById(R.id.userAvatar);
userAvatarBackground = hView.findViewById(R.id.userAvatarBackground); userAvatarBackground = hView.findViewById(R.id.userAvatarBackground);
navHeaderFrame = hView.findViewById(R.id.navHeaderFrame);
List<UserAccount> userAccountsList; List<UserAccount> userAccountsList;
userAccountsList = new ArrayList<>(); userAccountsList = new ArrayList<>();
@ -283,7 +303,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
if(!userFullNameNav.equals("")) { if(!userFullNameNav.equals("")) {
userFullName.setText(userFullNameNav); userFullName.setText(Html.fromHtml(userFullNameNav));
} }
if(!userAvatarNav.equals("")) { if(!userAvatarNav.equals("")) {
@ -297,24 +317,18 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
PicassoService.getInstance(ctx).get() PicassoService.getInstance(ctx).get()
.load(userAvatarNav) .load(userAvatarNav)
.transform(new BlurTransformation(ctx))
.into(userAvatarBackground, new com.squareup.picasso.Callback() { .into(userAvatarBackground, new com.squareup.picasso.Callback() {
@Override @Override
public void onSuccess() { public void onSuccess() {
int textColor = new ColorInverter().getImageViewContrastColor(userAvatarBackground); int textColor = new ColorInverter().getImageViewContrastColor(userAvatarBackground);
userFullName.setTextColor(textColor); userFullName.setTextColor(textColor);
userEmail.setTextColor(textColor); userEmail.setTextColor(textColor);
blurView.setupWith(navHeaderFrame)
.setBlurAlgorithm(new RenderScriptBlur(ctx))
.setBlurRadius(5)
.setHasFixedTransformationMatrix(false);
} }
@Override @Override public void onError(Exception e) {}
public void onError(Exception e) {}
}); });
} }
@ -324,11 +338,16 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProfileFragment()).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProfileFragment()).commit();
navigationView.setCheckedItem(R.id.nav_profile); navigationView.setCheckedItem(R.id.nav_profile);
drawer.closeDrawers(); drawer.closeDrawers();
}); });
String currentVersion = tinyDb.getString("giteaVersion"); getNotificationsCount(instanceToken);
}
navigationView.getMenu().findItem(R.id.nav_administration).setVisible(tinyDb.getBoolean("userIsAdmin")); @Override
public void onDrawerSlide(@NonNull View drawerView, float slideOffset) {
navigationView.getMenu().findItem(R.id.nav_administration).setVisible(tinyDB.getBoolean("userIsAdmin"));
navigationView.getMenu().findItem(R.id.nav_notifications).setVisible(new Version(currentVersion).higherOrEqual("1.12.3")); navigationView.getMenu().findItem(R.id.nav_notifications).setVisible(new Version(currentVersion).higherOrEqual("1.12.3"));
} }
@ -373,22 +392,21 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
switch(launchFragmentByHandler) { switch(launchFragmentByHandler) {
case "repos": case "repos":
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new RepositoriesFragment()).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new RepositoriesFragment()).commit();
navigationView.setCheckedItem(R.id.nav_repositories); navigationView.setCheckedItem(R.id.nav_repositories);
return; return;
case "org":
case "org":
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new OrganizationsFragment()).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new OrganizationsFragment()).commit();
navigationView.setCheckedItem(R.id.nav_organizations); navigationView.setCheckedItem(R.id.nav_organizations);
return; return;
case "notification":
case "notification":
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new NotificationsFragment()).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new NotificationsFragment()).commit();
navigationView.setCheckedItem(R.id.nav_notifications); navigationView.setCheckedItem(R.id.nav_notifications);
return; return;
case "explore":
case "explore":
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ExploreFragment()).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ExploreFragment()).commit();
navigationView.setCheckedItem(R.id.nav_explore); navigationView.setCheckedItem(R.id.nav_explore);
return; return;
@ -397,60 +415,59 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
if(savedInstanceState == null) { if(savedInstanceState == null) {
if(!new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.3")) { if(!new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.3")) {
if(tinyDb.getInt("homeScreenId") == 7) { if(tinyDB.getInt("homeScreenId") == 7) {
tinyDb.putInt("homeScreenId", 0); tinyDB.putInt("homeScreenId", 0);
} }
} }
switch(tinyDb.getInt("homeScreenId")) { switch(tinyDB.getInt("homeScreenId")) {
case 1: case 1:
toolbarTitle.setText(getResources().getString(R.string.pageTitleStarredRepos)); toolbarTitle.setText(getResources().getString(R.string.pageTitleStarredRepos));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new StarredRepositoriesFragment()).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new StarredRepositoriesFragment()).commit();
navigationView.setCheckedItem(R.id.nav_starred_repos); navigationView.setCheckedItem(R.id.nav_starred_repos);
break; break;
case 2:
case 2:
toolbarTitle.setText(getResources().getString(R.string.pageTitleOrganizations)); toolbarTitle.setText(getResources().getString(R.string.pageTitleOrganizations));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new OrganizationsFragment()).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new OrganizationsFragment()).commit();
navigationView.setCheckedItem(R.id.nav_organizations); navigationView.setCheckedItem(R.id.nav_organizations);
break; break;
case 3:
case 3:
toolbarTitle.setText(getResources().getString(R.string.pageTitleRepositories)); toolbarTitle.setText(getResources().getString(R.string.pageTitleRepositories));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new RepositoriesFragment()).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new RepositoriesFragment()).commit();
navigationView.setCheckedItem(R.id.nav_repositories); navigationView.setCheckedItem(R.id.nav_repositories);
break; break;
case 4:
case 4:
toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile)); toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProfileFragment()).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProfileFragment()).commit();
navigationView.setCheckedItem(R.id.nav_profile); navigationView.setCheckedItem(R.id.nav_profile);
break; break;
case 5:
case 5:
toolbarTitle.setText(getResources().getString(R.string.pageTitleExplore)); toolbarTitle.setText(getResources().getString(R.string.pageTitleExplore));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ExploreFragment()).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ExploreFragment()).commit();
navigationView.setCheckedItem(R.id.nav_explore); navigationView.setCheckedItem(R.id.nav_explore);
break; break;
case 6:
case 6:
toolbarTitle.setText(getResources().getString(R.string.titleDrafts)); toolbarTitle.setText(getResources().getString(R.string.titleDrafts));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new DraftsFragment()).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new DraftsFragment()).commit();
navigationView.setCheckedItem(R.id.nav_comments_draft); navigationView.setCheckedItem(R.id.nav_comments_draft);
break; break;
case 7:
case 7:
toolbarTitle.setText(getResources().getString(R.string.pageTitleNotifications)); toolbarTitle.setText(getResources().getString(R.string.pageTitleNotifications));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new NotificationsFragment()).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new NotificationsFragment()).commit();
navigationView.setCheckedItem(R.id.nav_notifications); navigationView.setCheckedItem(R.id.nav_notifications);
break; break;
default:
default:
toolbarTitle.setText(getResources().getString(R.string.pageTitleMyRepos)); toolbarTitle.setText(getResources().getString(R.string.pageTitleMyRepos));
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyRepositoriesFragment()).commit(); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyRepositoriesFragment()).commit();
navigationView.setCheckedItem(R.id.nav_home); navigationView.setCheckedItem(R.id.nav_home);
@ -460,37 +477,27 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
if(!connToInternet) { if(!connToInternet) {
if(!tinyDb.getBoolean("noConnection")) { if(!tinyDB.getBoolean("noConnection")) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection)); Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
} }
tinyDb.putBoolean("noConnection", true); tinyDB.putBoolean("noConnection", true);
} }
else { else {
loadUserInfo(instanceUrl, instanceToken, loginUid); loadUserInfo(instanceToken, loginUid);
giteaVersion(instanceUrl); giteaVersion();
tinyDb.putBoolean("noConnection", false); tinyDB.putBoolean("noConnection", false);
} }
// Changelog popup // Changelog popup
int versionCode = 0; int versionCode = AppUtil.getAppBuildNo(appCtx);
try { if(versionCode > tinyDB.getInt("versionCode")) {
PackageInfo packageInfo = appCtx.getPackageManager().getPackageInfo(appCtx.getPackageName(), 0); tinyDB.putInt("versionCode", versionCode);
versionCode = packageInfo.versionCode; tinyDB.putBoolean("versionFlag", true);
}
catch(PackageManager.NameNotFoundException e) {
Log.e("changelogDialog", Objects.requireNonNull(e.getMessage()));
}
if(versionCode > tinyDb.getInt("versionCode")) {
tinyDb.putInt("versionCode", versionCode);
tinyDb.putBoolean("versionFlag", true);
ChangeLog changelogDialog = new ChangeLog(this); ChangeLog changelogDialog = new ChangeLog(this);
changelogDialog.showDialog(); changelogDialog.showDialog();
@ -505,7 +512,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
@Override @Override
public void onButtonClicked(String text) { public void onButtonClicked(String text) {
TinyDB tinyDb = new TinyDB(ctx); TinyDB tinyDb = TinyDB.getInstance(ctx);
int currentActiveAccountId = tinyDb.getInt("currentActiveAccountId"); int currentActiveAccountId = tinyDb.getInt("currentActiveAccountId");
if("deleteDrafts".equals(text)) { if("deleteDrafts".equals(text)) {
@ -625,9 +632,11 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
public static void logout(Activity activity, Context ctx) { public static void logout(Activity activity, Context ctx) {
tinyDb.putBoolean("loggedInMode", false); TinyDB tinyDB = TinyDB.getInstance(ctx);
tinyDb.remove("basicAuthPassword");
tinyDb.putBoolean("basicAuthFlag", false); tinyDB.putBoolean("loggedInMode", false);
tinyDB.remove("basicAuthPassword");
tinyDB.putBoolean("basicAuthFlag", false);
//tinyDb.clear(); //tinyDb.clear();
activity.finish(); activity.finish();
ctx.startActivity(new Intent(ctx, LoginActivity.class)); ctx.startActivity(new Intent(ctx, LoginActivity.class));
@ -648,13 +657,13 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
private void giteaVersion(final String instanceUrl) { private void giteaVersion() {
final TinyDB tinyDb = new TinyDB(appCtx); final TinyDB tinyDb = TinyDB.getInstance(appCtx);
final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token"); final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token");
Call<GiteaVersion> callVersion = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getGiteaVersionWithToken(token); Call<GiteaVersion> callVersion = RetrofitClient.getApiInterface(ctx).getGiteaVersionWithToken(token);
callVersion.enqueue(new Callback<GiteaVersion>() { callVersion.enqueue(new Callback<GiteaVersion>() {
@ -678,11 +687,11 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
}); });
} }
private void loadUserInfo(String instanceUrl, String token, String loginUid) { private void loadUserInfo(String token, String loginUid) {
final TinyDB tinyDb = new TinyDB(appCtx); final TinyDB tinyDb = TinyDB.getInstance(appCtx);
Call<UserInfo> call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getUserInfo(Authorization.returnAuthentication(ctx, loginUid, token)); Call<UserInfo> call = RetrofitClient.getApiInterface(ctx).getUserInfo(Authorization.get(ctx));
call.enqueue(new Callback<UserInfo>() { call.enqueue(new Callback<UserInfo>() {
@ -747,9 +756,9 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
} }
private void getNotificationsCount(String instanceUrl, String token) { private void getNotificationsCount(String token) {
Call<NotificationCount> call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().checkUnreadNotifications(token); Call<NotificationCount> call = RetrofitClient.getApiInterface(ctx).checkUnreadNotifications(token);
call.enqueue(new Callback<NotificationCount>() { call.enqueue(new Callback<NotificationCount>() {

View File

@ -9,20 +9,18 @@ import android.view.inputmethod.InputMethodManager;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import org.gitnex.tea4j.models.MergePullRequest;
import org.gitnex.tea4j.models.MergePullRequestSpinner;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityMergePullRequestBinding; import org.mian.gitnex.databinding.ActivityMergePullRequestBinding;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version; import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.models.MergePullRequest;
import org.mian.gitnex.models.MergePullRequestSpinner;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Objects; import java.util.Objects;
import okhttp3.ResponseBody;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
@ -33,13 +31,7 @@ import retrofit2.Callback;
public class MergePullRequestActivity extends BaseActivity { public class MergePullRequestActivity extends BaseActivity {
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
final Context ctx = this;
private Context appCtx;
private TinyDB tinyDb;
private String instanceUrl;
private String loginUid;
private String instanceToken;
private String repoOwner; private String repoOwner;
private String repoName; private String repoName;
private int prIndex; private int prIndex;
@ -48,32 +40,20 @@ public class MergePullRequestActivity extends BaseActivity {
private String Do; private String Do;
@Override
protected int getLayoutResourceId() {
return R.layout.activity_merge_pull_request;
}
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
tinyDb = new TinyDB(appCtx);
viewBinding = ActivityMergePullRequestBinding.inflate(getLayoutInflater()); viewBinding = ActivityMergePullRequestBinding.inflate(getLayoutInflater());
View view = viewBinding.getRoot(); setContentView(viewBinding.getRoot());
setContentView(view);
instanceUrl = tinyDb.getString("instanceUrl"); String repoFullName = tinyDB.getString("repoFullName");
loginUid = tinyDb.getString("loginUid");
instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
repoOwner = parts[0]; repoOwner = parts[0];
repoName = parts[1]; repoName = parts[1];
prIndex = Integer.parseInt(tinyDb.getString("issueNumber")); prIndex = Integer.parseInt(tinyDB.getString("issueNumber"));
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
@ -85,22 +65,22 @@ public class MergePullRequestActivity extends BaseActivity {
setMergeAdapter(); setMergeAdapter();
if(!tinyDb.getString("issueTitle").isEmpty()) { if(!tinyDB.getString("issueTitle").isEmpty()) {
viewBinding.toolbarTitle.setText(tinyDb.getString("issueTitle")); viewBinding.toolbarTitle.setText(tinyDB.getString("issueTitle"));
viewBinding.mergeTitle.setText(tinyDb.getString("issueTitle") + " (#" + tinyDb.getString("issueNumber") + ")"); viewBinding.mergeTitle.setText(tinyDB.getString("issueTitle") + " (#" + tinyDB.getString("issueNumber") + ")");
} }
initCloseListener(); initCloseListener();
viewBinding.close.setOnClickListener(onClickListener); viewBinding.close.setOnClickListener(onClickListener);
// if gitea version is greater/equal(1.12.0) than user installed version (installed.higherOrEqual(compareVer)) // if gitea version is greater/equal(1.12.0) than user installed version (installed.higherOrEqual(compareVer))
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) { if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.0")) {
viewBinding.deleteBranch.setVisibility(View.VISIBLE); viewBinding.deleteBranch.setVisibility(View.VISIBLE);
} }
if(tinyDb.getString("prMergeable").equals("false")) { if(tinyDB.getString("prMergeable").equals("false")) {
disableProcessButton(); disableProcessButton();
viewBinding.mergeInfoDisabledMessage.setVisibility(View.VISIBLE); viewBinding.mergeInfoDisabledMessage.setVisibility(View.VISIBLE);
@ -110,7 +90,7 @@ public class MergePullRequestActivity extends BaseActivity {
viewBinding.mergeInfoDisabledMessage.setVisibility(View.GONE); viewBinding.mergeInfoDisabledMessage.setVisibility(View.GONE);
} }
if(tinyDb.getString("prIsFork").equals("true")) { if(tinyDB.getString("prIsFork").equals("true")) {
viewBinding.deleteBranchForkInfo.setVisibility(View.VISIBLE); viewBinding.deleteBranchForkInfo.setVisibility(View.VISIBLE);
} }
@ -138,7 +118,7 @@ public class MergePullRequestActivity extends BaseActivity {
mergeList.add(new MergePullRequestSpinner("rebase", getResources().getString(R.string.mergeOptionRebase))); mergeList.add(new MergePullRequestSpinner("rebase", getResources().getString(R.string.mergeOptionRebase)));
mergeList.add(new MergePullRequestSpinner("rebase-merge", getResources().getString(R.string.mergeOptionRebaseCommit))); mergeList.add(new MergePullRequestSpinner("rebase-merge", getResources().getString(R.string.mergeOptionRebaseCommit)));
// squash merge works only on gitea > v1.11.4 due to a bug // squash merge works only on gitea > v1.11.4 due to a bug
if(new Version(tinyDb.getString("giteaVersion")).higher("1.11.4")) { if(new Version(tinyDB.getString("giteaVersion")).higher("1.11.4")) {
mergeList.add(new MergePullRequestSpinner("squash", getResources().getString(R.string.mergeOptionSquash))); mergeList.add(new MergePullRequestSpinner("squash", getResources().getString(R.string.mergeOptionSquash)));
} }
@ -189,20 +169,20 @@ public class MergePullRequestActivity extends BaseActivity {
MergePullRequest mergePR = new MergePullRequest(Do, mergePRDT, mergeTitle); MergePullRequest mergePR = new MergePullRequest(Do, mergePRDT, mergeTitle);
Call<ResponseBody> call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().mergePullRequest(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, prIndex, mergePR); Call<Void> call = RetrofitClient.getApiInterface(ctx).mergePullRequest(Authorization.get(ctx), repoOwner, repoName, prIndex, mergePR);
call.enqueue(new Callback<ResponseBody>() { call.enqueue(new Callback<Void>() {
@Override @Override
public void onResponse(@NonNull Call<ResponseBody> call, @NonNull retrofit2.Response<ResponseBody> response) { public void onResponse(@NonNull Call<Void> call, @NonNull retrofit2.Response<Void> response) {
if(response.code() == 200) { if(response.code() == 200) {
if(deleteBranch) { if(deleteBranch) {
if(tinyDb.getString("prIsFork").equals("true")) { if(tinyDB.getString("prIsFork").equals("true")) {
String repoFullName = tinyDb.getString("prForkFullName"); String repoFullName = tinyDB.getString("prForkFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
final String repoOwner = parts[0]; final String repoOwner = parts[0];
final String repoName = parts[1]; final String repoName = parts[1];
@ -210,13 +190,13 @@ public class MergePullRequestActivity extends BaseActivity {
deleteBranchFunction(repoOwner, repoName); deleteBranchFunction(repoOwner, repoName);
Toasty.success(ctx, getString(R.string.mergePRSuccessMsg)); Toasty.success(ctx, getString(R.string.mergePRSuccessMsg));
tinyDb.putBoolean("prMerged", true); tinyDB.putBoolean("prMerged", true);
tinyDb.putBoolean("resumePullRequests", true); tinyDB.putBoolean("resumePullRequests", true);
finish(); finish();
} }
else { else {
String repoFullName = tinyDb.getString("repoFullName"); String repoFullName = tinyDB.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
final String repoOwner = parts[0]; final String repoOwner = parts[0];
final String repoName = parts[1]; final String repoName = parts[1];
@ -224,8 +204,8 @@ public class MergePullRequestActivity extends BaseActivity {
deleteBranchFunction(repoOwner, repoName); deleteBranchFunction(repoOwner, repoName);
Toasty.success(ctx, getString(R.string.mergePRSuccessMsg)); Toasty.success(ctx, getString(R.string.mergePRSuccessMsg));
tinyDb.putBoolean("prMerged", true); tinyDB.putBoolean("prMerged", true);
tinyDb.putBoolean("resumePullRequests", true); tinyDB.putBoolean("resumePullRequests", true);
finish(); finish();
} }
@ -233,8 +213,8 @@ public class MergePullRequestActivity extends BaseActivity {
else { else {
Toasty.success(ctx, getString(R.string.mergePRSuccessMsg)); Toasty.success(ctx, getString(R.string.mergePRSuccessMsg));
tinyDb.putBoolean("prMerged", true); tinyDB.putBoolean("prMerged", true);
tinyDb.putBoolean("resumePullRequests", true); tinyDB.putBoolean("resumePullRequests", true);
finish(); finish();
} }
@ -263,7 +243,7 @@ public class MergePullRequestActivity extends BaseActivity {
} }
@Override @Override
public void onFailure(@NonNull Call<ResponseBody> call, @NonNull Throwable t) { public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Log.e("onFailure", t.toString()); Log.e("onFailure", t.toString());
enableProcessButton(); enableProcessButton();
@ -275,12 +255,11 @@ public class MergePullRequestActivity extends BaseActivity {
private void deleteBranchFunction(String repoOwner, String repoName) { private void deleteBranchFunction(String repoOwner, String repoName) {
String branchName = tinyDb.getString("prHeadBranch"); String branchName = tinyDB.getString("prHeadBranch");
Call<JsonElement> call = RetrofitClient Call<JsonElement> call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface() .deleteBranch(Authorization.get(ctx), repoOwner, repoName, branchName);
.deleteBranch(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, branchName);
call.enqueue(new Callback<JsonElement>() { call.enqueue(new Callback<JsonElement>() {

View File

@ -25,8 +25,9 @@ public class OpenRepoInBrowserActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext(); appCtx = getApplicationContext();
TinyDB tinyDb = new TinyDB(appCtx); TinyDB tinyDb = TinyDB.getInstance(appCtx);
try { try {

View File

@ -23,9 +23,9 @@ import org.mian.gitnex.R;
import org.mian.gitnex.fragments.BottomSheetOrganizationFragment; import org.mian.gitnex.fragments.BottomSheetOrganizationFragment;
import org.mian.gitnex.fragments.MembersByOrgFragment; import org.mian.gitnex.fragments.MembersByOrgFragment;
import org.mian.gitnex.fragments.OrganizationInfoFragment; import org.mian.gitnex.fragments.OrganizationInfoFragment;
import org.mian.gitnex.fragments.OrganizationLabelsFragment;
import org.mian.gitnex.fragments.RepositoriesByOrgFragment; import org.mian.gitnex.fragments.RepositoriesByOrgFragment;
import org.mian.gitnex.fragments.TeamsByOrgFragment; import org.mian.gitnex.fragments.TeamsByOrgFragment;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import java.util.Objects; import java.util.Objects;
import io.mikael.urlbuilder.UrlBuilder; import io.mikael.urlbuilder.UrlBuilder;
@ -36,27 +36,17 @@ import io.mikael.urlbuilder.UrlBuilder;
public class OrganizationDetailActivity extends BaseActivity implements BottomSheetOrganizationFragment.BottomSheetListener { public class OrganizationDetailActivity extends BaseActivity implements BottomSheetOrganizationFragment.BottomSheetListener {
final Context ctx = this;
private Context appCtx;
private TinyDB tinyDb;
@Override
protected int getLayoutResourceId(){
return R.layout.activity_org_detail;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
tinyDb = new TinyDB(appCtx);
TinyDB tinyDb = new TinyDB(appCtx); setContentView(R.layout.activity_org_detail);
String orgName = tinyDb.getString("orgName");
String orgName = tinyDB.getString("orgName");
Toolbar toolbar = findViewById(R.id.toolbar); Toolbar toolbar = findViewById(R.id.toolbar);
TextView toolbarTitle = toolbar.findViewById(R.id.toolbar_title); TextView toolbarTitle = findViewById(R.id.toolbar_title);
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
Objects.requireNonNull(getSupportActionBar()).setTitle(orgName); Objects.requireNonNull(getSupportActionBar()).setTitle(orgName);
@ -71,7 +61,7 @@ public class OrganizationDetailActivity extends BaseActivity implements BottomSh
Typeface myTypeface; Typeface myTypeface;
switch(tinyDb.getInt("customFontId", -1)) { switch(tinyDB.getInt("customFontId", -1)) {
case 0: case 0:
@ -150,20 +140,27 @@ public class OrganizationDetailActivity extends BaseActivity implements BottomSh
switch (text) { switch (text) {
case "repository": case "repository":
tinyDb.putBoolean("organizationAction", true); tinyDB.putBoolean("organizationAction", true);
startActivity(new Intent(OrganizationDetailActivity.this, CreateRepoActivity.class)); startActivity(new Intent(OrganizationDetailActivity.this, CreateRepoActivity.class));
break; break;
case "label":
Intent intent = new Intent(ctx, CreateLabelActivity.class);
intent.putExtra("orgName", getIntent().getStringExtra("orgName"));
intent.putExtra("type", "org");
ctx.startActivity(intent);
break;
case "team": case "team":
startActivity(new Intent(OrganizationDetailActivity.this, CreateTeamByOrgActivity.class)); startActivity(new Intent(OrganizationDetailActivity.this, CreateTeamByOrgActivity.class));
break; break;
case "copyOrgUrl": case "copyOrgUrl":
String url = UrlBuilder.fromString(tinyDb.getString("instanceUrl")) String url = UrlBuilder.fromString(tinyDB.getString("instanceUrl"))
.withPath("/") .withPath("/")
.toString(); .toString();
ClipboardManager clipboard = (ClipboardManager) Objects.requireNonNull(ctx).getSystemService(Context.CLIPBOARD_SERVICE); ClipboardManager clipboard = (ClipboardManager) Objects.requireNonNull(ctx).getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("orgUrl", url + tinyDb.getString("orgName")); ClipData clip = ClipData.newPlainText("orgUrl", url + tinyDB.getString("orgName"));
assert clipboard != null; assert clipboard != null;
clipboard.setPrimaryClip(clip); clipboard.setPrimaryClip(clip);
Toasty.info(ctx, ctx.getString(R.string.copyIssueUrlToastMsg)); Toasty.info(ctx, ctx.getString(R.string.copyIssueUrlToastMsg));
@ -188,7 +185,7 @@ public class OrganizationDetailActivity extends BaseActivity implements BottomSh
} }
else { else {
orgName = tinyDb.getString("orgName"); orgName = tinyDB.getString("orgName");
} }
Fragment fragment = null; Fragment fragment = null;
@ -200,10 +197,13 @@ public class OrganizationDetailActivity extends BaseActivity implements BottomSh
case 1: // repos case 1: // repos
return RepositoriesByOrgFragment.newInstance(orgName); return RepositoriesByOrgFragment.newInstance(orgName);
case 2: // teams case 2: // labels
return OrganizationLabelsFragment.newInstance(orgName);
case 3: // teams
return TeamsByOrgFragment.newInstance(orgName); return TeamsByOrgFragment.newInstance(orgName);
case 3: // members case 4: // members
return MembersByOrgFragment.newInstance(orgName); return MembersByOrgFragment.newInstance(orgName);
} }
@ -212,7 +212,7 @@ public class OrganizationDetailActivity extends BaseActivity implements BottomSh
@Override @Override
public int getCount() { public int getCount() {
return 4; return 5;
} }
} }
} }

View File

@ -1,6 +1,5 @@
package org.mian.gitnex.activities; package org.mian.gitnex.activities;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.Menu; import android.view.Menu;
@ -15,7 +14,7 @@ import androidx.appcompat.widget.Toolbar;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.adapters.TeamMembersByOrgAdapter; import org.mian.gitnex.adapters.TeamMembersByOrgAdapter;
import org.mian.gitnex.fragments.BottomSheetOrganizationFragment; import org.mian.gitnex.databinding.ActivityOrgTeamMembersBinding;
import org.mian.gitnex.fragments.BottomSheetOrganizationTeamsFragment; import org.mian.gitnex.fragments.BottomSheetOrganizationTeamsFragment;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
@ -34,34 +33,24 @@ public class OrganizationTeamMembersActivity extends BaseActivity implements Bot
private GridView mGridView; private GridView mGridView;
private ProgressBar progressBar; private ProgressBar progressBar;
final Context ctx = this;
private Context appCtx;
private String teamId; private String teamId;
@Override
protected int getLayoutResourceId(){
return R.layout.activity_org_team_members;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
Toolbar toolbar = findViewById(R.id.toolbar); ActivityOrgTeamMembersBinding activityOrgTeamMembersBinding = ActivityOrgTeamMembersBinding.inflate(getLayoutInflater());
setContentView(activityOrgTeamMembersBinding.getRoot());
Toolbar toolbar = activityOrgTeamMembersBinding.toolbar;
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
TinyDB tinyDb = new TinyDB(appCtx); ImageView closeActivity = activityOrgTeamMembersBinding.close;
final String instanceUrl = tinyDb.getString("instanceUrl"); TextView toolbarTitle = activityOrgTeamMembersBinding.toolbarTitle;
final String loginUid = tinyDb.getString("loginUid"); noDataMembers = activityOrgTeamMembersBinding.noDataMembers;
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token"); mGridView = activityOrgTeamMembersBinding.gridView;
progressBar = activityOrgTeamMembersBinding.progressBar;
ImageView closeActivity = findViewById(R.id.close);
TextView toolbarTitle = findViewById(R.id.toolbar_title);
noDataMembers = findViewById(R.id.noDataMembers);
mGridView = findViewById(R.id.gridView);
progressBar = findViewById(R.id.progressBar);
initCloseListener(); initCloseListener();
closeActivity.setOnClickListener(onClickListener); closeActivity.setOnClickListener(onClickListener);
@ -85,30 +74,27 @@ public class OrganizationTeamMembersActivity extends BaseActivity implements Bot
} }
assert teamId != null; assert teamId != null;
fetchDataAsync(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), Integer.parseInt(teamId)); fetchDataAsync(Authorization.get(ctx), Integer.parseInt(teamId));
} }
@Override @Override
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
TinyDB tinyDb = new TinyDB(appCtx); TinyDB tinyDb = TinyDB.getInstance(appCtx);
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
if(tinyDb.getBoolean("teamActionFlag")) { if(tinyDb.getBoolean("teamActionFlag")) {
fetchDataAsync(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), Integer.parseInt(teamId)); fetchDataAsync(Authorization.get(ctx), Integer.parseInt(teamId));
tinyDb.putBoolean("teamActionFlag", false); tinyDb.putBoolean("teamActionFlag", false);
} }
} }
private void fetchDataAsync(String instanceUrl, String instanceToken, int teamId) { private void fetchDataAsync(String instanceToken, int teamId) {
TeamMembersByOrgViewModel teamMembersModel = new ViewModelProvider(this).get(TeamMembersByOrgViewModel.class); TeamMembersByOrgViewModel teamMembersModel = new ViewModelProvider(this).get(TeamMembersByOrgViewModel.class);
teamMembersModel.getMembersByOrgList(instanceUrl, instanceToken, teamId, ctx).observe(this, teamMembersListMain -> { teamMembersModel.getMembersByOrgList(instanceToken, teamId, ctx).observe(this, teamMembersListMain -> {
adapter = new TeamMembersByOrgAdapter(ctx, teamMembersListMain); adapter = new TeamMembersByOrgAdapter(ctx, teamMembersListMain);

View File

@ -11,14 +11,15 @@ import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import org.gitnex.tea4j.models.AddEmail;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityProfileEmailBinding;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.AddEmail;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -33,28 +34,23 @@ public class ProfileEmailActivity extends BaseActivity {
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
private EditText userEmail; private EditText userEmail;
final Context ctx = this;
private Context appCtx;
private Button addEmailButton; private Button addEmailButton;
@Override
protected int getLayoutResourceId(){
return R.layout.activity_profile_email;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
ActivityProfileEmailBinding activityProfileEmailBinding = ActivityProfileEmailBinding.inflate(getLayoutInflater());
setContentView(activityProfileEmailBinding.getRoot());
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
ImageView closeActivity = findViewById(R.id.close); ImageView closeActivity = activityProfileEmailBinding.close;
userEmail = findViewById(R.id.userEmail); userEmail = activityProfileEmailBinding.userEmail;
addEmailButton = findViewById(R.id.addEmailButton); addEmailButton = activityProfileEmailBinding.addEmailButton;
userEmail.requestFocus(); userEmail.requestFocus();
assert imm != null; assert imm != null;
@ -78,10 +74,6 @@ public class ProfileEmailActivity extends BaseActivity {
private void processAddNewEmail() { private void processAddNewEmail() {
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx); boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
TinyDB tinyDb = new TinyDB(appCtx);
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String newUserEmail = userEmail.getText().toString().trim(); String newUserEmail = userEmail.getText().toString().trim();
@ -105,19 +97,18 @@ public class ProfileEmailActivity extends BaseActivity {
List<String> newEmailList = new ArrayList<>(Arrays.asList(newUserEmail.split(","))); List<String> newEmailList = new ArrayList<>(Arrays.asList(newUserEmail.split(",")));
disableProcessButton(); disableProcessButton();
addNewEmail(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), newEmailList); addNewEmail(Authorization.get(ctx), newEmailList);
} }
private void addNewEmail(final String instanceUrl, final String token, List<String> newUserEmail) { private void addNewEmail(final String token, List<String> newUserEmail) {
AddEmail addEmailFunc = new AddEmail(newUserEmail); AddEmail addEmailFunc = new AddEmail(newUserEmail);
final TinyDB tinyDb = new TinyDB(appCtx); final TinyDB tinyDb = TinyDB.getInstance(appCtx);
Call<JsonElement> call; Call<JsonElement> call;
call = RetrofitClient call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(appCtx)
.getApiInterface()
.addNewEmail(token, addEmailFunc); .addNewEmail(token, addEmailFunc);
call.enqueue(new Callback<JsonElement>() { call.enqueue(new Callback<JsonElement>() {

View File

@ -1,349 +0,0 @@
package org.mian.gitnex.activities;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;
import org.mian.gitnex.R;
import org.mian.gitnex.actions.IssueActions;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.database.api.DraftsApi;
import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.StaticGlobalVariables;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.Issues;
import java.util.Objects;
import retrofit2.Call;
import retrofit2.Callback;
/**
* Author M M Arif
*/
public class ReplyToIssueActivity extends BaseActivity {
public ImageView closeActivity;
private View.OnClickListener onClickListener;
final Context ctx = this;
private Context appCtx;
private TextView draftSaved;
private EditText addComment;
private Button replyButton;
private String TAG = StaticGlobalVariables.replyToIssueActivity;
private long draftIdOnCreate;
@Override
protected int getLayoutResourceId(){
return R.layout.activity_reply_to_issue;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
TinyDB tinyDb = new TinyDB(appCtx);
draftSaved = findViewById(R.id.draftSaved);
addComment = findViewById(R.id.addComment);
addComment.setShowSoftInputOnFocus(true);
closeActivity = findViewById(R.id.close);
TextView toolbar_title = findViewById(R.id.toolbar_title);
addComment.requestFocus();
assert imm != null;
imm.showSoftInput(addComment, InputMethodManager.SHOW_IMPLICIT);
if(!tinyDb.getString("issueTitle").isEmpty()) {
toolbar_title.setText(tinyDb.getString("issueTitle"));
}
initCloseListener();
closeActivity.setOnClickListener(onClickListener);
if(getIntent().getStringExtra("draftId") != null) {
draftIdOnCreate = Long.parseLong(Objects.requireNonNull(getIntent().getStringExtra("draftId")));
}
else {
if(getIntent().getStringExtra("commentBody") != null) {
draftIdOnCreate = returnDraftId(getIntent().getStringExtra("commentBody"));
}
else {
draftIdOnCreate = returnDraftId("");
}
}
replyButton = findViewById(R.id.replyButton);
if(getIntent().getStringExtra("commentBody") != null) {
addComment.setText(getIntent().getStringExtra("commentBody"));
if(getIntent().getBooleanExtra("cursorToEnd", false)) {
addComment.setSelection(addComment.length());
}
}
if(getIntent().getStringExtra("draftTitle") != null) {
toolbar_title.setText(getIntent().getStringExtra("draftTitle"));
}
if(getIntent().getStringExtra("commentAction") != null && Objects.equals(getIntent().getStringExtra("commentAction"), "edit") && !Objects.equals(getIntent().getStringExtra("commentId"), "new")) {
final String commentId = getIntent().getStringExtra("commentId");
toolbar_title.setText(getResources().getString(R.string.editCommentTitle));
replyButton.setText(getResources().getString(R.string.editCommentButtonText));
addComment.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
saveDraft(addComment.getText().toString(), commentId, draftIdOnCreate);
draftSaved.setVisibility(View.VISIBLE);
}
});
replyButton.setOnClickListener(v -> {
disableProcessButton();
assert commentId != null;
IssueActions.editIssueComment(ctx, Integer.parseInt(commentId), addComment.getText().toString(), draftIdOnCreate);
});
return;
}
addComment.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
saveDraft(addComment.getText().toString(), "new", draftIdOnCreate);
draftSaved.setVisibility(View.VISIBLE);
}
});
if(!connToInternet) {
disableProcessButton();
}
else {
replyButton.setOnClickListener(replyToIssue);
}
}
private void saveDraft(String draftText, String commentId, long draftIdOnCreate) {
TinyDB tinyDb = new TinyDB(getApplicationContext());
int repositoryId = (int) tinyDb.getLong("repositoryId", 0);
int currentActiveAccountId = tinyDb.getInt("currentActiveAccountId");
int issueNumber = Integer.parseInt(tinyDb.getString("issueNumber"));
DraftsApi draftsApi = new DraftsApi(appCtx);
if(draftIdOnCreate == 0) {
draftsApi.insertDraft(repositoryId, currentActiveAccountId, issueNumber, draftText, StaticGlobalVariables.draftTypeComment, commentId);
}
else {
DraftsApi.updateDraft(draftText, (int) draftIdOnCreate, commentId); //updateDraftByIssueIdAsyncTask(draftText, issueNumber, repositoryId, commentId);
}
}
private long returnDraftId(String draftText) {
TinyDB tinyDb = new TinyDB(getApplicationContext());
int repositoryId = (int) tinyDb.getLong("repositoryId", 0);
int currentActiveAccountId = tinyDb.getInt("currentActiveAccountId");
int issueNumber = Integer.parseInt(tinyDb.getString("issueNumber"));
DraftsApi draftsApi = new DraftsApi(appCtx);
return draftsApi.insertDraft(repositoryId, currentActiveAccountId, issueNumber, draftText, StaticGlobalVariables.draftTypeComment, "");
}
private void initCloseListener() {
onClickListener = view -> finish();
}
private final View.OnClickListener replyToIssue = v -> processNewCommentReply();
private void processNewCommentReply() {
String newReplyDT = addComment.getText().toString();
boolean connToInternet = AppUtil.hasNetworkConnection(appCtx);
if(!connToInternet) {
Toasty.error(ctx, getResources().getString(R.string.checkNetConnection));
return;
}
if(newReplyDT.equals("")) {
Toasty.error(ctx, getString(R.string.commentEmptyError));
}
else {
disableProcessButton();
replyComment(newReplyDT);
}
}
private void replyComment(String newReplyDT) {
final TinyDB tinyDb = new TinyDB(appCtx);
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/");
final String repoOwner = parts[0];
final String repoName = parts[1];
final int issueIndex = Integer.parseInt(tinyDb.getString("issueNumber"));
Issues issueComment = new Issues(newReplyDT);
Call<Issues> call = RetrofitClient
.getInstance(instanceUrl, ctx)
.getApiInterface()
.replyCommentToIssue(Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, issueIndex, issueComment);
call.enqueue(new Callback<Issues>() {
@Override
public void onResponse(@NonNull Call<Issues> call, @NonNull retrofit2.Response<Issues> response) {
if(response.code() == 201) {
Toasty.success(ctx, getString(R.string.commentSuccess));
tinyDb.putBoolean("commentPosted", true);
tinyDb.putBoolean("resumeIssues", true);
tinyDb.putBoolean("resumePullRequests", true);
// delete draft comment
if(tinyDb.getBoolean("draftsCommentsDeletionEnabled")) {
DraftsApi draftsApi = new DraftsApi(appCtx);
draftsApi.deleteSingleDraft((int) draftIdOnCreate);
}
finish();
}
else if(response.code() == 401) {
enableProcessButton();
AlertDialogs.authorizationTokenRevokedDialog(ctx, getResources().getString(R.string.alertDialogTokenRevokedTitle),
getResources().getString(R.string.alertDialogTokenRevokedMessage),
getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
}
else {
enableProcessButton();
Toasty.error(ctx, getString(R.string.commentError));
}
}
@Override
public void onFailure(@NonNull Call<Issues> call, @NonNull Throwable t) {
Log.e(TAG, t.toString());
enableProcessButton();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.reply_to_issue, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if(id == R.id.replyToIssueMenu) {
Intent fragmentIntent = new Intent(ReplyToIssueActivity.this, MainActivity.class);
fragmentIntent.putExtra("launchFragment", "drafts");
ReplyToIssueActivity.this.startActivity(fragmentIntent);
return true;
}
else {
return super.onOptionsItemSelected(item);
}
}
private void disableProcessButton() {
replyButton.setEnabled(false);
}
private void enableProcessButton() {
replyButton.setEnabled(true);
}
}

View File

@ -27,6 +27,9 @@ import androidx.fragment.app.FragmentStatePagerAdapter;
import androidx.viewpager.widget.ViewPager; import androidx.viewpager.widget.ViewPager;
import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayout;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import org.gitnex.tea4j.models.Branches;
import org.gitnex.tea4j.models.UserRepositories;
import org.gitnex.tea4j.models.WatchInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.fragments.BottomSheetIssuesFilterFragment; import org.mian.gitnex.fragments.BottomSheetIssuesFilterFragment;
@ -42,12 +45,8 @@ import org.mian.gitnex.fragments.PullRequestsFragment;
import org.mian.gitnex.fragments.ReleasesFragment; import org.mian.gitnex.fragments.ReleasesFragment;
import org.mian.gitnex.fragments.RepoInfoFragment; import org.mian.gitnex.fragments.RepoInfoFragment;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version; import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.models.Branches;
import org.mian.gitnex.models.UserRepositories;
import org.mian.gitnex.models.WatchInfo;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@ -71,12 +70,6 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetRepoF
private FragmentRefreshListenerMilestone fragmentRefreshListenerMilestone; private FragmentRefreshListenerMilestone fragmentRefreshListenerMilestone;
private FragmentRefreshListenerFiles fragmentRefreshListenerFiles; private FragmentRefreshListenerFiles fragmentRefreshListenerFiles;
private final Context ctx = this;
private Context appCtx;
private TinyDB tinyDB;
private String instanceUrl;
private String loginUid; private String loginUid;
private String instanceToken; private String instanceToken;
@ -86,19 +79,12 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetRepoF
public static ViewPager mViewPager; public static ViewPager mViewPager;
private int tabsCount; private int tabsCount;
@Override
protected int getLayoutResourceId() {
return R.layout.activity_repo_detail;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
tinyDB = new TinyDB(appCtx); setContentView(R.layout.activity_repo_detail);
String[] repoNameParts = tinyDB.getString("repoFullName").split("/"); String[] repoNameParts = tinyDB.getString("repoFullName").split("/");
repositoryOwner = repoNameParts[0]; repositoryOwner = repoNameParts[0];
@ -106,14 +92,13 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetRepoF
Toolbar toolbar = findViewById(R.id.toolbar); Toolbar toolbar = findViewById(R.id.toolbar);
TextView toolbarTitle = toolbar.findViewById(R.id.toolbar_title); TextView toolbarTitle = findViewById(R.id.toolbar_title);
toolbarTitle.setText(repositoryName); toolbarTitle.setText(repositoryName);
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
Objects.requireNonNull(getSupportActionBar()).setTitle(repositoryName); Objects.requireNonNull(getSupportActionBar()).setTitle(repositoryName);
getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true);
instanceUrl = tinyDB.getString("instanceUrl");
loginUid = tinyDB.getString("loginUid"); loginUid = tinyDB.getString("loginUid");
instanceToken = "token " + tinyDB.getString(loginUid + "-token"); instanceToken = "token " + tinyDB.getString(loginUid + "-token");
@ -198,7 +183,7 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetRepoF
textViewBadgePull.setVisibility(View.GONE); textViewBadgePull.setVisibility(View.GONE);
textViewBadgeRelease.setVisibility(View.GONE); textViewBadgeRelease.setVisibility(View.GONE);
getRepoInfo(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repositoryOwner, repositoryName); getRepoInfo(Authorization.get(ctx), repositoryOwner, repositoryName);
ColorStateList textColor = tabLayout.getTabTextColors(); ColorStateList textColor = tabLayout.getTabTextColors();
// Issue count // Issue count
@ -254,8 +239,8 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetRepoF
} }
} }
checkRepositoryStarStatus(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repositoryOwner, repositoryName); checkRepositoryStarStatus(Authorization.get(ctx), repositoryOwner, repositoryName);
checkRepositoryWatchStatus(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repositoryOwner, repositoryName); checkRepositoryWatchStatus(Authorization.get(ctx), repositoryOwner, repositoryName);
} }
@Override @Override
@ -265,7 +250,7 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetRepoF
if(tinyDB.getBoolean("enableCounterIssueBadge")) { if(tinyDB.getBoolean("enableCounterIssueBadge")) {
getRepoInfo(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repositoryOwner, repositoryName); getRepoInfo(Authorization.get(ctx), repositoryOwner, repositoryName);
} }
} }
@ -434,8 +419,8 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetRepoF
private void chooseBranch() { private void chooseBranch() {
Call<List<Branches>> call = RetrofitClient.getInstance(instanceUrl, ctx) Call<List<Branches>> call = RetrofitClient
.getApiInterface() .getApiInterface(ctx)
.getBranches(instanceToken, repositoryOwner, repositoryName); .getBranches(instanceToken, repositoryOwner, repositoryName);
call.enqueue(new Callback<List<Branches>>() { call.enqueue(new Callback<List<Branches>>() {
@ -547,9 +532,9 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetRepoF
} }
} }
private void getRepoInfo(String instanceUrl, String token, final String owner, String repo) { private void getRepoInfo(String token, final String owner, String repo) {
Call<UserRepositories> call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getUserRepository(token, owner, repo); Call<UserRepositories> call = RetrofitClient.getApiInterface(ctx).getUserRepository(token, owner, repo);
call.enqueue(new Callback<UserRepositories>() { call.enqueue(new Callback<UserRepositories>() {
@Override @Override
@ -599,9 +584,9 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetRepoF
} }
private void checkRepositoryStarStatus(String instanceUrl, String instanceToken, final String owner, String repo) { private void checkRepositoryStarStatus(String instanceToken, final String owner, String repo) {
Call<JsonElement> call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().checkRepoStarStatus(instanceToken, owner, repo); Call<JsonElement> call = RetrofitClient.getApiInterface(ctx).checkRepoStarStatus(instanceToken, owner, repo);
call.enqueue(new Callback<JsonElement>() { call.enqueue(new Callback<JsonElement>() {
@Override @Override
@ -619,11 +604,11 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetRepoF
} }
private void checkRepositoryWatchStatus(String instanceUrl, String instanceToken, final String owner, String repo) { private void checkRepositoryWatchStatus(String instanceToken, final String owner, String repo) {
Call<WatchInfo> call; Call<WatchInfo> call;
call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().checkRepoWatchStatus(instanceToken, owner, repo); call = RetrofitClient.getApiInterface(ctx).checkRepoWatchStatus(instanceToken, owner, repo);
call.enqueue(new Callback<WatchInfo>() { call.enqueue(new Callback<WatchInfo>() {
@Override @Override

View File

@ -1,7 +1,6 @@
package org.mian.gitnex.activities; package org.mian.gitnex.activities;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
@ -22,14 +21,15 @@ import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import org.gitnex.tea4j.models.UserRepositories;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.adapters.RepoForksAdapter; import org.mian.gitnex.adapters.RepoForksAdapter;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.databinding.ActivityRepoForksBinding;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.StaticGlobalVariables; import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Version; import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.models.UserRepositories;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import retrofit2.Call; import retrofit2.Call;
@ -42,13 +42,11 @@ import retrofit2.Response;
public class RepoForksActivity extends BaseActivity { public class RepoForksActivity extends BaseActivity {
final Context ctx = this;
private Context appCtx;
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
private TextView noData; private TextView noData;
private ProgressBar progressBar; private ProgressBar progressBar;
private String TAG = "RepositoryForks"; private String TAG = "RepositoryForks";
private int resultLimit = StaticGlobalVariables.resultLimitOldGiteaInstances; private int resultLimit = Constants.resultLimitOldGiteaInstances;
private int pageSize = 1; private int pageSize = 1;
private RecyclerView recyclerView; private RecyclerView recyclerView;
@ -56,25 +54,19 @@ public class RepoForksActivity extends BaseActivity {
private RepoForksAdapter adapter; private RepoForksAdapter adapter;
private ProgressBar progressLoadMore; private ProgressBar progressLoadMore;
@Override
protected int getLayoutResourceId() {
return R.layout.activity_forks;
}
@SuppressLint("DefaultLocale") @SuppressLint("DefaultLocale")
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
Toolbar toolbar = findViewById(R.id.toolbar); ActivityRepoForksBinding activityRepoForksBinding = ActivityRepoForksBinding.inflate(getLayoutInflater());
setContentView(activityRepoForksBinding.getRoot());
Toolbar toolbar = activityRepoForksBinding.toolbar;
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
TinyDB tinyDb = new TinyDB(appCtx); TinyDB tinyDb = TinyDB.getInstance(appCtx);
final String instanceUrl = tinyDb.getString("instanceUrl");
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String repoFullNameForForks = getIntent().getStringExtra("repoFullNameForForks"); String repoFullNameForForks = getIntent().getStringExtra("repoFullNameForForks");
assert repoFullNameForForks != null; assert repoFullNameForForks != null;
@ -82,15 +74,15 @@ public class RepoForksActivity extends BaseActivity {
final String repoOwner = parts[0]; final String repoOwner = parts[0];
final String repoName = parts[1]; final String repoName = parts[1];
TextView toolbar_title = findViewById(R.id.toolbar_title); TextView toolbar_title = activityRepoForksBinding.toolbarTitle;
toolbar_title.setMovementMethod(new ScrollingMovementMethod()); toolbar_title.setMovementMethod(new ScrollingMovementMethod());
toolbar_title.setText(String.format("%s : %s", ctx.getResources().getString(R.string.infoTabRepoForksCount), repoName)); toolbar_title.setText(String.format("%s : %s", ctx.getResources().getString(R.string.infoTabRepoForksCount), repoName));
ImageView closeActivity = findViewById(R.id.close); ImageView closeActivity = activityRepoForksBinding.close;
noData = findViewById(R.id.noData); noData = activityRepoForksBinding.noData;
progressLoadMore = findViewById(R.id.progressLoadMore); progressLoadMore = activityRepoForksBinding.progressLoadMore;
progressBar = findViewById(R.id.progress_bar); progressBar = activityRepoForksBinding.progressBar;
SwipeRefreshLayout swipeRefresh = findViewById(R.id.pullToRefresh); SwipeRefreshLayout swipeRefresh = activityRepoForksBinding.pullToRefresh;
initCloseListener(); initCloseListener();
closeActivity.setOnClickListener(onClickListener); closeActivity.setOnClickListener(onClickListener);
@ -98,10 +90,10 @@ public class RepoForksActivity extends BaseActivity {
// if gitea is 1.12 or higher use the new limit (resultLimitNewGiteaInstances) // if gitea is 1.12 or higher use the new limit (resultLimitNewGiteaInstances)
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12")) { if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12")) {
resultLimit = StaticGlobalVariables.resultLimitNewGiteaInstances; resultLimit = Constants.resultLimitNewGiteaInstances;
} }
recyclerView = findViewById(R.id.recyclerView); recyclerView = activityRepoForksBinding.recyclerView;
forksList = new ArrayList<>(); forksList = new ArrayList<>();
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
@ -111,7 +103,7 @@ public class RepoForksActivity extends BaseActivity {
swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> { swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
swipeRefresh.setRefreshing(false); swipeRefresh.setRefreshing(false);
loadInitial(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, pageSize, resultLimit); loadInitial(Authorization.get(ctx), repoOwner, repoName, pageSize, resultLimit);
adapter.notifyDataChanged(); adapter.notifyDataChanged();
}, 200)); }, 200));
@ -122,7 +114,7 @@ public class RepoForksActivity extends BaseActivity {
if(forksList.size() == resultLimit || pageSize == resultLimit) { if(forksList.size() == resultLimit || pageSize == resultLimit) {
int page = (forksList.size() + resultLimit) / resultLimit; int page = (forksList.size() + resultLimit) / resultLimit;
loadMore(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, page, resultLimit); loadMore(Authorization.get(ctx), repoOwner, repoName, page, resultLimit);
} }
})); }));
@ -130,14 +122,13 @@ public class RepoForksActivity extends BaseActivity {
recyclerView.setLayoutManager(new LinearLayoutManager(ctx)); recyclerView.setLayoutManager(new LinearLayoutManager(ctx));
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
loadInitial(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName, pageSize, resultLimit); loadInitial(Authorization.get(ctx), repoOwner, repoName, pageSize, resultLimit);
} }
private void loadInitial(String instanceUrl, String instanceToken, String repoOwner, String repoName, int pageSize, int resultLimit) { private void loadInitial(String instanceToken, String repoOwner, String repoName, int pageSize, int resultLimit) {
Call<List<UserRepositories>> call = RetrofitClient Call<List<UserRepositories>> call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface()
.getRepositoryForks(instanceToken, repoOwner, repoName, pageSize, resultLimit); .getRepositoryForks(instanceToken, repoOwner, repoName, pageSize, resultLimit);
call.enqueue(new Callback<List<UserRepositories>>() { call.enqueue(new Callback<List<UserRepositories>>() {
@ -180,13 +171,12 @@ public class RepoForksActivity extends BaseActivity {
} }
private void loadMore(String instanceUrl, String instanceToken, String repoOwner, String repoName, int page, int resultLimit) { private void loadMore(String instanceToken, String repoOwner, String repoName, int page, int resultLimit) {
progressLoadMore.setVisibility(View.VISIBLE); progressLoadMore.setVisibility(View.VISIBLE);
Call<List<UserRepositories>> call = RetrofitClient Call<List<UserRepositories>> call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface()
.getRepositoryForks(instanceToken, repoOwner, repoName, page, resultLimit); .getRepositoryForks(instanceToken, repoOwner, repoName, page, resultLimit);
call.enqueue(new Callback<List<UserRepositories>>() { call.enqueue(new Callback<List<UserRepositories>>() {

View File

@ -1,6 +1,5 @@
package org.mian.gitnex.activities; package org.mian.gitnex.activities;
import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.GridView; import android.widget.GridView;
@ -10,8 +9,8 @@ import android.widget.TextView;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.adapters.RepoStargazersAdapter; import org.mian.gitnex.adapters.RepoStargazersAdapter;
import org.mian.gitnex.databinding.ActivityRepoStargazersBinding;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.viewmodels.RepoStargazersViewModel; import org.mian.gitnex.viewmodels.RepoStargazersViewModel;
/** /**
@ -26,30 +25,19 @@ public class RepoStargazersActivity extends BaseActivity {
private GridView mGridView; private GridView mGridView;
private ProgressBar mProgressBar; private ProgressBar mProgressBar;
final Context ctx = this;
private Context appCtx;
@Override
protected int getLayoutResourceId(){
return R.layout.activity_repo_stargazers;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
TinyDB tinyDb = new TinyDB(appCtx); ActivityRepoStargazersBinding activityRepoStargazersBinding = ActivityRepoStargazersBinding.inflate(getLayoutInflater());
final String instanceUrl = tinyDb.getString("instanceUrl"); setContentView(activityRepoStargazersBinding.getRoot());
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
ImageView closeActivity = findViewById(R.id.close); ImageView closeActivity = activityRepoStargazersBinding.close;
TextView toolbarTitle = findViewById(R.id.toolbar_title); TextView toolbarTitle = activityRepoStargazersBinding.toolbarTitle;
noDataStargazers = findViewById(R.id.noDataStargazers); noDataStargazers = activityRepoStargazersBinding.noDataStargazers;
mGridView = findViewById(R.id.gridView); mGridView = activityRepoStargazersBinding.gridView;
mProgressBar = findViewById(R.id.progress_bar); mProgressBar = activityRepoStargazersBinding.progressBar;
String repoFullNameForStars = getIntent().getStringExtra("repoFullNameForStars"); String repoFullNameForStars = getIntent().getStringExtra("repoFullNameForStars");
String[] parts = repoFullNameForStars.split("/"); String[] parts = repoFullNameForStars.split("/");
@ -61,14 +49,14 @@ public class RepoStargazersActivity extends BaseActivity {
toolbarTitle.setText(R.string.repoStargazersInMenu); toolbarTitle.setText(R.string.repoStargazersInMenu);
fetchDataAsync(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName); fetchDataAsync(Authorization.get(ctx), repoOwner, repoName);
} }
private void fetchDataAsync(String instanceUrl, String instanceToken, String repoOwner, String repoName) { private void fetchDataAsync(String instanceToken, String repoOwner, String repoName) {
RepoStargazersViewModel repoStargazersModel = new ViewModelProvider(this).get(RepoStargazersViewModel.class); RepoStargazersViewModel repoStargazersModel = new ViewModelProvider(this).get(RepoStargazersViewModel.class);
repoStargazersModel.getRepoStargazers(instanceUrl, instanceToken, repoOwner, repoName, ctx).observe(this, stargazersListMain -> { repoStargazersModel.getRepoStargazers(instanceToken, repoOwner, repoName, ctx).observe(this, stargazersListMain -> {
adapter = new RepoStargazersAdapter(ctx, stargazersListMain); adapter = new RepoStargazersAdapter(ctx, stargazersListMain);

View File

@ -1,6 +1,5 @@
package org.mian.gitnex.activities; package org.mian.gitnex.activities;
import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.GridView; import android.widget.GridView;
@ -10,8 +9,8 @@ import android.widget.TextView;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.adapters.RepoWatchersAdapter; import org.mian.gitnex.adapters.RepoWatchersAdapter;
import org.mian.gitnex.databinding.ActivityRepoWatchersBinding;
import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.Authorization;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.viewmodels.RepoWatchersViewModel; import org.mian.gitnex.viewmodels.RepoWatchersViewModel;
/** /**
@ -26,30 +25,19 @@ public class RepoWatchersActivity extends BaseActivity {
private GridView mGridView; private GridView mGridView;
private ProgressBar mProgressBar; private ProgressBar mProgressBar;
final Context ctx = this;
private Context appCtx;
@Override
protected int getLayoutResourceId(){
return R.layout.activity_repo_watchers;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
TinyDB tinyDb = new TinyDB(appCtx); ActivityRepoWatchersBinding activityRepoWatchersBinding = ActivityRepoWatchersBinding.inflate(getLayoutInflater());
final String instanceUrl = tinyDb.getString("instanceUrl"); setContentView(activityRepoWatchersBinding.getRoot());
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
ImageView closeActivity = findViewById(R.id.close); ImageView closeActivity = activityRepoWatchersBinding.close;
TextView toolbarTitle = findViewById(R.id.toolbar_title); TextView toolbarTitle = activityRepoWatchersBinding.toolbarTitle;
noDataWatchers = findViewById(R.id.noDataWatchers); noDataWatchers = activityRepoWatchersBinding.noDataWatchers;
mGridView = findViewById(R.id.gridView); mGridView = activityRepoWatchersBinding.gridView;
mProgressBar = findViewById(R.id.progress_bar); mProgressBar = activityRepoWatchersBinding.progressBar;
String repoFullNameForWatchers = getIntent().getStringExtra("repoFullNameForWatchers"); String repoFullNameForWatchers = getIntent().getStringExtra("repoFullNameForWatchers");
String[] parts = repoFullNameForWatchers.split("/"); String[] parts = repoFullNameForWatchers.split("/");
@ -61,14 +49,14 @@ public class RepoWatchersActivity extends BaseActivity {
toolbarTitle.setText(R.string.repoWatchersInMenu); toolbarTitle.setText(R.string.repoWatchersInMenu);
fetchDataAsync(instanceUrl, Authorization.returnAuthentication(ctx, loginUid, instanceToken), repoOwner, repoName); fetchDataAsync(Authorization.get(ctx), repoOwner, repoName);
} }
private void fetchDataAsync(String instanceUrl, String instanceToken, String repoOwner, String repoName) { private void fetchDataAsync(String instanceToken, String repoOwner, String repoName) {
RepoWatchersViewModel repoWatchersModel = new ViewModelProvider(this).get(RepoWatchersViewModel.class); RepoWatchersViewModel repoWatchersModel = new ViewModelProvider(this).get(RepoWatchersViewModel.class);
repoWatchersModel.getRepoWatchers(instanceUrl, instanceToken, repoOwner, repoName, ctx).observe(this, watchersListMain -> { repoWatchersModel.getRepoWatchers(instanceToken, repoOwner, repoName, ctx).observe(this, watchersListMain -> {
adapter = new RepoWatchersAdapter(ctx, watchersListMain); adapter = new RepoWatchersAdapter(ctx, watchersListMain);

View File

@ -1,7 +1,6 @@
package org.mian.gitnex.activities; package org.mian.gitnex.activities;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
@ -11,6 +10,8 @@ import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import org.gitnex.tea4j.models.RepositoryTransfer;
import org.gitnex.tea4j.models.UserRepositories;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.database.api.RepositoriesApi; import org.mian.gitnex.database.api.RepositoriesApi;
@ -18,11 +19,8 @@ import org.mian.gitnex.databinding.ActivityRepositorySettingsBinding;
import org.mian.gitnex.databinding.CustomRepositoryDeleteDialogBinding; import org.mian.gitnex.databinding.CustomRepositoryDeleteDialogBinding;
import org.mian.gitnex.databinding.CustomRepositoryEditPropertiesDialogBinding; import org.mian.gitnex.databinding.CustomRepositoryEditPropertiesDialogBinding;
import org.mian.gitnex.databinding.CustomRepositoryTransferDialogBinding; import org.mian.gitnex.databinding.CustomRepositoryTransferDialogBinding;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version; import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.models.RepositoryTransfer;
import org.mian.gitnex.models.UserRepositories;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
@ -40,40 +38,27 @@ public class RepositorySettingsActivity extends BaseActivity {
private Dialog dialogDeleteRepository; private Dialog dialogDeleteRepository;
private Dialog dialogTransferRepository; private Dialog dialogTransferRepository;
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
private Context ctx = this;
private Context appCtx;
private TinyDB tinyDb;
private String instanceUrl;
private String loginUid; private String loginUid;
private String instanceToken; private String instanceToken;
private String repositoryOwner; private String repositoryOwner;
private String repositoryName; private String repositoryName;
@Override
protected int getLayoutResourceId(){
return R.layout.activity_repository_settings;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
tinyDb = new TinyDB(appCtx);
viewBinding = ActivityRepositorySettingsBinding.inflate(getLayoutInflater()); viewBinding = ActivityRepositorySettingsBinding.inflate(getLayoutInflater());
View view = viewBinding.getRoot(); setContentView(viewBinding.getRoot());
setContentView(view);
instanceUrl = tinyDb.getString("instanceUrl"); loginUid = tinyDB.getString("loginUid");
loginUid = tinyDb.getString("loginUid"); String repoFullName = tinyDB.getString("repoFullName");
String repoFullName = tinyDb.getString("repoFullName");
String[] parts = repoFullName.split("/"); String[] parts = repoFullName.split("/");
repositoryOwner = parts[0]; repositoryOwner = parts[0];
repositoryName = parts[1]; repositoryName = parts[1];
instanceToken = "token " + tinyDb.getString(loginUid + "-token"); instanceToken = "token " + tinyDB.getString(loginUid + "-token");
ImageView closeActivity = findViewById(R.id.close); ImageView closeActivity = findViewById(R.id.close);
@ -81,7 +66,7 @@ public class RepositorySettingsActivity extends BaseActivity {
closeActivity.setOnClickListener(onClickListener); closeActivity.setOnClickListener(onClickListener);
// require gitea 1.12 or higher // require gitea 1.12 or higher
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) { if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.0")) {
viewBinding.transferOwnerFrame.setVisibility(View.VISIBLE); viewBinding.transferOwnerFrame.setVisibility(View.VISIBLE);
} }
@ -128,6 +113,7 @@ public class RepositorySettingsActivity extends BaseActivity {
} }
}); });
dialogTransferRepository.setCancelable(false);
dialogTransferRepository.show(); dialogTransferRepository.show();
} }
@ -136,8 +122,7 @@ public class RepositorySettingsActivity extends BaseActivity {
RepositoryTransfer repositoryTransfer = new RepositoryTransfer(newOwner); RepositoryTransfer repositoryTransfer = new RepositoryTransfer(newOwner);
Call<JsonElement> transferCall = RetrofitClient Call<JsonElement> transferCall = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface()
.transferRepository(instanceToken, repositoryOwner, repositoryName, repositoryTransfer); .transferRepository(instanceToken, repositoryOwner, repositoryName, repositoryTransfer);
transferCall.enqueue(new Callback<JsonElement>() { transferCall.enqueue(new Callback<JsonElement>() {
@ -154,7 +139,7 @@ public class RepositorySettingsActivity extends BaseActivity {
Toasty.success(ctx, getString(R.string.repoTransferSuccess)); Toasty.success(ctx, getString(R.string.repoTransferSuccess));
finish(); finish();
RepositoriesApi.deleteRepository((int) tinyDb.getLong("repositoryId", 0)); RepositoriesApi.deleteRepository((int) tinyDB.getLong("repositoryId", 0));
Intent intent = new Intent(RepositorySettingsActivity.this, MainActivity.class); Intent intent = new Intent(RepositorySettingsActivity.this, MainActivity.class);
RepositorySettingsActivity.this.startActivity(intent); RepositorySettingsActivity.this.startActivity(intent);
} }
@ -211,14 +196,14 @@ public class RepositorySettingsActivity extends BaseActivity {
} }
}); });
dialogDeleteRepository.setCancelable(false);
dialogDeleteRepository.show(); dialogDeleteRepository.show();
} }
private void deleteRepository() { private void deleteRepository() {
Call<JsonElement> deleteCall = RetrofitClient Call<JsonElement> deleteCall = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface()
.deleteRepository(instanceToken, repositoryOwner, repositoryName); .deleteRepository(instanceToken, repositoryOwner, repositoryName);
deleteCall.enqueue(new Callback<JsonElement>() { deleteCall.enqueue(new Callback<JsonElement>() {
@ -235,7 +220,7 @@ public class RepositorySettingsActivity extends BaseActivity {
Toasty.success(ctx, getString(R.string.repoDeletionSuccess)); Toasty.success(ctx, getString(R.string.repoDeletionSuccess));
finish(); finish();
RepositoriesApi.deleteRepository((int) tinyDb.getLong("repositoryId", 0)); RepositoriesApi.deleteRepository((int) tinyDB.getLong("repositoryId", 0));
Intent intent = new Intent(RepositorySettingsActivity.this, MainActivity.class); Intent intent = new Intent(RepositorySettingsActivity.this, MainActivity.class);
RepositorySettingsActivity.this.startActivity(intent); RepositorySettingsActivity.this.startActivity(intent);
} }
@ -275,8 +260,7 @@ public class RepositorySettingsActivity extends BaseActivity {
propBinding.cancel.setOnClickListener(editProperties -> dialogProp.dismiss()); propBinding.cancel.setOnClickListener(editProperties -> dialogProp.dismiss());
Call<UserRepositories> call = RetrofitClient Call<UserRepositories> call = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface()
.getUserRepository(instanceToken, repositoryOwner, repositoryName); .getUserRepository(instanceToken, repositoryOwner, repositoryName);
call.enqueue(new Callback<UserRepositories>() { call.enqueue(new Callback<UserRepositories>() {
@ -352,6 +336,7 @@ public class RepositorySettingsActivity extends BaseActivity {
propBinding.repoEnableMerge.isChecked(), propBinding.repoEnableRebase.isChecked(), propBinding.repoEnableMerge.isChecked(), propBinding.repoEnableRebase.isChecked(),
propBinding.repoEnableSquash.isChecked(), propBinding.repoEnableForceMerge.isChecked())); propBinding.repoEnableSquash.isChecked(), propBinding.repoEnableForceMerge.isChecked()));
dialogProp.setCancelable(false);
dialogProp.show(); dialogProp.show();
} }
@ -376,8 +361,7 @@ public class RepositorySettingsActivity extends BaseActivity {
} }
Call<UserRepositories> propsCall = RetrofitClient Call<UserRepositories> propsCall = RetrofitClient
.getInstance(instanceUrl, ctx) .getApiInterface(ctx)
.getApiInterface()
.updateRepositoryProperties(instanceToken, repositoryOwner, repositoryName, repoProps); .updateRepositoryProperties(instanceToken, repositoryOwner, repositoryName, repoProps);
propsCall.enqueue(new Callback<UserRepositories>() { propsCall.enqueue(new Callback<UserRepositories>() {
@ -390,8 +374,8 @@ public class RepositorySettingsActivity extends BaseActivity {
if (response.code() == 200) { if (response.code() == 200) {
tinyDb.putBoolean("hasIssues", repoEnableIssues); tinyDB.putBoolean("hasIssues", repoEnableIssues);
tinyDb.putBoolean("hasPullRequests", repoEnablePr); tinyDB.putBoolean("hasPullRequests", repoEnablePr);
dialogProp.dismiss(); dialogProp.dismiss();
Toasty.success(ctx, getString(R.string.repoPropertiesSaveSuccess)); Toasty.success(ctx, getString(R.string.repoPropertiesSaveSuccess));
@ -399,7 +383,7 @@ public class RepositorySettingsActivity extends BaseActivity {
if(!repositoryName.equals(repoName)) { if(!repositoryName.equals(repoName)) {
finish(); finish();
RepositoriesApi.updateRepositoryOwnerAndName(repositoryOwner, repoName, (int) tinyDb.getLong("repositoryId", 0)); RepositoriesApi.updateRepositoryOwnerAndName(repositoryOwner, repoName, (int) tinyDB.getLong("repositoryId", 0));
Intent intent = new Intent(RepositorySettingsActivity.this, MainActivity.class); Intent intent = new Intent(RepositorySettingsActivity.this, MainActivity.class);
RepositorySettingsActivity.this.startActivity(intent); RepositorySettingsActivity.this.startActivity(intent);
} }

View File

@ -1,6 +1,5 @@
package org.mian.gitnex.activities; package org.mian.gitnex.activities;
import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
@ -9,11 +8,8 @@ import android.widget.TextView;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import com.google.android.material.switchmaterial.SwitchMaterial; import com.google.android.material.switchmaterial.SwitchMaterial;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.databinding.ActivitySettingsAppearanceBinding;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/** /**
* Author M M Arif * Author M M Arif
@ -21,170 +17,76 @@ import java.util.List;
public class SettingsAppearanceActivity extends BaseActivity { public class SettingsAppearanceActivity extends BaseActivity {
private Context appCtx;
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
private static final String[] timeList = {"Pretty", "Normal"}; private static final String[] timeList = {"Pretty", "Normal"};
private static int timeSelectedChoice = 0; private static int timeSelectedChoice = 0;
private List<String> codeBlockList;
private static int codeBlockSelectedChoice = 0;
private static final String[] customFontList = {"Roboto", "Manrope", "Source Code Pro"}; private static final String[] customFontList = {"Roboto", "Manrope", "Source Code Pro"};
private static int customFontSelectedChoice = 0; private static int customFontSelectedChoice = 0;
private static final String[] themeList = {"Dark", "Light", "Auto (Light / Dark)", "Retro", "Auto (Retro / Dark)"}; private static final String[] themeList = {"Dark", "Light", "Auto (Light / Dark)", "Retro", "Auto (Retro / Dark)", "Pitch Black"};
private static int themeSelectedChoice = 0; private static int themeSelectedChoice = 0;
@Override
protected int getLayoutResourceId() {
return R.layout.activity_settings_appearance;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
final TinyDB tinyDb = new TinyDB(appCtx); ActivitySettingsAppearanceBinding activitySettingsAppearanceBinding = ActivitySettingsAppearanceBinding.inflate(getLayoutInflater());
setContentView(activitySettingsAppearanceBinding.getRoot());
ImageView closeActivity = findViewById(R.id.close); ImageView closeActivity = activitySettingsAppearanceBinding.close;
final TextView tvDateTimeSelected = findViewById(R.id.tvDateTimeSelected); // setter for time final TextView tvDateTimeSelected = activitySettingsAppearanceBinding.tvDateTimeSelected; // setter for time
final TextView codeBlockSelected = findViewById(R.id.codeBlockSelected); // setter for code block final TextView customFontSelected = activitySettingsAppearanceBinding.customFontSelected; // setter for custom font
final TextView customFontSelected = findViewById(R.id.customFontSelected); // setter for custom font final TextView themeSelected = activitySettingsAppearanceBinding.themeSelected; // setter for theme
final TextView themeSelected = findViewById(R.id.themeSelected); // setter for theme
LinearLayout timeFrame = findViewById(R.id.timeFrame); LinearLayout timeFrame = activitySettingsAppearanceBinding.timeFrame;
LinearLayout codeBlockFrame = findViewById(R.id.codeBlockFrame); LinearLayout customFontFrame = activitySettingsAppearanceBinding.customFontFrame;
LinearLayout customFontFrame = findViewById(R.id.customFontFrame); LinearLayout themeFrame = activitySettingsAppearanceBinding.themeSelectionFrame;
LinearLayout themeFrame = findViewById(R.id.themeSelectionFrame);
SwitchMaterial counterBadgesSwitch = findViewById(R.id.switchCounterBadge); SwitchMaterial counterBadgesSwitch = activitySettingsAppearanceBinding.switchCounterBadge;
initCloseListener(); initCloseListener();
closeActivity.setOnClickListener(onClickListener); closeActivity.setOnClickListener(onClickListener);
// code block if(!tinyDB.getString("timeStr").isEmpty()) {
String[] codeBlockList_ = {getResources().getString(R.string.codeBlockGreenOnBlack), getResources().getString(R.string.codeBlockWhiteOnBlack),
getResources().getString(R.string.codeBlockGreyOnBlack), getResources().getString(R.string.codeBlockWhiteOnGrey),
getResources().getString(R.string.codeBlockDarkOnWhite)};
codeBlockList = new ArrayList<>(Arrays.asList(codeBlockList_)); tvDateTimeSelected.setText(tinyDB.getString("timeStr"));
String[] codeBlockArray = new String[codeBlockList.size()];
codeBlockList.toArray(codeBlockArray);
if(codeBlockSelectedChoice == 0) {
codeBlockSelectedChoice = tinyDb.getInt("codeBlockId");
codeBlockSelected.setText(getResources().getString(R.string.codeBlockGreenOnBlack));
} }
if(codeBlockSelectedChoice == 1) { if(!tinyDB.getString("customFontStr").isEmpty()) {
codeBlockSelected.setText(getResources().getString(R.string.codeBlockWhiteOnBlack)); customFontSelected.setText(tinyDB.getString("customFontStr"));
}
else if(codeBlockSelectedChoice == 2) {
codeBlockSelected.setText(getResources().getString(R.string.codeBlockGreyOnBlack));
}
else if(codeBlockSelectedChoice == 3) {
codeBlockSelected.setText(getResources().getString(R.string.codeBlockWhiteOnGrey));
}
else if(codeBlockSelectedChoice == 4) {
codeBlockSelected.setText(getResources().getString(R.string.codeBlockDarkOnWhite));
} }
codeBlockFrame.setOnClickListener(codeBlock -> { if(!tinyDB.getString("themeStr").isEmpty()) {
AlertDialog.Builder cBuilder = new AlertDialog.Builder(SettingsAppearanceActivity.this); themeSelected.setText(tinyDB.getString("themeStr"));
cBuilder.setTitle(R.string.settingsCodeBlockSelectorDialogTitle);
cBuilder.setCancelable(codeBlockSelectedChoice != -1);
cBuilder.setSingleChoiceItems(codeBlockList_, codeBlockSelectedChoice, (dialogInterfaceCodeBlock, i) -> {
codeBlockSelectedChoice = i;
codeBlockSelected.setText(codeBlockList_[i]);
tinyDb.putInt("codeBlockId", i);
switch(i) {
case 1: // white on black
tinyDb.putInt("codeBlockColor", getResources().getColor(R.color.colorWhite));
tinyDb.putInt("codeBlockBackground", getResources().getColor(R.color.black));
break;
case 2: // grey on black
tinyDb.putInt("codeBlockColor", getResources().getColor(R.color.colorAccent));
tinyDb.putInt("codeBlockBackground", getResources().getColor(R.color.black));
break;
case 3: // white on grey
tinyDb.putInt("codeBlockColor", getResources().getColor(R.color.colorWhite));
tinyDb.putInt("codeBlockBackground", getResources().getColor(R.color.colorAccent));
break;
case 4: // dark on white
tinyDb.putInt("codeBlockColor", getResources().getColor(R.color.colorPrimary));
tinyDb.putInt("codeBlockBackground", getResources().getColor(R.color.colorWhite));
break;
default: // green on black
tinyDb.putInt("codeBlockColor", getResources().getColor(R.color.colorLightGreen));
tinyDb.putInt("codeBlockBackground", getResources().getColor(R.color.black));
break;
}
dialogInterfaceCodeBlock.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
});
AlertDialog cDialog = cBuilder.create();
cDialog.show();
});
// code block
if(!tinyDb.getString("timeStr").isEmpty()) {
tvDateTimeSelected.setText(tinyDb.getString("timeStr"));
}
if(!tinyDb.getString("customFontStr").isEmpty()) {
customFontSelected.setText(tinyDb.getString("customFontStr"));
}
if(!tinyDb.getString("themeStr").isEmpty()) {
themeSelected.setText(tinyDb.getString("themeStr"));
} }
if(timeSelectedChoice == 0) { if(timeSelectedChoice == 0) {
timeSelectedChoice = tinyDb.getInt("timeId"); timeSelectedChoice = tinyDB.getInt("timeId");
} }
if(customFontSelectedChoice == 0) { if(customFontSelectedChoice == 0) {
customFontSelectedChoice = tinyDb.getInt("customFontId", 1); customFontSelectedChoice = tinyDB.getInt("customFontId", 1);
} }
if(themeSelectedChoice == 0) { if(themeSelectedChoice == 0) {
themeSelectedChoice = tinyDb.getInt("themeId"); themeSelectedChoice = tinyDB.getInt("themeId");
} }
counterBadgesSwitch.setChecked(tinyDb.getBoolean("enableCounterBadges")); counterBadgesSwitch.setChecked(tinyDB.getBoolean("enableCounterBadges"));
// counter badge switcher // counter badge switcher
counterBadgesSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> { counterBadgesSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
tinyDb.putBoolean("enableCounterBadges", isChecked); tinyDB.putBoolean("enableCounterBadges", isChecked);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave)); Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
}); });
@ -200,10 +102,10 @@ public class SettingsAppearanceActivity extends BaseActivity {
themeSelectedChoice = i; themeSelectedChoice = i;
themeSelected.setText(themeList[i]); themeSelected.setText(themeList[i]);
tinyDb.putString("themeStr", themeList[i]); tinyDB.putString("themeStr", themeList[i]);
tinyDb.putInt("themeId", i); tinyDB.putInt("themeId", i);
tinyDb.putBoolean("refreshParent", true); tinyDB.putBoolean("refreshParent", true);
this.recreate(); this.recreate();
this.overridePendingTransition(0, 0); this.overridePendingTransition(0, 0);
dialogInterfaceTheme.dismiss(); dialogInterfaceTheme.dismiss();
@ -226,10 +128,10 @@ public class SettingsAppearanceActivity extends BaseActivity {
customFontSelectedChoice = i; customFontSelectedChoice = i;
customFontSelected.setText(customFontList[i]); customFontSelected.setText(customFontList[i]);
tinyDb.putString("customFontStr", customFontList[i]); tinyDB.putString("customFontStr", customFontList[i]);
tinyDb.putInt("customFontId", i); tinyDB.putInt("customFontId", i);
tinyDb.putBoolean("refreshParent", true); tinyDB.putBoolean("refreshParent", true);
this.recreate(); this.recreate();
this.overridePendingTransition(0, 0); this.overridePendingTransition(0, 0);
dialogInterfaceCustomFont.dismiss(); dialogInterfaceCustomFont.dismiss();
@ -252,16 +154,16 @@ public class SettingsAppearanceActivity extends BaseActivity {
timeSelectedChoice = i; timeSelectedChoice = i;
tvDateTimeSelected.setText(timeList[i]); tvDateTimeSelected.setText(timeList[i]);
tinyDb.putString("timeStr", timeList[i]); tinyDB.putString("timeStr", timeList[i]);
tinyDb.putInt("timeId", i); tinyDB.putInt("timeId", i);
if("Normal".equals(timeList[i])) { if("Normal".equals(timeList[i])) {
tinyDb.putString("dateFormat", "normal"); tinyDB.putString("dateFormat", "normal");
} }
else { else {
tinyDb.putString("dateFormat", "pretty"); tinyDB.putString("dateFormat", "pretty");
} }
dialogInterfaceTime.dismiss(); dialogInterfaceTime.dismiss();

View File

@ -1,12 +1,10 @@
package org.mian.gitnex.activities; package org.mian.gitnex.activities;
import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import com.google.android.material.switchmaterial.SwitchMaterial;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.databinding.ActivitySettingsDraftsBinding;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
/** /**
@ -15,36 +13,27 @@ import org.mian.gitnex.helpers.Toasty;
public class SettingsDraftsActivity extends BaseActivity { public class SettingsDraftsActivity extends BaseActivity {
private Context appCtx;
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
@Override
protected int getLayoutResourceId() {
return R.layout.activity_settings_drafts;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
TinyDB tinyDb = new TinyDB(appCtx); ActivitySettingsDraftsBinding activitySettingsDraftsBinding = ActivitySettingsDraftsBinding.inflate(getLayoutInflater());
setContentView(activitySettingsDraftsBinding.getRoot());
ImageView closeActivity = findViewById(R.id.close); ImageView closeActivity = activitySettingsDraftsBinding.close;
initCloseListener(); initCloseListener();
closeActivity.setOnClickListener(onClickListener); closeActivity.setOnClickListener(onClickListener);
SwitchMaterial commentsDeletionSwitch = findViewById(R.id.commentsDeletionSwitch); activitySettingsDraftsBinding.commentsDeletionSwitch.setChecked(tinyDB.getBoolean("draftsCommentsDeletionEnabled"));
commentsDeletionSwitch.setChecked(tinyDb.getBoolean("draftsCommentsDeletionEnabled"));
// delete comments on submit switcher // delete comments on submit switcher
commentsDeletionSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> { activitySettingsDraftsBinding.commentsDeletionSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
tinyDb.putBoolean("draftsCommentsDeletionEnabled", isChecked); tinyDB.putBoolean("draftsCommentsDeletionEnabled", isChecked);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave)); Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
}); });

View File

@ -1,99 +0,0 @@
package org.mian.gitnex.activities;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.appcompat.app.AlertDialog;
import com.google.android.material.switchmaterial.SwitchMaterial;
import org.mian.gitnex.R;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty;
/**
* Author M M Arif
*/
public class SettingsFileViewerActivity extends BaseActivity {
private Context appCtx;
private View.OnClickListener onClickListener;
private static final String[] fileViewerSourceCodeThemesList = {"Sublime", "Arduino Light", "Github", "Far ", "Ir Black", "Android Studio"};
private static int fileViewerSourceCodeThemesSelectedChoice = 0;
@Override
protected int getLayoutResourceId() {
return R.layout.activity_settings_fileview;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
final TinyDB tinyDb = new TinyDB(appCtx);
ImageView closeActivity = findViewById(R.id.close);
initCloseListener();
closeActivity.setOnClickListener(onClickListener);
final TextView fileViewerSourceCodeThemesSelected = findViewById(R.id.sourceCodeThemeSelected); // setter for fileviewer theme
LinearLayout sourceCodeThemeFrame = findViewById(R.id.sourceCodeThemeFrame);
SwitchMaterial pdfModeSwitch = findViewById(R.id.switchPdfMode);
if(!tinyDb.getString("fileviewerSourceCodeThemeStr").isEmpty()) {
fileViewerSourceCodeThemesSelected.setText(tinyDb.getString("fileviewerSourceCodeThemeStr"));
}
if(fileViewerSourceCodeThemesSelectedChoice == 0) {
fileViewerSourceCodeThemesSelectedChoice = tinyDb.getInt("fileviewerThemeId");
}
pdfModeSwitch.setChecked(tinyDb.getBoolean("enablePdfMode"));
// fileviewer srouce code theme selection dialog
sourceCodeThemeFrame.setOnClickListener(view -> {
AlertDialog.Builder fvtsBuilder = new AlertDialog.Builder(SettingsFileViewerActivity.this);
fvtsBuilder.setTitle(R.string.fileviewerSourceCodeThemeSelectorDialogTitle);
fvtsBuilder.setCancelable(fileViewerSourceCodeThemesSelectedChoice != -1);
fvtsBuilder.setSingleChoiceItems(fileViewerSourceCodeThemesList, fileViewerSourceCodeThemesSelectedChoice, (dialogInterfaceTheme, i) -> {
fileViewerSourceCodeThemesSelectedChoice = i;
fileViewerSourceCodeThemesSelected.setText(fileViewerSourceCodeThemesList[i]);
tinyDb.putString("fileviewerSourceCodeThemeStr", fileViewerSourceCodeThemesList[i]);
tinyDb.putInt("fileviewerSourceCodeThemeId", i);
dialogInterfaceTheme.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
});
AlertDialog cfDialog = fvtsBuilder.create();
cfDialog.show();
});
// pdf night mode switcher
pdfModeSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
tinyDb.putBoolean("enablePdfMode", isChecked);
tinyDb.putString("enablePdfModeInit", "yes");
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
});
}
private void initCloseListener() {
onClickListener = view -> finish();
}
}

View File

@ -1,12 +1,10 @@
package org.mian.gitnex.activities; package org.mian.gitnex.activities;
import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.databinding.ActivitySettingsGeneralBinding; import org.mian.gitnex.databinding.ActivitySettingsGeneralBinding;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version; import org.mian.gitnex.helpers.Version;
import java.util.ArrayList; import java.util.ArrayList;
@ -20,7 +18,6 @@ import java.util.List;
public class SettingsGeneralActivity extends BaseActivity { public class SettingsGeneralActivity extends BaseActivity {
private ActivitySettingsGeneralBinding viewBinding; private ActivitySettingsGeneralBinding viewBinding;
private Context appCtx;
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
private List<String> homeScreenList; private List<String> homeScreenList;
@ -29,23 +26,13 @@ public class SettingsGeneralActivity extends BaseActivity {
private List<String> defaultScreen; private List<String> defaultScreen;
private static int defaultLinkHandlerScreenSelectedChoice = 0; private static int defaultLinkHandlerScreenSelectedChoice = 0;
@Override
protected int getLayoutResourceId() {
return R.layout.activity_settings_general;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
viewBinding = ActivitySettingsGeneralBinding.inflate(getLayoutInflater()); viewBinding = ActivitySettingsGeneralBinding.inflate(getLayoutInflater());
View view = viewBinding.getRoot(); setContentView(viewBinding.getRoot());
setContentView(view);
TinyDB tinyDb = new TinyDB(appCtx);
initCloseListener(); initCloseListener();
viewBinding.close.setOnClickListener(onClickListener); viewBinding.close.setOnClickListener(onClickListener);
@ -59,7 +46,7 @@ public class SettingsGeneralActivity extends BaseActivity {
getResources().getString(R.string.pageTitleRepositories), getResources().getString(R.string.pageTitleProfile), getResources().getString(R.string.pageTitleExplore), getResources().getString(R.string.pageTitleRepositories), getResources().getString(R.string.pageTitleProfile), getResources().getString(R.string.pageTitleExplore),
getResources().getString(R.string.titleDrafts), getResources().getString(R.string.pageTitleNotifications)}; getResources().getString(R.string.titleDrafts), getResources().getString(R.string.pageTitleNotifications)};
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.3")) { if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.3")) {
homeDefaultScreen_ = homeDefaultScreenNew; homeDefaultScreen_ = homeDefaultScreenNew;
} }
@ -70,7 +57,7 @@ public class SettingsGeneralActivity extends BaseActivity {
if(homeScreenSelectedChoice == 0) { if(homeScreenSelectedChoice == 0) {
homeScreenSelectedChoice = tinyDb.getInt("homeScreenId"); homeScreenSelectedChoice = tinyDB.getInt("homeScreenId");
viewBinding.homeScreenSelected.setText(getResources().getString(R.string.pageTitleMyRepos)); viewBinding.homeScreenSelected.setText(getResources().getString(R.string.pageTitleMyRepos));
} }
@ -114,7 +101,7 @@ public class SettingsGeneralActivity extends BaseActivity {
homeScreenSelectedChoice = i; homeScreenSelectedChoice = i;
viewBinding.homeScreenSelected.setText(homeScreenArray[i]); viewBinding.homeScreenSelected.setText(homeScreenArray[i]);
tinyDb.putInt("homeScreenId", i); tinyDB.putInt("homeScreenId", i);
dialogInterfaceHomeScreen.dismiss(); dialogInterfaceHomeScreen.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave)); Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
@ -126,7 +113,7 @@ public class SettingsGeneralActivity extends BaseActivity {
// home screen // home screen
// link handler // link handler
String[] defaultScreen_ = {getResources().getString(R.string.generalDeepLinkSelectedText), getResources().getString(R.string.navRepos), getResources().getString(R.string.navOrgs), getResources().getString(R.string.pageTitleNotifications), getResources().getString(R.string.navExplore)}; String[] defaultScreen_ = {getResources().getString(R.string.generalDeepLinkSelectedText), getResources().getString(R.string.navRepos), getResources().getString(R.string.navOrg), getResources().getString(R.string.pageTitleNotifications), getResources().getString(R.string.navExplore)};
defaultScreen = new ArrayList<>(Arrays.asList(defaultScreen_)); defaultScreen = new ArrayList<>(Arrays.asList(defaultScreen_));
String[] linksArray = new String[defaultScreen.size()]; String[] linksArray = new String[defaultScreen.size()];
@ -134,7 +121,7 @@ public class SettingsGeneralActivity extends BaseActivity {
if(defaultLinkHandlerScreenSelectedChoice == 0) { if(defaultLinkHandlerScreenSelectedChoice == 0) {
defaultLinkHandlerScreenSelectedChoice = tinyDb.getInt("defaultScreenId"); defaultLinkHandlerScreenSelectedChoice = tinyDB.getInt("defaultScreenId");
viewBinding.generalDeepLinkSelected.setText(getResources().getString(R.string.generalDeepLinkSelectedText)); viewBinding.generalDeepLinkSelected.setText(getResources().getString(R.string.generalDeepLinkSelectedText));
} }
@ -144,7 +131,7 @@ public class SettingsGeneralActivity extends BaseActivity {
} }
else if(defaultLinkHandlerScreenSelectedChoice == 2) { else if(defaultLinkHandlerScreenSelectedChoice == 2) {
viewBinding.generalDeepLinkSelected.setText(getResources().getString(R.string.navOrgs)); viewBinding.generalDeepLinkSelected.setText(getResources().getString(R.string.navOrg));
} }
else if(defaultLinkHandlerScreenSelectedChoice == 3) { else if(defaultLinkHandlerScreenSelectedChoice == 3) {
@ -166,7 +153,7 @@ public class SettingsGeneralActivity extends BaseActivity {
defaultLinkHandlerScreenSelectedChoice = i; defaultLinkHandlerScreenSelectedChoice = i;
viewBinding.generalDeepLinkSelected.setText(linksArray[i]); viewBinding.generalDeepLinkSelected.setText(linksArray[i]);
tinyDb.putInt("defaultScreenId", i); tinyDB.putInt("defaultScreenId", i);
dialogInterfaceHomeScreen.dismiss(); dialogInterfaceHomeScreen.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave)); Toasty.success(appCtx, getResources().getString(R.string.settingsSave));

View File

@ -0,0 +1,117 @@
package org.mian.gitnex.activities;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.NumberPicker;
import androidx.appcompat.app.AlertDialog;
import com.pes.androidmaterialcolorpickerdialog.ColorPicker;
import org.mian.gitnex.R;
import org.mian.gitnex.databinding.ActivitySettingsNotificationsBinding;
import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.notifications.Notifications;
/**
* Template Author M M Arif
* Author opyale
*/
public class SettingsNotificationsActivity extends BaseActivity {
private ActivitySettingsNotificationsBinding viewBinding;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
viewBinding = ActivitySettingsNotificationsBinding.inflate(getLayoutInflater());
setContentView(viewBinding.getRoot());
View.OnClickListener onClickListener = viewClose -> finish();
viewBinding.close.setOnClickListener(onClickListener);
viewBinding.pollingDelaySelected.setText(String.format(getString(R.string.pollingDelaySelectedText), tinyDB.getInt("pollingDelayMinutes", Constants.defaultPollingDelay)));
viewBinding.chooseColorState.setCardBackgroundColor(tinyDB.getInt("notificationsLightColor", Color.GREEN));
viewBinding.enableNotificationsMode.setChecked(tinyDB.getBoolean("notificationsEnabled", true));
viewBinding.enableLightsMode.setChecked(tinyDB.getBoolean("notificationsEnableLights", true));
viewBinding.enableVibrationMode.setChecked(tinyDB.getBoolean("notificationsEnableVibration", true));
viewBinding.enableNotificationsMode.setOnCheckedChangeListener((buttonView, isChecked) -> {
tinyDB.putBoolean("notificationsEnabled", isChecked);
if(!isChecked) Notifications.stopWorker(ctx);
Toasty.info(appCtx, getResources().getString(R.string.settingsSave));
});
// polling delay
viewBinding.pollingDelayFrame.setOnClickListener(v -> {
NumberPicker numberPicker = new NumberPicker(ctx);
numberPicker.setMinValue(Constants.minimumPollingDelay);
numberPicker.setMaxValue(Constants.maximumPollingDelay);
numberPicker.setValue(tinyDB.getInt("pollingDelayMinutes", Constants.defaultPollingDelay));
numberPicker.setWrapSelectorWheel(true);
AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
builder.setTitle(getString(R.string.pollingDelayDialogHeaderText));
builder.setMessage(getString(R.string.pollingDelayDialogDescriptionText));
builder.setCancelable(true);
builder.setPositiveButton(getString(R.string.okButton), (dialog, which) -> {
tinyDB.putInt("pollingDelayMinutes", numberPicker.getValue());
Notifications.stopWorker(ctx);
Notifications.startWorker(ctx);
viewBinding.pollingDelaySelected.setText(String.format(getString(R.string.pollingDelaySelectedText), numberPicker.getValue()));
Toasty.info(appCtx, getResources().getString(R.string.settingsSave));
});
builder.setNeutralButton(R.string.cancelButton, (dialog, which) -> dialog.dismiss());
builder.setView(numberPicker);
builder.create().show();
});
// lights switcher
viewBinding.enableLightsMode.setOnCheckedChangeListener((buttonView, isChecked) -> {
tinyDB.putBoolean("notificationsEnableLights", isChecked);
Toasty.info(appCtx, getResources().getString(R.string.settingsSave));
});
// lights color chooser
viewBinding.chooseColorFrame.setOnClickListener(v -> {
ColorPicker colorPicker = new ColorPicker(SettingsNotificationsActivity.this);
colorPicker.setColor(tinyDB.getInt("notificationsLightColor", Color.GREEN));
colorPicker.setCallback(color -> {
tinyDB.putInt("notificationsLightColor", color);
viewBinding.chooseColorState.setCardBackgroundColor(color);
colorPicker.dismiss();
Toasty.info(appCtx, getResources().getString(R.string.settingsSave));
});
colorPicker.show();
});
// vibration switcher
viewBinding.enableVibrationMode.setOnCheckedChangeListener((buttonView, isChecked) -> {
tinyDB.putBoolean("notificationsEnableVibration", isChecked);
Toasty.info(appCtx, getResources().getString(R.string.settingsSave));
});
}
}

View File

@ -1,12 +1,10 @@
package org.mian.gitnex.activities; package org.mian.gitnex.activities;
import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import com.google.android.material.switchmaterial.SwitchMaterial;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.databinding.ActivitySettingsReportsBinding;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
/** /**
@ -15,36 +13,27 @@ import org.mian.gitnex.helpers.Toasty;
public class SettingsReportsActivity extends BaseActivity { public class SettingsReportsActivity extends BaseActivity {
private Context appCtx;
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
@Override
protected int getLayoutResourceId() {
return R.layout.activity_settings_reporting;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
TinyDB tinyDb = new TinyDB(appCtx); ActivitySettingsReportsBinding activitySettingsReportsBinding = ActivitySettingsReportsBinding.inflate(getLayoutInflater());
setContentView(activitySettingsReportsBinding.getRoot());
ImageView closeActivity = findViewById(R.id.close); ImageView closeActivity = activitySettingsReportsBinding.close;
initCloseListener(); initCloseListener();
closeActivity.setOnClickListener(onClickListener); closeActivity.setOnClickListener(onClickListener);
SwitchMaterial crashReportsSwitch = findViewById(R.id.crashReportsSwitch); activitySettingsReportsBinding.crashReportsSwitch.setChecked(tinyDB.getBoolean("crashReportingEnabled"));
crashReportsSwitch.setChecked(tinyDb.getBoolean("crashReportingEnabled"));
// crash reports switcher // crash reports switcher
crashReportsSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> { activitySettingsReportsBinding.crashReportsSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
tinyDb.putBoolean("crashReportingEnabled", isChecked); tinyDB.putBoolean("crashReportingEnabled", isChecked);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave)); Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
}); });
} }

View File

@ -1,24 +1,27 @@
package org.mian.gitnex.activities; package org.mian.gitnex.activities;
import android.app.KeyguardManager;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.NumberPicker;
import android.widget.TextView; import android.widget.TextView;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.biometric.BiometricManager;
import com.google.android.material.switchmaterial.SwitchMaterial;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.databinding.ActivitySettingsSecurityBinding;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.Version;
import org.mian.gitnex.helpers.ssl.MemorizingTrustManager; import org.mian.gitnex.helpers.ssl.MemorizingTrustManager;
import org.mian.gitnex.notifications.NotificationsMaster;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import static androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG;
import static androidx.biometric.BiometricManager.Authenticators.DEVICE_CREDENTIAL;
/** /**
* Author M M Arif * Author M M Arif
@ -26,78 +29,121 @@ import java.io.IOException;
public class SettingsSecurityActivity extends BaseActivity { public class SettingsSecurityActivity extends BaseActivity {
private Context appCtx;
private Context ctx = this;
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
private static String[] cacheSizeDataList = {"50 MB", "100 MB", "250 MB", "500 MB", "1 GB"}; private static final String[] cacheSizeDataList = {"50 MB", "100 MB", "250 MB", "500 MB", "1 GB"};
private static int cacheSizeDataSelectedChoice = 0; private static int cacheSizeDataSelectedChoice = 0;
private static String[] cacheSizeImagesList = {"50 MB", "100 MB", "250 MB", "500 MB", "1 GB"}; private static final String[] cacheSizeImagesList = {"50 MB", "100 MB", "250 MB", "500 MB", "1 GB"};
private static int cacheSizeImagesSelectedChoice = 0; private static int cacheSizeImagesSelectedChoice = 0;
private static int MINIMUM_POLLING_DELAY = 1;
private static int DEFAULT_POLLING_DELAY = 20;
private static int MAXIMUM_POLLING_DELAY = 720;
@Override
protected int getLayoutResourceId() {
return R.layout.activity_settings_security;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
TinyDB tinyDb = new TinyDB(appCtx); ActivitySettingsSecurityBinding activitySettingsSecurityBinding = ActivitySettingsSecurityBinding.inflate(getLayoutInflater());
String currentVersion = tinyDb.getString("giteaVersion"); setContentView(activitySettingsSecurityBinding.getRoot());
ImageView closeActivity = findViewById(R.id.close); ImageView closeActivity = activitySettingsSecurityBinding.close;
initCloseListener(); initCloseListener();
closeActivity.setOnClickListener(onClickListener); closeActivity.setOnClickListener(onClickListener);
TextView cacheSizeDataSelected = findViewById(R.id.cacheSizeDataSelected); // setter for data cache size TextView cacheSizeDataSelected = activitySettingsSecurityBinding.cacheSizeDataSelected; // setter for data cache size
TextView cacheSizeImagesSelected = findViewById(R.id.cacheSizeImagesSelected); // setter for images cache size TextView cacheSizeImagesSelected = activitySettingsSecurityBinding.cacheSizeImagesSelected; // setter for images cache size
TextView clearCacheSelected = findViewById(R.id.clearCacheSelected); // setter for clear cache TextView clearCacheSelected = activitySettingsSecurityBinding.clearCacheSelected; // setter for clear cache
TextView pollingDelaySelected = findViewById(R.id.pollingDelaySelected);
LinearLayout certsFrame = findViewById(R.id.certsFrame); LinearLayout certsFrame = activitySettingsSecurityBinding.certsFrame;
LinearLayout pollingDelayFrame = findViewById(R.id.pollingDelayFrame); LinearLayout cacheSizeDataFrame = activitySettingsSecurityBinding.cacheSizeDataSelectionFrame;
LinearLayout cacheSizeDataFrame = findViewById(R.id.cacheSizeDataSelectionFrame); LinearLayout cacheSizeImagesFrame = activitySettingsSecurityBinding.cacheSizeImagesSelectionFrame;
LinearLayout cacheSizeImagesFrame = findViewById(R.id.cacheSizeImagesSelectionFrame); LinearLayout clearCacheFrame = activitySettingsSecurityBinding.clearCacheSelectionFrame;
LinearLayout clearCacheFrame = findViewById(R.id.clearCacheSelectionFrame);
if(!tinyDb.getString("cacheSizeStr").isEmpty()) { SwitchMaterial switchBiometric = activitySettingsSecurityBinding.switchBiometric;
cacheSizeDataSelected.setText(tinyDb.getString("cacheSizeStr")); if(!tinyDB.getString("cacheSizeStr").isEmpty()) {
cacheSizeDataSelected.setText(tinyDB.getString("cacheSizeStr"));
} }
if(!tinyDb.getString("cacheSizeImagesStr").isEmpty()) { if(!tinyDB.getString("cacheSizeImagesStr").isEmpty()) {
cacheSizeImagesSelected.setText(tinyDb.getString("cacheSizeImagesStr")); cacheSizeImagesSelected.setText(tinyDB.getString("cacheSizeImagesStr"));
} }
if(cacheSizeDataSelectedChoice == 0) { if(cacheSizeDataSelectedChoice == 0) {
cacheSizeDataSelectedChoice = tinyDb.getInt("cacheSizeId"); cacheSizeDataSelectedChoice = tinyDB.getInt("cacheSizeId");
} }
if(cacheSizeImagesSelectedChoice == 0) { if(cacheSizeImagesSelectedChoice == 0) {
cacheSizeImagesSelectedChoice = tinyDb.getInt("cacheSizeImagesId"); cacheSizeImagesSelectedChoice = tinyDB.getInt("cacheSizeImagesId");
} }
if(new Version(currentVersion).less("1.12.3")) { switchBiometric.setChecked(tinyDB.getBoolean("biometricStatus"));
pollingDelayFrame.setVisibility(View.GONE); // biometric switcher
switchBiometric.setOnCheckedChangeListener((buttonView, isChecked) -> {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if(isChecked) {
BiometricManager biometricManager = BiometricManager.from(ctx);
KeyguardManager keyguardManager = (KeyguardManager) ctx.getSystemService(Context.KEYGUARD_SERVICE);
if (!keyguardManager.isDeviceSecure()) {
switch(biometricManager.canAuthenticate(BIOMETRIC_STRONG | DEVICE_CREDENTIAL)) {
case BiometricManager.BIOMETRIC_SUCCESS:
tinyDB.putBoolean("biometricStatus", true);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
break;
case BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE:
case BiometricManager.BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED:
case BiometricManager.BIOMETRIC_ERROR_UNSUPPORTED:
case BiometricManager.BIOMETRIC_STATUS_UNKNOWN:
tinyDB.putBoolean("biometricStatus", false);
switchBiometric.setChecked(false);
Toasty.error(appCtx, getResources().getString(R.string.biometricNotSupported));
break;
case BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE:
tinyDB.putBoolean("biometricStatus", false);
switchBiometric.setChecked(false);
Toasty.error(appCtx, getResources().getString(R.string.biometricNotAvailable));
break;
case BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED:
tinyDB.putBoolean("biometricStatus", false);
switchBiometric.setChecked(false);
Toasty.info(appCtx, getResources().getString(R.string.enrollBiometric));
break;
}
}
else {
tinyDB.putBoolean("biometricStatus", true);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
}
}
else {
tinyDB.putBoolean("biometricStatus", false);
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
}
}
else {
tinyDB.putBoolean("biometricStatus", false);
Toasty.success(appCtx, getResources().getString(R.string.biometricNotSupported));
} }
pollingDelaySelected.setText(String.format(getString(R.string.pollingDelaySelectedText), tinyDb.getInt("pollingDelayMinutes", DEFAULT_POLLING_DELAY))); });
// clear cache setter // clear cache setter
File cacheDir = appCtx.getCacheDir(); File cacheDir = appCtx.getCacheDir();
@ -142,8 +188,8 @@ public class SettingsSecurityActivity extends BaseActivity {
cacheSizeImagesSelectedChoice = i; cacheSizeImagesSelectedChoice = i;
cacheSizeImagesSelected.setText(cacheSizeImagesList[i]); cacheSizeImagesSelected.setText(cacheSizeImagesList[i]);
tinyDb.putString("cacheSizeImagesStr", cacheSizeImagesList[i]); tinyDB.putString("cacheSizeImagesStr", cacheSizeImagesList[i]);
tinyDb.putInt("cacheSizeImagesId", i); tinyDB.putInt("cacheSizeImagesId", i);
dialogInterfaceTheme.dismiss(); dialogInterfaceTheme.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave)); Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
@ -165,8 +211,8 @@ public class SettingsSecurityActivity extends BaseActivity {
cacheSizeDataSelectedChoice = i; cacheSizeDataSelectedChoice = i;
cacheSizeDataSelected.setText(cacheSizeDataList[i]); cacheSizeDataSelected.setText(cacheSizeDataList[i]);
tinyDb.putString("cacheSizeStr", cacheSizeDataList[i]); tinyDB.putString("cacheSizeStr", cacheSizeDataList[i]);
tinyDb.putInt("cacheSizeId", i); tinyDB.putInt("cacheSizeId", i);
dialogInterfaceTheme.dismiss(); dialogInterfaceTheme.dismiss();
Toasty.success(appCtx, getResources().getString(R.string.settingsSave)); Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
@ -187,9 +233,9 @@ public class SettingsSecurityActivity extends BaseActivity {
appCtx.getSharedPreferences(MemorizingTrustManager.KEYSTORE_NAME, Context.MODE_PRIVATE).edit().remove(MemorizingTrustManager.KEYSTORE_KEY).apply(); appCtx.getSharedPreferences(MemorizingTrustManager.KEYSTORE_NAME, Context.MODE_PRIVATE).edit().remove(MemorizingTrustManager.KEYSTORE_KEY).apply();
tinyDb.putBoolean("loggedInMode", false); tinyDB.putBoolean("loggedInMode", false);
tinyDb.remove("basicAuthPassword"); tinyDB.remove("basicAuthPassword");
tinyDb.putBoolean("basicAuthFlag", false); tinyDB.putBoolean("basicAuthFlag", false);
Intent loginActivityIntent = new Intent().setClass(appCtx, LoginActivity.class); Intent loginActivityIntent = new Intent().setClass(appCtx, LoginActivity.class);
loginActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); loginActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@ -199,36 +245,6 @@ public class SettingsSecurityActivity extends BaseActivity {
builder.setNeutralButton(R.string.cancelButton, (dialog, which) -> dialog.dismiss()); builder.setNeutralButton(R.string.cancelButton, (dialog, which) -> dialog.dismiss());
builder.create().show(); builder.create().show();
}); });
// polling delay
pollingDelayFrame.setOnClickListener(v -> {
NumberPicker numberPicker = new NumberPicker(ctx);
numberPicker.setMinValue(MINIMUM_POLLING_DELAY);
numberPicker.setMaxValue(MAXIMUM_POLLING_DELAY);
numberPicker.setValue(tinyDb.getInt("pollingDelayMinutes", DEFAULT_POLLING_DELAY));
numberPicker.setWrapSelectorWheel(true);
AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
builder.setTitle(getString(R.string.pollingDelayDialogHeaderText));
builder.setMessage(getString(R.string.pollingDelayDialogDescriptionText));
builder.setCancelable(true);
builder.setPositiveButton(getString(R.string.okButton), (dialog, which) -> {
tinyDb.putInt("pollingDelayMinutes", numberPicker.getValue());
NotificationsMaster.fireWorker(ctx);
NotificationsMaster.hireWorker(ctx);
pollingDelaySelected.setText(String.format(getString(R.string.pollingDelaySelectedText), numberPicker.getValue()));
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
});
builder.setNeutralButton(R.string.cancelButton, null);
builder.setView(numberPicker);
builder.create().show();
});
} }
private void initCloseListener() { private void initCloseListener() {

View File

@ -1,6 +1,5 @@
package org.mian.gitnex.activities; package org.mian.gitnex.activities;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
@ -10,7 +9,7 @@ import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.databinding.ActivitySettingsTranslationBinding;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
/** /**
@ -19,36 +18,29 @@ import org.mian.gitnex.helpers.Toasty;
public class SettingsTranslationActivity extends BaseActivity { public class SettingsTranslationActivity extends BaseActivity {
private Context appCtx;
private View.OnClickListener onClickListener; private View.OnClickListener onClickListener;
private static String[] langList = {"English", "Arabic", "Chinese", "Czech", "Finnish", "French", "German", "Italian", "Latvian", "Persian", private static String[] langList = {"English", "Arabic", "Chinese", "Czech", "Finnish", "French", "German", "Italian", "Latvian", "Persian",
"Polish", "Portuguese/Brazilian", "Russian", "Serbian", "Spanish", "Turkish", "Ukrainian"}; "Polish", "Portuguese/Brazilian", "Russian", "Serbian", "Spanish", "Turkish", "Ukrainian"};
private static int langSelectedChoice = 0; private static int langSelectedChoice = 0;
@Override
protected int getLayoutResourceId() {
return R.layout.activity_settings_translation;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
appCtx = getApplicationContext();
TinyDB tinyDb = new TinyDB(appCtx); ActivitySettingsTranslationBinding activitySettingsTranslationBinding = ActivitySettingsTranslationBinding.inflate(getLayoutInflater());
setContentView(activitySettingsTranslationBinding.getRoot());
ImageView closeActivity = findViewById(R.id.close); ImageView closeActivity = activitySettingsTranslationBinding.close;
initCloseListener(); initCloseListener();
closeActivity.setOnClickListener(onClickListener); closeActivity.setOnClickListener(onClickListener);
final TextView tvLanguageSelected = findViewById(R.id.tvLanguageSelected); // setter for en, fr final TextView tvLanguageSelected = activitySettingsTranslationBinding.tvLanguageSelected; // setter for en, fr
TextView helpTranslate = findViewById(R.id.helpTranslate); TextView helpTranslate = activitySettingsTranslationBinding.helpTranslate;
LinearLayout langFrame = findViewById(R.id.langFrame); LinearLayout langFrame = activitySettingsTranslationBinding.langFrame;
helpTranslate.setOnClickListener(v12 -> { helpTranslate.setOnClickListener(v12 -> {
@ -60,14 +52,14 @@ public class SettingsTranslationActivity extends BaseActivity {
}); });
if(!tinyDb.getString("localeStr").isEmpty()) { if(!tinyDB.getString("localeStr").isEmpty()) {
tvLanguageSelected.setText(tinyDb.getString("localeStr")); tvLanguageSelected.setText(tinyDB.getString("localeStr"));
} }
if(langSelectedChoice == 0) { if(langSelectedChoice == 0) {
langSelectedChoice = tinyDb.getInt("langId"); langSelectedChoice = tinyDB.getInt("langId");
} }
// language dialog // language dialog
@ -82,81 +74,81 @@ public class SettingsTranslationActivity extends BaseActivity {
langSelectedChoice = i; langSelectedChoice = i;
tvLanguageSelected.setText(langList[i]); tvLanguageSelected.setText(langList[i]);
tinyDb.putString("localeStr", langList[i]); tinyDB.putString("localeStr", langList[i]);
tinyDb.putInt("langId", i); tinyDB.putInt("langId", i);
switch(langList[i]) { switch(langList[i]) {
case "Arabic": case "Arabic":
tinyDb.putString("locale", "ar"); tinyDB.putString("locale", "ar");
break; break;
case "Chinese": case "Chinese":
tinyDb.putString("locale", "zh"); tinyDB.putString("locale", "zh");
break; break;
case "Czech": case "Czech":
tinyDb.putString("locale", "cs"); tinyDB.putString("locale", "cs");
break; break;
case "Finnish": case "Finnish":
tinyDb.putString("locale", "fi"); tinyDB.putString("locale", "fi");
break; break;
case "French": case "French":
tinyDb.putString("locale", "fr"); tinyDB.putString("locale", "fr");
break; break;
case "German": case "German":
tinyDb.putString("locale", "de"); tinyDB.putString("locale", "de");
break; break;
case "Italian": case "Italian":
tinyDb.putString("locale", "it"); tinyDB.putString("locale", "it");
break; break;
case "Latvian": case "Latvian":
tinyDb.putString("locale", "lv"); tinyDB.putString("locale", "lv");
break; break;
case "Persian": case "Persian":
tinyDb.putString("locale", "fa"); tinyDB.putString("locale", "fa");
break; break;
case "Polish": case "Polish":
tinyDb.putString("locale", "pl"); tinyDB.putString("locale", "pl");
break; break;
case "Portuguese/Brazilian": case "Portuguese/Brazilian":
tinyDb.putString("locale", "pt"); tinyDB.putString("locale", "pt");
break; break;
case "Russian": case "Russian":
tinyDb.putString("locale", "ru"); tinyDB.putString("locale", "ru");
break; break;
case "Serbian": case "Serbian":
tinyDb.putString("locale", "sr"); tinyDB.putString("locale", "sr");
break; break;
case "Spanish": case "Spanish":
tinyDb.putString("locale", "es"); tinyDB.putString("locale", "es");
break; break;
case "Turkish": case "Turkish":
tinyDb.putString("locale", "tr"); tinyDB.putString("locale", "tr");
break; break;
case "Ukrainian": case "Ukrainian":
tinyDb.putString("locale", "uk"); tinyDB.putString("locale", "uk");
break; break;
default: default:
tinyDb.putString("locale", "en"); tinyDB.putString("locale", "en");
break; break;
} }
tinyDb.putBoolean("refreshParent", true); tinyDB.putBoolean("refreshParent", true);
this.recreate(); this.recreate();
this.overridePendingTransition(0, 0); this.overridePendingTransition(0, 0);
dialogInterface.dismiss(); dialogInterface.dismiss();

View File

@ -0,0 +1,176 @@
package org.mian.gitnex.adapters;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.recyclerview.widget.RecyclerView;
import com.google.gson.JsonElement;
import org.apache.commons.lang3.StringUtils;
import org.gitnex.tea4j.models.CronTasks;
import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty;
import java.util.List;
import java.util.Locale;
import retrofit2.Call;
import retrofit2.Callback;
/**
* Author M M Arif
*/
public class AdminCronTasksAdapter extends RecyclerView.Adapter<AdminCronTasksAdapter.CronTasksViewHolder> {
private final List<CronTasks> tasksList;
private final Context mCtx;
private static TinyDB tinyDb;
static class CronTasksViewHolder extends RecyclerView.ViewHolder {
private CronTasks cronTasks;
private final ImageView runTask;
private final TextView taskName;
private final LinearLayout cronTasksInfo;
private final LinearLayout cronTasksRun;
private CronTasksViewHolder(View itemView) {
super(itemView);
Context ctx = itemView.getContext();
final String locale = tinyDb.getString("locale");
final String timeFormat = tinyDb.getString("dateFormat");
runTask = itemView.findViewById(R.id.runTask);
taskName = itemView.findViewById(R.id.taskName);
cronTasksInfo = itemView.findViewById(R.id.cronTasksInfo);
cronTasksRun = itemView.findViewById(R.id.cronTasksRun);
cronTasksInfo.setOnClickListener(taskInfo -> {
String nextRun = "";
String lastRun = "";
if(cronTasks.getNext() != null) {
nextRun = TimeHelper.formatTime(cronTasks.getNext(), new Locale(locale), timeFormat, ctx);
}
if(cronTasks.getPrev() != null) {
lastRun = TimeHelper.formatTime(cronTasks.getPrev(), new Locale(locale), timeFormat, ctx);
}
View view = LayoutInflater.from(ctx).inflate(R.layout.layout_cron_task_info, null);
TextView taskScheduleContent = view.findViewById(R.id.taskScheduleContent);
TextView nextRunContent = view.findViewById(R.id.nextRunContent);
TextView lastRunContent = view.findViewById(R.id.lastRunContent);
TextView execTimeContent = view.findViewById(R.id.execTimeContent);
taskScheduleContent.setText(cronTasks.getSchedule());
nextRunContent.setText(nextRun);
lastRunContent.setText(lastRun);
execTimeContent.setText(String.valueOf(cronTasks.getExec_times()));
AlertDialog.Builder alertDialog = new AlertDialog.Builder(ctx);
alertDialog.setTitle(StringUtils.capitalize(cronTasks.getName().replace("_", " ")));
alertDialog.setView(view);
alertDialog.setPositiveButton(ctx.getString(R.string.close), null);
alertDialog.create().show();
});
cronTasksRun.setOnClickListener(taskInfo -> {
runCronTask(ctx, cronTasks.getName());
});
}
}
public AdminCronTasksAdapter(Context mCtx, List<CronTasks> tasksListMain) {
tinyDb = TinyDB.getInstance(mCtx);
this.mCtx = mCtx;
this.tasksList = tasksListMain;
}
@NonNull
@Override
public AdminCronTasksAdapter.CronTasksViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_admin_cron_tasks, parent, false);
return new AdminCronTasksAdapter.CronTasksViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull AdminCronTasksAdapter.CronTasksViewHolder holder, int position) {
CronTasks currentItem = tasksList.get(position);
holder.cronTasks = currentItem;
holder.taskName.setText(StringUtils.capitalize(currentItem.getName().replace("_", " ")));
}
private static void runCronTask(final Context ctx, final String taskName) {
final String loginUid = tinyDb.getString("loginUid");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
Call<JsonElement> call = RetrofitClient
.getApiInterface(ctx)
.adminRunCronTask(instanceToken, taskName);
call.enqueue(new Callback<JsonElement>() {
@Override
public void onResponse(@NonNull Call<JsonElement> call, @NonNull retrofit2.Response<JsonElement> response) {
switch(response.code()) {
case 204:
Toasty.success(ctx, ctx.getString(R.string.adminCronTaskSuccessMsg, taskName));
break;
case 401:
AlertDialogs.authorizationTokenRevokedDialog(ctx, ctx.getString(R.string.alertDialogTokenRevokedTitle),
ctx.getResources().getString(R.string.alertDialogTokenRevokedMessage),
ctx.getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
ctx.getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
break;
case 403:
Toasty.error(ctx, ctx.getString(R.string.authorizeError));
break;
case 404:
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
break;
default:
Toasty.error(ctx, ctx.getString(R.string.genericError));
}
}
@Override
public void onFailure(@NonNull Call<JsonElement> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getString(R.string.genericServerResponseError));
}
});
}
@Override
public int getItemCount() {
return tasksList.size();
}
}

View File

@ -1,6 +1,7 @@
package org.mian.gitnex.adapters; package org.mian.gitnex.adapters;
import android.content.Context; import android.content.Context;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -9,12 +10,14 @@ import android.widget.Filterable;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.content.res.ResourcesCompat;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.TextDrawable;
import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.models.UserInfo;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -24,19 +27,22 @@ import java.util.List;
public class AdminGetUsersAdapter extends RecyclerView.Adapter<AdminGetUsersAdapter.UsersViewHolder> implements Filterable { public class AdminGetUsersAdapter extends RecyclerView.Adapter<AdminGetUsersAdapter.UsersViewHolder> implements Filterable {
private List<UserInfo> usersList; private final List<UserInfo> usersList;
private Context mCtx; private final Context mCtx;
private List<UserInfo> usersListFull; private final List<UserInfo> usersListFull;
static class UsersViewHolder extends RecyclerView.ViewHolder { static class UsersViewHolder extends RecyclerView.ViewHolder {
private ImageView userAvatar; private String userLoginId;
private TextView userFullName;
private TextView userEmail; private final ImageView userAvatar;
private ImageView userRole; private final TextView userFullName;
private TextView userName; private final TextView userEmail;
private final ImageView userRole;
private final TextView userName;
private UsersViewHolder(View itemView) { private UsersViewHolder(View itemView) {
super(itemView); super(itemView);
userAvatar = itemView.findViewById(R.id.userAvatar); userAvatar = itemView.findViewById(R.id.userAvatar);
@ -45,10 +51,17 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter<AdminGetUsersAdap
userEmail = itemView.findViewById(R.id.userEmail); userEmail = itemView.findViewById(R.id.userEmail);
userRole = itemView.findViewById(R.id.userRole); userRole = itemView.findViewById(R.id.userRole);
userAvatar.setOnClickListener(loginId -> {
Context context = loginId.getContext();
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
});
} }
} }
public AdminGetUsersAdapter(Context mCtx, List<UserInfo> usersListMain) { public AdminGetUsersAdapter(Context mCtx, List<UserInfo> usersListMain) {
this.mCtx = mCtx; this.mCtx = mCtx;
this.usersList = usersListMain; this.usersList = usersListMain;
usersListFull = new ArrayList<>(usersList); usersListFull = new ArrayList<>(usersList);
@ -57,6 +70,7 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter<AdminGetUsersAdap
@NonNull @NonNull
@Override @Override
public AdminGetUsersAdapter.UsersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public AdminGetUsersAdapter.UsersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_admin_users, parent, false); View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_admin_users, parent, false);
return new AdminGetUsersAdapter.UsersViewHolder(v); return new AdminGetUsersAdapter.UsersViewHolder(v);
} }
@ -66,35 +80,43 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter<AdminGetUsersAdap
UserInfo currentItem = usersList.get(position); UserInfo currentItem = usersList.get(position);
holder.userLoginId = currentItem.getLogin();
if(!currentItem.getFullname().equals("")) { if(!currentItem.getFullname().equals("")) {
holder.userFullName.setText(currentItem.getFullname());
holder.userFullName.setText(Html.fromHtml(currentItem.getFullname()));
holder.userName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername())); holder.userName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername()));
} }
else { else {
holder.userFullName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername())); holder.userFullName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername()));
holder.userName.setVisibility(View.GONE); holder.userName.setVisibility(View.GONE);
} }
if(!currentItem.getEmail().equals("")) { if(!currentItem.getEmail().equals("")) {
holder.userEmail.setText(currentItem.getEmail()); holder.userEmail.setText(currentItem.getEmail());
} }
else { else {
holder.userEmail.setVisibility(View.GONE); holder.userEmail.setVisibility(View.GONE);
} }
if(currentItem.getIs_admin()) { if(currentItem.getIs_admin()) {
holder.userRole.setVisibility(View.VISIBLE); holder.userRole.setVisibility(View.VISIBLE);
TextDrawable drawable = TextDrawable.builder() TextDrawable drawable = TextDrawable.builder()
.beginConfig() .beginConfig()
.textColor(mCtx.getResources().getColor(R.color.colorWhite)) .textColor(ResourcesCompat.getColor(mCtx.getResources(), R.color.colorWhite, null))
.fontSize(44) .fontSize(44)
.width(180) .width(180)
.height(60) .height(60)
.endConfig() .endConfig()
.buildRoundRect(mCtx.getResources().getString(R.string.userRoleAdmin).toLowerCase(), mCtx.getResources().getColor(R.color.releasePre), 8); .buildRoundRect(mCtx.getResources().getString(R.string.userRoleAdmin).toLowerCase(), ResourcesCompat.getColor(mCtx.getResources(), R.color.releasePre, null), 8);
holder.userRole.setImageDrawable(drawable); holder.userRole.setImageDrawable(drawable);
} }
else { else {
holder.userRole.setVisibility(View.GONE); holder.userRole.setVisibility(View.GONE);
} }
@ -111,14 +133,15 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter<AdminGetUsersAdap
return usersFilter; return usersFilter;
} }
private Filter usersFilter = new Filter() { private final Filter usersFilter = new Filter() {
@Override @Override
protected FilterResults performFiltering(CharSequence constraint) { protected FilterResults performFiltering(CharSequence constraint) {
List<UserInfo> filteredList = new ArrayList<>(); List<UserInfo> filteredList = new ArrayList<>();
if (constraint == null || constraint.length() == 0) { if (constraint == null || constraint.length() == 0) {
filteredList.addAll(usersListFull); filteredList.addAll(usersListFull);
} else { }
else {
String filterPattern = constraint.toString().toLowerCase().trim(); String filterPattern = constraint.toString().toLowerCase().trim();
for (UserInfo item : usersListFull) { for (UserInfo item : usersListFull) {
@ -136,6 +159,7 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter<AdminGetUsersAdap
@Override @Override
protected void publishResults(CharSequence constraint, FilterResults results) { protected void publishResults(CharSequence constraint, FilterResults results) {
usersList.clear(); usersList.clear();
usersList.addAll((List) results.values); usersList.addAll((List) results.values);
notifyDataSetChanged(); notifyDataSetChanged();

View File

@ -1,6 +1,7 @@
package org.mian.gitnex.adapters; package org.mian.gitnex.adapters;
import android.content.Context; import android.content.Context;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -9,10 +10,10 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.gitnex.tea4j.models.Collaborators;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.models.Collaborators;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
@ -23,12 +24,12 @@ import java.util.List;
public class AssigneesListAdapter extends RecyclerView.Adapter<AssigneesListAdapter.AssigneesViewHolder> { public class AssigneesListAdapter extends RecyclerView.Adapter<AssigneesListAdapter.AssigneesViewHolder> {
private Context mCtx; private final Context mCtx;
private List<Collaborators> assigneesList; private final List<Collaborators> assigneesList;
private List<String> assigneesStrings = new ArrayList<>(); private List<String> assigneesStrings = new ArrayList<>();
private List<String> currentAssignees; private List<String> currentAssignees;
private AssigneesListAdapterListener assigneesListener; private final AssigneesListAdapterListener assigneesListener;
public interface AssigneesListAdapterListener { public interface AssigneesListAdapterListener {
@ -45,9 +46,9 @@ public class AssigneesListAdapter extends RecyclerView.Adapter<AssigneesListAdap
static class AssigneesViewHolder extends RecyclerView.ViewHolder { static class AssigneesViewHolder extends RecyclerView.ViewHolder {
private CheckBox assigneesSelection; private final CheckBox assigneesSelection;
private TextView assigneesName; private final TextView assigneesName;
private ImageView assigneesAvatar; private final ImageView assigneesAvatar;
private AssigneesViewHolder(View itemView) { private AssigneesViewHolder(View itemView) {
@ -79,7 +80,7 @@ public class AssigneesListAdapter extends RecyclerView.Adapter<AssigneesListAdap
} }
else { else {
holder.assigneesName.setText(currentItem.getFull_name()); holder.assigneesName.setText(Html.fromHtml(currentItem.getFull_name()));
} }
PicassoService PicassoService
.getInstance(mCtx).get().load(currentItem.getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(180, 180).centerCrop().into(holder.assigneesAvatar); .getInstance(mCtx).get().load(currentItem.getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(180, 180).centerCrop().into(holder.assigneesAvatar);

View File

@ -2,15 +2,17 @@ package org.mian.gitnex.adapters;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.BaseAdapter; import android.widget.BaseAdapter;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import org.gitnex.tea4j.models.Collaborators;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.models.Collaborators; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import java.util.List; import java.util.List;
@ -20,21 +22,32 @@ import java.util.List;
public class CollaboratorsAdapter extends BaseAdapter { public class CollaboratorsAdapter extends BaseAdapter {
private List<Collaborators> collaboratorsList; private final List<Collaborators> collaboratorsList;
private Context mCtx; private final Context mCtx;
private class ViewHolder { private static class ViewHolder {
private ImageView collaboratorAvatar; private String userLoginId;
private TextView collaboratorName;
private final ImageView collaboratorAvatar;
private final TextView collaboratorName;
ViewHolder(View v) { ViewHolder(View v) {
collaboratorAvatar = v.findViewById(R.id.collaboratorAvatar); collaboratorAvatar = v.findViewById(R.id.collaboratorAvatar);
collaboratorName = v.findViewById(R.id.collaboratorName); collaboratorName = v.findViewById(R.id.collaboratorName);
collaboratorAvatar.setOnClickListener(loginId -> {
Context context = loginId.getContext();
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
});
} }
} }
public CollaboratorsAdapter(Context mCtx, List<Collaborators> collaboratorsListMain) { public CollaboratorsAdapter(Context mCtx, List<Collaborators> collaboratorsListMain) {
this.mCtx = mCtx; this.mCtx = mCtx;
this.collaboratorsList = collaboratorsListMain; this.collaboratorsList = collaboratorsListMain;
} }
@ -61,17 +74,18 @@ public class CollaboratorsAdapter extends BaseAdapter {
ViewHolder viewHolder = null; ViewHolder viewHolder = null;
if (finalView == null) { if (finalView == null) {
finalView = LayoutInflater.from(mCtx).inflate(R.layout.list_collaborators, null); finalView = LayoutInflater.from(mCtx).inflate(R.layout.list_collaborators, null);
viewHolder = new ViewHolder(finalView); viewHolder = new ViewHolder(finalView);
finalView.setTag(viewHolder); finalView.setTag(viewHolder);
} }
else { else {
viewHolder = (ViewHolder) finalView.getTag(); viewHolder = (ViewHolder) finalView.getTag();
} }
initData(viewHolder, position); initData(viewHolder, position);
return finalView; return finalView;
} }
private void initData(ViewHolder viewHolder, int position) { private void initData(ViewHolder viewHolder, int position) {
@ -79,10 +93,14 @@ public class CollaboratorsAdapter extends BaseAdapter {
Collaborators currentItem = collaboratorsList.get(position); Collaborators currentItem = collaboratorsList.get(position);
PicassoService.getInstance(mCtx).get().load(currentItem.getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(180, 180).centerCrop().into(viewHolder.collaboratorAvatar); PicassoService.getInstance(mCtx).get().load(currentItem.getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(180, 180).centerCrop().into(viewHolder.collaboratorAvatar);
viewHolder.userLoginId = currentItem.getLogin();
if(!currentItem.getFull_name().equals("")) { if(!currentItem.getFull_name().equals("")) {
viewHolder.collaboratorName.setText(currentItem.getFull_name());
viewHolder.collaboratorName.setText(Html.fromHtml(currentItem.getFull_name()));
} }
else { else {
viewHolder.collaboratorName.setText(currentItem.getLogin()); viewHolder.collaboratorName.setText(currentItem.getLogin());
} }

View File

@ -11,11 +11,12 @@ import android.widget.Button;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.vdurmont.emoji.EmojiParser;
import org.gitnex.tea4j.models.Commits;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.ClickListener;
import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.models.Commits;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
@ -25,7 +26,7 @@ import java.util.Locale;
public class CommitsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public class CommitsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context ctx; private final Context ctx;
private final int TYPE_LOAD = 0; private final int TYPE_LOAD = 0;
private List<Commits> commitsList; private List<Commits> commitsList;
private CommitsAdapter.OnLoadMoreListener loadMoreListener; private CommitsAdapter.OnLoadMoreListener loadMoreListener;
@ -112,11 +113,11 @@ public class CommitsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
void bindData(Commits commitsModel) { void bindData(Commits commitsModel) {
final TinyDB tinyDb = new TinyDB(ctx); final TinyDB tinyDb = TinyDB.getInstance(ctx);
final String locale = tinyDb.getString("locale"); final String locale = tinyDb.getString("locale");
final String timeFormat = tinyDb.getString("dateFormat"); final String timeFormat = tinyDb.getString("dateFormat");
commitTitle.setText(commitsModel.getCommit().getMessage()); commitTitle.setText(EmojiParser.parseToUnicode(commitsModel.getCommit().getMessage()));
commitCommitter.setText(ctx.getString(R.string.commitCommittedBy, commitsModel.getCommit().getCommitter().getName())); commitCommitter.setText(ctx.getString(R.string.commitCommittedBy, commitsModel.getCommit().getCommitter().getName()));
commitDate.setText(TimeHelper.formatTime(commitsModel.getCommit().getCommitter().getDate(), new Locale(locale), timeFormat, ctx)); commitDate.setText(TimeHelper.formatTime(commitsModel.getCommit().getCommitter().getDate(), new Locale(locale), timeFormat, ctx));

View File

@ -2,8 +2,8 @@ package org.mian.gitnex.adapters;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.text.Html;
import android.text.Spanned; import android.text.Spanned;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -11,12 +11,16 @@ import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.content.res.ResourcesCompat;
import androidx.core.text.HtmlCompat;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.IssueDetailActivity;
import org.mian.gitnex.database.api.DraftsApi; import org.mian.gitnex.database.api.DraftsApi;
import org.mian.gitnex.database.models.DraftWithRepository; import org.mian.gitnex.database.models.DraftWithRepository;
import org.mian.gitnex.fragments.BottomSheetReplyFragment; import org.mian.gitnex.fragments.BottomSheetReplyFragment;
import org.mian.gitnex.helpers.Markdown;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import java.util.List; import java.util.List;
@ -28,21 +32,16 @@ import java.util.List;
public class DraftsAdapter extends RecyclerView.Adapter<DraftsAdapter.DraftsViewHolder> { public class DraftsAdapter extends RecyclerView.Adapter<DraftsAdapter.DraftsViewHolder> {
private List<DraftWithRepository> draftsList; private List<DraftWithRepository> draftsList;
private FragmentManager fragmentManager; private final FragmentManager fragmentManager;
private Context mCtx; private final Context mCtx;
class DraftsViewHolder extends RecyclerView.ViewHolder { class DraftsViewHolder extends RecyclerView.ViewHolder {
private TextView draftText; private DraftWithRepository draftWithRepository;
private TextView repoInfo;
private TextView repoId; private final TextView draftText;
private TextView draftId; private final TextView repoInfo;
private TextView issueNumber; private final ImageView editCommentStatus;
private TextView issueType;
private TextView repoOwner;
private TextView repoName;
private TextView commentId;
private ImageView editCommentStatus;
private DraftsViewHolder(View itemView) { private DraftsViewHolder(View itemView) {
@ -50,19 +49,12 @@ public class DraftsAdapter extends RecyclerView.Adapter<DraftsAdapter.DraftsView
draftText = itemView.findViewById(R.id.draftText); draftText = itemView.findViewById(R.id.draftText);
repoInfo = itemView.findViewById(R.id.repoInfo); repoInfo = itemView.findViewById(R.id.repoInfo);
repoId = itemView.findViewById(R.id.repoId);
draftId = itemView.findViewById(R.id.draftId);
issueNumber = itemView.findViewById(R.id.issueNumber);
issueType = itemView.findViewById(R.id.issueType);
repoOwner = itemView.findViewById(R.id.repoOwner);
repoName = itemView.findViewById(R.id.repoName);
commentId = itemView.findViewById(R.id.commentId);
ImageView deleteDraft = itemView.findViewById(R.id.deleteDraft); ImageView deleteDraft = itemView.findViewById(R.id.deleteDraft);
editCommentStatus = itemView.findViewById(R.id.editCommentStatus); editCommentStatus = itemView.findViewById(R.id.editCommentStatus);
deleteDraft.setOnClickListener(itemDelete -> { deleteDraft.setOnClickListener(itemDelete -> {
int getDraftId = Integer.parseInt(draftId.getText().toString()); int getDraftId = draftWithRepository.getDraftId();
deleteDraft(getAdapterPosition()); deleteDraft(getAdapterPosition());
DraftsApi draftsApi = new DraftsApi(mCtx); DraftsApi draftsApi = new DraftsApi(mCtx);
draftsApi.deleteSingleDraft(getDraftId); draftsApi.deleteSingleDraft(getDraftId);
@ -73,23 +65,26 @@ public class DraftsAdapter extends RecyclerView.Adapter<DraftsAdapter.DraftsView
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putString("commentBody", draftText.getText().toString()); bundle.putString("commentBody", draftWithRepository.getDraftText());
bundle.putString("issueNumber", issueNumber.getText().toString()); bundle.putString("issueNumber", String.valueOf(draftWithRepository.getIssueId()));
bundle.putString("repositoryId", repoId.getText().toString()); bundle.putString("repositoryId", String.valueOf(draftWithRepository.getRepositoryId()));
bundle.putString("draftTitle", repoInfo.getText().toString()); bundle.putString("draftTitle", repoInfo.getText().toString());
bundle.putString("commentId", commentId.getText().toString()); bundle.putString("commentId", draftWithRepository.getCommentId());
bundle.putString("draftId", draftId.getText().toString()); bundle.putString("draftId", String.valueOf(draftWithRepository.getDraftId()));
if(!commentId.getText().toString().isEmpty()) { if(!draftWithRepository.getCommentId().isEmpty()) {
bundle.putString("commentAction", "edit"); bundle.putString("commentAction", "edit");
} }
TinyDB tinyDb = new TinyDB(mCtx); TinyDB tinyDb = TinyDB.getInstance(mCtx);
tinyDb.putString("issueNumber", issueNumber.getText().toString()); tinyDb.putString("issueNumber", String.valueOf(draftWithRepository.getIssueId()));
tinyDb.putLong("repositoryId", Long.parseLong(repoId.getText().toString())); tinyDb.putLong("repositoryId", draftWithRepository.getRepositoryId());
//tinyDb.putString("issueType", issueType.getText().toString()); tinyDb.putString("issueType", draftWithRepository.getIssueType());
tinyDb.putString("repoFullName", draftWithRepository.getRepositoryOwner() + "/" + draftWithRepository.getRepositoryName());
BottomSheetReplyFragment.newInstance(bundle).show(fragmentManager, "replyBottomSheet"); BottomSheetReplyFragment bottomSheetReplyFragment = BottomSheetReplyFragment.newInstance(bundle);
bottomSheetReplyFragment.setOnInteractedListener(() -> mCtx.startActivity(new Intent(mCtx, IssueDetailActivity.class)));
bottomSheetReplyFragment.show(fragmentManager, "replyBottomSheet");
}); });
@ -125,18 +120,14 @@ public class DraftsAdapter extends RecyclerView.Adapter<DraftsAdapter.DraftsView
DraftWithRepository currentItem = draftsList.get(position); DraftWithRepository currentItem = draftsList.get(position);
holder.repoId.setText(String.valueOf(currentItem.getRepositoryId())); String issueNumber = "<font color='" + ResourcesCompat.getColor(mCtx.getResources(), R.color.lightGray, null) + "'>" + mCtx.getResources().getString(R.string.hash) + currentItem.getIssueId() + "</font>";
holder.draftId.setText(String.valueOf(currentItem.getDraftId())); Spanned headTitle = HtmlCompat
holder.issueNumber.setText(String.valueOf(currentItem.getIssueId())); .fromHtml(issueNumber + " " + currentItem.getRepositoryOwner() + " / " + currentItem.getRepositoryName(), HtmlCompat.FROM_HTML_MODE_LEGACY);
holder.issueType.setText(currentItem.getDraftType());
holder.repoOwner.setText(currentItem.getRepositoryOwner());
holder.repoName.setText(currentItem.getRepositoryName());
holder.draftText.setText(currentItem.getDraftText());
holder.commentId.setText(currentItem.getCommentId());
String issueNumber = "<font color='" + mCtx.getResources().getColor(R.color.lightGray) + "'>" + mCtx.getResources().getString(R.string.hash) + currentItem.getIssueId() + "</font>";
Spanned headTitle = Html.fromHtml(issueNumber + " " + currentItem.getRepositoryOwner() + " / " + currentItem.getRepositoryName());
holder.repoInfo.setText(headTitle); holder.repoInfo.setText(headTitle);
holder.draftWithRepository = currentItem;
new Markdown(mCtx, currentItem.getDraftText(), holder.draftText);
if(!currentItem.getCommentId().equalsIgnoreCase("new")) { if(!currentItem.getCommentId().equalsIgnoreCase("new")) {
holder.editCommentStatus.setVisibility(View.VISIBLE); holder.editCommentStatus.setVisibility(View.VISIBLE);
@ -144,7 +135,6 @@ public class DraftsAdapter extends RecyclerView.Adapter<DraftsAdapter.DraftsView
else { else {
holder.editCommentStatus.setVisibility(View.GONE); holder.editCommentStatus.setVisibility(View.GONE);
} }
} }
@Override @Override
@ -157,6 +147,4 @@ public class DraftsAdapter extends RecyclerView.Adapter<DraftsAdapter.DraftsView
draftsList = list; draftsList = list;
notifyDataSetChanged(); notifyDataSetChanged();
} }
} }

View File

@ -18,6 +18,8 @@ import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator; import com.amulyakhare.textdrawable.util.ColorGenerator;
import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.android.material.bottomsheet.BottomSheetDialog;
import org.gitnex.tea4j.models.UserRepositories;
import org.gitnex.tea4j.models.WatchInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.OpenRepoInBrowserActivity; import org.mian.gitnex.activities.OpenRepoInBrowserActivity;
import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.activities.RepoDetailActivity;
@ -31,8 +33,6 @@ import org.mian.gitnex.database.models.Repository;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.UserRepositories;
import org.mian.gitnex.models.WatchInfo;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import retrofit2.Call; import retrofit2.Call;
@ -96,7 +96,7 @@ public class ExploreRepositoriesAdapter extends RecyclerView.Adapter<ExploreRepo
Intent intent = new Intent(context, RepoDetailActivity.class); Intent intent = new Intent(context, RepoDetailActivity.class);
intent.putExtra("repoFullName", repoFullName.getText().toString()); intent.putExtra("repoFullName", repoFullName.getText().toString());
TinyDB tinyDb = new TinyDB(context); TinyDB tinyDb = TinyDB.getInstance(context);
tinyDb.putString("repoFullName", repoFullName.getText().toString()); tinyDb.putString("repoFullName", repoFullName.getText().toString());
tinyDb.putBoolean("resumeIssues", true); tinyDb.putBoolean("resumeIssues", true);
tinyDb.putBoolean("isRepoAdmin", isRepoAdmin.isChecked()); tinyDb.putBoolean("isRepoAdmin", isRepoAdmin.isChecked());
@ -128,14 +128,13 @@ public class ExploreRepositoriesAdapter extends RecyclerView.Adapter<ExploreRepo
//store if user is watching this repo //store if user is watching this repo
{ {
final String instanceUrl = tinyDb.getString("instanceUrl");
final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token"); final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token");
WatchInfo watch = new WatchInfo(); WatchInfo watch = new WatchInfo();
Call<WatchInfo> call; Call<WatchInfo> call;
call = RetrofitClient.getInstance(instanceUrl, context).getApiInterface().checkRepoWatchStatus(token, repoOwner, repoName); call = RetrofitClient.getApiInterface(context).checkRepoWatchStatus(token, repoOwner, repoName);
call.enqueue(new Callback<WatchInfo>() { call.enqueue(new Callback<WatchInfo>() {

View File

@ -7,13 +7,14 @@ import android.view.ViewGroup;
import android.widget.Filter; import android.widget.Filter;
import android.widget.Filterable; import android.widget.Filterable;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.gitnex.tea4j.models.Files;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.Files;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -23,55 +24,40 @@ import java.util.List;
public class FilesAdapter extends RecyclerView.Adapter<FilesAdapter.FilesViewHolder> implements Filterable { public class FilesAdapter extends RecyclerView.Adapter<FilesAdapter.FilesViewHolder> implements Filterable {
private List<Files> filesList; private final List<Files> originalFiles = new ArrayList<>();
private Context mCtx; private final List<Files> alteredFiles = new ArrayList<>();
private List<Files> filesListFull;
private FilesAdapterListener filesListener; private final Context mCtx;
private final FilesAdapterListener filesListener;
public interface FilesAdapterListener { public interface FilesAdapterListener {
void onClickDir(String str);
void onClickFile(String str); void onClickFile(Files file);
} }
class FilesViewHolder extends RecyclerView.ViewHolder { class FilesViewHolder extends RecyclerView.ViewHolder {
private ImageView fileTypeImage; private Files file;
private ImageView dirTypeImage;
private ImageView unknownTypeImage; private final LinearLayout fileFrame;
private TextView fileName; private final ImageView fileTypeIs;
private TextView fileType; private final TextView fileName;
private TextView fileInfo; private final TextView fileInfo;
private FilesViewHolder(View itemView) { private FilesViewHolder(View itemView) {
super(itemView); super(itemView);
fileFrame = itemView.findViewById(R.id.fileFrame);
fileName = itemView.findViewById(R.id.fileName); fileName = itemView.findViewById(R.id.fileName);
fileTypeImage = itemView.findViewById(R.id.fileImage); fileTypeIs = itemView.findViewById(R.id.fileTypeIs);
dirTypeImage = itemView.findViewById(R.id.dirImage);
unknownTypeImage = itemView.findViewById(R.id.unknownImage);
fileType = itemView.findViewById(R.id.fileType);
fileInfo = itemView.findViewById(R.id.fileInfo); fileInfo = itemView.findViewById(R.id.fileInfo);
fileFrame.setOnClickListener(v -> filesListener.onClickFile(file));
//ImageView filesDropdownMenu = itemView.findViewById(R.id.filesDropdownMenu); //ImageView filesDropdownMenu = itemView.findViewById(R.id.filesDropdownMenu);
fileName.setOnClickListener(v -> {
Context context = v.getContext();
if(fileType.getText().toString().equals("file")) {
filesListener.onClickFile(fileName.getText().toString());
}
else if(fileType.getText().toString().equals("dir")) {
filesListener.onClickDir(fileName.getText().toString());
}
else {
Toasty.warning(context, context.getString(R.string.filesGenericError));
}
});
/*filesDropdownMenu.setOnClickListener(new View.OnClickListener() { /*filesDropdownMenu.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
@ -138,11 +124,24 @@ public class FilesAdapter extends RecyclerView.Adapter<FilesAdapter.FilesViewHol
} }
} }
public FilesAdapter(Context mCtx, List<Files> filesListMain, FilesAdapterListener filesListener) { public FilesAdapter(Context mCtx, FilesAdapterListener filesListener) {
this.mCtx = mCtx; this.mCtx = mCtx;
this.filesList = filesListMain;
filesListFull = new ArrayList<>(filesList);
this.filesListener = filesListener; this.filesListener = filesListener;
}
public List<Files> getOriginalFiles() {
return originalFiles;
}
public void notifyOriginalDataSetChanged() {
alteredFiles.clear();
alteredFiles.addAll(originalFiles);
notifyDataSetChanged();
} }
@NonNull @NonNull
@ -155,35 +154,43 @@ public class FilesAdapter extends RecyclerView.Adapter<FilesAdapter.FilesViewHol
@Override @Override
public void onBindViewHolder(@NonNull FilesAdapter.FilesViewHolder holder, int position) { public void onBindViewHolder(@NonNull FilesAdapter.FilesViewHolder holder, int position) {
Files currentItem = filesList.get(position); Files currentItem = alteredFiles.get(position);
holder.fileType.setText(currentItem.getType()); holder.file = currentItem;
holder.fileName.setText(currentItem.getName()); holder.fileName.setText(currentItem.getName());
if(currentItem.getType().equals("file")) { switch(currentItem.getType()) {
holder.fileTypeImage.setVisibility(View.VISIBLE);
holder.dirTypeImage.setVisibility(View.GONE); case "file":
holder.unknownTypeImage.setVisibility(View.GONE); holder.fileTypeIs.setImageDrawable(AppCompatResources.getDrawable(mCtx, R.drawable.ic_file));
holder.fileInfo.setVisibility(View.VISIBLE); holder.fileInfo.setVisibility(View.VISIBLE);
holder.fileInfo.setText(FileUtils.byteCountToDisplaySize(currentItem.getSize())); holder.fileInfo.setText(FileUtils.byteCountToDisplaySize(currentItem.getSize()));
} break;
else if(currentItem.getType().equals("dir")) {
holder.dirTypeImage.setVisibility(View.VISIBLE);
holder.unknownTypeImage.setVisibility(View.GONE);
holder.fileTypeImage.setVisibility(View.GONE);
holder.fileInfo.setVisibility(View.GONE);
}
else {
holder.unknownTypeImage.setVisibility(View.VISIBLE);
holder.dirTypeImage.setVisibility(View.GONE);
holder.fileTypeImage.setVisibility(View.GONE);
}
case "dir":
holder.fileTypeIs.setImageDrawable(AppCompatResources.getDrawable(mCtx, R.drawable.ic_directory));
holder.fileInfo.setVisibility(View.GONE);
break;
case "submodule":
holder.fileTypeIs.setImageDrawable(AppCompatResources.getDrawable(mCtx, R.drawable.ic_submodule));
holder.fileInfo.setVisibility(View.GONE);
break;
case "symlink":
holder.fileTypeIs.setImageDrawable(AppCompatResources.getDrawable(mCtx, R.drawable.ic_symlink));
holder.fileInfo.setVisibility(View.GONE);
break;
default:
holder.fileTypeIs.setImageDrawable(AppCompatResources.getDrawable(mCtx, R.drawable.ic_question));
}
} }
@Override @Override
public int getItemCount() { public int getItemCount() {
return filesList.size(); return alteredFiles.size();
} }
@Override @Override
@ -191,17 +198,19 @@ public class FilesAdapter extends RecyclerView.Adapter<FilesAdapter.FilesViewHol
return filesFilter; return filesFilter;
} }
private Filter filesFilter = new Filter() { private final Filter filesFilter = new Filter() {
@Override @Override
protected FilterResults performFiltering(CharSequence constraint) { protected FilterResults performFiltering(CharSequence constraint) {
List<Files> filteredList = new ArrayList<>(); List<Files> filteredList = new ArrayList<>();
if (constraint == null || constraint.length() == 0) { if (constraint == null || constraint.length() == 0) {
filteredList.addAll(filesListFull); filteredList.addAll(originalFiles);
} else { } else {
String filterPattern = constraint.toString().toLowerCase().trim(); String filterPattern = constraint.toString().toLowerCase().trim();
for (Files item : filesListFull) { for (Files item : originalFiles) {
if (item.getName().toLowerCase().contains(filterPattern) || item.getPath().toLowerCase().contains(filterPattern)) { if (item.getName().toLowerCase().contains(filterPattern) || item.getPath().toLowerCase().contains(filterPattern)) {
filteredList.add(item); filteredList.add(item);
} }
@ -212,14 +221,19 @@ public class FilesAdapter extends RecyclerView.Adapter<FilesAdapter.FilesViewHol
results.values = filteredList; results.values = filteredList;
return results; return results;
} }
@Override @Override
protected void publishResults(CharSequence constraint, FilterResults results) { protected void publishResults(CharSequence constraint, FilterResults results) {
filesList.clear();
filesList.addAll((List) results.values); alteredFiles.clear();
alteredFiles.addAll((List) results.values);
notifyDataSetChanged(); notifyDataSetChanged();
} }
}; };
} }

View File

@ -13,10 +13,11 @@ import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import org.gitnex.tea4j.models.FileDiffView;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.fragments.BottomSheetReplyFragment; import org.mian.gitnex.fragments.BottomSheetReplyFragment;
import org.mian.gitnex.helpers.DiffTextView; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.models.FileDiffView; import org.mian.gitnex.views.DiffTextView;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentSkipListMap; import java.util.concurrent.ConcurrentSkipListMap;
@ -36,9 +37,9 @@ public class FilesDiffAdapter extends BaseAdapter {
private static int COLOR_SELECTED; private static int COLOR_SELECTED;
private static int COLOR_FONT; private static int COLOR_FONT;
private Context context; private final Context context;
private FragmentManager fragmentManager; private final FragmentManager fragmentManager;
private List<FileDiffView> fileDiffViews; private final List<FileDiffView> fileDiffViews;
public FilesDiffAdapter(Context context, FragmentManager fragmentManager, List<FileDiffView> fileDiffViews) { public FilesDiffAdapter(Context context, FragmentManager fragmentManager, List<FileDiffView> fileDiffViews) {
@ -48,11 +49,11 @@ public class FilesDiffAdapter extends BaseAdapter {
selectedViews = new ConcurrentSkipListMap<>(); selectedViews = new ConcurrentSkipListMap<>();
COLOR_ADDED = getColorFromAttribute(R.attr.diffAddedColor); COLOR_ADDED = AppUtil.getColorFromAttribute(context, R.attr.diffAddedColor);
COLOR_REMOVED = getColorFromAttribute(R.attr.diffRemovedColor); COLOR_REMOVED = AppUtil.getColorFromAttribute(context, R.attr.diffRemovedColor);
COLOR_NORMAL = getColorFromAttribute(R.attr.primaryBackgroundColor); COLOR_NORMAL = AppUtil.getColorFromAttribute(context, R.attr.primaryBackgroundColor);
COLOR_SELECTED = getColorFromAttribute(R.attr.diffSelectedColor); COLOR_SELECTED = AppUtil.getColorFromAttribute(context, R.attr.diffSelectedColor);
COLOR_FONT = getColorFromAttribute(R.attr.inputTextColor); COLOR_FONT = AppUtil.getColorFromAttribute(context, R.attr.inputTextColor);
} }
@ -185,7 +186,6 @@ public class FilesDiffAdapter extends BaseAdapter {
}); });
diffTextView.setOnLongClickListener(v -> { diffTextView.setOnLongClickListener(v -> {
if(((DiffTextView) v).getCurrentBackgroundColor() == COLOR_SELECTED) { if(((DiffTextView) v).getCurrentBackgroundColor() == COLOR_SELECTED) {
@ -257,13 +257,4 @@ public class FilesDiffAdapter extends BaseAdapter {
} }
private int getColorFromAttribute(int resid) {
TypedValue typedValue = new TypedValue();
context.getTheme().resolveAttribute(resid, typedValue, true);
return typedValue.data;
}
} }

View File

@ -5,54 +5,36 @@ import android.content.ClipData;
import android.content.ClipboardManager; import android.content.ClipboardManager;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.text.Spanned;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.vdurmont.emoji.EmojiParser; import com.vdurmont.emoji.EmojiParser;
import org.gitnex.tea4j.models.IssueComments;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.fragments.BottomSheetReplyFragment; import org.mian.gitnex.fragments.BottomSheetReplyFragment;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.Markdown;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.UserMentions; import org.mian.gitnex.views.ReactionList;
import org.mian.gitnex.models.IssueComments; import org.mian.gitnex.views.ReactionSpinner;
import java.util.Collection;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects; import java.util.Objects;
import io.noties.markwon.AbstractMarkwonPlugin;
import io.noties.markwon.Markwon;
import io.noties.markwon.core.CorePlugin;
import io.noties.markwon.core.MarkwonTheme;
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
import io.noties.markwon.ext.tables.TablePlugin;
import io.noties.markwon.ext.tasklist.TaskListPlugin;
import io.noties.markwon.html.HtmlPlugin;
import io.noties.markwon.image.DefaultMediaDecoder;
import io.noties.markwon.image.ImageItem;
import io.noties.markwon.image.ImagesPlugin;
import io.noties.markwon.image.SchemeHandler;
import io.noties.markwon.image.gif.GifMediaDecoder;
import io.noties.markwon.image.svg.SvgMediaDecoder;
import io.noties.markwon.linkify.LinkifyPlugin;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
@ -62,94 +44,116 @@ import retrofit2.Callback;
public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdapter.IssueCommentViewHolder> { public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdapter.IssueCommentViewHolder> {
private List<IssueComments> issuesComments; private final Context ctx;
private FragmentManager fragmentManager; private final TinyDB tinyDB;
private Context mCtx; private final Bundle bundle;
private final List<IssueComments> issuesComments;
private final FragmentManager fragmentManager;
private final BottomSheetReplyFragment.OnInteractedListener onInteractedListener;
public IssueCommentsAdapter(Context mCtx, FragmentManager fragmentManager, List<IssueComments> issuesCommentsMain) { public IssueCommentsAdapter(Context ctx, Bundle bundle, List<IssueComments> issuesCommentsMain, FragmentManager fragmentManager, BottomSheetReplyFragment.OnInteractedListener onInteractedListener) {
this.mCtx = mCtx; this.ctx = ctx;
this.fragmentManager = fragmentManager; this.bundle = bundle;
this.issuesComments = issuesCommentsMain; this.issuesComments = issuesCommentsMain;
this.fragmentManager = fragmentManager;
this.onInteractedListener = onInteractedListener;
tinyDB = TinyDB.getInstance(ctx);
} }
class IssueCommentViewHolder extends RecyclerView.ViewHolder { class IssueCommentViewHolder extends RecyclerView.ViewHolder {
private TextView issueNumber; private String userLoginId;
private TextView commendId; private IssueComments issueComment;
private ImageView issueCommenterAvatar;
private TextView issueComment;
private TextView issueCommentDate;
private TextView commendBodyRaw;
private TextView commentModified;
private TextView commenterUsername;
private TextView htmlUrl;
private IssueCommentViewHolder(View itemView) { private final ImageView avatar;
private final TextView author;
private final TextView information;
private final TextView comment;
private final LinearLayout commentReactionBadges;
super(itemView); private IssueCommentViewHolder(View view) {
issueNumber = itemView.findViewById(R.id.issueNumber); super(view);
commendId = itemView.findViewById(R.id.commendId);
issueCommenterAvatar = itemView.findViewById(R.id.issueCommenterAvatar);
issueComment = itemView.findViewById(R.id.issueComment);
issueCommentDate = itemView.findViewById(R.id.issueCommentDate);
ImageView commentsOptionsMenu = itemView.findViewById(R.id.commentsOptionsMenu);
commendBodyRaw = itemView.findViewById(R.id.commendBodyRaw);
commentModified = itemView.findViewById(R.id.commentModified);
commenterUsername = itemView.findViewById(R.id.commenterUsername);
htmlUrl = itemView.findViewById(R.id.htmlUrl);
commentsOptionsMenu.setOnClickListener(v -> { avatar = view.findViewById(R.id.avatar);
author = view.findViewById(R.id.author);
information = view.findViewById(R.id.information);
ImageView menu = view.findViewById(R.id.menu);
comment = view.findViewById(R.id.comment);
commentReactionBadges = view.findViewById(R.id.commentReactionBadges);
menu.setOnClickListener(v -> {
final Context ctx = v.getContext(); final Context ctx = v.getContext();
final TinyDB tinyDb = new TinyDB(ctx); final String loginUid = tinyDB.getString("loginUid");
final String loginUid = tinyDb.getString("loginUid");
@SuppressLint("InflateParams") View view = LayoutInflater.from(ctx).inflate(R.layout.bottom_sheet_issue_comments, null); @SuppressLint("InflateParams") View vw = LayoutInflater.from(ctx).inflate(R.layout.bottom_sheet_issue_comments, null);
TextView commentMenuEdit = view.findViewById(R.id.commentMenuEdit); TextView commentMenuEdit = vw.findViewById(R.id.commentMenuEdit);
TextView commentShare = view.findViewById(R.id.issueCommentShare); TextView commentShare = vw.findViewById(R.id.issueCommentShare);
TextView commentMenuQuote = view.findViewById(R.id.commentMenuQuote); TextView commentMenuQuote = vw.findViewById(R.id.commentMenuQuote);
TextView commentMenuCopy = view.findViewById(R.id.commentMenuCopy); TextView commentMenuCopy = vw.findViewById(R.id.commentMenuCopy);
TextView commentMenuDelete = view.findViewById(R.id.commentMenuDelete); TextView commentMenuDelete = vw.findViewById(R.id.commentMenuDelete);
TextView issueCommentCopyUrl = view.findViewById(R.id.issueCommentCopyUrl); TextView issueCommentCopyUrl = vw.findViewById(R.id.issueCommentCopyUrl);
if(!loginUid.contentEquals(commenterUsername.getText())) { if(!loginUid.contentEquals(issueComment.getUser().getUsername())) {
commentMenuEdit.setVisibility(View.GONE); commentMenuEdit.setVisibility(View.GONE);
commentMenuDelete.setVisibility(View.GONE); commentMenuDelete.setVisibility(View.GONE);
} }
if(issueComment.getText().toString().isEmpty()) { if(issueComment.getBody().isEmpty()) {
commentMenuCopy.setVisibility(View.GONE); commentMenuCopy.setVisibility(View.GONE);
} }
BottomSheetDialog dialog = new BottomSheetDialog(ctx); BottomSheetDialog dialog = new BottomSheetDialog(ctx);
dialog.setContentView(view); dialog.setContentView(vw);
dialog.show(); dialog.show();
commentMenuEdit.setOnClickListener(ediComment -> { LinearLayout linearLayout = vw.findViewById(R.id.commentReactionButtons);
Bundle bundle = new Bundle(); Bundle bundle1 = new Bundle();
bundle.putString("commentId", commendId.getText().toString()); bundle1.putAll(bundle);
bundle.putString("commentAction", "edit"); bundle1.putInt("commentId", issueComment.getId());
bundle.putString("commentBody", commendBodyRaw.getText().toString());
BottomSheetReplyFragment.newInstance(bundle).show(fragmentManager, "replyBottomSheet"); ReactionSpinner reactionSpinner = new ReactionSpinner(ctx, bundle1);
reactionSpinner.setOnInteractedListener(() -> {
tinyDB.putBoolean("commentEdited", true);
onInteractedListener.onInteracted();
dialog.dismiss(); dialog.dismiss();
}); });
commentShare.setOnClickListener(ediComment -> { linearLayout.addView(reactionSpinner);
commentMenuEdit.setOnClickListener(v1 -> {
Bundle bundle = new Bundle();
bundle.putInt("commentId", issueComment.getId());
bundle.putString("commentAction", "edit");
bundle.putString("commentBody", issueComment.getBody());
BottomSheetReplyFragment bottomSheetReplyFragment = BottomSheetReplyFragment.newInstance(bundle);
bottomSheetReplyFragment.setOnInteractedListener(onInteractedListener);
bottomSheetReplyFragment.show(fragmentManager, "replyBottomSheet");
dialog.dismiss();
});
commentShare.setOnClickListener(v1 -> {
// get comment Url // get comment Url
CharSequence commentUrl = htmlUrl.getText(); CharSequence commentUrl = issueComment.getHtml_url();
// share issue comment // share issue comment
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
sharingIntent.setType("text/plain"); sharingIntent.setType("text/plain");
String intentHeader = tinyDb.getString("issueNumber") + ctx.getResources().getString(R.string.hash) + "issuecomment-" + commendId.getText() + " " + tinyDb.getString("issueTitle"); String intentHeader = tinyDB.getString("issueNumber") + ctx.getResources().getString(R.string.hash) + "issuecomment-" + issueComment.getId() + " " + tinyDB.getString("issueTitle");
sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, intentHeader); sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, intentHeader);
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, commentUrl); sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, commentUrl);
ctx.startActivity(Intent.createChooser(sharingIntent, intentHeader)); ctx.startActivity(Intent.createChooser(sharingIntent, intentHeader));
@ -158,10 +162,10 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
}); });
issueCommentCopyUrl.setOnClickListener(ediComment -> { issueCommentCopyUrl.setOnClickListener(v1 -> {
// comment Url // comment Url
CharSequence commentUrl = htmlUrl.getText(); CharSequence commentUrl = issueComment.getHtml_url();
ClipboardManager clipboard = (ClipboardManager) Objects.requireNonNull(ctx).getSystemService(Context.CLIPBOARD_SERVICE); ClipboardManager clipboard = (ClipboardManager) Objects.requireNonNull(ctx).getSystemService(Context.CLIPBOARD_SERVICE);
assert clipboard != null; assert clipboard != null;
@ -177,14 +181,14 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
commentMenuQuote.setOnClickListener(v1 -> { commentMenuQuote.setOnClickListener(v1 -> {
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
String commenterName = commenterUsername.getText().toString(); String commenterName = issueComment.getUser().getUsername();
if(!commenterName.equals(tinyDb.getString("userLogin"))) { if(!commenterName.equals(tinyDB.getString("userLogin"))) {
stringBuilder.append("@").append(commenterName).append("\n\n"); stringBuilder.append("@").append(commenterName).append("\n\n");
} }
String[] lines = commendBodyRaw.getText().toString().split("\\R"); String[] lines = issueComment.getBody().split("\\R");
for(String line : lines) { for(String line : lines) {
@ -202,12 +206,12 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
}); });
commentMenuCopy.setOnClickListener(view1 -> { commentMenuCopy.setOnClickListener(v1 -> {
ClipboardManager clipboard = (ClipboardManager) Objects.requireNonNull(ctx).getSystemService(Context.CLIPBOARD_SERVICE); ClipboardManager clipboard = (ClipboardManager) Objects.requireNonNull(ctx).getSystemService(Context.CLIPBOARD_SERVICE);
assert clipboard != null; assert clipboard != null;
ClipData clip = ClipData.newPlainText("Comment on issue #" + issueNumber.getText().toString(), issueComment.getText().toString()); ClipData clip = ClipData.newPlainText("Comment on issue #" + tinyDB.getString("issueNumber"), issueComment.getBody());
clipboard.setPrimaryClip(clip); clipboard.setPrimaryClip(clip);
dialog.dismiss(); dialog.dismiss();
@ -215,15 +219,22 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
}); });
commentMenuDelete.setOnClickListener(deleteComment -> { commentMenuDelete.setOnClickListener(v1 -> {
deleteIssueComment(ctx, Integer.parseInt(commendId.getText().toString()), getAdapterPosition()); deleteIssueComment(ctx, issueComment.getId(), getAdapterPosition());
dialog.dismiss(); dialog.dismiss();
}); });
}); });
avatar.setOnClickListener(loginId -> {
Context context = loginId.getContext();
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
});
} }
} }
@ -238,22 +249,19 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
private void deleteIssueComment(final Context ctx, final int commentId, int position) { private void deleteIssueComment(final Context ctx, final int commentId, int position) {
final TinyDB tinyDb = new TinyDB(ctx); final String loginUid = tinyDB.getString("loginUid");
final String instanceUrl = tinyDb.getString("instanceUrl"); final String instanceToken = "token " + tinyDB.getString(loginUid + "-token");
final String loginUid = tinyDb.getString("loginUid"); String[] repoFullName = tinyDB.getString("repoFullName").split("/");
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
String[] repoFullName = tinyDb.getString("repoFullName").split("/");
if (repoFullName.length != 2) { if (repoFullName.length != 2) {
return; return;
} }
final String repoOwner = repoFullName[0]; final String repoOwner = repoFullName[0];
final String repoName = repoFullName[1]; final String repoName = repoFullName[1];
Call<JsonElement> call; Call<JsonElement> call = RetrofitClient
.getApiInterface(ctx)
call = RetrofitClient
.getInstance(instanceUrl, ctx)
.getApiInterface()
.deleteComment(instanceToken, repoOwner, repoName, commentId); .deleteComment(instanceToken, repoOwner, repoName, commentId);
call.enqueue(new Callback<JsonElement>() { call.enqueue(new Callback<JsonElement>() {
@ -261,47 +269,40 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
@Override @Override
public void onResponse(@NonNull Call<JsonElement> call, @NonNull retrofit2.Response<JsonElement> response) { public void onResponse(@NonNull Call<JsonElement> call, @NonNull retrofit2.Response<JsonElement> response) {
if(response.code() == 204) { switch(response.code()) {
case 204:
updateAdapter(position); updateAdapter(position);
Toasty.success(ctx, ctx.getResources().getString(R.string.deleteCommentSuccess)); Toasty.success(ctx, ctx.getResources().getString(R.string.deleteCommentSuccess));
break;
} case 401:
else if(response.code() == 401) {
AlertDialogs.authorizationTokenRevokedDialog(ctx, ctx.getResources().getString(R.string.alertDialogTokenRevokedTitle), AlertDialogs.authorizationTokenRevokedDialog(ctx, ctx.getResources().getString(R.string.alertDialogTokenRevokedTitle),
ctx.getResources().getString(R.string.alertDialogTokenRevokedMessage), ctx.getResources().getString(R.string.alertDialogTokenRevokedMessage),
ctx.getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), ctx.getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
ctx.getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton)); ctx.getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
break;
} case 403:
else if(response.code() == 403) {
Toasty.error(ctx, ctx.getString(R.string.authorizeError)); Toasty.error(ctx, ctx.getString(R.string.authorizeError));
break;
} case 404:
else if(response.code() == 404) {
Toasty.warning(ctx, ctx.getString(R.string.apiNotFound)); Toasty.warning(ctx, ctx.getString(R.string.apiNotFound));
break;
} default:
else {
Toasty.error(ctx, ctx.getString(R.string.genericError)); Toasty.error(ctx, ctx.getString(R.string.genericError));
} }
} }
@Override @Override
public void onFailure(@NonNull Call<JsonElement> call, @NonNull Throwable t) { public void onFailure(@NonNull Call<JsonElement> call, @NonNull Throwable t) {
Toasty.error(ctx, ctx.getResources().getString(R.string.genericServerResponseError)); Toasty.error(ctx, ctx.getResources().getString(R.string.genericServerResponseError));
} }
}); });
} }
@NonNull @NonNull
@ -312,109 +313,72 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
return new IssueCommentsAdapter.IssueCommentViewHolder(v); return new IssueCommentsAdapter.IssueCommentViewHolder(v);
} }
@SuppressLint("SetTextI18n")
@Override @Override
public void onBindViewHolder(@NonNull IssueCommentsAdapter.IssueCommentViewHolder holder, int position) { public void onBindViewHolder(@NonNull IssueCommentsAdapter.IssueCommentViewHolder holder, int position) {
final TinyDB tinyDb = new TinyDB(mCtx); String timeFormat = tinyDB.getString("dateFormat");
final String locale = tinyDb.getString("locale"); IssueComments issueComment = issuesComments.get(position);
final String timeFormat = tinyDb.getString("dateFormat");
IssueComments currentItem = issuesComments.get(position); holder.userLoginId = issueComment.getUser().getLogin();
holder.htmlUrl.setText(currentItem.getHtml_url()); holder.issueComment = issueComment;
holder.commenterUsername.setText(currentItem.getUser().getUsername()); holder.author.setText(issueComment.getUser().getUsername());
holder.commendId.setText(String.valueOf(currentItem.getId()));
holder.commendBodyRaw.setText(currentItem.getBody());
if(!currentItem.getUser().getFull_name().equals("")) { PicassoService.getInstance(ctx).get()
holder.issueCommenterAvatar.setOnClickListener(new ClickListener(mCtx.getResources().getString(R.string.issueCommenter) + currentItem.getUser().getFull_name(), mCtx)); .load(issueComment.getUser().getAvatar_url())
} .placeholder(R.drawable.loader_animated)
else { .transform(new RoundedTransformation(4, 0))
holder.issueCommenterAvatar.setOnClickListener(new ClickListener(mCtx.getResources().getString(R.string.issueCommenter) + currentItem.getUser().getLogin(), mCtx)); .resize(AppUtil.getPixelsFromDensity(ctx, 35), AppUtil.getPixelsFromDensity(ctx, 35))
} .centerCrop()
.into(holder.avatar);
PicassoService.getInstance(mCtx).get().load(currentItem.getUser().getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(holder.issueCommenterAvatar); new Markdown(ctx, EmojiParser.parseToUnicode(issueComment.getBody()), holder.comment);
String cleanIssueComments = currentItem.getBody().trim(); StringBuilder informationBuilder = null;
if(issueComment.getCreated_at() != null) {
final Markwon markwon = Markwon.builder(Objects.requireNonNull(mCtx)).usePlugin(CorePlugin.create()).usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() {
@Override
public void configureImages(@NonNull ImagesPlugin plugin) {
plugin.addSchemeHandler(new SchemeHandler() {
@NonNull
@Override
public ImageItem handle(@NonNull String raw, @NonNull Uri uri) {
final int resourceId = mCtx.getResources().getIdentifier(raw.substring("drawable://".length()), "drawable", mCtx.getPackageName());
final Drawable drawable = ContextCompat.getDrawable(mCtx, resourceId);
assert drawable != null;
return ImageItem.withResult(drawable);
}
@NonNull
@Override
public Collection<String> supportedSchemes() {
return Collections.singleton("drawable");
}
});
plugin.placeholderProvider(drawable -> null);
plugin.addMediaDecoder(GifMediaDecoder.create(false));
plugin.addMediaDecoder(SvgMediaDecoder.create(mCtx.getResources()));
plugin.addMediaDecoder(SvgMediaDecoder.create());
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(mCtx.getResources()));
plugin.defaultMediaDecoder(DefaultMediaDecoder.create());
}
})).usePlugin(new AbstractMarkwonPlugin() {
@Override
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
builder.codeTextColor(tinyDb.getInt("codeBlockColor")).codeBackgroundColor(tinyDb.getInt("codeBlockBackground")).linkColor(mCtx.getResources().getColor(R.color.lightBlue));
}
}).usePlugin(TablePlugin.create(mCtx)).usePlugin(TaskListPlugin.create(mCtx)).usePlugin(HtmlPlugin.create()).usePlugin(StrikethroughPlugin.create()).usePlugin(LinkifyPlugin.create()).build();
Spanned bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(cleanIssueComments));
markwon.setParsedMarkdown(holder.issueComment, UserMentions.UserMentionsFunc(mCtx, bodyWithMD, cleanIssueComments));
String edited;
if(!currentItem.getUpdated_at().equals(currentItem.getCreated_at())) {
edited = mCtx.getResources().getString(R.string.colorfulBulletSpan) + mCtx.getResources().getString(R.string.modifiedText);
holder.commentModified.setVisibility(View.VISIBLE);
holder.commentModified.setText(edited);
holder.commentModified.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), mCtx));
}
else {
holder.commentModified.setVisibility(View.INVISIBLE);
}
holder.issueCommentDate.setText(TimeHelper.formatTime(currentItem.getCreated_at(), new Locale(locale), timeFormat, mCtx));
if(timeFormat.equals("pretty")) { if(timeFormat.equals("pretty")) {
holder.issueCommentDate.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getCreated_at()), mCtx));
informationBuilder = new StringBuilder(TimeHelper.formatTime(issueComment.getCreated_at(), Locale.getDefault(), "pretty", ctx));
holder.information.setOnClickListener(v -> TimeHelper.customDateFormatForToastDateFormat(issueComment.getCreated_at()));
} }
else if(timeFormat.equals("normal")) {
informationBuilder = new StringBuilder(TimeHelper.formatTime(issueComment.getCreated_at(), Locale.getDefault(), "normal", ctx));
}
if(!issueComment.getCreated_at().equals(issueComment.getUpdated_at())) {
if(informationBuilder != null) {
informationBuilder.append(ctx.getString(R.string.colorfulBulletSpan)).append(ctx.getString(R.string.modifiedText));
}
}
}
holder.information.setText(informationBuilder);
Bundle bundle1 = new Bundle();
bundle1.putAll(bundle);
bundle1.putInt("commentId", issueComment.getId());
ReactionList reactionList = new ReactionList(ctx, bundle1);
holder.commentReactionBadges.addView(reactionList);
reactionList.setOnReactionAddedListener(() -> {
if(holder.commentReactionBadges.getVisibility() != View.VISIBLE) {
holder.commentReactionBadges.post(() -> holder.commentReactionBadges.setVisibility(View.VISIBLE));
}
});
} }
@Override @Override
public int getItemCount() { public int getItemCount() {
return issuesComments.size(); return issuesComments.size();
} }
} }

View File

@ -3,7 +3,6 @@ package org.mian.gitnex.adapters;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -11,15 +10,19 @@ import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.content.res.ResourcesCompat;
import androidx.core.text.HtmlCompat;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.vdurmont.emoji.EmojiParser;
import org.gitnex.tea4j.models.Issues;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.IssueDetailActivity; import org.mian.gitnex.activities.IssueDetailActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.ClickListener;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.models.Issues;
import org.ocpsoft.prettytime.PrettyTime; import org.ocpsoft.prettytime.PrettyTime;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -32,7 +35,7 @@ import java.util.Locale;
public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context; private final Context context;
private final int TYPE_LOAD = 0; private final int TYPE_LOAD = 0;
private List<Issues> issuesList; private List<Issues> issuesList;
private OnLoadMoreListener loadMoreListener; private OnLoadMoreListener loadMoreListener;
@ -99,92 +102,99 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
class IssuesHolder extends RecyclerView.ViewHolder { class IssuesHolder extends RecyclerView.ViewHolder {
private TextView issueNumber; private Issues issue;
private ImageView issueAssigneeAvatar;
private TextView issueTitle; private final ImageView issueAssigneeAvatar;
private TextView issueCreatedTime; private final TextView issueTitle;
private TextView issueCommentsCount; private final TextView issueCreatedTime;
private final TextView issueCommentsCount;
IssuesHolder(View itemView) { IssuesHolder(View itemView) {
super(itemView); super(itemView);
issueNumber = itemView.findViewById(R.id.issueNumber);
issueAssigneeAvatar = itemView.findViewById(R.id.assigneeAvatar); issueAssigneeAvatar = itemView.findViewById(R.id.assigneeAvatar);
issueTitle = itemView.findViewById(R.id.issueTitle); issueTitle = itemView.findViewById(R.id.issueTitle);
issueCommentsCount = itemView.findViewById(R.id.issueCommentsCount); issueCommentsCount = itemView.findViewById(R.id.issueCommentsCount);
LinearLayout frameCommentsCount = itemView.findViewById(R.id.frameCommentsCount); LinearLayout frameCommentsCount = itemView.findViewById(R.id.frameCommentsCount);
issueCreatedTime = itemView.findViewById(R.id.issueCreatedTime); issueCreatedTime = itemView.findViewById(R.id.issueCreatedTime);
issueTitle.setOnClickListener(v -> { issueTitle.setOnClickListener(title -> {
Context context = v.getContext(); Context context = title.getContext();
Intent intent = new Intent(context, IssueDetailActivity.class); Intent intent = new Intent(context, IssueDetailActivity.class);
intent.putExtra("issueNumber", issueNumber.getText()); intent.putExtra("issueNumber", issue.getNumber());
TinyDB tinyDb = new TinyDB(context); TinyDB tinyDb = TinyDB.getInstance(context);
tinyDb.putString("issueNumber", issueNumber.getText().toString()); tinyDb.putString("issueNumber", String.valueOf(issue.getNumber()));
tinyDb.putString("issueType", "Issue"); tinyDb.putString("issueType", "Issue");
context.startActivity(intent); context.startActivity(intent);
}); });
frameCommentsCount.setOnClickListener(v -> {
Context context = v.getContext(); frameCommentsCount.setOnClickListener(commentsCount -> {
Context context = commentsCount.getContext();
Intent intent = new Intent(context, IssueDetailActivity.class); Intent intent = new Intent(context, IssueDetailActivity.class);
intent.putExtra("issueNumber", issueNumber.getText()); intent.putExtra("issueNumber", issue.getNumber());
TinyDB tinyDb = new TinyDB(context); TinyDB tinyDb = TinyDB.getInstance(context);
tinyDb.putString("issueNumber", issueNumber.getText().toString()); tinyDb.putString("issueNumber", String.valueOf(issue.getNumber()));
tinyDb.putString("issueType", "Issue"); tinyDb.putString("issueType", "Issue");
context.startActivity(intent); context.startActivity(intent);
}); });
issueAssigneeAvatar.setOnClickListener(v -> {
Context context = v.getContext();
String userLoginId = issue.getUser().getLogin();
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
});
} }
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
void bindData(Issues issuesModel) { void bindData(Issues issue) {
final TinyDB tinyDb = new TinyDB(context); TinyDB tinyDb = TinyDB.getInstance(context);
final String locale = tinyDb.getString("locale"); String locale = tinyDb.getString("locale");
final String timeFormat = tinyDb.getString("dateFormat"); String timeFormat = tinyDb.getString("dateFormat");
if(!issuesModel.getUser().getFull_name().equals("")) { PicassoService.getInstance(context).get()
issueAssigneeAvatar.setOnClickListener(new ClickListener(context.getResources().getString(R.string.issueCreator) + issuesModel.getUser().getFull_name(), context)); .load(issue.getUser().getAvatar_url())
} .placeholder(R.drawable.loader_animated)
else { .transform(new RoundedTransformation(8, 0))
issueAssigneeAvatar.setOnClickListener(new ClickListener(context.getResources().getString(R.string.issueCreator) + issuesModel.getUser().getLogin(), context)); .resize(120, 120)
} .centerCrop()
.into(issueAssigneeAvatar);
PicassoService.getInstance(context).get().load(issuesModel.getUser().getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(issueAssigneeAvatar); String issueNumber_ = "<font color='" + ResourcesCompat.getColor(context.getResources(), R.color.lightGray, null) + "'>" + context.getResources().getString(R.string.hash) + issue.getNumber() + "</font>";
issueTitle.setText(HtmlCompat.fromHtml(issueNumber_ + " " + EmojiParser.parseToUnicode(issue.getTitle()), HtmlCompat.FROM_HTML_MODE_LEGACY));
String issueNumber_ = "<font color='" + context.getResources().getColor(R.color.lightGray) + "'>" + context.getResources().getString(R.string.hash) + issuesModel.getNumber() + "</font>"; this.issue = issue;
issueTitle.setText(Html.fromHtml(issueNumber_ + " " + issuesModel.getTitle())); this.issueCommentsCount.setText(String.valueOf(issue.getComments()));
issueNumber.setText(String.valueOf(issuesModel.getNumber()));
issueCommentsCount.setText(String.valueOf(issuesModel.getComments()));
switch(timeFormat) { switch(timeFormat) {
case "pretty": { case "pretty": {
PrettyTime prettyTime = new PrettyTime(new Locale(locale)); PrettyTime prettyTime = new PrettyTime(new Locale(locale));
String createdTime = prettyTime.format(issuesModel.getCreated_at()); String createdTime = prettyTime.format(issue.getCreated_at());
issueCreatedTime.setText(createdTime); this.issueCreatedTime.setText(createdTime);
issueCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(issuesModel.getCreated_at()), context)); this.issueCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(issue.getCreated_at()), context));
break; break;
} }
case "normal": { case "normal": {
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
String createdTime = formatter.format(issuesModel.getCreated_at()); String createdTime = formatter.format(issue.getCreated_at());
issueCreatedTime.setText(createdTime); this.issueCreatedTime.setText(createdTime);
break; break;
} }
case "normal1": { case "normal1": {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale)); DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
String createdTime = formatter.format(issuesModel.getCreated_at()); String createdTime = formatter.format(issue.getCreated_at());
issueCreatedTime.setText(createdTime); this.issueCreatedTime.setText(createdTime);
break; break;
} }
} }

View File

@ -15,11 +15,11 @@ import androidx.cardview.widget.CardView;
import androidx.core.widget.ImageViewCompat; import androidx.core.widget.ImageViewCompat;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.android.material.bottomsheet.BottomSheetDialog;
import org.gitnex.tea4j.models.Labels;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.CreateLabelActivity; import org.mian.gitnex.activities.CreateLabelActivity;
import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.ColorInverter; import org.mian.gitnex.helpers.ColorInverter;
import org.mian.gitnex.models.Labels;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -32,6 +32,8 @@ public class LabelsAdapter extends RecyclerView.Adapter<LabelsAdapter.LabelsView
private List<Labels> labelsList; private List<Labels> labelsList;
final private Context mCtx; final private Context mCtx;
private ArrayList<Integer> labelsArray = new ArrayList<>(); private ArrayList<Integer> labelsArray = new ArrayList<>();
private static String type;
private static String orgName;
static class LabelsViewHolder extends RecyclerView.ViewHolder { static class LabelsViewHolder extends RecyclerView.ViewHolder {
@ -77,6 +79,8 @@ public class LabelsAdapter extends RecyclerView.Adapter<LabelsAdapter.LabelsView
intent.putExtra("labelTitle", labelTitle.getText()); intent.putExtra("labelTitle", labelTitle.getText());
intent.putExtra("labelColor", labelColor.getText()); intent.putExtra("labelColor", labelColor.getText());
intent.putExtra("labelAction", "edit"); intent.putExtra("labelAction", "edit");
intent.putExtra("type", type);
intent.putExtra("orgName", orgName);
context.startActivity(intent); context.startActivity(intent);
dialog.dismiss(); dialog.dismiss();
@ -87,8 +91,9 @@ public class LabelsAdapter extends RecyclerView.Adapter<LabelsAdapter.LabelsView
AlertDialogs.labelDeleteDialog(context, labelTitle.getText().toString(), labelId.getText().toString(), AlertDialogs.labelDeleteDialog(context, labelTitle.getText().toString(), labelId.getText().toString(),
context.getResources().getString(R.string.labelDeleteTitle), context.getResources().getString(R.string.labelDeleteTitle),
context.getResources().getString(R.string.labelDeleteMessage), context.getResources().getString(R.string.labelDeleteMessage),
context.getResources().getString(R.string.labelDeletePositiveButton), context.getResources().getString(R.string.labelDeleteTitle),
context.getResources().getString(R.string.labelDeleteNegativeButton)); context.getResources().getString(R.string.labelDeleteNegativeButton),
type, orgName);
dialog.dismiss(); dialog.dismiss();
}); });
@ -98,9 +103,12 @@ public class LabelsAdapter extends RecyclerView.Adapter<LabelsAdapter.LabelsView
} }
} }
public LabelsAdapter(Context mCtx, List<Labels> labelsMain) { public LabelsAdapter(Context mCtx, List<Labels> labelsMain, String type, String orgName) {
this.mCtx = mCtx; this.mCtx = mCtx;
this.labelsList = labelsMain; this.labelsList = labelsMain;
LabelsAdapter.type = type;
LabelsAdapter.orgName = orgName;
} }
@NonNull @NonNull

View File

@ -9,8 +9,8 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.gitnex.tea4j.models.Labels;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.models.Labels;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;

View File

@ -2,6 +2,7 @@ package org.mian.gitnex.adapters;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -10,10 +11,11 @@ import android.widget.Filter;
import android.widget.Filterable; import android.widget.Filterable;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.models.UserInfo;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -23,26 +25,36 @@ import java.util.List;
public class MembersByOrgAdapter extends BaseAdapter implements Filterable { public class MembersByOrgAdapter extends BaseAdapter implements Filterable {
private List<UserInfo> membersList; private final List<UserInfo> membersList;
private Context mCtx; private final Context mCtx;
private List<UserInfo> membersListFull; private final List<UserInfo> membersListFull;
private class ViewHolder { private static class ViewHolder {
private ImageView memberAvatar; private String userLoginId;
private TextView memberName;
private final ImageView memberAvatar;
private final TextView memberName;
ViewHolder(View v) { ViewHolder(View v) {
memberAvatar = v.findViewById(R.id.memberAvatar); memberAvatar = v.findViewById(R.id.memberAvatar);
memberName = v.findViewById(R.id.memberName); memberName = v.findViewById(R.id.memberName);
memberAvatar.setOnClickListener(loginId -> {
Context context = loginId.getContext();
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
});
} }
} }
public MembersByOrgAdapter(Context mCtx, List<UserInfo> membersListMain) { public MembersByOrgAdapter(Context mCtx, List<UserInfo> membersListMain) {
this.mCtx = mCtx; this.mCtx = mCtx;
this.membersList = membersListMain; this.membersList = membersListMain;
membersListFull = new ArrayList<>(membersList); membersListFull = new ArrayList<>(membersList);
} }
@Override @Override
@ -67,17 +79,18 @@ public class MembersByOrgAdapter extends BaseAdapter implements Filterable {
MembersByOrgAdapter.ViewHolder viewHolder = null; MembersByOrgAdapter.ViewHolder viewHolder = null;
if (finalView == null) { if (finalView == null) {
finalView = LayoutInflater.from(mCtx).inflate(R.layout.list_members_by_org, null); finalView = LayoutInflater.from(mCtx).inflate(R.layout.list_members_by_org, null);
viewHolder = new MembersByOrgAdapter.ViewHolder(finalView); viewHolder = new ViewHolder(finalView);
finalView.setTag(viewHolder); finalView.setTag(viewHolder);
} }
else { else {
viewHolder = (MembersByOrgAdapter.ViewHolder) finalView.getTag(); viewHolder = (MembersByOrgAdapter.ViewHolder) finalView.getTag();
} }
initData(viewHolder, position); initData(viewHolder, position);
return finalView; return finalView;
} }
private void initData(MembersByOrgAdapter.ViewHolder viewHolder, int position) { private void initData(MembersByOrgAdapter.ViewHolder viewHolder, int position) {
@ -85,10 +98,14 @@ public class MembersByOrgAdapter extends BaseAdapter implements Filterable {
UserInfo currentItem = membersList.get(position); UserInfo currentItem = membersList.get(position);
PicassoService.getInstance(mCtx).get().load(currentItem.getAvatar()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(viewHolder.memberAvatar); PicassoService.getInstance(mCtx).get().load(currentItem.getAvatar()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(viewHolder.memberAvatar);
viewHolder.userLoginId = currentItem.getLogin();
if(!currentItem.getFullname().equals("")) { if(!currentItem.getFullname().equals("")) {
viewHolder.memberName.setText(currentItem.getFullname());
viewHolder.memberName.setText(Html.fromHtml(currentItem.getFullname()));
} }
else { else {
viewHolder.memberName.setText(currentItem.getLogin()); viewHolder.memberName.setText(currentItem.getLogin());
} }
@ -99,14 +116,17 @@ public class MembersByOrgAdapter extends BaseAdapter implements Filterable {
return membersFilter; return membersFilter;
} }
private Filter membersFilter = new Filter() { private final Filter membersFilter = new Filter() {
@Override @Override
protected FilterResults performFiltering(CharSequence constraint) { protected FilterResults performFiltering(CharSequence constraint) {
List<UserInfo> filteredList = new ArrayList<>(); List<UserInfo> filteredList = new ArrayList<>();
if (constraint == null || constraint.length() == 0) { if (constraint == null || constraint.length() == 0) {
filteredList.addAll(membersListFull); filteredList.addAll(membersListFull);
} else { }
else {
String filterPattern = constraint.toString().toLowerCase().trim(); String filterPattern = constraint.toString().toLowerCase().trim();
for (UserInfo item : membersListFull) { for (UserInfo item : membersListFull) {
@ -124,6 +144,7 @@ public class MembersByOrgAdapter extends BaseAdapter implements Filterable {
@Override @Override
protected void publishResults(CharSequence constraint, FilterResults results) { protected void publishResults(CharSequence constraint, FilterResults results) {
membersList.clear(); membersList.clear();
membersList.addAll((List) results.values); membersList.addAll((List) results.values);
notifyDataSetChanged(); notifyDataSetChanged();

View File

@ -2,9 +2,6 @@ package org.mian.gitnex.adapters;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.text.Spanned;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -13,40 +10,24 @@ import android.widget.ImageView;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.content.res.ResourcesCompat;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.vdurmont.emoji.EmojiParser; import com.vdurmont.emoji.EmojiParser;
import org.gitnex.tea4j.models.Milestones;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.actions.MilestoneActions; import org.mian.gitnex.actions.MilestoneActions;
import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.ClickListener;
import org.mian.gitnex.helpers.StaticGlobalVariables; import org.mian.gitnex.helpers.Constants;
import org.mian.gitnex.helpers.Markdown;
import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.models.Milestones;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects;
import io.noties.markwon.AbstractMarkwonPlugin;
import io.noties.markwon.Markwon;
import io.noties.markwon.core.CorePlugin;
import io.noties.markwon.core.MarkwonTheme;
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
import io.noties.markwon.ext.tables.TablePlugin;
import io.noties.markwon.ext.tasklist.TaskListPlugin;
import io.noties.markwon.html.HtmlPlugin;
import io.noties.markwon.image.DefaultMediaDecoder;
import io.noties.markwon.image.ImageItem;
import io.noties.markwon.image.ImagesPlugin;
import io.noties.markwon.image.SchemeHandler;
import io.noties.markwon.image.gif.GifMediaDecoder;
import io.noties.markwon.image.svg.SvgMediaDecoder;
import io.noties.markwon.linkify.LinkifyPlugin;
/** /**
* Author M M Arif * Author M M Arif
@ -60,7 +41,7 @@ public class MilestonesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
private OnLoadMoreListener loadMoreListener; private OnLoadMoreListener loadMoreListener;
private boolean isLoading = false; private boolean isLoading = false;
private boolean isMoreDataAvailable = true; private boolean isMoreDataAvailable = true;
private String TAG = StaticGlobalVariables.tagMilestonesAdapter; private String TAG = Constants.tagMilestonesAdapter;
public MilestonesAdapter(Context context, List<Milestones> dataListMain) { public MilestonesAdapter(Context context, List<Milestones> dataListMain) {
@ -177,71 +158,18 @@ public class MilestonesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
void bindData(Milestones dataModel) { void bindData(Milestones dataModel) {
final TinyDB tinyDb = new TinyDB(context); final TinyDB tinyDb = TinyDB.getInstance(context);
final String locale = tinyDb.getString("locale"); final String locale = tinyDb.getString("locale");
final String timeFormat = tinyDb.getString("dateFormat"); final String timeFormat = tinyDb.getString("dateFormat");
milestoneId.setText(String.valueOf(dataModel.getId())); milestoneId.setText(String.valueOf(dataModel.getId()));
milestoneStatus.setText(dataModel.getState()); milestoneStatus.setText(dataModel.getState());
Markwon markwon = Markwon.builder(Objects.requireNonNull(context)).usePlugin(CorePlugin.create()).usePlugin(ImagesPlugin.create(plugin -> { new Markdown(context, dataModel.getTitle(), msTitle);
plugin.addSchemeHandler(new SchemeHandler() {
@NonNull
@Override
public ImageItem handle(@NonNull String raw, @NonNull Uri uri) {
final int resourceId = context.getResources().getIdentifier(
raw.substring("drawable://".length()),
"drawable",
context.getPackageName());
final Drawable drawable = context.getDrawable(resourceId);
assert drawable != null;
return ImageItem.withResult(drawable);
}
@NonNull
@Override
public Collection<String> supportedSchemes() {
return Collections.singleton("drawable");
}
});
plugin.placeholderProvider(drawable -> null);
plugin.addMediaDecoder(GifMediaDecoder.create(false));
plugin.addMediaDecoder(SvgMediaDecoder.create(context.getResources()));
plugin.addMediaDecoder(SvgMediaDecoder.create());
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(context.getResources()));
plugin.defaultMediaDecoder(DefaultMediaDecoder.create());
}))
.usePlugin(new AbstractMarkwonPlugin() {
@Override
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
builder
.codeTextColor(tinyDb.getInt("codeBlockColor"))
.codeBackgroundColor(tinyDb.getInt("codeBlockBackground"))
.linkColor(context.getResources().getColor(R.color.lightBlue));
}
})
.usePlugin(TablePlugin.create(context))
.usePlugin(TaskListPlugin.create(context))
.usePlugin(HtmlPlugin.create())
.usePlugin(StrikethroughPlugin.create())
.usePlugin(LinkifyPlugin.create())
.build();
Spanned msTitle_ = markwon.toMarkdown(dataModel.getTitle());
markwon.setParsedMarkdown(msTitle, msTitle_);
if(!dataModel.getDescription().equals("")) { if(!dataModel.getDescription().equals("")) {
CharSequence bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(dataModel.getDescription())); new Markdown(context, EmojiParser.parseToUnicode(dataModel.getDescription()), msDescription);
msDescription.setText(bodyWithMD);
} }
else { else {
@ -293,7 +221,7 @@ public class MilestonesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
String dueDate = formatter.format(date); String dueDate = formatter.format(date);
if(date.before(new Date())) { if(date.before(new Date())) {
msDueDate.setTextColor(context.getResources().getColor(R.color.darkRed)); msDueDate.setTextColor(ResourcesCompat.getColor(context.getResources(), R.color.darkRed, null));
} }
msDueDate.setText(dueDate); msDueDate.setText(dueDate);

View File

@ -20,6 +20,8 @@ import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator; import com.amulyakhare.textdrawable.util.ColorGenerator;
import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.android.material.bottomsheet.BottomSheetDialog;
import org.gitnex.tea4j.models.UserRepositories;
import org.gitnex.tea4j.models.WatchInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.OpenRepoInBrowserActivity; import org.mian.gitnex.activities.OpenRepoInBrowserActivity;
import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.activities.RepoDetailActivity;
@ -33,8 +35,6 @@ import org.mian.gitnex.database.models.Repository;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.UserRepositories;
import org.mian.gitnex.models.WatchInfo;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@ -92,7 +92,7 @@ public class MyReposListAdapter extends RecyclerView.Adapter<MyReposListAdapter.
Intent intent = new Intent(context, RepoDetailActivity.class); Intent intent = new Intent(context, RepoDetailActivity.class);
intent.putExtra("repoFullName", repoFullName.getText().toString()); intent.putExtra("repoFullName", repoFullName.getText().toString());
TinyDB tinyDb = new TinyDB(context); TinyDB tinyDb = TinyDB.getInstance(context);
tinyDb.putString("repoFullName", repoFullName.getText().toString()); tinyDb.putString("repoFullName", repoFullName.getText().toString());
tinyDb.putString("repoType", repoType.getText().toString()); tinyDb.putString("repoType", repoType.getText().toString());
//tinyDb.putBoolean("resumeIssues", true); //tinyDb.putBoolean("resumeIssues", true);
@ -125,14 +125,13 @@ public class MyReposListAdapter extends RecyclerView.Adapter<MyReposListAdapter.
//store if user is watching this repo //store if user is watching this repo
{ {
final String instanceUrl = tinyDb.getString("instanceUrl");
final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token"); final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token");
WatchInfo watch = new WatchInfo(); WatchInfo watch = new WatchInfo();
Call<WatchInfo> call; Call<WatchInfo> call;
call = RetrofitClient.getInstance(instanceUrl, context).getApiInterface().checkRepoWatchStatus(token, repoOwner, repoName); call = RetrofitClient.getApiInterface(context).checkRepoWatchStatus(token, repoOwner, repoName);
call.enqueue(new Callback<WatchInfo>() { call.enqueue(new Callback<WatchInfo>() {
@ -293,7 +292,7 @@ public class MyReposListAdapter extends RecyclerView.Adapter<MyReposListAdapter.
} }
holder.repoFullName.setText(currentItem.getFullName()); holder.repoFullName.setText(currentItem.getFullName());
if(currentItem.getPrivateFlag()) { if(currentItem.getPrivateFlag()) {
holder.repoPrivatePublic.setImageResource(R.drawable.ic_lock); holder.repoPrivatePublic.setVisibility(View.VISIBLE);
holder.repoType.setText(R.string.strPrivate); holder.repoType.setText(R.string.strPrivate);
} }
else { else {

View File

@ -1,7 +1,6 @@
package org.mian.gitnex.adapters; package org.mian.gitnex.adapters;
import android.content.Context; import android.content.Context;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -9,12 +8,14 @@ import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.content.res.ResourcesCompat;
import androidx.core.text.HtmlCompat;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.gitnex.tea4j.models.NotificationThread;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.database.api.RepositoriesApi; import org.mian.gitnex.database.api.RepositoriesApi;
import org.mian.gitnex.database.models.Repository; import org.mian.gitnex.database.models.Repository;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.models.NotificationThread;
import java.util.List; import java.util.List;
/** /**
@ -31,7 +32,7 @@ public class NotificationsAdapter extends RecyclerView.Adapter<NotificationsAdap
public NotificationsAdapter(Context context, List<NotificationThread> notificationThreads, OnMoreClickedListener onMoreClickedListener, OnNotificationClickedListener onNotificationClickedListener) { public NotificationsAdapter(Context context, List<NotificationThread> notificationThreads, OnMoreClickedListener onMoreClickedListener, OnNotificationClickedListener onNotificationClickedListener) {
this.tinyDb = new TinyDB(context); this.tinyDb = TinyDB.getInstance(context);
this.context = context; this.context = context;
this.notificationThreads = notificationThreads; this.notificationThreads = notificationThreads;
this.onMoreClickedListener = onMoreClickedListener; this.onMoreClickedListener = onMoreClickedListener;
@ -81,10 +82,10 @@ public class NotificationsAdapter extends RecyclerView.Adapter<NotificationsAdap
NotificationThread notificationThread = notificationThreads.get(position); NotificationThread notificationThread = notificationThreads.get(position);
String url = notificationThread.getSubject().getUrl(); String url = notificationThread.getSubject().getUrl();
String subjectId = "<font color='" + context.getResources().getColor(R.color.lightGray) + "'>" + context.getResources() String subjectId = "<font color='" + ResourcesCompat.getColor(context.getResources(), R.color.lightGray, null) + "'>" + context.getResources()
.getString(R.string.hash) + url.substring(url.lastIndexOf("/") + 1) + "</font>"; .getString(R.string.hash) + url.substring(url.lastIndexOf("/") + 1) + "</font>";
holder.subject.setText(Html.fromHtml(subjectId + " " + notificationThread.getSubject().getTitle())); holder.subject.setText(HtmlCompat.fromHtml(subjectId + " " + notificationThread.getSubject().getTitle(), HtmlCompat.FROM_HTML_MODE_LEGACY));
holder.repository.setText(notificationThread.getRepository().getFullName()); holder.repository.setText(notificationThread.getRepository().getFullName());
if(notificationThread.isPinned()) { if(notificationThread.isPinned()) {

View File

@ -12,12 +12,12 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.gitnex.tea4j.models.UserOrganizations;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.OrganizationDetailActivity; import org.mian.gitnex.activities.OrganizationDetailActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.models.UserOrganizations;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -45,27 +45,23 @@ public class OrganizationsListAdapter extends RecyclerView.Adapter<Organizations
image = itemView.findViewById(R.id.imageAvatar); image = itemView.findViewById(R.id.imageAvatar);
organizationId = itemView.findViewById(R.id.organizationId); organizationId = itemView.findViewById(R.id.organizationId);
itemView.setOnClickListener(new View.OnClickListener() { itemView.setOnClickListener(v -> {
@Override
public void onClick(View v) {
Context context = v.getContext(); Context context = v.getContext();
Intent intent = new Intent(context, OrganizationDetailActivity.class); Intent intent = new Intent(context, OrganizationDetailActivity.class);
intent.putExtra("orgName", mTextView1.getText().toString()); intent.putExtra("orgName", mTextView1.getText().toString());
TinyDB tinyDb = new TinyDB(context); TinyDB tinyDb = TinyDB.getInstance(context);
tinyDb.putString("orgName", mTextView1.getText().toString()); tinyDb.putString("orgName", mTextView1.getText().toString());
tinyDb.putString("organizationId", organizationId.getText().toString()); tinyDb.putString("organizationId", organizationId.getText().toString());
tinyDb.putBoolean("organizationAction", true); tinyDb.putBoolean("organizationAction", true);
context.startActivity(intent); context.startActivity(intent);
}
}); });
} }
} }
public OrganizationsListAdapter(Context mCtx, List<UserOrganizations> orgsListMain) { public OrganizationsListAdapter(Context mCtx, List<UserOrganizations> orgsListMain) {
this.mCtx = mCtx; this.mCtx = mCtx;
this.orgList = orgsListMain; this.orgList = orgsListMain;
orgListFull = new ArrayList<>(orgList); orgListFull = new ArrayList<>(orgList);
@ -74,6 +70,7 @@ public class OrganizationsListAdapter extends RecyclerView.Adapter<Organizations
@NonNull @NonNull
@Override @Override
public OrganizationsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public OrganizationsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_organizations, parent, false); View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_organizations, parent, false);
return new OrganizationsViewHolder(v); return new OrganizationsViewHolder(v);
} }
@ -88,11 +85,12 @@ public class OrganizationsListAdapter extends RecyclerView.Adapter<Organizations
PicassoService.getInstance(mCtx).get().load(currentItem.getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(holder.image); PicassoService.getInstance(mCtx).get().load(currentItem.getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(holder.image);
holder.mTextView1.setText(currentItem.getUsername()); holder.mTextView1.setText(currentItem.getUsername());
if (!currentItem.getDescription().equals("")) { if (!currentItem.getDescription().equals("")) {
holder.mTextView2.setVisibility(View.VISIBLE); holder.mTextView2.setVisibility(View.VISIBLE);
holder.mTextView2.setText(currentItem.getDescription()); holder.mTextView2.setText(currentItem.getDescription());
} }
} }
@Override @Override
@ -105,14 +103,19 @@ public class OrganizationsListAdapter extends RecyclerView.Adapter<Organizations
return orgFilter; return orgFilter;
} }
private Filter orgFilter = new Filter() { private final Filter orgFilter = new Filter() {
@Override @Override
protected FilterResults performFiltering(CharSequence constraint) { protected FilterResults performFiltering(CharSequence constraint) {
List<UserOrganizations> filteredList = new ArrayList<>(); List<UserOrganizations> filteredList = new ArrayList<>();
if (constraint == null || constraint.length() == 0) { if (constraint == null || constraint.length() == 0) {
filteredList.addAll(orgListFull); filteredList.addAll(orgListFull);
} else { }
else {
String filterPattern = constraint.toString().toLowerCase().trim(); String filterPattern = constraint.toString().toLowerCase().trim();
for (UserOrganizations item : orgListFull) { for (UserOrganizations item : orgListFull) {
@ -130,6 +133,7 @@ public class OrganizationsListAdapter extends RecyclerView.Adapter<Organizations
@Override @Override
protected void publishResults(CharSequence constraint, FilterResults results) { protected void publishResults(CharSequence constraint, FilterResults results) {
orgList.clear(); orgList.clear();
orgList.addAll((List) results.values); orgList.addAll((List) results.values);
notifyDataSetChanged(); notifyDataSetChanged();

View File

@ -6,12 +6,13 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.amulyakhare.textdrawable.TextDrawable;
import org.mian.gitnex.R;
import org.mian.gitnex.models.Emails;
import java.util.List;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.content.res.ResourcesCompat;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable;
import org.gitnex.tea4j.models.Emails;
import org.mian.gitnex.R;
import java.util.List;
/** /**
* Author M M Arif * Author M M Arif
@ -58,12 +59,12 @@ public class ProfileEmailsAdapter extends RecyclerView.Adapter<ProfileEmailsAdap
if(currentItem.getPrimary()) { if(currentItem.getPrimary()) {
TextDrawable drawable = TextDrawable.builder() TextDrawable drawable = TextDrawable.builder()
.beginConfig() .beginConfig()
.textColor(mCtx.getResources().getColor(R.color.colorWhite)) .textColor(ResourcesCompat.getColor(mCtx.getResources(), R.color.colorWhite, null))
.fontSize(36) .fontSize(36)
.width(220) .width(220)
.height(60) .height(60)
.endConfig() .endConfig()
.buildRoundRect(mCtx.getResources().getString(R.string.emailTypeText), mCtx.getResources().getColor(R.color.tooltipBackground), 8); .buildRoundRect(mCtx.getResources().getString(R.string.emailTypeText), ResourcesCompat.getColor(mCtx.getResources(), R.color.tooltipBackground, null), 8);
holder.emailPrimary.setImageDrawable(drawable); holder.emailPrimary.setImageDrawable(drawable);
} }
else { else {

View File

@ -1,18 +1,20 @@
package org.mian.gitnex.adapters; package org.mian.gitnex.adapters;
import android.content.Context; import android.content.Context;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.models.UserInfo;
import java.util.List;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation;
import java.util.List;
/** /**
* Author M M Arif * Author M M Arif
@ -20,26 +22,36 @@ import androidx.recyclerview.widget.RecyclerView;
public class ProfileFollowersAdapter extends RecyclerView.Adapter<ProfileFollowersAdapter.FollowersViewHolder> { public class ProfileFollowersAdapter extends RecyclerView.Adapter<ProfileFollowersAdapter.FollowersViewHolder> {
private List<UserInfo> followersList; private final List<UserInfo> followersList;
private Context mCtx; private final Context mCtx;
static class FollowersViewHolder extends RecyclerView.ViewHolder { static class FollowersViewHolder extends RecyclerView.ViewHolder {
private ImageView userAvatar; private String userLoginId;
private TextView userFullName;
private TextView userName; private final ImageView userAvatar;
private final TextView userFullName;
private final TextView userName;
private FollowersViewHolder(View itemView) { private FollowersViewHolder(View itemView) {
super(itemView); super(itemView);
userAvatar = itemView.findViewById(R.id.userAvatar); userAvatar = itemView.findViewById(R.id.userAvatar);
userFullName = itemView.findViewById(R.id.userFullName); userFullName = itemView.findViewById(R.id.userFullName);
userName = itemView.findViewById(R.id.userName); userName = itemView.findViewById(R.id.userName);
userAvatar.setOnClickListener(loginId -> {
Context context = loginId.getContext();
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
});
} }
} }
public ProfileFollowersAdapter(Context mCtx, List<UserInfo> followersListMain) { public ProfileFollowersAdapter(Context mCtx, List<UserInfo> followersListMain) {
this.mCtx = mCtx; this.mCtx = mCtx;
this.followersList = followersListMain; this.followersList = followersListMain;
} }
@ -47,8 +59,9 @@ public class ProfileFollowersAdapter extends RecyclerView.Adapter<ProfileFollowe
@NonNull @NonNull
@Override @Override
public ProfileFollowersAdapter.FollowersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public ProfileFollowersAdapter.FollowersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_profile_followers, parent, false); View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_profile_followers, parent, false);
return new ProfileFollowersAdapter.FollowersViewHolder(v); return new FollowersViewHolder(v);
} }
@Override @Override
@ -56,11 +69,15 @@ public class ProfileFollowersAdapter extends RecyclerView.Adapter<ProfileFollowe
UserInfo currentItem = followersList.get(position); UserInfo currentItem = followersList.get(position);
holder.userLoginId = currentItem.getLogin();
if(!currentItem.getFullname().equals("")) { if(!currentItem.getFullname().equals("")) {
holder.userFullName.setText(currentItem.getFullname());
holder.userFullName.setText(Html.fromHtml(currentItem.getFullname()));
holder.userName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername())); holder.userName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername()));
} }
else { else {
holder.userFullName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername())); holder.userFullName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername()));
holder.userName.setVisibility(View.GONE); holder.userName.setVisibility(View.GONE);
} }

View File

@ -1,18 +1,20 @@
package org.mian.gitnex.adapters; package org.mian.gitnex.adapters;
import android.content.Context; import android.content.Context;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.models.UserInfo;
import java.util.List;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation;
import java.util.List;
/** /**
* Author M M Arif * Author M M Arif
@ -20,26 +22,36 @@ import androidx.recyclerview.widget.RecyclerView;
public class ProfileFollowingAdapter extends RecyclerView.Adapter<ProfileFollowingAdapter.FollowingViewHolder> { public class ProfileFollowingAdapter extends RecyclerView.Adapter<ProfileFollowingAdapter.FollowingViewHolder> {
private List<UserInfo> followingList; private final List<UserInfo> followingList;
private Context mCtx; private final Context mCtx;
static class FollowingViewHolder extends RecyclerView.ViewHolder { static class FollowingViewHolder extends RecyclerView.ViewHolder {
private ImageView userAvatar; private String userLoginId;
private TextView userFullName;
private TextView userName; private final ImageView userAvatar;
private final TextView userFullName;
private final TextView userName;
private FollowingViewHolder(View itemView) { private FollowingViewHolder(View itemView) {
super(itemView); super(itemView);
userAvatar = itemView.findViewById(R.id.userAvatar); userAvatar = itemView.findViewById(R.id.userAvatar);
userFullName = itemView.findViewById(R.id.userFullName); userFullName = itemView.findViewById(R.id.userFullName);
userName = itemView.findViewById(R.id.userName); userName = itemView.findViewById(R.id.userName);
userAvatar.setOnClickListener(loginId -> {
Context context = loginId.getContext();
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
});
} }
} }
public ProfileFollowingAdapter(Context mCtx, List<UserInfo> followingListMain) { public ProfileFollowingAdapter(Context mCtx, List<UserInfo> followingListMain) {
this.mCtx = mCtx; this.mCtx = mCtx;
this.followingList = followingListMain; this.followingList = followingListMain;
} }
@ -47,8 +59,9 @@ public class ProfileFollowingAdapter extends RecyclerView.Adapter<ProfileFollowi
@NonNull @NonNull
@Override @Override
public ProfileFollowingAdapter.FollowingViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public ProfileFollowingAdapter.FollowingViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_profile_following, parent, false); View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_profile_following, parent, false);
return new ProfileFollowingAdapter.FollowingViewHolder(v); return new FollowingViewHolder(v);
} }
@Override @Override
@ -56,11 +69,15 @@ public class ProfileFollowingAdapter extends RecyclerView.Adapter<ProfileFollowi
UserInfo currentItem = followingList.get(position); UserInfo currentItem = followingList.get(position);
holder.userLoginId = currentItem.getLogin();
if(!currentItem.getFullname().equals("")) { if(!currentItem.getFullname().equals("")) {
holder.userFullName.setText(currentItem.getFullname());
holder.userFullName.setText(Html.fromHtml(currentItem.getFullname()));
holder.userName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername())); holder.userName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername()));
} }
else { else {
holder.userFullName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername())); holder.userFullName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername()));
holder.userName.setVisibility(View.GONE); holder.userName.setVisibility(View.GONE);
} }

View File

@ -3,7 +3,6 @@ package org.mian.gitnex.adapters;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -11,15 +10,19 @@ import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.content.res.ResourcesCompat;
import androidx.core.text.HtmlCompat;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.vdurmont.emoji.EmojiParser;
import org.gitnex.tea4j.models.PullRequests;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.IssueDetailActivity; import org.mian.gitnex.activities.IssueDetailActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.ClickListener;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.models.PullRequests;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
@ -29,7 +32,7 @@ import java.util.Locale;
public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context; private final Context context;
private final int TYPE_LOAD = 0; private final int TYPE_LOAD = 0;
private List<PullRequests> prList; private List<PullRequests> prList;
private PullRequestsAdapter.OnLoadMoreListener loadMoreListener; private PullRequestsAdapter.OnLoadMoreListener loadMoreListener;
@ -64,15 +67,11 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
isLoading = true; isLoading = true;
loadMoreListener.onLoadMore(); loadMoreListener.onLoadMore();
} }
if(getItemViewType(position) == TYPE_LOAD) { if(getItemViewType(position) == TYPE_LOAD) {
((PullRequestsAdapter.PullRequestsHolder) holder).bindData(prList.get(position)); ((PullRequestsAdapter.PullRequestsHolder) holder).bindData(prList.get(position));
} }
} }
@Override @Override
@ -84,7 +83,6 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
else { else {
return 1; return 1;
} }
} }
@Override @Override
@ -96,25 +94,17 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
class PullRequestsHolder extends RecyclerView.ViewHolder { class PullRequestsHolder extends RecyclerView.ViewHolder {
private TextView prNumber; private PullRequests pullRequest;
private TextView prMergeable;
private TextView prHeadBranch; private final ImageView assigneeAvatar;
private TextView prIsFork; private final TextView prTitle;
private TextView prForkFullName; private final TextView prCreatedTime;
private ImageView assigneeAvatar; private final TextView prCommentsCount;
private TextView prTitle;
private TextView prCreatedTime;
private TextView prCommentsCount;
PullRequestsHolder(View itemView) { PullRequestsHolder(View itemView) {
super(itemView); super(itemView);
prNumber = itemView.findViewById(R.id.prNumber);
prMergeable = itemView.findViewById(R.id.prMergeable);
prHeadBranch = itemView.findViewById(R.id.prHeadBranch);
prIsFork = itemView.findViewById(R.id.prIsFork);
prForkFullName = itemView.findViewById(R.id.prForkFullName);
assigneeAvatar = itemView.findViewById(R.id.assigneeAvatar); assigneeAvatar = itemView.findViewById(R.id.assigneeAvatar);
prTitle = itemView.findViewById(R.id.prTitle); prTitle = itemView.findViewById(R.id.prTitle);
prCommentsCount = itemView.findViewById(R.id.prCommentsCount); prCommentsCount = itemView.findViewById(R.id.prCommentsCount);
@ -126,90 +116,95 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
Context context = v.getContext(); Context context = v.getContext();
Intent intent = new Intent(context, IssueDetailActivity.class); Intent intent = new Intent(context, IssueDetailActivity.class);
intent.putExtra("issueNumber", prNumber.getText()); intent.putExtra("issueNumber", pullRequest.getNumber());
intent.putExtra("prMergeable", prMergeable.getText()); intent.putExtra("prMergeable", pullRequest.isMergeable());
intent.putExtra("prHeadBranch", prHeadBranch.getText()); intent.putExtra("prHeadBranch", pullRequest.getHead().getRef());
TinyDB tinyDb = TinyDB.getInstance(context);
tinyDb.putString("issueNumber", String.valueOf(pullRequest.getNumber()));
tinyDb.putString("prMergeable", String.valueOf(pullRequest.isMergeable()));
tinyDb.putString("prHeadBranch", pullRequest.getHead().getRef());
if(pullRequest.getHead() != null && pullRequest.getHead().getRepo() != null) {
tinyDb.putString("prIsFork", String.valueOf(pullRequest.getHead().getRepo().isFork()));
tinyDb.putString("prForkFullName", pullRequest.getHead().getRepo().getFull_name());
}
else {
// pull was done from a deleted fork
tinyDb.putString("prIsFork", "true");
tinyDb.putString("prForkFullName", context.getString(R.string.prDeletedFork));
}
TinyDB tinyDb = new TinyDB(context);
tinyDb.putString("issueNumber", prNumber.getText().toString());
tinyDb.putString("prMergeable", prMergeable.getText().toString());
tinyDb.putString("prHeadBranch", prHeadBranch.getText().toString());
tinyDb.putString("prIsFork", prIsFork.getText().toString());
tinyDb.putString("prForkFullName", prForkFullName.getText().toString());
tinyDb.putString("issueType", "Pull"); tinyDb.putString("issueType", "Pull");
context.startActivity(intent); context.startActivity(intent);
}); });
frameCommentsCount.setOnClickListener(v -> { frameCommentsCount.setOnClickListener(v -> {
Context context = v.getContext(); Context context = v.getContext();
Intent intent = new Intent(context, IssueDetailActivity.class); Intent intent = new Intent(context, IssueDetailActivity.class);
intent.putExtra("issueNumber", prNumber.getText()); intent.putExtra("issueNumber", pullRequest.getNumber());
intent.putExtra("prMergeable", prMergeable.getText()); intent.putExtra("prMergeable", pullRequest.isMergeable());
intent.putExtra("prHeadBranch", prHeadBranch.getText()); intent.putExtra("prHeadBranch", pullRequest.getHead().getRef());
TinyDB tinyDb = TinyDB.getInstance(context);
tinyDb.putString("issueNumber", String.valueOf(pullRequest.getNumber()));
tinyDb.putString("prMergeable", String.valueOf(pullRequest.isMergeable()));
tinyDb.putString("prHeadBranch", pullRequest.getHead().getRef());
if(pullRequest.getHead() != null && pullRequest.getHead().getRepo() != null) {
tinyDb.putString("prIsFork", String.valueOf(pullRequest.getHead().getRepo().isFork()));
tinyDb.putString("prForkFullName", pullRequest.getHead().getRepo().getFull_name());
}
else {
// pull was done from a deleted fork
tinyDb.putString("prIsFork", "true");
tinyDb.putString("prForkFullName", context.getString(R.string.prDeletedFork));
}
TinyDB tinyDb = new TinyDB(context);
tinyDb.putString("issueNumber", prNumber.getText().toString());
tinyDb.putString("prMergeable", prMergeable.getText().toString());
tinyDb.putString("prHeadBranch", prHeadBranch.getText().toString());
tinyDb.putString("prIsFork", prIsFork.getText().toString());
tinyDb.putString("prForkFullName", prForkFullName.getText().toString());
tinyDb.putString("issueType", "Pull"); tinyDb.putString("issueType", "Pull");
context.startActivity(intent); context.startActivity(intent);
}); });
assigneeAvatar.setOnClickListener(v -> {
Context context = v.getContext();
String userLoginId = pullRequest.getUser().getLogin();
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
});
} }
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
void bindData(PullRequests prModel) { void bindData(PullRequests pullRequest) {
final TinyDB tinyDb = new TinyDB(context); TinyDB tinyDb = TinyDB.getInstance(context);
final String locale = tinyDb.getString("locale"); String locale = tinyDb.getString("locale");
final String timeFormat = tinyDb.getString("dateFormat"); String timeFormat = tinyDb.getString("dateFormat");
if(!prModel.getUser().getFull_name().equals("")) { PicassoService.getInstance(context).get()
assigneeAvatar.setOnClickListener(new ClickListener(context.getResources().getString(R.string.prCreator) + prModel.getUser().getFull_name(), context)); .load(pullRequest.getUser().getAvatar_url())
} .placeholder(R.drawable.loader_animated)
else { .transform(new RoundedTransformation(8, 0))
assigneeAvatar.setOnClickListener(new ClickListener(context.getResources().getString(R.string.prCreator) + prModel.getUser().getLogin(), context)); .resize(120, 120)
} .centerCrop()
.into(this.assigneeAvatar);
if(prModel.getUser().getAvatar_url() != null) { this.pullRequest = pullRequest;
PicassoService.getInstance(context).get().load(prModel.getUser().getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(assigneeAvatar);
}
else {
PicassoService.getInstance(context).get().load(prModel.getUser().getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(assigneeAvatar);
}
String prNumber_ = "<font color='" + context.getResources().getColor(R.color.lightGray) + "'>" + context.getResources().getString(R.string.hash) + prModel.getNumber() + "</font>"; String prNumber_ = "<font color='" + ResourcesCompat.getColor(context.getResources(), R.color.lightGray, null) + "'>" + context.getResources().getString(R.string.hash) + pullRequest.getNumber() + "</font>";
prTitle.setText(Html.fromHtml(prNumber_ + " " + prModel.getTitle()));
prNumber.setText(String.valueOf(prModel.getNumber())); this.prTitle.setText(HtmlCompat.fromHtml(prNumber_ + " " + EmojiParser.parseToUnicode(pullRequest.getTitle()), HtmlCompat.FROM_HTML_MODE_LEGACY));
prMergeable.setText(String.valueOf(prModel.isMergeable())); this.prCommentsCount.setText(String.valueOf(pullRequest.getComments()));
if(prModel.getHead() != null) { this.prCreatedTime.setText(TimeHelper.formatTime(pullRequest.getCreated_at(), new Locale(locale), timeFormat, context));
prHeadBranch.setText(prModel.getHead().getRef());
if(prModel.getHead().getRepo() != null) {
prIsFork.setText(String.valueOf(prModel.getHead().getRepo().isFork()));
prForkFullName.setText(prModel.getHead().getRepo().getFull_name());
}
else {
// pull was done from a deleted fork
prIsFork.setText("true");
prForkFullName.setText(context.getString(R.string.prDeletedFrok));
}
}
prCommentsCount.setText(String.valueOf(prModel.getComments()));
prCreatedTime.setText(TimeHelper.formatTime(prModel.getCreated_at(), new Locale(locale), timeFormat, context));
if(timeFormat.equals("pretty")) { if(timeFormat.equals("pretty")) {
prCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(prModel.getCreated_at()), context)); this.prCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(pullRequest.getCreated_at()), context));
} }
} }
} }
static class LoadHolder extends RecyclerView.ViewHolder { static class LoadHolder extends RecyclerView.ViewHolder {

View File

@ -1,10 +1,6 @@
package org.mian.gitnex.adapters; package org.mian.gitnex.adapters;
import android.content.Context; import android.content.Context;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.text.Html;
import android.text.Spanned;
import android.text.method.LinkMovementMethod; import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -14,36 +10,19 @@ import android.widget.LinearLayout;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.text.HtmlCompat;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.vdurmont.emoji.EmojiParser; import org.gitnex.tea4j.models.Releases;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.ClickListener;
import org.mian.gitnex.helpers.Markdown;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.models.Releases;
import java.util.Collection;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects;
import io.noties.markwon.AbstractMarkwonPlugin;
import io.noties.markwon.Markwon;
import io.noties.markwon.core.CorePlugin;
import io.noties.markwon.core.MarkwonTheme;
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
import io.noties.markwon.ext.tables.TablePlugin;
import io.noties.markwon.ext.tasklist.TaskListPlugin;
import io.noties.markwon.html.HtmlPlugin;
import io.noties.markwon.image.DefaultMediaDecoder;
import io.noties.markwon.image.ImageItem;
import io.noties.markwon.image.ImagesPlugin;
import io.noties.markwon.image.SchemeHandler;
import io.noties.markwon.image.gif.GifMediaDecoder;
import io.noties.markwon.image.svg.SvgMediaDecoder;
import io.noties.markwon.linkify.LinkifyPlugin;
/** /**
* Author M M Arif * Author M M Arif
@ -111,7 +90,7 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
@Override @Override
public void onBindViewHolder(@NonNull ReleasesAdapter.ReleasesViewHolder holder, int position) { public void onBindViewHolder(@NonNull ReleasesAdapter.ReleasesViewHolder holder, int position) {
final TinyDB tinyDb = new TinyDB(mCtx); final TinyDB tinyDb = TinyDB.getInstance(mCtx);
final String locale = tinyDb.getString("locale"); final String locale = tinyDb.getString("locale");
final String timeFormat = tinyDb.getString("dateFormat"); final String timeFormat = tinyDb.getString("dateFormat");
@ -149,58 +128,8 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
holder.releaseDate.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getPublished_at()), mCtx)); holder.releaseDate.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getPublished_at()), mCtx));
} }
final Markwon markwon = Markwon.builder(Objects.requireNonNull(mCtx))
.usePlugin(CorePlugin.create())
.usePlugin(ImagesPlugin.create(plugin -> {
plugin.addSchemeHandler(new SchemeHandler() {
@NonNull
@Override
public ImageItem handle(@NonNull String raw, @NonNull Uri uri) {
final int resourceId = mCtx.getResources().getIdentifier(
raw.substring("drawable://".length()),
"drawable",
mCtx.getPackageName());
final Drawable drawable = mCtx.getDrawable(resourceId);
assert drawable != null;
return ImageItem.withResult(drawable);
}
@NonNull
@Override
public Collection<String> supportedSchemes() {
return Collections.singleton("drawable");
}
});
plugin.placeholderProvider(drawable -> null);
plugin.addMediaDecoder(GifMediaDecoder.create(false));
plugin.addMediaDecoder(SvgMediaDecoder.create(mCtx.getResources()));
plugin.addMediaDecoder(SvgMediaDecoder.create());
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(mCtx.getResources()));
plugin.defaultMediaDecoder(DefaultMediaDecoder.create());
}))
.usePlugin(new AbstractMarkwonPlugin() {
@Override
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
builder
.codeTextColor(tinyDb.getInt("codeBlockColor"))
.codeBackgroundColor(tinyDb.getInt("codeBlockBackground"))
.linkColor(mCtx.getResources().getColor(R.color.lightBlue));
}
})
.usePlugin(TablePlugin.create(mCtx))
.usePlugin(TaskListPlugin.create(mCtx))
.usePlugin(HtmlPlugin.create())
.usePlugin(StrikethroughPlugin.create())
.usePlugin(LinkifyPlugin.create())
.build();
Spanned bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(currentItem.getBody()));
if(!currentItem.getBody().equals("")) { if(!currentItem.getBody().equals("")) {
markwon.setParsedMarkdown(holder.releaseBodyContent, bodyWithMD); new Markdown(mCtx, currentItem.getBody(), holder.releaseBodyContent);
} }
else { else {
holder.releaseBodyContent.setText(R.string.noReleaseBodyContent); holder.releaseBodyContent.setText(R.string.noReleaseBodyContent);
@ -224,11 +153,11 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
}); });
holder.releaseZipDownload.setText( holder.releaseZipDownload.setText(
Html.fromHtml("<a href='" + currentItem.getZipball_url() + "'>" + mCtx.getResources().getString(R.string.zipArchiveDownloadReleasesTab) + "</a> ")); HtmlCompat.fromHtml("<a href='" + currentItem.getZipball_url() + "'>" + mCtx.getResources().getString(R.string.zipArchiveDownloadReleasesTab) + "</a> ", HtmlCompat.FROM_HTML_MODE_LEGACY));
holder.releaseZipDownload.setMovementMethod(LinkMovementMethod.getInstance()); holder.releaseZipDownload.setMovementMethod(LinkMovementMethod.getInstance());
holder.releaseTarDownload.setText( holder.releaseTarDownload.setText(
Html.fromHtml("<a href='" + currentItem.getTarball_url() + "'>" + mCtx.getResources().getString(R.string.tarArchiveDownloadReleasesTab) + "</a> ")); HtmlCompat.fromHtml("<a href='" + currentItem.getTarball_url() + "'>" + mCtx.getResources().getString(R.string.tarArchiveDownloadReleasesTab) + "</a> ", HtmlCompat.FROM_HTML_MODE_LEGACY));
holder.releaseTarDownload.setMovementMethod(LinkMovementMethod.getInstance()); holder.releaseTarDownload.setMovementMethod(LinkMovementMethod.getInstance());
ReleasesDownloadsAdapter adapter = new ReleasesDownloadsAdapter(currentItem.getAssets()); ReleasesDownloadsAdapter adapter = new ReleasesDownloadsAdapter(currentItem.getAssets());

View File

@ -1,15 +1,15 @@
package org.mian.gitnex.adapters; package org.mian.gitnex.adapters;
import android.text.Html;
import android.text.method.LinkMovementMethod; import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.text.HtmlCompat;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.gitnex.tea4j.models.Releases;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.models.Releases;
import java.util.List; import java.util.List;
/** /**
@ -53,7 +53,7 @@ public class ReleasesDownloadsAdapter extends RecyclerView.Adapter<ReleasesDownl
if(currentItem.getName() != null) { if(currentItem.getName() != null) {
holder.downloadName.setText( holder.downloadName.setText(
Html.fromHtml("<a href='" + currentItem.getBrowser_download_url() + "'>" + currentItem.getName() + "</a> ")); HtmlCompat.fromHtml("<a href='" + currentItem.getBrowser_download_url() + "'>" + currentItem.getName() + "</a> ", HtmlCompat.FROM_HTML_MODE_LEGACY));
holder.downloadName.setMovementMethod(LinkMovementMethod.getInstance()); holder.downloadName.setMovementMethod(LinkMovementMethod.getInstance());
} }

View File

@ -16,6 +16,8 @@ import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator; import com.amulyakhare.textdrawable.util.ColorGenerator;
import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.android.material.bottomsheet.BottomSheetDialog;
import org.gitnex.tea4j.models.UserRepositories;
import org.gitnex.tea4j.models.WatchInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.OpenRepoInBrowserActivity; import org.mian.gitnex.activities.OpenRepoInBrowserActivity;
import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.activities.RepoDetailActivity;
@ -29,8 +31,6 @@ import org.mian.gitnex.database.models.Repository;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.UserRepositories;
import org.mian.gitnex.models.WatchInfo;
import java.util.List; import java.util.List;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
@ -211,7 +211,7 @@ public class RepoForksAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
Intent intent = new Intent(context, RepoDetailActivity.class); Intent intent = new Intent(context, RepoDetailActivity.class);
intent.putExtra("repoFullName", repoFullName.getText().toString()); intent.putExtra("repoFullName", repoFullName.getText().toString());
TinyDB tinyDb = new TinyDB(context); TinyDB tinyDb = TinyDB.getInstance(context);
tinyDb.putString("repoFullName", repoFullName.getText().toString()); tinyDb.putString("repoFullName", repoFullName.getText().toString());
tinyDb.putString("repoType", repoType_.getText().toString()); tinyDb.putString("repoType", repoType_.getText().toString());
//tinyDb.putBoolean("resumeIssues", true); //tinyDb.putBoolean("resumeIssues", true);
@ -244,14 +244,13 @@ public class RepoForksAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
//store if user is watching this repo //store if user is watching this repo
{ {
final String instanceUrl = tinyDb.getString("instanceUrl");
final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token"); final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token");
WatchInfo watch = new WatchInfo(); WatchInfo watch = new WatchInfo();
Call<WatchInfo> call; Call<WatchInfo> call;
call = RetrofitClient.getInstance(instanceUrl, context).getApiInterface().checkRepoWatchStatus(token, repoOwner, repoName); call = RetrofitClient.getApiInterface(context).checkRepoWatchStatus(token, repoOwner, repoName);
call.enqueue(new Callback<WatchInfo>() { call.enqueue(new Callback<WatchInfo>() {

View File

@ -9,11 +9,11 @@ import android.view.ViewGroup;
import android.widget.BaseAdapter; import android.widget.BaseAdapter;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.models.UserInfo;
import java.util.List; import java.util.List;
/** /**
@ -81,7 +81,7 @@ public class RepoStargazersAdapter extends BaseAdapter {
UserInfo currentItem = stargazersList.get(position); UserInfo currentItem = stargazersList.get(position);
PicassoService.getInstance(mCtx).get().load(currentItem.getAvatar()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(180, 180).centerCrop().into(viewHolder.memberAvatar); PicassoService.getInstance(mCtx).get().load(currentItem.getAvatar()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(180, 180).centerCrop().into(viewHolder.memberAvatar);
final TinyDB tinyDb = new TinyDB(mCtx); final TinyDB tinyDb = TinyDB.getInstance(mCtx);
Typeface myTypeface; Typeface myTypeface;
switch(tinyDb.getInt("customFontId", -1)) { switch(tinyDb.getInt("customFontId", -1)) {

View File

@ -9,11 +9,11 @@ import android.view.ViewGroup;
import android.widget.BaseAdapter; import android.widget.BaseAdapter;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.models.UserInfo;
import java.util.List; import java.util.List;
/** /**
@ -81,7 +81,7 @@ public class RepoWatchersAdapter extends BaseAdapter {
UserInfo currentItem = watchersList.get(position); UserInfo currentItem = watchersList.get(position);
PicassoService.getInstance(mCtx).get().load(currentItem.getAvatar()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(180, 180).centerCrop().into(viewHolder.memberAvatar); PicassoService.getInstance(mCtx).get().load(currentItem.getAvatar()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(180, 180).centerCrop().into(viewHolder.memberAvatar);
final TinyDB tinyDb = new TinyDB(mCtx); final TinyDB tinyDb = TinyDB.getInstance(mCtx);
Typeface myTypeface; Typeface myTypeface;
switch(tinyDb.getInt("customFontId", -1)) { switch(tinyDb.getInt("customFontId", -1)) {

View File

@ -20,12 +20,14 @@ import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator; import com.amulyakhare.textdrawable.util.ColorGenerator;
import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.android.material.bottomsheet.BottomSheetDialog;
import org.gitnex.tea4j.models.UserRepositories;
import org.gitnex.tea4j.models.WatchInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.OpenRepoInBrowserActivity; import org.mian.gitnex.activities.OpenRepoInBrowserActivity;
import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.activities.RepoDetailActivity;
import org.mian.gitnex.activities.RepoForksActivity;
import org.mian.gitnex.activities.RepoStargazersActivity; import org.mian.gitnex.activities.RepoStargazersActivity;
import org.mian.gitnex.activities.RepoWatchersActivity; import org.mian.gitnex.activities.RepoWatchersActivity;
import org.mian.gitnex.activities.RepoForksActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.database.api.RepositoriesApi; import org.mian.gitnex.database.api.RepositoriesApi;
@ -33,8 +35,6 @@ import org.mian.gitnex.database.models.Repository;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.UserRepositories;
import org.mian.gitnex.models.WatchInfo;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@ -94,7 +94,7 @@ public class ReposListAdapter extends RecyclerView.Adapter<ReposListAdapter.Repo
Intent intent = new Intent(context, RepoDetailActivity.class); Intent intent = new Intent(context, RepoDetailActivity.class);
intent.putExtra("repoFullName", repoFullName.getText().toString()); intent.putExtra("repoFullName", repoFullName.getText().toString());
TinyDB tinyDb = new TinyDB(context); TinyDB tinyDb = TinyDB.getInstance(context);
tinyDb.putString("repoFullName", repoFullName.getText().toString()); tinyDb.putString("repoFullName", repoFullName.getText().toString());
tinyDb.putString("repoType", repoType_.getText().toString()); tinyDb.putString("repoType", repoType_.getText().toString());
//tinyDb.putBoolean("resumeIssues", true); //tinyDb.putBoolean("resumeIssues", true);
@ -127,14 +127,13 @@ public class ReposListAdapter extends RecyclerView.Adapter<ReposListAdapter.Repo
//store if user is watching this repo //store if user is watching this repo
{ {
final String instanceUrl = tinyDb.getString("instanceUrl");
final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token"); final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token");
WatchInfo watch = new WatchInfo(); WatchInfo watch = new WatchInfo();
Call<WatchInfo> call; Call<WatchInfo> call;
call = RetrofitClient.getInstance(instanceUrl, context).getApiInterface().checkRepoWatchStatus(token, repoOwner, repoName); call = RetrofitClient.getApiInterface(context).checkRepoWatchStatus(token, repoOwner, repoName);
call.enqueue(new Callback<WatchInfo>() { call.enqueue(new Callback<WatchInfo>() {
@ -294,7 +293,7 @@ public class ReposListAdapter extends RecyclerView.Adapter<ReposListAdapter.Repo
} }
holder.fullName.setText(currentItem.getFullName()); holder.fullName.setText(currentItem.getFullName());
if(currentItem.getPrivateFlag()) { if(currentItem.getPrivateFlag()) {
holder.repoPrivatePublic.setImageResource(R.drawable.ic_lock); holder.repoPrivatePublic.setVisibility(View.VISIBLE);
holder.repoType.setText(R.string.strPrivate); holder.repoType.setText(R.string.strPrivate);
} }
else { else {

View File

@ -20,12 +20,14 @@ import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator; import com.amulyakhare.textdrawable.util.ColorGenerator;
import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.android.material.bottomsheet.BottomSheetDialog;
import org.gitnex.tea4j.models.UserRepositories;
import org.gitnex.tea4j.models.WatchInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.OpenRepoInBrowserActivity; import org.mian.gitnex.activities.OpenRepoInBrowserActivity;
import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.activities.RepoDetailActivity;
import org.mian.gitnex.activities.RepoForksActivity;
import org.mian.gitnex.activities.RepoStargazersActivity; import org.mian.gitnex.activities.RepoStargazersActivity;
import org.mian.gitnex.activities.RepoWatchersActivity; import org.mian.gitnex.activities.RepoWatchersActivity;
import org.mian.gitnex.activities.RepoForksActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.database.api.RepositoriesApi; import org.mian.gitnex.database.api.RepositoriesApi;
@ -33,8 +35,6 @@ import org.mian.gitnex.database.models.Repository;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.UserRepositories;
import org.mian.gitnex.models.WatchInfo;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@ -91,7 +91,7 @@ public class RepositoriesByOrgAdapter extends RecyclerView.Adapter<RepositoriesB
Intent intent = new Intent(context, RepoDetailActivity.class); Intent intent = new Intent(context, RepoDetailActivity.class);
intent.putExtra("repoFullName", fullName.getText().toString()); intent.putExtra("repoFullName", fullName.getText().toString());
TinyDB tinyDb = new TinyDB(context); TinyDB tinyDb = TinyDB.getInstance(context);
tinyDb.putString("repoFullName", fullName.getText().toString()); tinyDb.putString("repoFullName", fullName.getText().toString());
tinyDb.putString("repoType", repoType.getText().toString()); tinyDb.putString("repoType", repoType.getText().toString());
//tinyDb.putBoolean("resumeIssues", true); //tinyDb.putBoolean("resumeIssues", true);
@ -124,12 +124,11 @@ public class RepositoriesByOrgAdapter extends RecyclerView.Adapter<RepositoriesB
//store if user is watching this repo //store if user is watching this repo
{ {
final String instanceUrl = tinyDb.getString("instanceUrl");
final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token"); final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token");
Call<WatchInfo> call; Call<WatchInfo> call;
call = RetrofitClient.getInstance(instanceUrl, context).getApiInterface().checkRepoWatchStatus(token, repoOwner, repoName); call = RetrofitClient.getApiInterface(context).checkRepoWatchStatus(token, repoOwner, repoName);
call.enqueue(new Callback<WatchInfo>() { call.enqueue(new Callback<WatchInfo>() {
@ -294,7 +293,7 @@ public class RepositoriesByOrgAdapter extends RecyclerView.Adapter<RepositoriesB
} }
holder.fullName.setText(currentItem.getFullName()); holder.fullName.setText(currentItem.getFullName());
if(currentItem.getPrivateFlag()) { if(currentItem.getPrivateFlag()) {
holder.repoPrivatePublic.setImageResource(R.drawable.ic_lock); holder.repoPrivatePublic.setVisibility(View.VISIBLE);
holder.repoType.setText(R.string.strPrivate); holder.repoType.setText(R.string.strPrivate);
} }
else { else {
@ -329,7 +328,7 @@ public class RepositoriesByOrgAdapter extends RecyclerView.Adapter<RepositoriesB
return orgReposFilter; return orgReposFilter;
} }
private Filter orgReposFilter = new Filter() { private final Filter orgReposFilter = new Filter() {
@Override @Override
protected FilterResults performFiltering(CharSequence constraint) { protected FilterResults performFiltering(CharSequence constraint) {
List<UserRepositories> filteredList = new ArrayList<>(); List<UserRepositories> filteredList = new ArrayList<>();

View File

@ -2,24 +2,26 @@ package org.mian.gitnex.adapters;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.content.res.ResourcesCompat;
import androidx.core.text.HtmlCompat;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.gitnex.tea4j.models.Issues;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.IssueDetailActivity; import org.mian.gitnex.activities.IssueDetailActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.database.api.RepositoriesApi; import org.mian.gitnex.database.api.RepositoriesApi;
import org.mian.gitnex.database.models.Repository; import org.mian.gitnex.database.models.Repository;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.ClickListener; import org.mian.gitnex.helpers.ClickListener;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TimeHelper;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.models.Issues;
import org.ocpsoft.prettytime.PrettyTime; import org.ocpsoft.prettytime.PrettyTime;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -32,50 +34,48 @@ import java.util.Locale;
public class SearchIssuesAdapter extends RecyclerView.Adapter<SearchIssuesAdapter.SearchViewHolder> { public class SearchIssuesAdapter extends RecyclerView.Adapter<SearchIssuesAdapter.SearchViewHolder> {
private List<Issues> searchedList; private final List<Issues> searchedList;
private Context mCtx; private final Context mCtx;
private TinyDB tinyDb; private final TinyDB tinyDb;
public SearchIssuesAdapter(List<Issues> dataList, Context mCtx) { public SearchIssuesAdapter(List<Issues> dataList, Context mCtx) {
this.mCtx = mCtx; this.mCtx = mCtx;
this.searchedList = dataList; this.searchedList = dataList;
this.tinyDb = new TinyDB(mCtx); this.tinyDb = TinyDB.getInstance(mCtx);
} }
class SearchViewHolder extends RecyclerView.ViewHolder { class SearchViewHolder extends RecyclerView.ViewHolder {
private TextView issueNumber; private Issues issue;
private ImageView issueAssigneeAvatar;
private TextView issueTitle; private final ImageView issueAssigneeAvatar;
private TextView issueCreatedTime; private final TextView issueTitle;
private TextView issueCommentsCount; private final TextView issueCreatedTime;
private TextView repoFullName; private final TextView issueCommentsCount;
private SearchViewHolder(View itemView) { private SearchViewHolder(View itemView) {
super(itemView); super(itemView);
issueNumber = itemView.findViewById(R.id.issueNumber);
issueAssigneeAvatar = itemView.findViewById(R.id.assigneeAvatar); issueAssigneeAvatar = itemView.findViewById(R.id.assigneeAvatar);
issueTitle = itemView.findViewById(R.id.issueTitle); issueTitle = itemView.findViewById(R.id.issueTitle);
issueCommentsCount = itemView.findViewById(R.id.issueCommentsCount); issueCommentsCount = itemView.findViewById(R.id.issueCommentsCount);
issueCreatedTime = itemView.findViewById(R.id.issueCreatedTime); issueCreatedTime = itemView.findViewById(R.id.issueCreatedTime);
repoFullName = itemView.findViewById(R.id.repoFullName);
issueTitle.setOnClickListener(v -> { issueTitle.setOnClickListener(v -> {
Context context = v.getContext(); Context context = v.getContext();
Intent intent = new Intent(context, IssueDetailActivity.class); Intent intent = new Intent(context, IssueDetailActivity.class);
intent.putExtra("issueNumber", issueNumber.getText()); intent.putExtra("issueNumber", issue.getNumber());
tinyDb.putString("issueNumber", issueNumber.getText().toString()); tinyDb.putString("issueNumber", String.valueOf(issue.getNumber()));
tinyDb.putString("issueType", "Issue"); tinyDb.putString("issueType", "Issue");
tinyDb.putString("repoFullName", repoFullName.getText().toString()); tinyDb.putString("repoFullName", issue.getRepository().getFull_name());
String[] parts = repoFullName.getText().toString().split("/"); String[] parts = issue.getRepository().getFull_name().split("/");
final String repoOwner = parts[0]; final String repoOwner = parts[0];
final String repoName = parts[1]; final String repoName = parts[1];
@ -99,8 +99,14 @@ public class SearchIssuesAdapter extends RecyclerView.Adapter<SearchIssuesAdapte
context.startActivity(intent); context.startActivity(intent);
}); });
}
issueAssigneeAvatar.setOnClickListener(v -> {
Context context = v.getContext();
String userLoginId = issue.getUser().getLogin();
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
});
}
} }
@NonNull @NonNull
@ -119,22 +125,19 @@ public class SearchIssuesAdapter extends RecyclerView.Adapter<SearchIssuesAdapte
String locale = tinyDb.getString("locale"); String locale = tinyDb.getString("locale");
String timeFormat = tinyDb.getString("dateFormat"); String timeFormat = tinyDb.getString("dateFormat");
if(!currentItem.getUser().getFull_name().equals("")) { PicassoService.getInstance(mCtx).get()
holder.issueAssigneeAvatar.setOnClickListener(new ClickListener(mCtx.getResources().getString(R.string.issueCreator) + currentItem.getUser().getFull_name(), mCtx)); .load(currentItem.getUser().getAvatar_url())
} .placeholder(R.drawable.loader_animated)
else { .transform(new RoundedTransformation(8, 0))
holder.issueAssigneeAvatar.setOnClickListener(new ClickListener(mCtx.getResources().getString(R.string.issueCreator) + currentItem.getUser().getLogin(), mCtx)); .resize(120, 120)
} .centerCrop()
.into(holder.issueAssigneeAvatar);
PicassoService String issueNumber_ = "<font color='" + ResourcesCompat.getColor(mCtx.getResources(), R.color.lightGray, null) + "'>" + currentItem.getRepository().getFull_name() + mCtx.getResources().getString(R.string.hash) + currentItem.getNumber() + "</font>";
.getInstance(mCtx).get().load(currentItem.getUser().getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(holder.issueAssigneeAvatar);
String issueNumber_ = "<font color='" + mCtx.getResources().getColor(R.color.lightGray) + "'>" + currentItem.getRepository().getFull_name() + mCtx.getResources().getString(R.string.hash) + currentItem.getNumber() + "</font>"; holder.issue = currentItem;
holder.issueTitle.setText(Html.fromHtml(issueNumber_ + " " + currentItem.getTitle())); holder.issueTitle.setText(HtmlCompat.fromHtml(issueNumber_ + " " + currentItem.getTitle(), HtmlCompat.FROM_HTML_MODE_LEGACY));
holder.issueNumber.setText(String.valueOf(currentItem.getNumber()));
holder.issueCommentsCount.setText(String.valueOf(currentItem.getComments())); holder.issueCommentsCount.setText(String.valueOf(currentItem.getComments()));
holder.repoFullName.setText(currentItem.getRepository().getFull_name());
switch(timeFormat) { switch(timeFormat) {
case "pretty": { case "pretty": {

View File

@ -20,12 +20,14 @@ import androidx.recyclerview.widget.RecyclerView;
import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator; import com.amulyakhare.textdrawable.util.ColorGenerator;
import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.android.material.bottomsheet.BottomSheetDialog;
import org.gitnex.tea4j.models.UserRepositories;
import org.gitnex.tea4j.models.WatchInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.activities.OpenRepoInBrowserActivity; import org.mian.gitnex.activities.OpenRepoInBrowserActivity;
import org.mian.gitnex.activities.RepoDetailActivity; import org.mian.gitnex.activities.RepoDetailActivity;
import org.mian.gitnex.activities.RepoForksActivity;
import org.mian.gitnex.activities.RepoStargazersActivity; import org.mian.gitnex.activities.RepoStargazersActivity;
import org.mian.gitnex.activities.RepoWatchersActivity; import org.mian.gitnex.activities.RepoWatchersActivity;
import org.mian.gitnex.activities.RepoForksActivity;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.clients.RetrofitClient; import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.database.api.RepositoriesApi; import org.mian.gitnex.database.api.RepositoriesApi;
@ -33,8 +35,6 @@ import org.mian.gitnex.database.models.Repository;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.models.UserRepositories;
import org.mian.gitnex.models.WatchInfo;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@ -91,7 +91,7 @@ public class StarredReposListAdapter extends RecyclerView.Adapter<StarredReposLi
Intent intent = new Intent(context, RepoDetailActivity.class); Intent intent = new Intent(context, RepoDetailActivity.class);
intent.putExtra("repoFullName", fullName.getText().toString()); intent.putExtra("repoFullName", fullName.getText().toString());
TinyDB tinyDb = new TinyDB(context); TinyDB tinyDb = TinyDB.getInstance(context);
tinyDb.putString("repoFullName", fullName.getText().toString()); tinyDb.putString("repoFullName", fullName.getText().toString());
tinyDb.putString("repoType", repoType.getText().toString()); tinyDb.putString("repoType", repoType.getText().toString());
//tinyDb.putBoolean("resumeIssues", true); //tinyDb.putBoolean("resumeIssues", true);
@ -124,14 +124,13 @@ public class StarredReposListAdapter extends RecyclerView.Adapter<StarredReposLi
//store if user is watching this repo //store if user is watching this repo
{ {
final String instanceUrl = tinyDb.getString("instanceUrl");
final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token"); final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token");
WatchInfo watch = new WatchInfo(); WatchInfo watch = new WatchInfo();
Call<WatchInfo> call; Call<WatchInfo> call;
call = RetrofitClient.getInstance(instanceUrl, context).getApiInterface().checkRepoWatchStatus(token, repoOwner, repoName); call = RetrofitClient.getApiInterface(context).checkRepoWatchStatus(token, repoOwner, repoName);
call.enqueue(new Callback<WatchInfo>() { call.enqueue(new Callback<WatchInfo>() {
@ -297,7 +296,7 @@ public class StarredReposListAdapter extends RecyclerView.Adapter<StarredReposLi
} }
holder.fullName.setText(currentItem.getFullName()); holder.fullName.setText(currentItem.getFullName());
if(currentItem.getPrivateFlag()) { if(currentItem.getPrivateFlag()) {
holder.repoPrivatePublic.setImageResource(R.drawable.ic_lock); holder.repoPrivatePublic.setVisibility(View.VISIBLE);
holder.repoType.setText(R.string.strPrivate); holder.repoType.setText(R.string.strPrivate);
} }
else { else {

View File

@ -3,17 +3,19 @@ package org.mian.gitnex.adapters;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.text.Html;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.BaseAdapter; import android.widget.BaseAdapter;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import org.gitnex.tea4j.models.UserInfo;
import org.mian.gitnex.R; import org.mian.gitnex.R;
import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.PicassoService;
import org.mian.gitnex.helpers.AppUtil;
import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.RoundedTransformation;
import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.helpers.TinyDB;
import org.mian.gitnex.models.UserInfo;
import java.util.List; import java.util.List;
/** /**
@ -22,24 +24,34 @@ import java.util.List;
public class TeamMembersByOrgAdapter extends BaseAdapter { public class TeamMembersByOrgAdapter extends BaseAdapter {
private List<UserInfo> teamMembersList; private final List<UserInfo> teamMembersList;
private Context mCtx; private final Context mCtx;
private static class ViewHolder { private static class ViewHolder {
private ImageView memberAvatar; private String userLoginId;
private TextView memberName;
private final ImageView memberAvatar;
private final TextView memberName;
ViewHolder(View v) { ViewHolder(View v) {
memberAvatar = v.findViewById(R.id.memberAvatar); memberAvatar = v.findViewById(R.id.memberAvatar);
memberName = v.findViewById(R.id.memberName); memberName = v.findViewById(R.id.memberName);
memberAvatar.setOnClickListener(loginId -> {
Context context = loginId.getContext();
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
});
} }
} }
public TeamMembersByOrgAdapter(Context mCtx, List<UserInfo> membersListMain) { public TeamMembersByOrgAdapter(Context mCtx, List<UserInfo> membersListMain) {
this.mCtx = mCtx; this.mCtx = mCtx;
this.teamMembersList = membersListMain; this.teamMembersList = membersListMain;
} }
@Override @Override
@ -64,17 +76,18 @@ public class TeamMembersByOrgAdapter extends BaseAdapter {
TeamMembersByOrgAdapter.ViewHolder viewHolder = null; TeamMembersByOrgAdapter.ViewHolder viewHolder = null;
if (finalView == null) { if (finalView == null) {
finalView = LayoutInflater.from(mCtx).inflate(R.layout.list_members_by_team_by_org, null); finalView = LayoutInflater.from(mCtx).inflate(R.layout.list_members_by_team_by_org, null);
viewHolder = new ViewHolder(finalView); viewHolder = new ViewHolder(finalView);
finalView.setTag(viewHolder); finalView.setTag(viewHolder);
} }
else { else {
viewHolder = (TeamMembersByOrgAdapter.ViewHolder) finalView.getTag(); viewHolder = (TeamMembersByOrgAdapter.ViewHolder) finalView.getTag();
} }
initData(viewHolder, position); initData(viewHolder, position);
return finalView; return finalView;
} }
private void initData(TeamMembersByOrgAdapter.ViewHolder viewHolder, int position) { private void initData(TeamMembersByOrgAdapter.ViewHolder viewHolder, int position) {
@ -82,7 +95,9 @@ public class TeamMembersByOrgAdapter extends BaseAdapter {
UserInfo currentItem = teamMembersList.get(position); UserInfo currentItem = teamMembersList.get(position);
PicassoService.getInstance(mCtx).get().load(currentItem.getAvatar()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(180, 180).centerCrop().into(viewHolder.memberAvatar); PicassoService.getInstance(mCtx).get().load(currentItem.getAvatar()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(180, 180).centerCrop().into(viewHolder.memberAvatar);
final TinyDB tinyDb = new TinyDB(mCtx); viewHolder.userLoginId = currentItem.getLogin();
final TinyDB tinyDb = TinyDB.getInstance(mCtx);
Typeface myTypeface; Typeface myTypeface;
switch(tinyDb.getInt("customFontId", -1)) { switch(tinyDb.getInt("customFontId", -1)) {
@ -102,13 +117,14 @@ public class TeamMembersByOrgAdapter extends BaseAdapter {
} }
if(!currentItem.getFullname().equals("")) { if(!currentItem.getFullname().equals("")) {
viewHolder.memberName.setText(currentItem.getFullname());
viewHolder.memberName.setTypeface(myTypeface); viewHolder.memberName.setText(Html.fromHtml(currentItem.getFullname()));
} }
else { else {
viewHolder.memberName.setText(currentItem.getLogin()); viewHolder.memberName.setText(currentItem.getLogin());
viewHolder.memberName.setTypeface(myTypeface);
} }
viewHolder.memberName.setTypeface(myTypeface);
} }
} }

View File

@ -8,13 +8,13 @@ import android.view.ViewGroup;
import android.widget.Filter; import android.widget.Filter;
import android.widget.Filterable; import android.widget.Filterable;
import android.widget.TextView; import android.widget.TextView;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.OrganizationTeamMembersActivity;
import org.mian.gitnex.models.Teams;
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.gitnex.tea4j.models.Teams;
import org.mian.gitnex.R;
import org.mian.gitnex.activities.OrganizationTeamMembersActivity;
import java.util.ArrayList;
import java.util.List;
/** /**
* Author M M Arif * Author M M Arif

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