Merge branch 'main' into 7-assign-team-to-repo
This commit is contained in:
commit
6a6ecd251a
@ -15,8 +15,8 @@ steps:
|
|||||||
image: zosiab/eclint:latest
|
image: zosiab/eclint:latest
|
||||||
depends_on: [ clone ]
|
depends_on: [ clone ]
|
||||||
commands:
|
commands:
|
||||||
- git pull origin master
|
- git pull origin main
|
||||||
- eclint check $(git diff --name-only origin/master)
|
- eclint check $(git diff --name-only origin/main)
|
||||||
|
|
||||||
# This may be used in the future, because it makes of intellij's native code inspection/formatting capabilities.
|
# This may be used in the future, because it makes of intellij's native code inspection/formatting capabilities.
|
||||||
# Additional information: https://www.jetbrains.com/help/idea/command-line-formatter.html
|
# Additional information: https://www.jetbrains.com/help/idea/command-line-formatter.html
|
||||||
@ -54,7 +54,7 @@ trigger:
|
|||||||
event:
|
event:
|
||||||
- push
|
- push
|
||||||
branch:
|
branch:
|
||||||
- master
|
- main
|
||||||
|
|
||||||
---
|
---
|
||||||
kind: pipeline
|
kind: pipeline
|
||||||
@ -101,4 +101,4 @@ trigger:
|
|||||||
event:
|
event:
|
||||||
- push
|
- push
|
||||||
branch:
|
branch:
|
||||||
- master
|
- main
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
<!-- Screenshots and stacktrace's can go here. -->
|
<!-- Screenshots and stacktrace's can go here. -->
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
- [ ] I carefully read the [contribution guidelines](https://codeberg.org/GitNex/GitNex/src/branch/master/CONTRIBUTING.md).
|
- [ ] I carefully read the [contribution guidelines](https://codeberg.org/GitNex/GitNex/src/branch/main/CONTRIBUTING.md).
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
#### Thank you for your time.
|
#### Thank you for your time.
|
@ -2,8 +2,8 @@
|
|||||||
<!-- Create a new issue, if it doesn't exist yet -->
|
<!-- Create a new issue, if it doesn't exist yet -->
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|
||||||
<!-- Make sure you are targeting the master branch, pull requests on release branches are only allowed for bug fixes. -->
|
<!-- Make sure you are targeting the "main" branch, pull requests on release branches are only allowed for bug fixes. -->
|
||||||
|
|
||||||
- [ ] I carefully read the [contribution guidelines](https://codeberg.org/GitNex/GitNex/src/branch/master/CONTRIBUTING.md).
|
- [ ] I carefully read the [contribution guidelines](https://codeberg.org/GitNex/GitNex/src/branch/main/CONTRIBUTING.md).
|
||||||
- [ ] I'm following the code standards as defined [here](https://codeberg.org/gitnex/GitNex/wiki/Code-Standards).
|
- [ ] I'm following the code standards as defined [here](https://codeberg.org/gitnex/GitNex/wiki/Code-Standards).
|
||||||
- [ ] By submitting this pull request, I permit GitNex to license my work under the [GNU General Public License v3](https://codeberg.org/GitNex/GitNex/src/branch/master/LICENSE).
|
- [ ] By submitting this pull request, I permit GitNex to license my work under the [GNU General Public License v3](https://codeberg.org/GitNex/GitNex/src/branch/main/LICENSE).
|
@ -4,10 +4,10 @@ stages:
|
|||||||
- publish
|
- publish
|
||||||
|
|
||||||
on_setup:
|
on_setup:
|
||||||
image: tutum/curl
|
image: curlimages/curl:7.77.0
|
||||||
stage: .pre
|
stage: .pre
|
||||||
only:
|
only:
|
||||||
- master
|
- main
|
||||||
- tags
|
- tags
|
||||||
variables:
|
variables:
|
||||||
INSTANCE: "https://codeberg.org"
|
INSTANCE: "https://codeberg.org"
|
||||||
@ -20,7 +20,7 @@ build:
|
|||||||
image: nextcloudci/android:android-54
|
image: nextcloudci/android:android-54
|
||||||
stage: build
|
stage: build
|
||||||
only:
|
only:
|
||||||
- master
|
- main
|
||||||
- tags
|
- tags
|
||||||
script:
|
script:
|
||||||
- ./gradlew assembleFreeRelease
|
- ./gradlew assembleFreeRelease
|
||||||
@ -33,7 +33,7 @@ sign:
|
|||||||
image: nextcloudci/android:android-54
|
image: nextcloudci/android:android-54
|
||||||
stage: sign
|
stage: sign
|
||||||
only:
|
only:
|
||||||
- master
|
- main
|
||||||
- tags
|
- tags
|
||||||
variables:
|
variables:
|
||||||
OUTPUT: "signed.apk"
|
OUTPUT: "signed.apk"
|
||||||
@ -47,10 +47,10 @@ sign:
|
|||||||
expire_in: 15 minutes
|
expire_in: 15 minutes
|
||||||
|
|
||||||
latest:
|
latest:
|
||||||
image: tutum/curl
|
image: curlimages/curl:7.77.0
|
||||||
stage: publish
|
stage: publish
|
||||||
only:
|
only:
|
||||||
- master
|
- main
|
||||||
- tags
|
- tags
|
||||||
variables:
|
variables:
|
||||||
WEBDAV_USERNAME: "GitNexBot"
|
WEBDAV_USERNAME: "GitNexBot"
|
||||||
@ -60,7 +60,7 @@ latest:
|
|||||||
- curl -T "$PLUGIN_FILE" -u "$WEBDAV_USERNAME":"$WEBDAV_PASSWORD" "$PLUGIN_DESTINATION"
|
- curl -T "$PLUGIN_FILE" -u "$WEBDAV_USERNAME":"$WEBDAV_PASSWORD" "$PLUGIN_DESTINATION"
|
||||||
|
|
||||||
release:
|
release:
|
||||||
image: tutum/curl
|
image: curlimages/curl:7.77.0
|
||||||
stage: publish
|
stage: publish
|
||||||
only:
|
only:
|
||||||
- tags
|
- tags
|
||||||
@ -72,10 +72,10 @@ release:
|
|||||||
- curl -T "$PLUGIN_FILE" -u "$WEBDAV_USERNAME":"$WEBDAV_PASSWORD" 'https://cloud.swatian.com/remote.php/dav/files/GitNexBot/gitnex/releases/'"$CI_COMMIT_REF_NAME"'.apk'
|
- curl -T "$PLUGIN_FILE" -u "$WEBDAV_USERNAME":"$WEBDAV_PASSWORD" 'https://cloud.swatian.com/remote.php/dav/files/GitNexBot/gitnex/releases/'"$CI_COMMIT_REF_NAME"'.apk'
|
||||||
|
|
||||||
on_success:
|
on_success:
|
||||||
image: tutum/curl
|
image: curlimages/curl:7.77.0
|
||||||
stage: .post
|
stage: .post
|
||||||
only:
|
only:
|
||||||
- master
|
- main
|
||||||
- tags
|
- tags
|
||||||
variables:
|
variables:
|
||||||
INSTANCE: "https://codeberg.org"
|
INSTANCE: "https://codeberg.org"
|
||||||
@ -86,10 +86,10 @@ on_success:
|
|||||||
when: on_success
|
when: on_success
|
||||||
|
|
||||||
on_failure:
|
on_failure:
|
||||||
image: tutum/curl
|
image: curlimages/curl:7.77.0
|
||||||
stage: .post
|
stage: .post
|
||||||
only:
|
only:
|
||||||
- master
|
- main
|
||||||
- tags
|
- tags
|
||||||
variables:
|
variables:
|
||||||
INSTANCE: "https://codeberg.org"
|
INSTANCE: "https://codeberg.org"
|
||||||
|
@ -29,7 +29,7 @@ It is documented in the Wiki: [Code-Standards](https://codeberg.org/gitnex/GitNe
|
|||||||
2. Clone the forked repository from your namespace to your local machine.
|
2. Clone the forked repository from your namespace to your local machine.
|
||||||
3. Create a new branch and work on your feature, enhancement or patch.
|
3. Create a new branch and work on your feature, enhancement or patch.
|
||||||
4. Push your commits to your forked version.
|
4. Push your commits to your forked version.
|
||||||
5. You can now create a PR using the web interface against **master** branch.
|
5. You can now create a PR using the web interface against **main** branch.
|
||||||
|
|
||||||
For more information, click [here](http://makeapullrequest.com/).
|
For more information, click [here](http://makeapullrequest.com/).
|
||||||
|
|
||||||
|
10
README.md
10
README.md
@ -1,4 +1,4 @@
|
|||||||
[](https://www.gnu.org/licenses/gpl-3.0) [](https://gitlab.com/opyale/gitnex/-/pipelines) [](https://codeberg.org/gitnex/GitNex/releases) [](https://crowdin.com/project/gitnex) [](https://discord.gg/FbSS4rf)
|
[](https://www.gnu.org/licenses/gpl-3.0) [](https://gitlab.com/opyale/gitnex/-/pipelines) [](https://codeberg.org/gitnex/GitNex/releases) [](https://crowdin.com/project/gitnex) [](https://discord.gg/FbSS4rf)
|
||||||
|
|
||||||
[<img alt="Become a Patroen" src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" height="40"/>](https://www.patreon.com/mmarif)
|
[<img alt="Become a Patroen" src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" height="40"/>](https://www.patreon.com/mmarif)
|
||||||
|
|
||||||
@ -11,7 +11,7 @@ GitNex is licensed under GPLv3 License. See the LICENSE file for the full licens
|
|||||||
## Downloads
|
## Downloads
|
||||||
[<img alt='Get it on F-droid' src='https://gitlab.com/fdroid/artwork/raw/master/badge/get-it-on.png' height="80"/>](https://f-droid.org/en/packages/org.mian.gitnex/)
|
[<img alt='Get it on F-droid' src='https://gitlab.com/fdroid/artwork/raw/master/badge/get-it-on.png' height="80"/>](https://f-droid.org/en/packages/org.mian.gitnex/)
|
||||||
[<img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png' height="80"/>](https://play.google.com/store/apps/details?id=org.mian.gitnex.pro)
|
[<img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png' height="80"/>](https://play.google.com/store/apps/details?id=org.mian.gitnex.pro)
|
||||||
[<img alt='Download builds and releases' src='https://codeberg.org/gitnex/GitNex/raw/branch/master/assets/apk-badge.png' height="82"/>](https://cloud.swatian.com/s/DN7E5xxtaw4fRbE)
|
[<img alt='Download builds and releases' src='https://codeberg.org/gitnex/GitNex/raw/branch/main/assets/apk-badge.png' height="82"/>](https://cloud.swatian.com/s/DN7E5xxtaw4fRbE)
|
||||||
|
|
||||||
## Note about Gitea version
|
## Note about Gitea version
|
||||||
Please make sure that you are on latest stable release or later for better app experience.
|
Please make sure that you are on latest stable release or later for better app experience.
|
||||||
@ -37,7 +37,7 @@ Option 2 - Open terminal(Linux) and cd to the project dir. Run `./gradlew assemb
|
|||||||
- [MANY MORE](https://codeberg.org/gitnex/GitNex/wiki/Features)
|
- [MANY MORE](https://codeberg.org/gitnex/GitNex/wiki/Features)
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
[CONTRIBUTING](https://codeberg.org/gitnex/GitNex/src/branch/master/CONTRIBUTING.md)
|
[CONTRIBUTING](https://codeberg.org/gitnex/GitNex/src/branch/main/CONTRIBUTING.md)
|
||||||
|
|
||||||
## Translation
|
## Translation
|
||||||
Help us translate GitNex to your native language.
|
Help us translate GitNex to your native language.
|
||||||
@ -48,9 +48,9 @@ We use [Crowdin](https://crowdin.com/project/gitnex) for translation. If your la
|
|||||||
|
|
||||||
## Screenshots:
|
## Screenshots:
|
||||||
|
|
||||||
<img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/001.png" alt="001.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/002.png" alt="002.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/003.png" alt="003.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/004.png" alt="004.png" width="200"/>
|
<img src="https://codeberg.org/gitnex/GitNex/raw/branch/main/fastlane/metadata/android/en-US/images/phoneScreenshots/001.png" alt="001.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/main/fastlane/metadata/android/en-US/images/phoneScreenshots/002.png" alt="002.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/main/fastlane/metadata/android/en-US/images/phoneScreenshots/003.png" alt="003.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/main/fastlane/metadata/android/en-US/images/phoneScreenshots/004.png" alt="004.png" width="200"/>
|
||||||
---|---|---|---
|
---|---|---|---
|
||||||
<img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/005.png" alt="005.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/006.png" alt="006.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/007.png" alt="007.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/008.png" alt="008.png" width="200"/>
|
<img src="https://codeberg.org/gitnex/GitNex/raw/branch/main/fastlane/metadata/android/en-US/images/phoneScreenshots/005.png" alt="005.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/main/fastlane/metadata/android/en-US/images/phoneScreenshots/006.png" alt="006.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/main/fastlane/metadata/android/en-US/images/phoneScreenshots/007.png" alt="007.png" width="200"/> | <img src="https://codeberg.org/gitnex/GitNex/raw/branch/main/fastlane/metadata/android/en-US/images/phoneScreenshots/008.png" alt="008.png" width="200"/>
|
||||||
|
|
||||||
## Links
|
## Links
|
||||||
[Website](https://gitnex.com)
|
[Website](https://gitnex.com)
|
||||||
|
@ -56,12 +56,13 @@ configurations {
|
|||||||
dependencies {
|
dependencies {
|
||||||
def lifecycle_version = '2.3.1'
|
def lifecycle_version = '2.3.1'
|
||||||
def markwon_version = '4.6.2'
|
def markwon_version = '4.6.2'
|
||||||
def work_version = "2.5.0"
|
def work_version = "2.7.0-alpha04"
|
||||||
def acra = "5.7.0"
|
def acra = "5.7.0"
|
||||||
|
|
||||||
implementation fileTree(include: ['*.jar'], dir: 'libs')
|
implementation fileTree(include: ['*.jar'], dir: 'libs')
|
||||||
implementation 'androidx.appcompat:appcompat:1.3.0-rc01'
|
implementation 'androidx.appcompat:appcompat:1.4.0-alpha02'
|
||||||
implementation 'com.google.android.material:material:1.3.0'
|
implementation 'com.google.android.material:material:1.3.0'
|
||||||
|
implementation 'androidx.viewpager2:viewpager2:1.1.0-alpha01'
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
|
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
|
||||||
implementation "androidx.legacy:legacy-support-v4:1.0.0"
|
implementation "androidx.legacy:legacy-support-v4:1.0.0"
|
||||||
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
|
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
|
||||||
@ -103,14 +104,14 @@ dependencies {
|
|||||||
implementation "ch.acra:acra-mail:$acra"
|
implementation "ch.acra:acra-mail:$acra"
|
||||||
implementation "ch.acra:acra-limiter:$acra"
|
implementation "ch.acra:acra-limiter:$acra"
|
||||||
implementation "ch.acra:acra-notification:$acra"
|
implementation "ch.acra:acra-notification:$acra"
|
||||||
implementation 'androidx.room:room-runtime:2.2.6'
|
implementation 'androidx.room:room-runtime:2.3.0'
|
||||||
annotationProcessor 'androidx.room:room-compiler:2.2.6'
|
annotationProcessor 'androidx.room:room-compiler:2.3.0'
|
||||||
implementation "androidx.work:work-runtime:$work_version"
|
implementation "androidx.work:work-runtime:$work_version"
|
||||||
implementation "io.mikael:urlbuilder:2.0.9"
|
implementation "io.mikael:urlbuilder:2.0.9"
|
||||||
implementation "org.codeberg.gitnex-garage:emoji-java:v5.1.2"
|
implementation "org.codeberg.gitnex-garage:emoji-java:v5.1.2"
|
||||||
implementation "org.codeberg.gitnex:tea4j:1.0.5"
|
implementation "org.codeberg.gitnex:tea4j:1.0.16"
|
||||||
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.1.5"
|
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.1.5"
|
||||||
implementation 'androidx.biometric:biometric:1.1.0'
|
implementation 'androidx.biometric:biometric:1.1.0'
|
||||||
implementation 'com.github.chrisvest:stormpot:2.4.1'
|
implementation 'com.github.chrisvest:stormpot:2.4.2'
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
android:name=".activities.CreateNewUserActivity"
|
android:name=".activities.CreateNewUserActivity"
|
||||||
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" />
|
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" />
|
||||||
<activity
|
<activity
|
||||||
android:name=".activities.ProfileEmailActivity"
|
android:name=".activities.MyProfileEmailActivity"
|
||||||
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" />
|
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" />
|
||||||
<activity
|
<activity
|
||||||
android:name=".activities.AddCollaboratorToRepositoryActivity"
|
android:name=".activities.AddCollaboratorToRepositoryActivity"
|
||||||
@ -123,7 +123,7 @@
|
|||||||
android:name=".activities.SettingsAppearanceActivity"
|
android:name=".activities.SettingsAppearanceActivity"
|
||||||
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" />
|
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" />
|
||||||
<activity
|
<activity
|
||||||
android:name=".activities.SettingsFileViewerActivity"
|
android:name=".activities.ProfileActivity"
|
||||||
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" />
|
android:configChanges="orientation|screenSize|smallestScreenSize|density|screenLayout|uiMode|keyboard|keyboardHidden|navigation" />
|
||||||
<activity
|
<activity
|
||||||
android:name=".activities.SettingsSecurityActivity"
|
android:name=".activities.SettingsSecurityActivity"
|
||||||
|
@ -0,0 +1,62 @@
|
|||||||
|
package org.mian.gitnex.actions;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.clients.RetrofitClient;
|
||||||
|
import org.mian.gitnex.helpers.AlertDialogs;
|
||||||
|
import org.mian.gitnex.helpers.Authorization;
|
||||||
|
import org.mian.gitnex.helpers.Toasty;
|
||||||
|
import retrofit2.Call;
|
||||||
|
import retrofit2.Callback;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Author qwerty287
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class PullRequestActions {
|
||||||
|
|
||||||
|
public static void deleteHeadBranch(Context context, String repoOwner, String repoName, String headBranch, boolean showToasts) {
|
||||||
|
Call<JsonElement> call = RetrofitClient
|
||||||
|
.getApiInterface(context)
|
||||||
|
.deleteBranch(Authorization.get(context), repoOwner, repoName, headBranch);
|
||||||
|
|
||||||
|
call.enqueue(new Callback<JsonElement>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResponse(@NonNull Call<JsonElement> call, @NonNull retrofit2.Response<JsonElement> response) {
|
||||||
|
|
||||||
|
if(response.code() == 204) {
|
||||||
|
|
||||||
|
if(showToasts) Toasty.success(context, context.getString(R.string.deleteBranchSuccess));
|
||||||
|
}
|
||||||
|
else if(response.code() == 401) {
|
||||||
|
|
||||||
|
AlertDialogs
|
||||||
|
.authorizationTokenRevokedDialog(context, context.getResources().getString(R.string.alertDialogTokenRevokedTitle), context.getResources().getString(R.string.alertDialogTokenRevokedMessage), context.getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), context.getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
|
||||||
|
}
|
||||||
|
else if(response.code() == 403) {
|
||||||
|
|
||||||
|
if(showToasts) Toasty.error(context, context.getString(R.string.authorizeError));
|
||||||
|
}
|
||||||
|
else if(response.code() == 404) {
|
||||||
|
|
||||||
|
if(showToasts) Toasty.warning(context, context.getString(R.string.deleteBranchErrorNotFound));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
if(showToasts) Toasty.error(context, context.getString(R.string.genericError));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NonNull Call<JsonElement> call, @NonNull Throwable t) {
|
||||||
|
|
||||||
|
if(showToasts) Toasty.error(context, context.getString(R.string.deleteBranchError));
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -49,6 +49,7 @@ public class AddNewAccountActivity extends BaseActivity {
|
|||||||
|
|
||||||
initCloseListener();
|
initCloseListener();
|
||||||
viewBinding.close.setOnClickListener(onClickListener);
|
viewBinding.close.setOnClickListener(onClickListener);
|
||||||
|
viewBinding.instanceUrl.setText(getIntent().getStringExtra("instanceUrl"));
|
||||||
|
|
||||||
ArrayAdapter<Protocol> adapterProtocols = new ArrayAdapter<>(ctx, R.layout.list_spinner_items, Protocol.values());
|
ArrayAdapter<Protocol> adapterProtocols = new ArrayAdapter<>(ctx, R.layout.list_spinner_items, Protocol.values());
|
||||||
|
|
||||||
@ -115,7 +116,7 @@ public class AddNewAccountActivity extends BaseActivity {
|
|||||||
private void versionCheck(final String instanceUrl, final String loginToken) {
|
private void versionCheck(final String instanceUrl, final String loginToken) {
|
||||||
|
|
||||||
Call<GiteaVersion> callVersion;
|
Call<GiteaVersion> callVersion;
|
||||||
callVersion = RetrofitClient.getApiInterface(ctx).getGiteaVersionWithToken("token " + loginToken);
|
callVersion = RetrofitClient.getApiInterface(ctx, instanceUrl).getGiteaVersionWithToken("token " + loginToken);
|
||||||
callVersion.enqueue(new Callback<GiteaVersion>() {
|
callVersion.enqueue(new Callback<GiteaVersion>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -8,6 +8,7 @@ import org.mian.gitnex.helpers.AppUtil;
|
|||||||
import org.mian.gitnex.helpers.TimeHelper;
|
import org.mian.gitnex.helpers.TimeHelper;
|
||||||
import org.mian.gitnex.helpers.TinyDB;
|
import org.mian.gitnex.helpers.TinyDB;
|
||||||
import org.mian.gitnex.notifications.Notifications;
|
import org.mian.gitnex.notifications.Notifications;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Author M M Arif
|
* Author M M Arif
|
||||||
@ -37,7 +38,7 @@ public abstract class BaseActivity extends AppCompatActivity {
|
|||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
|
|
||||||
if(TimeHelper.timeBetweenHours(18, 6)) { // 6pm to 6am
|
if(TimeHelper.timeBetweenHours(tinyDB.getInt("darkThemeTimeHour"), tinyDB.getInt("lightThemeTimeHour"), tinyDB.getInt("darkThemeTimeMinute"), tinyDB.getInt("lightThemeTimeMinute"))) {
|
||||||
|
|
||||||
tinyDB.putString("currentTheme", "dark");
|
tinyDB.putString("currentTheme", "dark");
|
||||||
setTheme(R.style.AppTheme);
|
setTheme(R.style.AppTheme);
|
||||||
@ -54,7 +55,7 @@ public abstract class BaseActivity extends AppCompatActivity {
|
|||||||
setTheme(R.style.AppThemeRetro);
|
setTheme(R.style.AppThemeRetro);
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
if(TimeHelper.timeBetweenHours(18, 6)) { // 6pm to 6am
|
if(TimeHelper.timeBetweenHours(tinyDB.getInt("darkThemeTimeHour"), tinyDB.getInt("lightThemeTimeHour"), tinyDB.getInt("darkThemeTimeMinute"), tinyDB.getInt("lightThemeTimeMinute"))) {
|
||||||
|
|
||||||
tinyDB.putString("currentTheme", "dark");
|
tinyDB.putString("currentTheme", "dark");
|
||||||
setTheme(R.style.AppTheme);
|
setTheme(R.style.AppTheme);
|
||||||
@ -77,7 +78,13 @@ public abstract class BaseActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AppUtil.setAppLocale(getResources(), tinyDB.getString("locale"));
|
String locale = tinyDB.getString("locale");
|
||||||
|
if (locale.isEmpty()) {
|
||||||
|
AppUtil.setAppLocale(getResources(), Locale.getDefault().getLanguage());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
AppUtil.setAppLocale(getResources(), locale);
|
||||||
|
}
|
||||||
|
|
||||||
Notifications.startWorker(appCtx);
|
Notifications.startWorker(appCtx);
|
||||||
}
|
}
|
||||||
|
@ -215,7 +215,7 @@ public class CreateRepoActivity extends BaseActivity {
|
|||||||
|
|
||||||
Call<List<OrgOwner>> call = RetrofitClient
|
Call<List<OrgOwner>> call = RetrofitClient
|
||||||
.getApiInterface(ctx)
|
.getApiInterface(ctx)
|
||||||
.getOrgOwners(instanceToken);
|
.getOrgOwners(instanceToken, 1, 50);
|
||||||
|
|
||||||
call.enqueue(new Callback<List<OrgOwner>>() {
|
call.enqueue(new Callback<List<OrgOwner>>() {
|
||||||
|
|
||||||
|
@ -9,8 +9,11 @@ import android.util.Log;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.gitnex.tea4j.models.Files;
|
||||||
|
import org.gitnex.tea4j.models.Organization;
|
||||||
import org.gitnex.tea4j.models.PullRequests;
|
import org.gitnex.tea4j.models.PullRequests;
|
||||||
import org.gitnex.tea4j.models.UserRepositories;
|
import org.gitnex.tea4j.models.UserRepositories;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
import org.mian.gitnex.clients.RetrofitClient;
|
import org.mian.gitnex.clients.RetrofitClient;
|
||||||
import org.mian.gitnex.database.api.BaseApi;
|
import org.mian.gitnex.database.api.BaseApi;
|
||||||
@ -20,13 +23,16 @@ import org.mian.gitnex.database.models.Repository;
|
|||||||
import org.mian.gitnex.database.models.UserAccount;
|
import org.mian.gitnex.database.models.UserAccount;
|
||||||
import org.mian.gitnex.databinding.ActivityDeeplinksBinding;
|
import org.mian.gitnex.databinding.ActivityDeeplinksBinding;
|
||||||
import org.mian.gitnex.helpers.AppUtil;
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
|
import org.mian.gitnex.helpers.TinyDB;
|
||||||
import org.mian.gitnex.helpers.UrlHelper;
|
import org.mian.gitnex.helpers.UrlHelper;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import io.mikael.urlbuilder.UrlBuilder;
|
import io.mikael.urlbuilder.UrlBuilder;
|
||||||
import retrofit2.Call;
|
import retrofit2.Call;
|
||||||
import retrofit2.Callback;
|
import retrofit2.Callback;
|
||||||
|
import retrofit2.Response;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Author M M Arif
|
* Author M M Arif
|
||||||
@ -42,6 +48,8 @@ public class DeepLinksActivity extends BaseActivity {
|
|||||||
private Intent mainIntent;
|
private Intent mainIntent;
|
||||||
private Intent issueIntent;
|
private Intent issueIntent;
|
||||||
private Intent repoIntent;
|
private Intent repoIntent;
|
||||||
|
private Intent orgIntent;
|
||||||
|
private Intent userIntent;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
@ -54,6 +62,9 @@ public class DeepLinksActivity extends BaseActivity {
|
|||||||
mainIntent = new Intent(ctx, MainActivity.class);
|
mainIntent = new Intent(ctx, MainActivity.class);
|
||||||
issueIntent = new Intent(ctx, IssueDetailActivity.class);
|
issueIntent = new Intent(ctx, IssueDetailActivity.class);
|
||||||
repoIntent = new Intent(ctx, RepoDetailActivity.class);
|
repoIntent = new Intent(ctx, RepoDetailActivity.class);
|
||||||
|
orgIntent = new Intent(ctx, OrganizationDetailActivity.class);
|
||||||
|
// TODO: enable if UserProfile Activity exist
|
||||||
|
//userIntent = new Intent(ctx, ProfileActivity.class)
|
||||||
|
|
||||||
Intent intent = getIntent();
|
Intent intent = getIntent();
|
||||||
Uri data = intent.getData();
|
Uri data = intent.getData();
|
||||||
@ -61,9 +72,10 @@ public class DeepLinksActivity extends BaseActivity {
|
|||||||
|
|
||||||
// check for login
|
// check for login
|
||||||
if(!tinyDB.getBoolean("loggedInMode")) {
|
if(!tinyDB.getBoolean("loggedInMode")) {
|
||||||
|
Intent loginIntent = new Intent(ctx, LoginActivity.class);
|
||||||
|
loginIntent.putExtra("instanceUrl", data.getHost());
|
||||||
|
ctx.startActivity(loginIntent);
|
||||||
finish();
|
finish();
|
||||||
ctx.startActivity(new Intent(ctx, LoginActivity.class));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// check for the links(URI) to be in the db
|
// check for the links(URI) to be in the db
|
||||||
@ -89,25 +101,83 @@ public class DeepLinksActivity extends BaseActivity {
|
|||||||
|
|
||||||
if(accountFound) {
|
if(accountFound) {
|
||||||
|
|
||||||
// redirect to proper fragment/activity, If no action is there, show options where user to want to go like repos, profile, notifications etc
|
// redirect to proper fragment/activity, if no action is there, show options where user to want to go like repos, profile, notifications etc
|
||||||
if(data.getPathSegments().size() > 0) {
|
if(data.getPathSegments().size() == 1) {
|
||||||
|
if(data.getLastPathSegment().equals("notifications")) { // notifications
|
||||||
viewBinding.progressBar.setVisibility(View.GONE);
|
mainIntent.putExtra("launchFragmentByLinkHandler", "notification");
|
||||||
String[] restOfUrl = Objects.requireNonNull(data.getPath()).split("/");
|
ctx.startActivity(mainIntent);
|
||||||
|
finish();
|
||||||
if(data.getPathSegments().contains("issues")) { // issue
|
}
|
||||||
|
else if(data.getLastPathSegment().equals("explore")) { // explore
|
||||||
|
mainIntent.putExtra("launchFragmentByLinkHandler", "explore");
|
||||||
|
ctx.startActivity(mainIntent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
else if(data.getLastPathSegment().equals(tinyDB.getString("userLogin"))) { // your user profile
|
||||||
|
mainIntent.putExtra("launchFragmentByLinkHandler", "profile");
|
||||||
|
ctx.startActivity(mainIntent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
else if(data.getLastPathSegment().equals("admin")) {
|
||||||
|
mainIntent.putExtra("launchFragmentByLinkHandler", "admin");
|
||||||
|
ctx.startActivity(mainIntent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
new Handler(Looper.getMainLooper()).postDelayed(() ->
|
||||||
|
getUserOrOrg(currentInstance, instanceToken, data.getLastPathSegment()), 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(data.getPathSegments().size() == 2) {
|
||||||
|
if(data.getPathSegments().get(0).equals("explore")) { // specific explore tab
|
||||||
|
if(data.getPathSegments().get(1).equals("organizations")) { // orgs
|
||||||
|
mainIntent.putExtra("exploreOrgs", true);
|
||||||
|
}
|
||||||
|
mainIntent.putExtra("launchFragmentByLinkHandler", "explore");
|
||||||
|
ctx.startActivity(mainIntent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
else if(data.getPathSegments().get(0).equals("user") && data.getPathSegments().get(1).equals("login")) { // open login
|
||||||
|
Intent loginIntent = new Intent(ctx, AddNewAccountActivity.class);
|
||||||
|
loginIntent.putExtra("instanceUrl", data.getHost());
|
||||||
|
loginIntent.putExtra("instanceProtocol", data.getScheme());
|
||||||
|
ctx.startActivity(loginIntent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
else if(data.getPathSegments().get(0).equals("admin")) {
|
||||||
|
mainIntent.putExtra("launchFragmentByLinkHandler", "admin");
|
||||||
|
mainIntent.putExtra("giteaAdminAction", data.getLastPathSegment());
|
||||||
|
ctx.startActivity(mainIntent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
else if(!data.getPathSegments().get(0).equals("") & !data.getLastPathSegment().equals("")) { // go to repo
|
||||||
|
new Handler(Looper.getMainLooper()).postDelayed(() ->
|
||||||
|
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getLastPathSegment(), "repo"), 500);
|
||||||
|
}
|
||||||
|
else { // no action, show options
|
||||||
|
showNoActionButtons();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(data.getPathSegments().size() >= 3) {
|
||||||
|
if(data.getPathSegments().get(2).equals("issues")) { // issue
|
||||||
|
|
||||||
if(!Objects.requireNonNull(data.getLastPathSegment()).contains("issues") & StringUtils.isNumeric(data.getLastPathSegment())) {
|
if(!Objects.requireNonNull(data.getLastPathSegment()).contains("issues") & StringUtils.isNumeric(data.getLastPathSegment())) {
|
||||||
|
|
||||||
issueIntent.putExtra("issueNumber", data.getLastPathSegment());
|
issueIntent.putExtra("issueNumber", data.getLastPathSegment());
|
||||||
|
issueIntent.putExtra("openedFromLink", "true");
|
||||||
|
|
||||||
|
String[] urlSplitted = data.toString().split("#");
|
||||||
|
if (urlSplitted.length == 2) {
|
||||||
|
issueIntent.putExtra("issueComment", urlSplitted[1]);
|
||||||
|
}
|
||||||
|
|
||||||
tinyDB.putString("issueNumber", data.getLastPathSegment());
|
tinyDB.putString("issueNumber", data.getLastPathSegment());
|
||||||
tinyDB.putString("issueType", "Issue");
|
tinyDB.putString("issueType", "Issue");
|
||||||
|
|
||||||
tinyDB.putString("repoFullName", restOfUrl[restOfUrl.length - 4] + "/" + restOfUrl[restOfUrl.length - 3]);
|
tinyDB.putString("repoFullName", data.getPathSegments().get(0) + "/" + data.getPathSegments().get(1));
|
||||||
|
|
||||||
final String repoOwner = restOfUrl[restOfUrl.length - 4];
|
final String repoOwner = data.getPathSegments().get(0);
|
||||||
final String repoName = restOfUrl[restOfUrl.length - 3];
|
final String repoName = data.getPathSegments().get(1);
|
||||||
|
|
||||||
int currentActiveAccountId = tinyDB.getInt("currentActiveAccountId");
|
int currentActiveAccountId = tinyDB.getInt("currentActiveAccountId");
|
||||||
RepositoriesApi repositoryData = BaseApi.getInstance(ctx, RepositoriesApi.class);
|
RepositoriesApi repositoryData = BaseApi.getInstance(ctx, RepositoriesApi.class);
|
||||||
@ -129,125 +199,121 @@ public class DeepLinksActivity extends BaseActivity {
|
|||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
else if(Objects.requireNonNull(data.getLastPathSegment()).contains("issues")) {
|
else if(Objects.requireNonNull(data.getLastPathSegment()).contains("issues")) {
|
||||||
|
new Handler(Looper.getMainLooper()).postDelayed(() ->
|
||||||
new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "issue"), 500);
|
||||||
|
}
|
||||||
goToRepoSection(currentInstance, instanceToken, restOfUrl[restOfUrl.length - 3], restOfUrl[restOfUrl.length - 2], "issue");
|
else if(data.getLastPathSegment().equals("new")) {
|
||||||
}, 500);
|
new Handler(Looper.getMainLooper()).postDelayed(() ->
|
||||||
|
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "issueNew"), 500);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
ctx.startActivity(mainIntent);
|
ctx.startActivity(mainIntent);
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(data.getPathSegments().contains("pulls")) { // pr
|
else if(data.getPathSegments().get(2).equals("pulls")) { // pr
|
||||||
|
|
||||||
if(!Objects.requireNonNull(data.getLastPathSegment()).contains("pulls") & StringUtils.isNumeric(data.getLastPathSegment())) {
|
if(!Objects.requireNonNull(data.getLastPathSegment()).contains("pulls") & StringUtils.isNumeric(data.getLastPathSegment())) {
|
||||||
|
|
||||||
new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
||||||
|
|
||||||
getPullRequest(currentInstance, instanceToken, restOfUrl[restOfUrl.length - 4], restOfUrl[restOfUrl.length - 3], Integer.parseInt(data.getLastPathSegment()));
|
String[] urlSplitted = data.toString().split("#");
|
||||||
|
if (urlSplitted.length == 2) {
|
||||||
|
issueIntent.putExtra("issueComment", urlSplitted[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
getPullRequest(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), Integer.parseInt(data.getLastPathSegment()));
|
||||||
}, 500);
|
}, 500);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if(Objects.requireNonNull(data.getLastPathSegment()).contains("pulls")) {
|
else if(Objects.requireNonNull(data.getLastPathSegment()).contains("pulls")) {
|
||||||
|
new Handler(Looper.getMainLooper()).postDelayed(() ->
|
||||||
|
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "pull"), 500);
|
||||||
|
}
|
||||||
|
else if(data.getLastPathSegment().equals("files")) { // pr diff
|
||||||
new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
||||||
|
issueIntent.putExtra("openPrDiff", "true");
|
||||||
goToRepoSection(currentInstance, instanceToken, restOfUrl[restOfUrl.length - 3], restOfUrl[restOfUrl.length - 2], "pull");
|
getPullRequest(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), Integer.parseInt(data.getPathSegments().get(3)));
|
||||||
}, 500);
|
}, 500);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
ctx.startActivity(mainIntent);
|
ctx.startActivity(mainIntent);
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(data.getPathSegments().contains("commit")) { // commits (no API yet to properly implement)
|
|
||||||
|
|
||||||
new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
else if(data.getPathSegments().get(2).equals("compare")) { // new pull request
|
||||||
|
new Handler(Looper.getMainLooper()).postDelayed(() ->
|
||||||
goToRepoSection(currentInstance, instanceToken, restOfUrl[restOfUrl.length - 4], restOfUrl[restOfUrl.length - 3], "pull");
|
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "pullNew"), 500);
|
||||||
}, 500);
|
|
||||||
}
|
}
|
||||||
else if(!restOfUrl[restOfUrl.length - 2].equals("") & !restOfUrl[restOfUrl.length - 1].equals("")) { // go to repo
|
else if(data.getPathSegments().get(2).equals("commit")) { // commits (no API yet to properly implement)
|
||||||
|
new Handler(Looper.getMainLooper()).postDelayed(() ->
|
||||||
new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "pull"), 500);
|
||||||
|
}
|
||||||
goToRepoSection(currentInstance, instanceToken, restOfUrl[restOfUrl.length - 2], restOfUrl[restOfUrl.length - 1], "repo");
|
else if(data.getPathSegments().get(2).equals("commits")) { // commits list
|
||||||
}, 500);
|
String branch = data.getLastPathSegment();
|
||||||
|
repoIntent.putExtra("branchName", branch);
|
||||||
|
new Handler(Looper.getMainLooper()).postDelayed(() ->
|
||||||
|
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "commitsList"), 500);
|
||||||
|
}
|
||||||
|
else if(data.getPathSegments().get(2).equals("milestones") && data.getLastPathSegment().equals("new")) { // new milestone
|
||||||
|
new Handler(Looper.getMainLooper()).postDelayed(() ->
|
||||||
|
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "milestonesNew"), 500);
|
||||||
|
}
|
||||||
|
else if(data.getPathSegments().get(2).equals("milestones")) { // milestones
|
||||||
|
new Handler(Looper.getMainLooper()).postDelayed(() ->
|
||||||
|
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "milestones"), 500);
|
||||||
|
}
|
||||||
|
else if(data.getPathSegments().get(2).equals("milestone")) { // milestone
|
||||||
|
repoIntent.putExtra("milestoneId", data.getLastPathSegment());
|
||||||
|
new Handler(Looper.getMainLooper()).postDelayed(() ->
|
||||||
|
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "milestones"), 500);
|
||||||
|
}
|
||||||
|
else if(data.getPathSegments().get(2).equals("releases") && data.getLastPathSegment().equals("new")) { // new release
|
||||||
|
new Handler(Looper.getMainLooper()).postDelayed(() ->
|
||||||
|
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "newRelease"), 500);
|
||||||
|
}
|
||||||
|
else if(data.getPathSegments().get(2).equals("releases") && data.getPathSegments().get(3).equals("tag") && data.getPathSegments().size() == 5) { // release
|
||||||
|
repoIntent.putExtra("releaseTagName", data.getLastPathSegment());
|
||||||
|
new Handler(Looper.getMainLooper()).postDelayed(() ->
|
||||||
|
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "releases"), 500);
|
||||||
|
}
|
||||||
|
else if(data.getPathSegments().get(2).equals("releases")) { // releases
|
||||||
|
new Handler(Looper.getMainLooper()).postDelayed(() ->
|
||||||
|
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "releases"), 500);
|
||||||
|
}
|
||||||
|
else if(data.getPathSegments().get(2).equals("labels")) { // labels
|
||||||
|
new Handler(Looper.getMainLooper()).postDelayed(() ->
|
||||||
|
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "labels"), 500);
|
||||||
|
}
|
||||||
|
else if(data.getPathSegments().get(2).equals("settings")) { // repo settings
|
||||||
|
new Handler(Looper.getMainLooper()).postDelayed(() ->
|
||||||
|
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "settings"), 500);
|
||||||
|
}
|
||||||
|
else if(data.getLastPathSegment().equals("branches")) { // branches list
|
||||||
|
new Handler(Looper.getMainLooper()).postDelayed(() ->
|
||||||
|
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "branchesList"), 500);
|
||||||
|
}
|
||||||
|
else if(data.getPathSegments().size() == 5 && data.getPathSegments().get(2).equals("src") && data.getPathSegments().get(3).equals("branch")) { // branch
|
||||||
|
repoIntent.putExtra("selectedBranch", data.getLastPathSegment());
|
||||||
|
new Handler(Looper.getMainLooper()).postDelayed(() ->
|
||||||
|
goToRepoSection(currentInstance, instanceToken, data.getPathSegments().get(0), data.getPathSegments().get(1), "branch"), 500);
|
||||||
|
}
|
||||||
|
else if(data.getPathSegments().get(2).equals("src") && data.getPathSegments().get(3).equals("branch")) { // file/dir
|
||||||
|
StringBuilder filePath = new StringBuilder();
|
||||||
|
ArrayList<String> segments = new ArrayList<>(data.getPathSegments());
|
||||||
|
segments.subList(0, 5).clear();
|
||||||
|
for (String item : segments) {
|
||||||
|
filePath.append(item);
|
||||||
|
filePath.append("/");
|
||||||
|
}
|
||||||
|
filePath.deleteCharAt(filePath.toString().length() - 1);
|
||||||
|
new Handler(Looper.getMainLooper()).postDelayed(() ->
|
||||||
|
getFile(currentInstance, instanceToken, data.getPathSegments().get(0),
|
||||||
|
data.getPathSegments().get(1), filePath.toString(), data.getPathSegments().get(4)), 500);
|
||||||
}
|
}
|
||||||
else { // no action, show options
|
else { // no action, show options
|
||||||
|
showNoActionButtons();
|
||||||
if(tinyDB.getInt("defaultScreenId") == 1) { // repos
|
|
||||||
|
|
||||||
mainIntent.putExtra("launchFragmentByLinkHandler", "repos");
|
|
||||||
ctx.startActivity(mainIntent);
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
else if(tinyDB.getInt("defaultScreenId") == 2) { // org
|
|
||||||
|
|
||||||
mainIntent.putExtra("launchFragmentByLinkHandler", "org");
|
|
||||||
ctx.startActivity(mainIntent);
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
else if(tinyDB.getInt("defaultScreenId") == 3) { // notifications
|
|
||||||
|
|
||||||
mainIntent.putExtra("launchFragmentByLinkHandler", "notification");
|
|
||||||
ctx.startActivity(mainIntent);
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
else if(tinyDB.getInt("defaultScreenId") == 4) { // explore
|
|
||||||
|
|
||||||
mainIntent.putExtra("launchFragmentByLinkHandler", "explore");
|
|
||||||
ctx.startActivity(mainIntent);
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
else if(tinyDB.getInt("defaultScreenId") == 0) { // show options
|
|
||||||
|
|
||||||
viewBinding.noActionFrame.setVisibility(View.VISIBLE);
|
|
||||||
viewBinding.addNewAccountFrame.setVisibility(View.GONE);
|
|
||||||
|
|
||||||
viewBinding.repository.setOnClickListener(repository -> {
|
|
||||||
|
|
||||||
tinyDB.putInt("defaultScreenId", 1);
|
|
||||||
mainIntent.putExtra("launchFragmentByLinkHandler", "repos");
|
|
||||||
ctx.startActivity(mainIntent);
|
|
||||||
finish();
|
|
||||||
});
|
|
||||||
|
|
||||||
viewBinding.organization.setOnClickListener(organization -> {
|
|
||||||
|
|
||||||
tinyDB.putInt("defaultScreenId", 2);
|
|
||||||
mainIntent.putExtra("launchFragmentByLinkHandler", "org");
|
|
||||||
ctx.startActivity(mainIntent);
|
|
||||||
finish();
|
|
||||||
});
|
|
||||||
|
|
||||||
viewBinding.notification.setOnClickListener(notification -> {
|
|
||||||
|
|
||||||
tinyDB.putInt("defaultScreenId", 3);
|
|
||||||
mainIntent.putExtra("launchFragmentByLinkHandler", "notification");
|
|
||||||
ctx.startActivity(mainIntent);
|
|
||||||
finish();
|
|
||||||
});
|
|
||||||
|
|
||||||
viewBinding.explore.setOnClickListener(explore -> {
|
|
||||||
|
|
||||||
tinyDB.putInt("defaultScreenId", 4);
|
|
||||||
mainIntent.putExtra("launchFragmentByLinkHandler", "explore");
|
|
||||||
ctx.startActivity(mainIntent);
|
|
||||||
finish();
|
|
||||||
});
|
|
||||||
|
|
||||||
viewBinding.launchApp2.setOnClickListener(launchApp2 -> {
|
|
||||||
|
|
||||||
tinyDB.putInt("defaultScreenId", 0);
|
|
||||||
ctx.startActivity(mainIntent);
|
|
||||||
finish();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -266,6 +332,7 @@ public class DeepLinksActivity extends BaseActivity {
|
|||||||
viewBinding.addNewAccount.setOnClickListener(addNewAccount -> {
|
viewBinding.addNewAccount.setOnClickListener(addNewAccount -> {
|
||||||
|
|
||||||
Intent accountIntent = new Intent(ctx, AddNewAccountActivity.class);
|
Intent accountIntent = new Intent(ctx, AddNewAccountActivity.class);
|
||||||
|
accountIntent.putExtra("instanceUrl", data.getHost());
|
||||||
startActivity(accountIntent);
|
startActivity(accountIntent);
|
||||||
finish();
|
finish();
|
||||||
});
|
});
|
||||||
@ -316,6 +383,7 @@ public class DeepLinksActivity extends BaseActivity {
|
|||||||
|
|
||||||
issueIntent.putExtra("issueNumber", index);
|
issueIntent.putExtra("issueNumber", index);
|
||||||
issueIntent.putExtra("prMergeable", prInfo.isMergeable());
|
issueIntent.putExtra("prMergeable", prInfo.isMergeable());
|
||||||
|
issueIntent.putExtra("openedFromLink", "true");
|
||||||
|
|
||||||
if(prInfo.getHead() != null) {
|
if(prInfo.getHead() != null) {
|
||||||
|
|
||||||
@ -450,4 +518,184 @@ public class DeepLinksActivity extends BaseActivity {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void getUserOrOrg(String url, String instanceToken, String userOrgName) {
|
||||||
|
Call<Organization> call = RetrofitClient.getApiInterface(ctx, url).getOrganization(instanceToken, userOrgName);
|
||||||
|
|
||||||
|
call.enqueue(new Callback<Organization>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResponse(@NotNull Call<Organization> call, @NotNull Response<Organization> response) {
|
||||||
|
if(response.code() == 404) { // org doesn't exist or it's a user user
|
||||||
|
Log.d("getUserOrOrg-404", String.valueOf(response.code()));
|
||||||
|
getUser(url, instanceToken, userOrgName);
|
||||||
|
}
|
||||||
|
else if(response.code() == 200) { // org
|
||||||
|
assert response.body() != null;
|
||||||
|
orgIntent.putExtra("orgName", response.body().getUsername());
|
||||||
|
|
||||||
|
|
||||||
|
TinyDB tinyDb = TinyDB.getInstance(ctx);
|
||||||
|
tinyDb.putString("orgName", response.body().getUsername());
|
||||||
|
tinyDb.putString("organizationId", String.valueOf(response.body().getId()));
|
||||||
|
tinyDb.putBoolean("organizationAction", true);
|
||||||
|
ctx.startActivity(orgIntent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Log.e("getUserOrOrg-code", String.valueOf(response.code()));
|
||||||
|
ctx.startActivity(mainIntent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NotNull Call<Organization> call, @NotNull Throwable t) {
|
||||||
|
Log.e("onFailure-getUserOrOrg", t.toString());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void getUser(String url, String instanceToken, String userName) {
|
||||||
|
// TODO: enable if UserProfile Activity exist
|
||||||
|
showNoActionButtons();
|
||||||
|
/*Call<UserInfo> call = RetrofitClient.getApiInterface(ctx, url).getUserProfile(instanceToken, userName);
|
||||||
|
|
||||||
|
call.enqueue(new Callback<UserInfo>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResponse(@NotNull Call<UserInfo> call, @NotNull Response<UserInfo> response) {
|
||||||
|
if(response.code() == 200) {
|
||||||
|
assert response.body() != null;
|
||||||
|
userIntent.putExtra("username", response.body().getLogin());
|
||||||
|
ctx.startActivity(userIntent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Log.e("getUser-code", String.valueOf(response.code()));
|
||||||
|
ctx.startActivity(mainIntent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NotNull Call<UserInfo> call, @NotNull Throwable t) {
|
||||||
|
Log.e("onFailure-getUser", t.toString());
|
||||||
|
ctx.startActivity(mainIntent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
});*/
|
||||||
|
}
|
||||||
|
|
||||||
|
private void getFile(String url, String instanceToken, String owner, String repo, String filePath, String branch) {
|
||||||
|
Call<Files> call = RetrofitClient.getApiInterface(ctx, url).getSingleFileContents(instanceToken, owner, repo, filePath, branch);
|
||||||
|
|
||||||
|
call.enqueue(new Callback<Files>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResponse(@NotNull Call<Files> call, @NotNull Response<Files> response) {
|
||||||
|
if(response.code() == 200) {
|
||||||
|
// check if file and open file/dir
|
||||||
|
Files file = response.body();
|
||||||
|
assert file != null;
|
||||||
|
if(file.getType().equals("file")) {
|
||||||
|
repoIntent.putExtra("file", file);
|
||||||
|
repoIntent.putExtra("branch", branch);
|
||||||
|
goToRepoSection(url, instanceToken, owner, repo, "file");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Log.e("getFile-onFailure", String.valueOf(response.code()));
|
||||||
|
ctx.startActivity(mainIntent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NotNull Call<Files> call, @NotNull Throwable t) {
|
||||||
|
Log.e("getFile-onFailure", t.toString());
|
||||||
|
// maybe it's a directory
|
||||||
|
getDir(url, instanceToken, owner, repo, filePath, branch);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void getDir(String url, String instanceToken, String owner, String repo, String filePath, String branch) {
|
||||||
|
repoIntent.putExtra("branch", branch);
|
||||||
|
repoIntent.putExtra("dir", filePath);
|
||||||
|
goToRepoSection(url, instanceToken, owner, repo, "dir");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showNoActionButtons() {
|
||||||
|
viewBinding.progressBar.setVisibility(View.GONE);
|
||||||
|
|
||||||
|
if(tinyDB.getInt("defaultScreenId") == 1) { // repos
|
||||||
|
|
||||||
|
mainIntent.putExtra("launchFragmentByLinkHandler", "repos");
|
||||||
|
ctx.startActivity(mainIntent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
else if(tinyDB.getInt("defaultScreenId") == 2) { // org
|
||||||
|
|
||||||
|
mainIntent.putExtra("launchFragmentByLinkHandler", "org");
|
||||||
|
ctx.startActivity(mainIntent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
else if(tinyDB.getInt("defaultScreenId") == 3) { // notifications
|
||||||
|
|
||||||
|
mainIntent.putExtra("launchFragmentByLinkHandler", "notification");
|
||||||
|
ctx.startActivity(mainIntent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
else if(tinyDB.getInt("defaultScreenId") == 4) { // explore
|
||||||
|
|
||||||
|
mainIntent.putExtra("launchFragmentByLinkHandler", "explore");
|
||||||
|
ctx.startActivity(mainIntent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
else if(tinyDB.getInt("defaultScreenId") == 0) { // show options
|
||||||
|
|
||||||
|
viewBinding.noActionFrame.setVisibility(View.VISIBLE);
|
||||||
|
viewBinding.addNewAccountFrame.setVisibility(View.GONE);
|
||||||
|
|
||||||
|
viewBinding.repository.setOnClickListener(repository -> {
|
||||||
|
|
||||||
|
tinyDB.putInt("defaultScreenId", 1);
|
||||||
|
mainIntent.putExtra("launchFragmentByLinkHandler", "repos");
|
||||||
|
ctx.startActivity(mainIntent);
|
||||||
|
finish();
|
||||||
|
});
|
||||||
|
|
||||||
|
viewBinding.organization.setOnClickListener(organization -> {
|
||||||
|
|
||||||
|
tinyDB.putInt("defaultScreenId", 2);
|
||||||
|
mainIntent.putExtra("launchFragmentByLinkHandler", "org");
|
||||||
|
ctx.startActivity(mainIntent);
|
||||||
|
finish();
|
||||||
|
});
|
||||||
|
|
||||||
|
viewBinding.notification.setOnClickListener(notification -> {
|
||||||
|
|
||||||
|
tinyDB.putInt("defaultScreenId", 3);
|
||||||
|
mainIntent.putExtra("launchFragmentByLinkHandler", "notification");
|
||||||
|
ctx.startActivity(mainIntent);
|
||||||
|
finish();
|
||||||
|
});
|
||||||
|
|
||||||
|
viewBinding.explore.setOnClickListener(explore -> {
|
||||||
|
|
||||||
|
tinyDB.putInt("defaultScreenId", 4);
|
||||||
|
mainIntent.putExtra("launchFragmentByLinkHandler", "explore");
|
||||||
|
ctx.startActivity(mainIntent);
|
||||||
|
finish();
|
||||||
|
});
|
||||||
|
|
||||||
|
viewBinding.launchApp2.setOnClickListener(launchApp2 -> {
|
||||||
|
|
||||||
|
tinyDB.putInt("defaultScreenId", 0);
|
||||||
|
ctx.startActivity(mainIntent);
|
||||||
|
finish();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -148,10 +148,18 @@ public class FileViewActivity extends BaseActivity implements BottomSheetFileVie
|
|||||||
|
|
||||||
runOnUiThread(() -> {
|
runOnUiThread(() -> {
|
||||||
binding.photoView.setVisibility(View.GONE);
|
binding.photoView.setVisibility(View.GONE);
|
||||||
binding.markdownFrame.setVisibility(View.GONE);
|
|
||||||
|
|
||||||
binding.contents.setVisibility(View.VISIBLE);
|
|
||||||
binding.contents.setContent(text, fileExtension);
|
binding.contents.setContent(text, fileExtension);
|
||||||
|
|
||||||
|
if(tinyDB.getBoolean("enableMarkdownInFileView")) {
|
||||||
|
Markdown.render(ctx, EmojiParser.parseToUnicode(text), binding.markdown);
|
||||||
|
|
||||||
|
binding.contents.setVisibility(View.GONE);
|
||||||
|
binding.markdownFrame.setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
|
binding.markdownFrame.setVisibility(View.GONE);
|
||||||
|
binding.contents.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package org.mian.gitnex.activities;
|
package org.mian.gitnex.activities;
|
||||||
|
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.graphics.Typeface;
|
import android.graphics.Typeface;
|
||||||
@ -196,6 +197,10 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
|
|||||||
getSingleIssue(repoOwner, repoName, issueIndex);
|
getSingleIssue(repoOwner, repoName, issueIndex);
|
||||||
fetchDataAsync(repoOwner, repoName, issueIndex);
|
fetchDataAsync(repoOwner, repoName, issueIndex);
|
||||||
|
|
||||||
|
if(getIntent().getStringExtra("openPrDiff") != null && getIntent().getStringExtra("openPrDiff").equals("true")) {
|
||||||
|
startActivity(new Intent(ctx, FileDiffActivity.class));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -434,6 +439,11 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
|
|||||||
|
|
||||||
if(id == android.R.id.home) {
|
if(id == android.R.id.home) {
|
||||||
|
|
||||||
|
if(getIntent().getStringExtra("openedFromLink") != null && getIntent().getStringExtra("openedFromLink").equals("true")) {
|
||||||
|
Intent intent = new Intent(ctx, RepoDetailActivity.class);
|
||||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||||
|
startActivity(intent);
|
||||||
|
}
|
||||||
finish();
|
finish();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -569,7 +579,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
|
|||||||
}
|
}
|
||||||
|
|
||||||
TinyDB tinyDb = TinyDB.getInstance(appCtx);
|
TinyDB tinyDb = TinyDB.getInstance(appCtx);
|
||||||
final String locale = tinyDb.getString("locale");
|
final Locale locale = getResources().getConfiguration().locale;
|
||||||
final String timeFormat = tinyDb.getString("dateFormat");
|
final String timeFormat = tinyDb.getString("dateFormat");
|
||||||
tinyDb.putString("issueState", singleIssue.getState());
|
tinyDb.putString("issueState", singleIssue.getState());
|
||||||
tinyDb.putString("issueTitle", singleIssue.getTitle());
|
tinyDb.putString("issueTitle", singleIssue.getTitle());
|
||||||
@ -582,6 +592,17 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
|
|||||||
viewBinding.issueTitle.setText(HtmlCompat.fromHtml(issueNumber_ + " " + EmojiParser.parseToUnicode(singleIssue.getTitle()), HtmlCompat.FROM_HTML_MODE_LEGACY));
|
viewBinding.issueTitle.setText(HtmlCompat.fromHtml(issueNumber_ + " " + EmojiParser.parseToUnicode(singleIssue.getTitle()), HtmlCompat.FROM_HTML_MODE_LEGACY));
|
||||||
String cleanIssueDescription = singleIssue.getBody().trim();
|
String cleanIssueDescription = singleIssue.getBody().trim();
|
||||||
|
|
||||||
|
viewBinding.assigneeAvatar.setOnClickListener(loginId -> {
|
||||||
|
Intent intent = new Intent(ctx, ProfileActivity.class);
|
||||||
|
intent.putExtra("username", singleIssue.getUser().getLogin());
|
||||||
|
ctx.startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
|
viewBinding.assigneeAvatar.setOnLongClickListener(loginId -> {
|
||||||
|
AppUtil.copyToClipboard(ctx, singleIssue.getUser().getLogin(), ctx.getString(R.string.copyLoginIdToClipBoard, singleIssue.getUser().getLogin()));
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
Markdown.render(ctx, EmojiParser.parseToUnicode(cleanIssueDescription), viewBinding.issueDescription);
|
Markdown.render(ctx, EmojiParser.parseToUnicode(cleanIssueDescription), viewBinding.issueDescription);
|
||||||
|
|
||||||
RelativeLayout.LayoutParams paramsDesc = (RelativeLayout.LayoutParams) viewBinding.issueDescription.getLayoutParams();
|
RelativeLayout.LayoutParams paramsDesc = (RelativeLayout.LayoutParams) viewBinding.issueDescription.getLayoutParams();
|
||||||
@ -603,7 +624,20 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
|
|||||||
|
|
||||||
viewBinding.frameAssignees.addView(assigneesView);
|
viewBinding.frameAssignees.addView(assigneesView);
|
||||||
assigneesView.setLayoutParams(params1);
|
assigneesView.setLayoutParams(params1);
|
||||||
if(!singleIssue.getAssignees().get(i).getFull_name().equals("")) {
|
|
||||||
|
int finalI = i;
|
||||||
|
assigneesView.setOnClickListener(loginId -> {
|
||||||
|
Intent intent = new Intent(ctx, ProfileActivity.class);
|
||||||
|
intent.putExtra("username", singleIssue.getAssignees().get(finalI).getLogin());
|
||||||
|
ctx.startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
|
assigneesView.setOnLongClickListener(loginId -> {
|
||||||
|
AppUtil.copyToClipboard(ctx, singleIssue.getAssignees().get(finalI).getLogin(), ctx.getString(R.string.copyLoginIdToClipBoard, singleIssue.getAssignees().get(finalI).getLogin()));
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
/*if(!singleIssue.getAssignees().get(i).getFull_name().equals("")) {
|
||||||
|
|
||||||
assigneesView.setOnClickListener(
|
assigneesView.setOnClickListener(
|
||||||
new ClickListener(getString(R.string.assignedTo, singleIssue.getAssignees().get(i).getFull_name()), ctx));
|
new ClickListener(getString(R.string.assignedTo, singleIssue.getAssignees().get(i).getFull_name()), ctx));
|
||||||
@ -612,7 +646,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
|
|||||||
|
|
||||||
assigneesView.setOnClickListener(
|
assigneesView.setOnClickListener(
|
||||||
new ClickListener(getString(R.string.assignedTo, singleIssue.getAssignees().get(i).getLogin()), ctx));
|
new ClickListener(getString(R.string.assignedTo, singleIssue.getAssignees().get(i).getLogin()), ctx));
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -660,7 +694,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
|
|||||||
|
|
||||||
if(timeFormat.equals("normal") || timeFormat.equals("pretty")) {
|
if(timeFormat.equals("normal") || timeFormat.equals("pretty")) {
|
||||||
|
|
||||||
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", new Locale(locale));
|
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", locale);
|
||||||
String dueDate = formatter.format(singleIssue.getDue_date());
|
String dueDate = formatter.format(singleIssue.getDue_date());
|
||||||
viewBinding.issueDueDate.setText(dueDate);
|
viewBinding.issueDueDate.setText(dueDate);
|
||||||
viewBinding.issueDueDate
|
viewBinding.issueDueDate
|
||||||
@ -668,7 +702,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
|
|||||||
}
|
}
|
||||||
else if(timeFormat.equals("normal1")) {
|
else if(timeFormat.equals("normal1")) {
|
||||||
|
|
||||||
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", new Locale(locale));
|
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", locale);
|
||||||
String dueDate = formatter.format(singleIssue.getDue_date());
|
String dueDate = formatter.format(singleIssue.getDue_date());
|
||||||
viewBinding.issueDueDate.setText(dueDate);
|
viewBinding.issueDueDate.setText(dueDate);
|
||||||
}
|
}
|
||||||
@ -714,7 +748,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
|
|||||||
viewBinding.issueDescription.setLayoutParams(paramsDesc);
|
viewBinding.issueDescription.setLayoutParams(paramsDesc);
|
||||||
}
|
}
|
||||||
|
|
||||||
viewBinding.issueCreatedTime.setText(TimeHelper.formatTime(singleIssue.getCreated_at(), new Locale(locale), timeFormat, ctx));
|
viewBinding.issueCreatedTime.setText(TimeHelper.formatTime(singleIssue.getCreated_at(), locale, timeFormat, ctx));
|
||||||
viewBinding.issueCreatedTime.setVisibility(View.VISIBLE);
|
viewBinding.issueCreatedTime.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
if(timeFormat.equals("pretty")) {
|
if(timeFormat.equals("pretty")) {
|
||||||
@ -750,7 +784,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
|
|||||||
viewBinding.issueMilestone.setVisibility(View.GONE);
|
viewBinding.issueMilestone.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!singleIssue.getUser().getFull_name().equals("")) {
|
/*if(!singleIssue.getUser().getFull_name().equals("")) {
|
||||||
|
|
||||||
viewBinding.assigneeAvatar.setOnClickListener(
|
viewBinding.assigneeAvatar.setOnClickListener(
|
||||||
new ClickListener(ctx.getResources().getString(R.string.issueCreator) + singleIssue.getUser().getFull_name(), ctx));
|
new ClickListener(ctx.getResources().getString(R.string.issueCreator) + singleIssue.getUser().getFull_name(), ctx));
|
||||||
@ -759,7 +793,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt
|
|||||||
|
|
||||||
viewBinding.assigneeAvatar.setOnClickListener(
|
viewBinding.assigneeAvatar.setOnClickListener(
|
||||||
new ClickListener(ctx.getResources().getString(R.string.issueCreator) + singleIssue.getUser().getLogin(), ctx));
|
new ClickListener(ctx.getResources().getString(R.string.issueCreator) + singleIssue.getUser().getLogin(), ctx));
|
||||||
}
|
}*/
|
||||||
|
|
||||||
viewBinding.progressBar.setVisibility(View.GONE);
|
viewBinding.progressBar.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
@ -77,6 +77,8 @@ public class LoginActivity extends BaseActivity {
|
|||||||
|
|
||||||
ArrayAdapter<Protocol> adapterProtocols = new ArrayAdapter<>(LoginActivity.this, R.layout.list_spinner_items, Protocol.values());
|
ArrayAdapter<Protocol> adapterProtocols = new ArrayAdapter<>(LoginActivity.this, R.layout.list_spinner_items, Protocol.values());
|
||||||
|
|
||||||
|
instanceUrlET.setText(getIntent().getStringExtra("instanceUrl"));
|
||||||
|
|
||||||
protocolSpinner.setAdapter(adapterProtocols);
|
protocolSpinner.setAdapter(adapterProtocols);
|
||||||
protocolSpinner.setSelection(0);
|
protocolSpinner.setSelection(0);
|
||||||
protocolSpinner.setOnItemClickListener((parent, view, position, id) -> {
|
protocolSpinner.setOnItemClickListener((parent, view, position, id) -> {
|
||||||
|
@ -44,7 +44,7 @@ import org.mian.gitnex.fragments.ExploreFragment;
|
|||||||
import org.mian.gitnex.fragments.MyRepositoriesFragment;
|
import org.mian.gitnex.fragments.MyRepositoriesFragment;
|
||||||
import org.mian.gitnex.fragments.NotificationsFragment;
|
import org.mian.gitnex.fragments.NotificationsFragment;
|
||||||
import org.mian.gitnex.fragments.OrganizationsFragment;
|
import org.mian.gitnex.fragments.OrganizationsFragment;
|
||||||
import org.mian.gitnex.fragments.ProfileFragment;
|
import org.mian.gitnex.fragments.MyProfileFragment;
|
||||||
import org.mian.gitnex.fragments.RepositoriesFragment;
|
import org.mian.gitnex.fragments.RepositoriesFragment;
|
||||||
import org.mian.gitnex.fragments.SettingsFragment;
|
import org.mian.gitnex.fragments.SettingsFragment;
|
||||||
import org.mian.gitnex.fragments.StarredRepositoriesFragment;
|
import org.mian.gitnex.fragments.StarredRepositoriesFragment;
|
||||||
@ -203,7 +203,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
|
|||||||
else if(fragmentById instanceof NotificationsFragment) {
|
else if(fragmentById instanceof NotificationsFragment) {
|
||||||
toolbarTitle.setText(R.string.pageTitleNotifications);
|
toolbarTitle.setText(R.string.pageTitleNotifications);
|
||||||
}
|
}
|
||||||
else if(fragmentById instanceof ProfileFragment) {
|
else if(fragmentById instanceof MyProfileFragment) {
|
||||||
toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile));
|
toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile));
|
||||||
}
|
}
|
||||||
else if(fragmentById instanceof DraftsFragment) {
|
else if(fragmentById instanceof DraftsFragment) {
|
||||||
@ -309,7 +309,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
|
|||||||
userAvatar.setOnClickListener(v -> {
|
userAvatar.setOnClickListener(v -> {
|
||||||
|
|
||||||
toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile));
|
toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile));
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProfileFragment()).commit();
|
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyProfileFragment()).commit();
|
||||||
navigationView.setCheckedItem(R.id.nav_profile);
|
navigationView.setCheckedItem(R.id.nav_profile);
|
||||||
drawer.closeDrawers();
|
drawer.closeDrawers();
|
||||||
|
|
||||||
@ -380,12 +380,24 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
|
|||||||
case "notification":
|
case "notification":
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new NotificationsFragment()).commit();
|
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new NotificationsFragment()).commit();
|
||||||
navigationView.setCheckedItem(R.id.nav_notifications);
|
navigationView.setCheckedItem(R.id.nav_notifications);
|
||||||
|
setActionBarTitle(getResources().getString(R.string.pageTitleNotifications));
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case "explore":
|
case "explore":
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ExploreFragment()).commit();
|
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ExploreFragment()).commit();
|
||||||
navigationView.setCheckedItem(R.id.nav_explore);
|
navigationView.setCheckedItem(R.id.nav_explore);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
case "profile":
|
||||||
|
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyProfileFragment()).commit();
|
||||||
|
navigationView.setCheckedItem(R.id.nav_profile);
|
||||||
|
return;
|
||||||
|
|
||||||
|
case "admin":
|
||||||
|
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new AdministrationFragment()).commit();
|
||||||
|
navigationView.setCheckedItem(R.id.nav_administration);
|
||||||
|
return;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -419,7 +431,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
|
|||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile));
|
toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile));
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProfileFragment()).commit();
|
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyProfileFragment()).commit();
|
||||||
navigationView.setCheckedItem(R.id.nav_profile);
|
navigationView.setCheckedItem(R.id.nav_profile);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -557,7 +569,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig
|
|||||||
else if(id == R.id.nav_profile) {
|
else if(id == R.id.nav_profile) {
|
||||||
|
|
||||||
toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile));
|
toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile));
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProfileFragment()).commit();
|
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyProfileFragment()).commit();
|
||||||
}
|
}
|
||||||
else if(id == R.id.nav_repositories) {
|
else if(id == R.id.nav_repositories) {
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@ import com.google.gson.JsonElement;
|
|||||||
import org.gitnex.tea4j.models.MergePullRequest;
|
import org.gitnex.tea4j.models.MergePullRequest;
|
||||||
import org.gitnex.tea4j.models.MergePullRequestSpinner;
|
import org.gitnex.tea4j.models.MergePullRequestSpinner;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.actions.PullRequestActions;
|
||||||
import org.mian.gitnex.clients.RetrofitClient;
|
import org.mian.gitnex.clients.RetrofitClient;
|
||||||
import org.mian.gitnex.databinding.ActivityMergePullRequestBinding;
|
import org.mian.gitnex.databinding.ActivityMergePullRequestBinding;
|
||||||
import org.mian.gitnex.helpers.AlertDialogs;
|
import org.mian.gitnex.helpers.AlertDialogs;
|
||||||
@ -187,7 +188,7 @@ public class MergePullRequestActivity extends BaseActivity {
|
|||||||
final String repoOwner = parts[0];
|
final String repoOwner = parts[0];
|
||||||
final String repoName = parts[1];
|
final String repoName = parts[1];
|
||||||
|
|
||||||
deleteBranchFunction(repoOwner, repoName);
|
PullRequestActions.deleteHeadBranch(ctx, repoOwner, repoName, tinyDB.getString("prHeadBranch"), false);
|
||||||
|
|
||||||
Toasty.success(ctx, getString(R.string.mergePRSuccessMsg));
|
Toasty.success(ctx, getString(R.string.mergePRSuccessMsg));
|
||||||
tinyDB.putBoolean("prMerged", true);
|
tinyDB.putBoolean("prMerged", true);
|
||||||
@ -201,7 +202,7 @@ public class MergePullRequestActivity extends BaseActivity {
|
|||||||
final String repoOwner = parts[0];
|
final String repoOwner = parts[0];
|
||||||
final String repoName = parts[1];
|
final String repoName = parts[1];
|
||||||
|
|
||||||
deleteBranchFunction(repoOwner, repoName);
|
PullRequestActions.deleteHeadBranch(ctx, repoOwner, repoName, tinyDB.getString("prHeadBranch"), false);
|
||||||
|
|
||||||
Toasty.success(ctx, getString(R.string.mergePRSuccessMsg));
|
Toasty.success(ctx, getString(R.string.mergePRSuccessMsg));
|
||||||
tinyDB.putBoolean("prMerged", true);
|
tinyDB.putBoolean("prMerged", true);
|
||||||
@ -253,36 +254,6 @@ public class MergePullRequestActivity extends BaseActivity {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void deleteBranchFunction(String repoOwner, String repoName) {
|
|
||||||
|
|
||||||
String branchName = tinyDB.getString("prHeadBranch");
|
|
||||||
|
|
||||||
Call<JsonElement> call = RetrofitClient
|
|
||||||
.getApiInterface(ctx)
|
|
||||||
.deleteBranch(Authorization.get(ctx), repoOwner, repoName, branchName);
|
|
||||||
|
|
||||||
call.enqueue(new Callback<JsonElement>() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResponse(@NonNull Call<JsonElement> call, @NonNull retrofit2.Response<JsonElement> response) {
|
|
||||||
|
|
||||||
if(response.code() == 204) {
|
|
||||||
|
|
||||||
Log.i("deleteBranch", "Branch deleted successfully");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onFailure(@NonNull Call<JsonElement> call, @NonNull Throwable t) {
|
|
||||||
|
|
||||||
Log.e("onFailure", t.toString());
|
|
||||||
enableProcessButton();
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void disableProcessButton() {
|
private void disableProcessButton() {
|
||||||
|
|
||||||
viewBinding.mergeButton.setEnabled(false);
|
viewBinding.mergeButton.setEnabled(false);
|
||||||
|
@ -30,7 +30,7 @@ import retrofit2.Callback;
|
|||||||
* Author M M Arif
|
* Author M M Arif
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class ProfileEmailActivity extends BaseActivity {
|
public class MyProfileEmailActivity extends BaseActivity {
|
||||||
|
|
||||||
private View.OnClickListener onClickListener;
|
private View.OnClickListener onClickListener;
|
||||||
private EditText userEmail;
|
private EditText userEmail;
|
@ -0,0 +1,143 @@
|
|||||||
|
package org.mian.gitnex.activities;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.graphics.Typeface;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.appcompat.widget.Toolbar;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
import androidx.viewpager2.adapter.FragmentStateAdapter;
|
||||||
|
import androidx.viewpager2.widget.ViewPager2;
|
||||||
|
import com.google.android.material.tabs.TabLayout;
|
||||||
|
import com.google.android.material.tabs.TabLayoutMediator;
|
||||||
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.fragments.profile.DetailFragment;
|
||||||
|
import org.mian.gitnex.fragments.profile.FollowersFragment;
|
||||||
|
import org.mian.gitnex.fragments.profile.FollowingFragment;
|
||||||
|
import org.mian.gitnex.fragments.profile.OrganizationsFragment;
|
||||||
|
import org.mian.gitnex.fragments.profile.RepositoriesFragment;
|
||||||
|
import org.mian.gitnex.fragments.profile.StarredRepositoriesFragment;
|
||||||
|
import org.mian.gitnex.helpers.Toasty;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Author M M Arif
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class ProfileActivity extends BaseActivity {
|
||||||
|
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_profile);
|
||||||
|
Intent profileIntent = getIntent();
|
||||||
|
Typeface myTypeface;
|
||||||
|
|
||||||
|
Toolbar toolbar = findViewById(R.id.toolbar);
|
||||||
|
TextView toolbarTitle = findViewById(R.id.toolbarTitle);
|
||||||
|
|
||||||
|
if(profileIntent.getStringExtra("username") != null && !Objects.equals(profileIntent.getStringExtra("username"), "")) {
|
||||||
|
username = profileIntent.getStringExtra("username");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Toasty.warning(ctx, ctx.getResources().getString(R.string.userInvalidUserName));
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
setSupportActionBar(toolbar);
|
||||||
|
Objects.requireNonNull(getSupportActionBar()).setTitle(username);
|
||||||
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
|
|
||||||
|
ViewPager2 viewPager = findViewById(R.id.profileContainer);
|
||||||
|
viewPager.setOffscreenPageLimit(1);
|
||||||
|
TabLayout tabLayout = findViewById(R.id.tabs);
|
||||||
|
|
||||||
|
switch(tinyDB.getInt("customFontId", -1)) {
|
||||||
|
case 0:
|
||||||
|
myTypeface = Typeface.createFromAsset(ctx.getAssets(), "fonts/roboto.ttf");
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
myTypeface = Typeface.createFromAsset(ctx.getAssets(), "fonts/sourcecodeproregular.ttf");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
myTypeface = Typeface.createFromAsset(ctx.getAssets(), "fonts/manroperegular.ttf");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
toolbarTitle.setTypeface(myTypeface);
|
||||||
|
toolbarTitle.setText(username);
|
||||||
|
|
||||||
|
viewPager.setAdapter(new ViewPagerAdapter(this));
|
||||||
|
|
||||||
|
String[] tabTitles = {ctx.getResources().getString(R.string.tabTextInfo), ctx.getResources().getString(R.string.navRepos), ctx.getResources().getString(R.string.navStarredRepos), ctx.getResources().getString(R.string.navOrg), ctx.getResources().getString(R.string.profileTabFollowers), ctx.getResources().getString(R.string.profileTabFollowing)};
|
||||||
|
new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> tab.setText(tabTitles[position])).attach();
|
||||||
|
|
||||||
|
ViewGroup vg = (ViewGroup) tabLayout.getChildAt(0);
|
||||||
|
int tabsCount = vg.getChildCount();
|
||||||
|
|
||||||
|
for (int j = 0; j < tabsCount; j++) {
|
||||||
|
|
||||||
|
ViewGroup vgTab = (ViewGroup) vg.getChildAt(j);
|
||||||
|
int tabChildCount = vgTab.getChildCount();
|
||||||
|
|
||||||
|
for (int i = 0; i < tabChildCount; i++) {
|
||||||
|
View tabViewChild = vgTab.getChildAt(i);
|
||||||
|
if (tabViewChild instanceof TextView) {
|
||||||
|
((TextView) tabViewChild).setTypeface(myTypeface);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ViewPagerAdapter extends FragmentStateAdapter {
|
||||||
|
|
||||||
|
public ViewPagerAdapter(@NonNull FragmentActivity fa) { super(fa); }
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Fragment createFragment(int position) {
|
||||||
|
switch(position) {
|
||||||
|
case 0: // detail
|
||||||
|
return DetailFragment.newInstance(username);
|
||||||
|
case 1: // repos
|
||||||
|
return RepositoriesFragment.newInstance(username);
|
||||||
|
case 2: // starred repos
|
||||||
|
return StarredRepositoriesFragment.newInstance(username);
|
||||||
|
case 3: // organizations
|
||||||
|
return OrganizationsFragment.newInstance(username);
|
||||||
|
case 4: // followers
|
||||||
|
return FollowersFragment.newInstance(username);
|
||||||
|
case 5: // following
|
||||||
|
return FollowingFragment.newInstance(username);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
|
|
||||||
|
int id = item.getItemId();
|
||||||
|
|
||||||
|
if(id == android.R.id.home) {
|
||||||
|
finish();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -232,13 +232,84 @@ public class RepoDetailActivity extends BaseActivity implements BottomSheetRepoF
|
|||||||
mainIntent.removeExtra("goToSection");
|
mainIntent.removeExtra("goToSection");
|
||||||
mainIntent.removeExtra("goToSectionType");
|
mainIntent.removeExtra("goToSectionType");
|
||||||
|
|
||||||
if(goToSectionType.equals("issue")) {
|
switch(goToSectionType) {
|
||||||
|
case "branchesList":
|
||||||
RepoDetailActivity.mViewPager.setCurrentItem(2);
|
RepoDetailActivity.mViewPager.setCurrentItem(1);
|
||||||
}
|
chooseBranch();
|
||||||
else if(goToSectionType.equals("pull")) {
|
break;
|
||||||
|
case "branch":
|
||||||
RepoDetailActivity.mViewPager.setCurrentItem(3);
|
RepoDetailActivity.mViewPager.setCurrentItem(1);
|
||||||
|
String selectedBranch = mainIntent.getStringExtra("selectedBranch");
|
||||||
|
tinyDB.putString("repoBranch", selectedBranch);
|
||||||
|
if(getFragmentRefreshListenerFiles() != null) {
|
||||||
|
getFragmentRefreshListenerFiles().onRefresh(selectedBranch);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "file":
|
||||||
|
RepoDetailActivity.mViewPager.setCurrentItem(1);
|
||||||
|
String branch1 = mainIntent.getStringExtra("branch");
|
||||||
|
tinyDB.putString("repoBranch", branch1);
|
||||||
|
if(getFragmentRefreshListenerFiles() != null) {
|
||||||
|
getFragmentRefreshListenerFiles().onRefresh(branch1);
|
||||||
|
}
|
||||||
|
Intent intent = new Intent(ctx, FileViewActivity.class);
|
||||||
|
intent.putExtra("file", mainIntent.getSerializableExtra("file"));
|
||||||
|
startActivity(intent);
|
||||||
|
break;
|
||||||
|
case "dir":
|
||||||
|
RepoDetailActivity.mViewPager.setCurrentItem(1);
|
||||||
|
String branch2 = mainIntent.getStringExtra("branch");
|
||||||
|
tinyDB.putString("repoBranch", branch2);
|
||||||
|
if(getFragmentRefreshListenerFiles() != null) {
|
||||||
|
getFragmentRefreshListenerFiles().onRefresh(branch2);
|
||||||
|
}
|
||||||
|
//((SectionsPagerAdapter) Objects.requireNonNull(RepoDetailActivity.mViewPager.getAdapter())).getItem(1);
|
||||||
|
break;
|
||||||
|
case "commitsList":
|
||||||
|
RepoDetailActivity.mViewPager.setCurrentItem(1);
|
||||||
|
String branch = mainIntent.getStringExtra("branchName");
|
||||||
|
tinyDB.putString("repoBranch", branch);
|
||||||
|
if(getFragmentRefreshListenerFiles() != null) {
|
||||||
|
getFragmentRefreshListenerFiles().onRefresh(branch);
|
||||||
|
}
|
||||||
|
Intent intent1 = new Intent(ctx, CommitsActivity.class);
|
||||||
|
intent1.putExtra("branchName", branch);
|
||||||
|
ctx.startActivity(intent1);
|
||||||
|
break;
|
||||||
|
case "issue":
|
||||||
|
RepoDetailActivity.mViewPager.setCurrentItem(2);
|
||||||
|
break;
|
||||||
|
case "issueNew":
|
||||||
|
RepoDetailActivity.mViewPager.setCurrentItem(2);
|
||||||
|
startActivity(new Intent(RepoDetailActivity.this, CreateIssueActivity.class));
|
||||||
|
break;
|
||||||
|
case "pull":
|
||||||
|
RepoDetailActivity.mViewPager.setCurrentItem(3);
|
||||||
|
break;
|
||||||
|
case "pullNew":
|
||||||
|
RepoDetailActivity.mViewPager.setCurrentItem(3);
|
||||||
|
startActivity(new Intent(RepoDetailActivity.this, CreatePullRequestActivity.class));
|
||||||
|
break;
|
||||||
|
case "releases":
|
||||||
|
RepoDetailActivity.mViewPager.setCurrentItem(4);
|
||||||
|
break;
|
||||||
|
case "newRelease":
|
||||||
|
RepoDetailActivity.mViewPager.setCurrentItem(4);
|
||||||
|
startActivity(new Intent(RepoDetailActivity.this, CreateReleaseActivity.class));
|
||||||
|
break;
|
||||||
|
case "milestones":
|
||||||
|
RepoDetailActivity.mViewPager.setCurrentItem(5);
|
||||||
|
break;
|
||||||
|
case "milestonesNew":
|
||||||
|
RepoDetailActivity.mViewPager.setCurrentItem(5);
|
||||||
|
startActivity(new Intent(RepoDetailActivity.this, CreateMilestoneActivity.class));
|
||||||
|
break;
|
||||||
|
case "labels":
|
||||||
|
RepoDetailActivity.mViewPager.setCurrentItem(6);
|
||||||
|
break;
|
||||||
|
case "settings":
|
||||||
|
startActivity(new Intent(RepoDetailActivity.this, RepositorySettingsActivity.class));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,14 +1,20 @@
|
|||||||
package org.mian.gitnex.activities;
|
package org.mian.gitnex.activities;
|
||||||
|
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.app.TimePickerDialog;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.text.format.DateFormat;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.TextView;
|
import android.widget.TimePicker;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
import androidx.fragment.app.DialogFragment;
|
||||||
import com.google.android.material.switchmaterial.SwitchMaterial;
|
import com.google.android.material.switchmaterial.SwitchMaterial;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
import org.mian.gitnex.databinding.ActivitySettingsAppearanceBinding;
|
import org.mian.gitnex.databinding.ActivitySettingsAppearanceBinding;
|
||||||
|
import org.mian.gitnex.helpers.TinyDB;
|
||||||
import org.mian.gitnex.helpers.Toasty;
|
import org.mian.gitnex.helpers.Toasty;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -19,13 +25,13 @@ public class SettingsAppearanceActivity extends BaseActivity {
|
|||||||
|
|
||||||
private View.OnClickListener onClickListener;
|
private View.OnClickListener onClickListener;
|
||||||
|
|
||||||
private static final String[] timeList = {"Pretty", "Normal"};
|
private static String[] timeList;
|
||||||
private static int timeSelectedChoice = 0;
|
private static int timeSelectedChoice = 0;
|
||||||
|
|
||||||
private static final String[] customFontList = {"Roboto", "Manrope", "Source Code Pro"};
|
private static String[] customFontList;
|
||||||
private static int customFontSelectedChoice = 0;
|
private static int customFontSelectedChoice = 0;
|
||||||
|
|
||||||
private static final String[] themeList = {"Dark", "Light", "Auto (Light / Dark)", "Retro", "Auto (Retro / Dark)", "Pitch Black"};
|
private static String[] themeList;
|
||||||
private static int themeSelectedChoice = 0;
|
private static int themeSelectedChoice = 0;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -38,48 +44,51 @@ public class SettingsAppearanceActivity extends BaseActivity {
|
|||||||
|
|
||||||
ImageView closeActivity = activitySettingsAppearanceBinding.close;
|
ImageView closeActivity = activitySettingsAppearanceBinding.close;
|
||||||
|
|
||||||
final TextView tvDateTimeSelected = activitySettingsAppearanceBinding.tvDateTimeSelected; // setter for time
|
|
||||||
final TextView customFontSelected = activitySettingsAppearanceBinding.customFontSelected; // setter for custom font
|
|
||||||
final TextView themeSelected = activitySettingsAppearanceBinding.themeSelected; // setter for theme
|
|
||||||
|
|
||||||
LinearLayout timeFrame = activitySettingsAppearanceBinding.timeFrame;
|
LinearLayout timeFrame = activitySettingsAppearanceBinding.timeFrame;
|
||||||
LinearLayout customFontFrame = activitySettingsAppearanceBinding.customFontFrame;
|
LinearLayout customFontFrame = activitySettingsAppearanceBinding.customFontFrame;
|
||||||
LinearLayout themeFrame = activitySettingsAppearanceBinding.themeSelectionFrame;
|
LinearLayout themeFrame = activitySettingsAppearanceBinding.themeSelectionFrame;
|
||||||
|
LinearLayout lightTimeFrame = activitySettingsAppearanceBinding.lightThemeTimeSelectionFrame;
|
||||||
|
LinearLayout darkTimeFrame = activitySettingsAppearanceBinding.darkThemeTimeSelectionFrame;
|
||||||
|
|
||||||
SwitchMaterial counterBadgesSwitch = activitySettingsAppearanceBinding.switchCounterBadge;
|
SwitchMaterial counterBadgesSwitch = activitySettingsAppearanceBinding.switchCounterBadge;
|
||||||
|
|
||||||
|
timeList = getResources().getStringArray(R.array.timeFormats);
|
||||||
|
customFontList = getResources().getStringArray(R.array.fonts);
|
||||||
|
themeList = getResources().getStringArray(R.array.themes);
|
||||||
|
|
||||||
initCloseListener();
|
initCloseListener();
|
||||||
closeActivity.setOnClickListener(onClickListener);
|
closeActivity.setOnClickListener(onClickListener);
|
||||||
|
|
||||||
if(!tinyDB.getString("timeStr").isEmpty()) {
|
String lightMinute = String.valueOf(tinyDB.getInt("lightThemeTimeMinute"));
|
||||||
|
String lightHour = String.valueOf(tinyDB.getInt("lightThemeTimeHour"));
|
||||||
|
if(lightMinute.length() == 1) lightMinute = "0" + lightMinute;
|
||||||
|
if(lightHour.length() == 1) lightHour = "0" + lightHour;
|
||||||
|
|
||||||
tvDateTimeSelected.setText(tinyDB.getString("timeStr"));
|
String darkMinute = String.valueOf(tinyDB.getInt("darkThemeTimeMinute"));
|
||||||
|
String darkHour = String.valueOf(tinyDB.getInt("darkThemeTimeHour"));
|
||||||
|
if(darkMinute.length() == 1) darkMinute = "0" + darkMinute;
|
||||||
|
if(darkHour.length() == 1) darkHour = "0" + darkHour;
|
||||||
|
|
||||||
|
activitySettingsAppearanceBinding.lightThemeSelectedTime.setText(ctx.getResources().getString(R.string.settingsThemeTimeSelectedHint, lightHour,
|
||||||
|
lightMinute));
|
||||||
|
activitySettingsAppearanceBinding.darkThemeSelectedTime.setText(ctx.getResources().getString(R.string.settingsThemeTimeSelectedHint, darkHour,
|
||||||
|
darkMinute));
|
||||||
|
activitySettingsAppearanceBinding.tvDateTimeSelected.setText(tinyDB.getString("timeStr"));
|
||||||
|
activitySettingsAppearanceBinding.customFontSelected.setText(tinyDB.getString("customFontStr", "Manrope"));
|
||||||
|
activitySettingsAppearanceBinding.themeSelected.setText(tinyDB.getString("themeStr", "Dark"));
|
||||||
|
|
||||||
|
if(tinyDB.getString("themeStr").startsWith("Auto")) {
|
||||||
|
darkTimeFrame.setVisibility(View.VISIBLE);
|
||||||
|
lightTimeFrame.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
darkTimeFrame.setVisibility(View.GONE);
|
||||||
|
lightTimeFrame.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!tinyDB.getString("customFontStr").isEmpty()) {
|
timeSelectedChoice = tinyDB.getInt("timeId");
|
||||||
|
customFontSelectedChoice = tinyDB.getInt("customFontId", 1);
|
||||||
customFontSelected.setText(tinyDB.getString("customFontStr"));
|
themeSelectedChoice = tinyDB.getInt("themeId");
|
||||||
}
|
|
||||||
|
|
||||||
if(!tinyDB.getString("themeStr").isEmpty()) {
|
|
||||||
|
|
||||||
themeSelected.setText(tinyDB.getString("themeStr"));
|
|
||||||
}
|
|
||||||
|
|
||||||
if(timeSelectedChoice == 0) {
|
|
||||||
|
|
||||||
timeSelectedChoice = tinyDB.getInt("timeId");
|
|
||||||
}
|
|
||||||
|
|
||||||
if(customFontSelectedChoice == 0) {
|
|
||||||
|
|
||||||
customFontSelectedChoice = tinyDB.getInt("customFontId", 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(themeSelectedChoice == 0) {
|
|
||||||
|
|
||||||
themeSelectedChoice = tinyDB.getInt("themeId");
|
|
||||||
}
|
|
||||||
|
|
||||||
counterBadgesSwitch.setChecked(tinyDB.getBoolean("enableCounterBadges"));
|
counterBadgesSwitch.setChecked(tinyDB.getBoolean("enableCounterBadges"));
|
||||||
|
|
||||||
@ -101,7 +110,7 @@ public class SettingsAppearanceActivity extends BaseActivity {
|
|||||||
tsBuilder.setSingleChoiceItems(themeList, themeSelectedChoice, (dialogInterfaceTheme, i) -> {
|
tsBuilder.setSingleChoiceItems(themeList, themeSelectedChoice, (dialogInterfaceTheme, i) -> {
|
||||||
|
|
||||||
themeSelectedChoice = i;
|
themeSelectedChoice = i;
|
||||||
themeSelected.setText(themeList[i]);
|
activitySettingsAppearanceBinding.themeSelected.setText(themeList[i]);
|
||||||
tinyDB.putString("themeStr", themeList[i]);
|
tinyDB.putString("themeStr", themeList[i]);
|
||||||
tinyDB.putInt("themeId", i);
|
tinyDB.putInt("themeId", i);
|
||||||
|
|
||||||
@ -116,6 +125,16 @@ public class SettingsAppearanceActivity extends BaseActivity {
|
|||||||
cfDialog.show();
|
cfDialog.show();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
lightTimeFrame.setOnClickListener(view -> {
|
||||||
|
LightTimePicker timePicker = new LightTimePicker();
|
||||||
|
timePicker.show(getSupportFragmentManager(), "timePicker");
|
||||||
|
});
|
||||||
|
|
||||||
|
darkTimeFrame.setOnClickListener(view -> {
|
||||||
|
DarkTimePicker timePicker = new DarkTimePicker();
|
||||||
|
timePicker.show(getSupportFragmentManager(), "timePicker");
|
||||||
|
});
|
||||||
|
|
||||||
// custom font dialog
|
// custom font dialog
|
||||||
customFontFrame.setOnClickListener(view -> {
|
customFontFrame.setOnClickListener(view -> {
|
||||||
|
|
||||||
@ -127,7 +146,7 @@ public class SettingsAppearanceActivity extends BaseActivity {
|
|||||||
cfBuilder.setSingleChoiceItems(customFontList, customFontSelectedChoice, (dialogInterfaceCustomFont, i) -> {
|
cfBuilder.setSingleChoiceItems(customFontList, customFontSelectedChoice, (dialogInterfaceCustomFont, i) -> {
|
||||||
|
|
||||||
customFontSelectedChoice = i;
|
customFontSelectedChoice = i;
|
||||||
customFontSelected.setText(customFontList[i]);
|
activitySettingsAppearanceBinding.customFontSelected.setText(customFontList[i]);
|
||||||
tinyDB.putString("customFontStr", customFontList[i]);
|
tinyDB.putString("customFontStr", customFontList[i]);
|
||||||
tinyDB.putInt("customFontId", i);
|
tinyDB.putInt("customFontId", i);
|
||||||
|
|
||||||
@ -153,17 +172,17 @@ public class SettingsAppearanceActivity extends BaseActivity {
|
|||||||
tBuilder.setSingleChoiceItems(timeList, timeSelectedChoice, (dialogInterfaceTime, i) -> {
|
tBuilder.setSingleChoiceItems(timeList, timeSelectedChoice, (dialogInterfaceTime, i) -> {
|
||||||
|
|
||||||
timeSelectedChoice = i;
|
timeSelectedChoice = i;
|
||||||
tvDateTimeSelected.setText(timeList[i]);
|
activitySettingsAppearanceBinding.tvDateTimeSelected.setText(timeList[i]);
|
||||||
tinyDB.putString("timeStr", timeList[i]);
|
tinyDB.putString("timeStr", timeList[i]);
|
||||||
tinyDB.putInt("timeId", i);
|
tinyDB.putInt("timeId", i);
|
||||||
|
|
||||||
if("Normal".equals(timeList[i])) {
|
switch(i) {
|
||||||
|
case 0:
|
||||||
tinyDB.putString("dateFormat", "normal");
|
tinyDB.putString("dateFormat", "pretty");
|
||||||
}
|
break;
|
||||||
else {
|
case 1:
|
||||||
|
tinyDB.putString("dateFormat", "normal");
|
||||||
tinyDB.putString("dateFormat", "pretty");
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
dialogInterfaceTime.dismiss();
|
dialogInterfaceTime.dismiss();
|
||||||
@ -180,4 +199,54 @@ public class SettingsAppearanceActivity extends BaseActivity {
|
|||||||
onClickListener = view -> finish();
|
onClickListener = view -> finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class LightTimePicker extends DialogFragment implements TimePickerDialog.OnTimeSetListener {
|
||||||
|
|
||||||
|
TinyDB db = TinyDB.getInstance(getContext());
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
|
int hour = db.getInt("lightThemeTimeHour");
|
||||||
|
int minute = db.getInt("lightThemeTimeMinute");
|
||||||
|
|
||||||
|
return new TimePickerDialog(getActivity(), this, hour, minute, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
|
||||||
|
db.putInt("lightThemeTimeHour", hourOfDay);
|
||||||
|
db.putInt("lightThemeTimeMinute", minute);
|
||||||
|
db.putBoolean("refreshParent", true);
|
||||||
|
requireActivity().overridePendingTransition(0, 0);
|
||||||
|
this.dismiss();
|
||||||
|
Toasty.success(requireActivity().getApplicationContext(), requireContext().getResources().getString(R.string.settingsSave));
|
||||||
|
requireActivity().recreate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class DarkTimePicker extends DialogFragment implements TimePickerDialog.OnTimeSetListener {
|
||||||
|
|
||||||
|
TinyDB db = TinyDB.getInstance(getContext());
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
|
int hour = db.getInt("darkThemeTimeHour");
|
||||||
|
int minute = db.getInt("darkThemeTimeMinute");
|
||||||
|
|
||||||
|
return new TimePickerDialog(getActivity(), this, hour, minute, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
|
||||||
|
db.putInt("darkThemeTimeHour", hourOfDay);
|
||||||
|
db.putInt("darkThemeTimeMinute", minute);
|
||||||
|
db.putBoolean("refreshParent", true);
|
||||||
|
requireActivity().overridePendingTransition(0, 0);
|
||||||
|
this.dismiss();
|
||||||
|
Toasty.success(requireActivity().getApplicationContext(), requireContext().getResources().getString(R.string.settingsSave));
|
||||||
|
requireActivity().recreate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@ public class SettingsGeneralActivity extends BaseActivity {
|
|||||||
private List<String> homeScreenList;
|
private List<String> homeScreenList;
|
||||||
private static int homeScreenSelectedChoice = 0;
|
private static int homeScreenSelectedChoice = 0;
|
||||||
|
|
||||||
private List<String> defaultScreen;
|
private List<String> linkHandlerDefaultScreen;
|
||||||
private static int defaultLinkHandlerScreenSelectedChoice = 0;
|
private static int defaultLinkHandlerScreenSelectedChoice = 0;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -38,20 +38,16 @@ public class SettingsGeneralActivity extends BaseActivity {
|
|||||||
viewBinding.close.setOnClickListener(onClickListener);
|
viewBinding.close.setOnClickListener(onClickListener);
|
||||||
|
|
||||||
// home screen
|
// home screen
|
||||||
String[] homeDefaultScreen_ = {getResources().getString(R.string.pageTitleMyRepos), getResources().getString(R.string.pageTitleStarredRepos), getResources().getString(R.string.pageTitleOrganizations),
|
String[] appHomeDefaultScreen = getResources().getStringArray(R.array.appDefaultHomeScreen);
|
||||||
getResources().getString(R.string.pageTitleRepositories), getResources().getString(R.string.pageTitleProfile), getResources().getString(R.string.pageTitleExplore),
|
|
||||||
getResources().getString(R.string.titleDrafts)};
|
|
||||||
|
|
||||||
String[] homeDefaultScreenNew = {getResources().getString(R.string.pageTitleMyRepos), getResources().getString(R.string.pageTitleStarredRepos), getResources().getString(R.string.pageTitleOrganizations),
|
String[] appHomeDefaultScreenNew = getResources().getStringArray(R.array.appDefaultHomeScreenNew);
|
||||||
getResources().getString(R.string.pageTitleRepositories), getResources().getString(R.string.pageTitleProfile), getResources().getString(R.string.pageTitleExplore),
|
|
||||||
getResources().getString(R.string.titleDrafts), getResources().getString(R.string.pageTitleNotifications)};
|
|
||||||
|
|
||||||
if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.3")) {
|
if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.12.3")) {
|
||||||
|
|
||||||
homeDefaultScreen_ = homeDefaultScreenNew;
|
appHomeDefaultScreen = appHomeDefaultScreenNew;
|
||||||
}
|
}
|
||||||
|
|
||||||
homeScreenList = new ArrayList<>(Arrays.asList(homeDefaultScreen_));
|
homeScreenList = new ArrayList<>(Arrays.asList(appHomeDefaultScreen));
|
||||||
String[] homeScreenArray = new String[homeScreenList.size()];
|
String[] homeScreenArray = new String[homeScreenList.size()];
|
||||||
homeScreenList.toArray(homeScreenArray);
|
homeScreenList.toArray(homeScreenArray);
|
||||||
|
|
||||||
@ -113,34 +109,14 @@ public class SettingsGeneralActivity extends BaseActivity {
|
|||||||
// home screen
|
// home screen
|
||||||
|
|
||||||
// link handler
|
// link handler
|
||||||
String[] defaultScreen_ = {getResources().getString(R.string.generalDeepLinkSelectedText), getResources().getString(R.string.navRepos), getResources().getString(R.string.navOrg), getResources().getString(R.string.pageTitleNotifications), getResources().getString(R.string.navExplore)};
|
String[] linkHandlerDefaultScreenList = getResources().getStringArray(R.array.linkHandlerDefaultScreen);
|
||||||
defaultScreen = new ArrayList<>(Arrays.asList(defaultScreen_));
|
linkHandlerDefaultScreen = new ArrayList<>(Arrays.asList(linkHandlerDefaultScreenList));
|
||||||
|
|
||||||
String[] linksArray = new String[defaultScreen.size()];
|
String[] linksArray = new String[linkHandlerDefaultScreen.size()];
|
||||||
defaultScreen.toArray(linksArray);
|
linkHandlerDefaultScreen.toArray(linksArray);
|
||||||
|
|
||||||
if(defaultLinkHandlerScreenSelectedChoice == 0) {
|
defaultLinkHandlerScreenSelectedChoice = tinyDB.getInt("defaultScreenId");
|
||||||
|
viewBinding.generalDeepLinkSelected.setText(linksArray[defaultLinkHandlerScreenSelectedChoice]);
|
||||||
defaultLinkHandlerScreenSelectedChoice = tinyDB.getInt("defaultScreenId");
|
|
||||||
viewBinding.generalDeepLinkSelected.setText(getResources().getString(R.string.generalDeepLinkSelectedText));
|
|
||||||
}
|
|
||||||
|
|
||||||
if(defaultLinkHandlerScreenSelectedChoice == 1) {
|
|
||||||
|
|
||||||
viewBinding.generalDeepLinkSelected.setText(getResources().getString(R.string.navRepos));
|
|
||||||
}
|
|
||||||
else if(defaultLinkHandlerScreenSelectedChoice == 2) {
|
|
||||||
|
|
||||||
viewBinding.generalDeepLinkSelected.setText(getResources().getString(R.string.navOrg));
|
|
||||||
}
|
|
||||||
else if(defaultLinkHandlerScreenSelectedChoice == 3) {
|
|
||||||
|
|
||||||
viewBinding.generalDeepLinkSelected.setText(getResources().getString(R.string.pageTitleNotifications));
|
|
||||||
}
|
|
||||||
else if(defaultLinkHandlerScreenSelectedChoice == 4) {
|
|
||||||
|
|
||||||
viewBinding.generalDeepLinkSelected.setText(getResources().getString(R.string.navExplore));
|
|
||||||
}
|
|
||||||
|
|
||||||
viewBinding.setDefaultLinkHandler.setOnClickListener(setDefaultLinkHandler -> {
|
viewBinding.setDefaultLinkHandler.setOnClickListener(setDefaultLinkHandler -> {
|
||||||
|
|
||||||
|
@ -31,10 +31,10 @@ public class SettingsSecurityActivity extends BaseActivity {
|
|||||||
|
|
||||||
private View.OnClickListener onClickListener;
|
private View.OnClickListener onClickListener;
|
||||||
|
|
||||||
private static final String[] cacheSizeDataList = {"50 MB", "100 MB", "250 MB", "500 MB", "1 GB"};
|
private static String[] cacheSizeDataList;
|
||||||
private static int cacheSizeDataSelectedChoice = 0;
|
private static int cacheSizeDataSelectedChoice = 0;
|
||||||
|
|
||||||
private static final String[] cacheSizeImagesList = {"50 MB", "100 MB", "250 MB", "500 MB", "1 GB"};
|
private static String[] cacheSizeImagesList;
|
||||||
private static int cacheSizeImagesSelectedChoice = 0;
|
private static int cacheSizeImagesSelectedChoice = 0;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -61,6 +61,9 @@ public class SettingsSecurityActivity extends BaseActivity {
|
|||||||
|
|
||||||
SwitchMaterial switchBiometric = activitySettingsSecurityBinding.switchBiometric;
|
SwitchMaterial switchBiometric = activitySettingsSecurityBinding.switchBiometric;
|
||||||
|
|
||||||
|
cacheSizeDataList = getResources().getStringArray(R.array.cacheSizeList);
|
||||||
|
cacheSizeImagesList = getResources().getStringArray(R.array.cacheSizeList);
|
||||||
|
|
||||||
if(!tinyDB.getString("cacheSizeStr").isEmpty()) {
|
if(!tinyDB.getString("cacheSizeStr").isEmpty()) {
|
||||||
|
|
||||||
cacheSizeDataSelected.setText(tinyDB.getString("cacheSizeStr"));
|
cacheSizeDataSelected.setText(tinyDB.getString("cacheSizeStr"));
|
||||||
|
@ -11,6 +11,9 @@ import androidx.appcompat.app.AlertDialog;
|
|||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
import org.mian.gitnex.databinding.ActivitySettingsTranslationBinding;
|
import org.mian.gitnex.databinding.ActivitySettingsTranslationBinding;
|
||||||
import org.mian.gitnex.helpers.Toasty;
|
import org.mian.gitnex.helpers.Toasty;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Author M M Arif
|
* Author M M Arif
|
||||||
@ -20,8 +23,6 @@ public class SettingsTranslationActivity extends BaseActivity {
|
|||||||
|
|
||||||
private View.OnClickListener onClickListener;
|
private View.OnClickListener onClickListener;
|
||||||
|
|
||||||
private static String[] langList = {"English", "Arabic", "Chinese", "Czech", "Finnish", "French", "German", "Italian", "Latvian", "Persian",
|
|
||||||
"Polish", "Portuguese/Brazilian", "Russian", "Serbian", "Spanish", "Turkish", "Ukrainian"};
|
|
||||||
private static int langSelectedChoice = 0;
|
private static int langSelectedChoice = 0;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -29,6 +30,12 @@ public class SettingsTranslationActivity extends BaseActivity {
|
|||||||
|
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
LinkedHashMap<String, String> langs = new LinkedHashMap<>();
|
||||||
|
langs.put("", getString(R.string.settingsLanguageSystem));
|
||||||
|
for(String langCode : getResources().getStringArray(R.array.languages)) {
|
||||||
|
langs.put(langCode, getLanguageDisplayName(langCode));
|
||||||
|
}
|
||||||
|
|
||||||
ActivitySettingsTranslationBinding activitySettingsTranslationBinding = ActivitySettingsTranslationBinding.inflate(getLayoutInflater());
|
ActivitySettingsTranslationBinding activitySettingsTranslationBinding = ActivitySettingsTranslationBinding.inflate(getLayoutInflater());
|
||||||
setContentView(activitySettingsTranslationBinding.getRoot());
|
setContentView(activitySettingsTranslationBinding.getRoot());
|
||||||
|
|
||||||
@ -52,15 +59,9 @@ public class SettingsTranslationActivity extends BaseActivity {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if(!tinyDB.getString("localeStr").isEmpty()) {
|
tvLanguageSelected.setText(tinyDB.getString("localeStr"));
|
||||||
|
|
||||||
tvLanguageSelected.setText(tinyDB.getString("localeStr"));
|
langSelectedChoice = tinyDB.getInt("langId");
|
||||||
}
|
|
||||||
|
|
||||||
if(langSelectedChoice == 0) {
|
|
||||||
|
|
||||||
langSelectedChoice = tinyDB.getInt("langId");
|
|
||||||
}
|
|
||||||
|
|
||||||
// language dialog
|
// language dialog
|
||||||
langFrame.setOnClickListener(view -> {
|
langFrame.setOnClickListener(view -> {
|
||||||
@ -70,89 +71,18 @@ public class SettingsTranslationActivity extends BaseActivity {
|
|||||||
lBuilder.setTitle(R.string.settingsLanguageSelectorDialogTitle);
|
lBuilder.setTitle(R.string.settingsLanguageSelectorDialogTitle);
|
||||||
lBuilder.setCancelable(langSelectedChoice != -1);
|
lBuilder.setCancelable(langSelectedChoice != -1);
|
||||||
|
|
||||||
lBuilder.setSingleChoiceItems(langList, langSelectedChoice, (dialogInterface, i) -> {
|
lBuilder.setSingleChoiceItems(langs.values().toArray(new String[0]), langSelectedChoice, (dialogInterface, i) -> {
|
||||||
|
|
||||||
langSelectedChoice = i;
|
String selectedLanguage = langs.keySet().toArray(new String[0])[i];
|
||||||
tvLanguageSelected.setText(langList[i]);
|
tinyDB.putString("localeStr", langs.get(selectedLanguage));
|
||||||
tinyDB.putString("localeStr", langList[i]);
|
|
||||||
tinyDB.putInt("langId", i);
|
tinyDB.putInt("langId", i);
|
||||||
|
tinyDB.putString("locale", selectedLanguage);
|
||||||
switch(langList[i]) {
|
|
||||||
case "Arabic":
|
|
||||||
|
|
||||||
tinyDB.putString("locale", "ar");
|
|
||||||
break;
|
|
||||||
case "Chinese":
|
|
||||||
|
|
||||||
tinyDB.putString("locale", "zh");
|
|
||||||
break;
|
|
||||||
case "Czech":
|
|
||||||
|
|
||||||
tinyDB.putString("locale", "cs");
|
|
||||||
break;
|
|
||||||
case "Finnish":
|
|
||||||
|
|
||||||
tinyDB.putString("locale", "fi");
|
|
||||||
break;
|
|
||||||
case "French":
|
|
||||||
|
|
||||||
tinyDB.putString("locale", "fr");
|
|
||||||
break;
|
|
||||||
case "German":
|
|
||||||
|
|
||||||
tinyDB.putString("locale", "de");
|
|
||||||
break;
|
|
||||||
case "Italian":
|
|
||||||
|
|
||||||
tinyDB.putString("locale", "it");
|
|
||||||
break;
|
|
||||||
case "Latvian":
|
|
||||||
|
|
||||||
tinyDB.putString("locale", "lv");
|
|
||||||
break;
|
|
||||||
case "Persian":
|
|
||||||
|
|
||||||
tinyDB.putString("locale", "fa");
|
|
||||||
break;
|
|
||||||
case "Polish":
|
|
||||||
|
|
||||||
tinyDB.putString("locale", "pl");
|
|
||||||
break;
|
|
||||||
case "Portuguese/Brazilian":
|
|
||||||
|
|
||||||
tinyDB.putString("locale", "pt");
|
|
||||||
break;
|
|
||||||
case "Russian":
|
|
||||||
|
|
||||||
tinyDB.putString("locale", "ru");
|
|
||||||
break;
|
|
||||||
case "Serbian":
|
|
||||||
|
|
||||||
tinyDB.putString("locale", "sr");
|
|
||||||
break;
|
|
||||||
case "Spanish":
|
|
||||||
|
|
||||||
tinyDB.putString("locale", "es");
|
|
||||||
break;
|
|
||||||
case "Turkish":
|
|
||||||
|
|
||||||
tinyDB.putString("locale", "tr");
|
|
||||||
break;
|
|
||||||
case "Ukrainian":
|
|
||||||
|
|
||||||
tinyDB.putString("locale", "uk");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
|
|
||||||
tinyDB.putString("locale", "en");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
tinyDB.putBoolean("refreshParent", true);
|
tinyDB.putBoolean("refreshParent", true);
|
||||||
this.recreate();
|
|
||||||
this.overridePendingTransition(0, 0);
|
this.overridePendingTransition(0, 0);
|
||||||
dialogInterface.dismiss();
|
dialogInterface.dismiss();
|
||||||
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
|
Toasty.success(appCtx, getResources().getString(R.string.settingsSave));
|
||||||
|
this.recreate();
|
||||||
});
|
});
|
||||||
|
|
||||||
lBuilder.setNeutralButton(getString(R.string.cancelButton), null);
|
lBuilder.setNeutralButton(getString(R.string.cancelButton), null);
|
||||||
@ -167,4 +97,10 @@ public class SettingsTranslationActivity extends BaseActivity {
|
|||||||
onClickListener = view -> finish();
|
onClickListener = view -> finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String getLanguageDisplayName(String langCode) {
|
||||||
|
Locale english = new Locale("en");
|
||||||
|
Locale translated = new Locale(langCode);
|
||||||
|
return String.format("%s (%s)", translated.getDisplayName(translated), translated.getDisplayName(english));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@ public class AdminCronTasksAdapter extends RecyclerView.Adapter<AdminCronTasksAd
|
|||||||
super(itemView);
|
super(itemView);
|
||||||
Context ctx = itemView.getContext();
|
Context ctx = itemView.getContext();
|
||||||
|
|
||||||
final String locale = tinyDb.getString("locale");
|
final Locale locale = ctx.getResources().getConfiguration().locale;
|
||||||
final String timeFormat = tinyDb.getString("dateFormat");
|
final String timeFormat = tinyDb.getString("dateFormat");
|
||||||
|
|
||||||
ImageView runTask = itemView.findViewById(R.id.runTask);
|
ImageView runTask = itemView.findViewById(R.id.runTask);
|
||||||
@ -58,10 +58,10 @@ public class AdminCronTasksAdapter extends RecyclerView.Adapter<AdminCronTasksAd
|
|||||||
String lastRun = "";
|
String lastRun = "";
|
||||||
|
|
||||||
if(cronTasks.getNext() != null) {
|
if(cronTasks.getNext() != null) {
|
||||||
nextRun = TimeHelper.formatTime(cronTasks.getNext(), new Locale(locale), timeFormat, ctx);
|
nextRun = TimeHelper.formatTime(cronTasks.getNext(), locale, timeFormat, ctx);
|
||||||
}
|
}
|
||||||
if(cronTasks.getPrev() != null) {
|
if(cronTasks.getPrev() != null) {
|
||||||
lastRun = TimeHelper.formatTime(cronTasks.getPrev(), new Locale(locale), timeFormat, ctx);
|
lastRun = TimeHelper.formatTime(cronTasks.getPrev(), locale, timeFormat, ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
View view = LayoutInflater.from(ctx).inflate(R.layout.layout_cron_task_info, null);
|
View view = LayoutInflater.from(ctx).inflate(R.layout.layout_cron_task_info, null);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package org.mian.gitnex.adapters;
|
package org.mian.gitnex.adapters;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
import android.text.Html;
|
import android.text.Html;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@ -15,6 +16,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
|||||||
import com.amulyakhare.textdrawable.TextDrawable;
|
import com.amulyakhare.textdrawable.TextDrawable;
|
||||||
import org.gitnex.tea4j.models.UserInfo;
|
import org.gitnex.tea4j.models.UserInfo;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.activities.ProfileActivity;
|
||||||
import org.mian.gitnex.clients.PicassoService;
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
import org.mian.gitnex.helpers.AppUtil;
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
import org.mian.gitnex.helpers.RoundedTransformation;
|
||||||
@ -31,7 +33,7 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter<AdminGetUsersAdap
|
|||||||
private final Context context;
|
private final Context context;
|
||||||
private final List<UserInfo> usersListFull;
|
private final List<UserInfo> usersListFull;
|
||||||
|
|
||||||
static class UsersViewHolder extends RecyclerView.ViewHolder {
|
class UsersViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
private String userLoginId;
|
private String userLoginId;
|
||||||
|
|
||||||
@ -52,10 +54,14 @@ public class AdminGetUsersAdapter extends RecyclerView.Adapter<AdminGetUsersAdap
|
|||||||
userRole = itemView.findViewById(R.id.userRole);
|
userRole = itemView.findViewById(R.id.userRole);
|
||||||
|
|
||||||
userAvatar.setOnClickListener(loginId -> {
|
userAvatar.setOnClickListener(loginId -> {
|
||||||
|
Intent intent = new Intent(context, ProfileActivity.class);
|
||||||
|
intent.putExtra("username", userLoginId);
|
||||||
|
context.startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
Context context = loginId.getContext();
|
userAvatar.setOnLongClickListener(loginId -> {
|
||||||
|
|
||||||
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
|
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
|
||||||
|
return true;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package org.mian.gitnex.adapters;
|
|||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
import android.text.Html;
|
import android.text.Html;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@ -11,6 +12,7 @@ import android.widget.ImageView;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import org.gitnex.tea4j.models.Collaborators;
|
import org.gitnex.tea4j.models.Collaborators;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.activities.ProfileActivity;
|
||||||
import org.mian.gitnex.clients.PicassoService;
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
import org.mian.gitnex.helpers.AppUtil;
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
import org.mian.gitnex.helpers.RoundedTransformation;
|
||||||
@ -25,7 +27,7 @@ public class CollaboratorsAdapter extends BaseAdapter {
|
|||||||
private final List<Collaborators> collaboratorsList;
|
private final List<Collaborators> collaboratorsList;
|
||||||
private final Context context;
|
private final Context context;
|
||||||
|
|
||||||
private static class ViewHolder {
|
private class ViewHolder {
|
||||||
|
|
||||||
private String userLoginId;
|
private String userLoginId;
|
||||||
|
|
||||||
@ -38,10 +40,14 @@ public class CollaboratorsAdapter extends BaseAdapter {
|
|||||||
collaboratorName = v.findViewById(R.id.collaboratorName);
|
collaboratorName = v.findViewById(R.id.collaboratorName);
|
||||||
|
|
||||||
collaboratorAvatar.setOnClickListener(loginId -> {
|
collaboratorAvatar.setOnClickListener(loginId -> {
|
||||||
|
Intent intent = new Intent(context, ProfileActivity.class);
|
||||||
|
intent.putExtra("username", userLoginId);
|
||||||
|
context.startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
Context context = loginId.getContext();
|
collaboratorAvatar.setOnLongClickListener(loginId -> {
|
||||||
|
|
||||||
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
|
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
|
||||||
|
return true;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -57,13 +57,11 @@ public class CommitsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
|
|||||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
||||||
|
|
||||||
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
|
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
|
||||||
|
|
||||||
isLoading = true;
|
isLoading = true;
|
||||||
loadMoreListener.onLoadMore();
|
loadMoreListener.onLoadMore();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(getItemViewType(position) == TYPE_LOAD) {
|
if(getItemViewType(position) == TYPE_LOAD) {
|
||||||
|
|
||||||
((CommitsHolder) holder).bindData(commitsList.get(position));
|
((CommitsHolder) holder).bindData(commitsList.get(position));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -106,18 +104,16 @@ public class CommitsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
|
|||||||
void bindData(Commits commitsModel) {
|
void bindData(Commits commitsModel) {
|
||||||
|
|
||||||
final TinyDB tinyDb = TinyDB.getInstance(context);
|
final TinyDB tinyDb = TinyDB.getInstance(context);
|
||||||
final String locale = tinyDb.getString("locale");
|
Locale locale = context.getResources().getConfiguration().locale;
|
||||||
final String timeFormat = tinyDb.getString("dateFormat");
|
final String timeFormat = tinyDb.getString("dateFormat");
|
||||||
|
|
||||||
commitTitle.setText(EmojiParser.parseToUnicode(commitsModel.getCommit().getMessage()));
|
commitTitle.setText(EmojiParser.parseToUnicode(commitsModel.getCommit().getMessage()));
|
||||||
commitCommitter.setText(context.getString(R.string.commitCommittedBy, commitsModel.getCommit().getCommitter().getName()));
|
commitCommitter.setText(context.getString(R.string.commitCommittedBy, commitsModel.getCommit().getCommitter().getName()));
|
||||||
|
commitDate.setText(TimeHelper.formatTime(commitsModel.getCommit().getCommitter().getDate(), locale, timeFormat, context));
|
||||||
commitDate.setText(TimeHelper.formatTime(commitsModel.getCommit().getCommitter().getDate(), new Locale(locale), timeFormat, context));
|
|
||||||
|
|
||||||
if(timeFormat.equals("pretty")) {
|
if(timeFormat.equals("pretty")) {
|
||||||
commitDate.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(commitsModel.getCommit().getCommitter().getDate()), context));
|
commitDate.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(commitsModel.getCommit().getCommitter().getDate()), context));
|
||||||
}
|
}
|
||||||
|
|
||||||
commitHtmlUrl.setOnClickListener(v -> context.startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse(commitsModel.getHtml_url()))));
|
commitHtmlUrl.setOnClickListener(v -> context.startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse(commitsModel.getHtml_url()))));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,36 +122,29 @@ public class CommitsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
|
|||||||
static class LoadHolder extends RecyclerView.ViewHolder {
|
static class LoadHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
LoadHolder(View itemView) {
|
LoadHolder(View itemView) {
|
||||||
|
|
||||||
super(itemView);
|
super(itemView);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMoreDataAvailable(boolean moreDataAvailable) {
|
public void setMoreDataAvailable(boolean moreDataAvailable) {
|
||||||
|
|
||||||
isMoreDataAvailable = moreDataAvailable;
|
isMoreDataAvailable = moreDataAvailable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void notifyDataChanged() {
|
public void notifyDataChanged() {
|
||||||
|
|
||||||
notifyDataSetChanged();
|
notifyDataSetChanged();
|
||||||
isLoading = false;
|
isLoading = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface OnLoadMoreListener {
|
public interface OnLoadMoreListener {
|
||||||
|
|
||||||
void onLoadMore();
|
void onLoadMore();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLoadMoreListener(CommitsAdapter.OnLoadMoreListener loadMoreListener) {
|
public void setLoadMoreListener(CommitsAdapter.OnLoadMoreListener loadMoreListener) {
|
||||||
|
|
||||||
this.loadMoreListener = loadMoreListener;
|
this.loadMoreListener = loadMoreListener;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateList(List<Commits> list) {
|
public void updateList(List<Commits> list) {
|
||||||
|
|
||||||
commitsList = list;
|
commitsList = list;
|
||||||
notifyDataSetChanged();
|
notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
|||||||
import org.gitnex.tea4j.models.Issues;
|
import org.gitnex.tea4j.models.Issues;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
import org.mian.gitnex.activities.IssueDetailActivity;
|
import org.mian.gitnex.activities.IssueDetailActivity;
|
||||||
|
import org.mian.gitnex.activities.ProfileActivity;
|
||||||
import org.mian.gitnex.clients.PicassoService;
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
import org.mian.gitnex.database.api.BaseApi;
|
import org.mian.gitnex.database.api.BaseApi;
|
||||||
import org.mian.gitnex.database.api.RepositoriesApi;
|
import org.mian.gitnex.database.api.RepositoriesApi;
|
||||||
@ -33,13 +34,13 @@ import java.util.Locale;
|
|||||||
* Author M M Arif
|
* Author M M Arif
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class SearchIssuesAdapter extends RecyclerView.Adapter<SearchIssuesAdapter.SearchViewHolder> {
|
public class ExploreIssuesAdapter extends RecyclerView.Adapter<ExploreIssuesAdapter.SearchViewHolder> {
|
||||||
|
|
||||||
private final List<Issues> searchedList;
|
private final List<Issues> searchedList;
|
||||||
private final Context context;
|
private final Context context;
|
||||||
private final TinyDB tinyDb;
|
private final TinyDB tinyDb;
|
||||||
|
|
||||||
public SearchIssuesAdapter(List<Issues> dataList, Context ctx) {
|
public ExploreIssuesAdapter(List<Issues> dataList, Context ctx) {
|
||||||
|
|
||||||
this.context = ctx;
|
this.context = ctx;
|
||||||
this.searchedList = dataList;
|
this.searchedList = dataList;
|
||||||
@ -49,7 +50,6 @@ public class SearchIssuesAdapter extends RecyclerView.Adapter<SearchIssuesAdapte
|
|||||||
class SearchViewHolder extends RecyclerView.ViewHolder {
|
class SearchViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
private Issues issue;
|
private Issues issue;
|
||||||
|
|
||||||
private final ImageView issueAssigneeAvatar;
|
private final ImageView issueAssigneeAvatar;
|
||||||
private final TextView issueTitle;
|
private final TextView issueTitle;
|
||||||
private final TextView issueCreatedTime;
|
private final TextView issueCreatedTime;
|
||||||
@ -65,9 +65,6 @@ public class SearchIssuesAdapter extends RecyclerView.Adapter<SearchIssuesAdapte
|
|||||||
issueCreatedTime = itemView.findViewById(R.id.issueCreatedTime);
|
issueCreatedTime = itemView.findViewById(R.id.issueCreatedTime);
|
||||||
|
|
||||||
itemView.setOnClickListener(v -> {
|
itemView.setOnClickListener(v -> {
|
||||||
|
|
||||||
Context context = v.getContext();
|
|
||||||
|
|
||||||
Intent intent = new Intent(context, IssueDetailActivity.class);
|
Intent intent = new Intent(context, IssueDetailActivity.class);
|
||||||
intent.putExtra("issueNumber", issue.getNumber());
|
intent.putExtra("issueNumber", issue.getNumber());
|
||||||
|
|
||||||
@ -90,42 +87,44 @@ public class SearchIssuesAdapter extends RecyclerView.Adapter<SearchIssuesAdapte
|
|||||||
|
|
||||||
long id = repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName);
|
long id = repositoryData.insertRepository(currentActiveAccountId, repoOwner, repoName);
|
||||||
tinyDb.putLong("repositoryId", id);
|
tinyDb.putLong("repositoryId", id);
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
Repository data = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName);
|
Repository data = repositoryData.getRepository(currentActiveAccountId, repoOwner, repoName);
|
||||||
tinyDb.putLong("repositoryId", data.getRepositoryId());
|
tinyDb.putLong("repositoryId", data.getRepositoryId());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
context.startActivity(intent);
|
context.startActivity(intent);
|
||||||
});
|
});
|
||||||
|
|
||||||
issueAssigneeAvatar.setOnClickListener(v -> {
|
issueAssigneeAvatar.setOnClickListener(v -> {
|
||||||
Context context = v.getContext();
|
Intent intent = new Intent(context, ProfileActivity.class);
|
||||||
String userLoginId = issue.getUser().getLogin();
|
intent.putExtra("username", issue.getUser().getLogin());
|
||||||
|
context.startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
|
issueAssigneeAvatar.setOnLongClickListener(loginId -> {
|
||||||
|
AppUtil.copyToClipboard(context, issue.getUser().getLogin(), context.getString(R.string.copyLoginIdToClipBoard, issue.getUser().getLogin()));
|
||||||
|
return true;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public SearchIssuesAdapter.SearchViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
public ExploreIssuesAdapter.SearchViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
|
|
||||||
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_issues, parent, false);
|
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_issues, parent, false);
|
||||||
return new SearchIssuesAdapter.SearchViewHolder(v);
|
return new ExploreIssuesAdapter.SearchViewHolder(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(@NonNull final SearchIssuesAdapter.SearchViewHolder holder, int position) {
|
public void onBindViewHolder(@NonNull final ExploreIssuesAdapter.SearchViewHolder holder, int position) {
|
||||||
|
|
||||||
Issues currentItem = searchedList.get(position);
|
Issues currentItem = searchedList.get(position);
|
||||||
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
||||||
|
|
||||||
String locale = tinyDb.getString("locale");
|
Locale locale = context.getResources().getConfiguration().locale;
|
||||||
String timeFormat = tinyDb.getString("dateFormat");
|
String timeFormat = tinyDb.getString("dateFormat");
|
||||||
|
|
||||||
PicassoService.getInstance(context).get()
|
PicassoService.getInstance(context).get()
|
||||||
@ -144,20 +143,20 @@ public class SearchIssuesAdapter extends RecyclerView.Adapter<SearchIssuesAdapte
|
|||||||
|
|
||||||
switch(timeFormat) {
|
switch(timeFormat) {
|
||||||
case "pretty": {
|
case "pretty": {
|
||||||
PrettyTime prettyTime = new PrettyTime(new Locale(locale));
|
PrettyTime prettyTime = new PrettyTime(locale);
|
||||||
String createdTime = prettyTime.format(currentItem.getCreated_at());
|
String createdTime = prettyTime.format(currentItem.getCreated_at());
|
||||||
holder.issueCreatedTime.setText(createdTime);
|
holder.issueCreatedTime.setText(createdTime);
|
||||||
holder.issueCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getCreated_at()), context));
|
holder.issueCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getCreated_at()), context));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "normal": {
|
case "normal": {
|
||||||
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
|
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
|
||||||
String createdTime = formatter.format(currentItem.getCreated_at());
|
String createdTime = formatter.format(currentItem.getCreated_at());
|
||||||
holder.issueCreatedTime.setText(createdTime);
|
holder.issueCreatedTime.setText(createdTime);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "normal1": {
|
case "normal1": {
|
||||||
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
|
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
|
||||||
String createdTime = formatter.format(currentItem.getCreated_at());
|
String createdTime = formatter.format(currentItem.getCreated_at());
|
||||||
holder.issueCreatedTime.setText(createdTime);
|
holder.issueCreatedTime.setText(createdTime);
|
||||||
break;
|
break;
|
||||||
@ -167,12 +166,10 @@ public class SearchIssuesAdapter extends RecyclerView.Adapter<SearchIssuesAdapte
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getItemCount() {
|
public int getItemCount() {
|
||||||
|
|
||||||
return searchedList.size();
|
return searchedList.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void notifyDataChanged() {
|
public void notifyDataChanged() {
|
||||||
|
|
||||||
notifyDataSetChanged();
|
notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,148 @@
|
|||||||
|
package org.mian.gitnex.adapters;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
import org.gitnex.tea4j.models.Organization;
|
||||||
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.activities.OrganizationDetailActivity;
|
||||||
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
|
import org.mian.gitnex.helpers.RoundedTransformation;
|
||||||
|
import org.mian.gitnex.helpers.TinyDB;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Author M M Arif
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class ExplorePublicOrganizationsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||||
|
|
||||||
|
private final Context context;
|
||||||
|
private final int TYPE_LOAD = 0;
|
||||||
|
private List<Organization> organizationsList;
|
||||||
|
private OnLoadMoreListener loadMoreListener;
|
||||||
|
private boolean isLoading = false, isMoreDataAvailable = true;
|
||||||
|
|
||||||
|
public ExplorePublicOrganizationsAdapter(Context ctx, List<Organization> organizationsListMain) {
|
||||||
|
this.context = ctx;
|
||||||
|
this.organizationsList = organizationsListMain;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
|
LayoutInflater inflater = LayoutInflater.from(context);
|
||||||
|
if(viewType == TYPE_LOAD) {
|
||||||
|
return new ExplorePublicOrganizationsAdapter.OrganizationsHolder(inflater.inflate(R.layout.list_organizations, parent, false));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return new ExplorePublicOrganizationsAdapter.LoadHolder(inflater.inflate(R.layout.row_load, parent, false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
||||||
|
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
|
||||||
|
isLoading = true;
|
||||||
|
loadMoreListener.onLoadMore();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(getItemViewType(position) == TYPE_LOAD) {
|
||||||
|
((ExplorePublicOrganizationsAdapter.OrganizationsHolder) holder).bindData(organizationsList.get(position));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemViewType(int position) {
|
||||||
|
if(organizationsList.get(position).getFull_name() != null) {
|
||||||
|
return TYPE_LOAD;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return organizationsList.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
class OrganizationsHolder extends RecyclerView.ViewHolder {
|
||||||
|
private Organization organization;
|
||||||
|
private final ImageView image;
|
||||||
|
private final TextView orgName;
|
||||||
|
private final TextView orgDescription;
|
||||||
|
|
||||||
|
OrganizationsHolder(View itemView) {
|
||||||
|
super(itemView);
|
||||||
|
image = itemView.findViewById(R.id.imageAvatar);
|
||||||
|
orgName = itemView.findViewById(R.id.orgName);
|
||||||
|
orgDescription = itemView.findViewById(R.id.orgDescription);
|
||||||
|
|
||||||
|
itemView.setOnClickListener(v -> {
|
||||||
|
Context context = v.getContext();
|
||||||
|
Intent intent = new Intent(context, OrganizationDetailActivity.class);
|
||||||
|
intent.putExtra("orgName", organization.getUsername());
|
||||||
|
|
||||||
|
TinyDB tinyDb = TinyDB.getInstance(context);
|
||||||
|
tinyDb.putString("orgName", organization.getUsername());
|
||||||
|
tinyDb.putString("organizationId", String.valueOf(organization.getId()));
|
||||||
|
tinyDb.putBoolean("organizationAction", true);
|
||||||
|
context.startActivity(intent);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("SetTextI18n")
|
||||||
|
void bindData(Organization organization) {
|
||||||
|
this.organization = organization;
|
||||||
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
||||||
|
orgName.setText(organization.getUsername());
|
||||||
|
PicassoService.getInstance(context).get()
|
||||||
|
.load(organization.getAvatar_url())
|
||||||
|
.placeholder(R.drawable.loader_animated)
|
||||||
|
.transform(new RoundedTransformation(imgRadius, 0))
|
||||||
|
.resize(120, 120)
|
||||||
|
.centerCrop()
|
||||||
|
.into(image);
|
||||||
|
if (!organization.getDescription().equals("")) {
|
||||||
|
orgDescription.setText(organization.getDescription());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class LoadHolder extends RecyclerView.ViewHolder {
|
||||||
|
LoadHolder(View itemView) {
|
||||||
|
super(itemView);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMoreDataAvailable(boolean moreDataAvailable) {
|
||||||
|
isMoreDataAvailable = moreDataAvailable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void notifyDataChanged() {
|
||||||
|
notifyDataSetChanged();
|
||||||
|
isLoading = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface OnLoadMoreListener {
|
||||||
|
void onLoadMore();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLoadMoreListener(OnLoadMoreListener loadMoreListener) {
|
||||||
|
this.loadMoreListener = loadMoreListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateList(List<Organization> list) {
|
||||||
|
organizationsList = list;
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
}
|
@ -122,45 +122,32 @@ public class ExploreRepositoriesAdapter extends RecyclerView.Adapter<ExploreRepo
|
|||||||
final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token");
|
final String token = "token " + tinyDb.getString(tinyDb.getString("loginUid") + "-token");
|
||||||
|
|
||||||
WatchInfo watch = new WatchInfo();
|
WatchInfo watch = new WatchInfo();
|
||||||
|
|
||||||
Call<WatchInfo> call;
|
Call<WatchInfo> call;
|
||||||
|
|
||||||
call = RetrofitClient.getApiInterface(context).checkRepoWatchStatus(token, repoOwner, repoName);
|
call = RetrofitClient.getApiInterface(context).checkRepoWatchStatus(token, repoOwner, repoName);
|
||||||
|
|
||||||
call.enqueue(new Callback<WatchInfo>() {
|
call.enqueue(new Callback<WatchInfo>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onResponse(@NonNull Call<WatchInfo> call, @NonNull retrofit2.Response<WatchInfo> response) {
|
public void onResponse(@NonNull Call<WatchInfo> call, @NonNull retrofit2.Response<WatchInfo> response) {
|
||||||
|
|
||||||
if(response.isSuccessful()) {
|
if(response.isSuccessful()) {
|
||||||
|
|
||||||
assert response.body() != null;
|
assert response.body() != null;
|
||||||
tinyDb.putBoolean("repoWatch", response.body().getSubscribed());
|
tinyDb.putBoolean("repoWatch", response.body().getSubscribed());
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
tinyDb.putBoolean("repoWatch", false);
|
|
||||||
|
|
||||||
if(response.code() != 404) {
|
|
||||||
|
|
||||||
Toasty.error(context, context.getString(R.string.genericApiStatusError));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
tinyDb.putBoolean("repoWatch", false);
|
||||||
|
if(response.code() != 404) {
|
||||||
|
Toasty.error(context, context.getString(R.string.genericApiStatusError));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFailure(@NonNull Call<WatchInfo> call, @NonNull Throwable t) {
|
public void onFailure(@NonNull Call<WatchInfo> call, @NonNull Throwable t) {
|
||||||
|
|
||||||
tinyDb.putBoolean("repoWatch", false);
|
tinyDb.putBoolean("repoWatch", false);
|
||||||
Toasty.error(context, context.getString(R.string.genericApiStatusError));
|
Toasty.error(context, context.getString(R.string.genericApiStatusError));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
context.startActivity(intent);
|
context.startActivity(intent);
|
||||||
|
|
||||||
});
|
});
|
||||||
@ -183,7 +170,7 @@ public class ExploreRepositoriesAdapter extends RecyclerView.Adapter<ExploreRepo
|
|||||||
UserRepositories currentItem = reposList.get(position);
|
UserRepositories currentItem = reposList.get(position);
|
||||||
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
||||||
|
|
||||||
String locale = tinyDb.getString("locale");
|
Locale locale = context.getResources().getConfiguration().locale;
|
||||||
String timeFormat = tinyDb.getString("dateFormat");
|
String timeFormat = tinyDb.getString("dateFormat");
|
||||||
holder.userRepositories = currentItem;
|
holder.userRepositories = currentItem;
|
||||||
holder.orgName.setText(currentItem.getFullName().split("/")[0]);
|
holder.orgName.setText(currentItem.getFullName().split("/")[0]);
|
||||||
@ -212,20 +199,20 @@ public class ExploreRepositoriesAdapter extends RecyclerView.Adapter<ExploreRepo
|
|||||||
|
|
||||||
switch(timeFormat) {
|
switch(timeFormat) {
|
||||||
case "pretty": {
|
case "pretty": {
|
||||||
PrettyTime prettyTime = new PrettyTime(new Locale(locale));
|
PrettyTime prettyTime = new PrettyTime(locale);
|
||||||
String createdTime = prettyTime.format(currentItem.getUpdated_at());
|
String createdTime = prettyTime.format(currentItem.getUpdated_at());
|
||||||
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
||||||
holder.repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), context));
|
holder.repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), context));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "normal": {
|
case "normal": {
|
||||||
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
|
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
|
||||||
String createdTime = formatter.format(currentItem.getUpdated_at());
|
String createdTime = formatter.format(currentItem.getUpdated_at());
|
||||||
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "normal1": {
|
case "normal1": {
|
||||||
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
|
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
|
||||||
String createdTime = formatter.format(currentItem.getUpdated_at());
|
String createdTime = formatter.format(currentItem.getUpdated_at());
|
||||||
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
||||||
break;
|
break;
|
||||||
|
@ -20,6 +20,7 @@ import com.google.gson.JsonElement;
|
|||||||
import com.vdurmont.emoji.EmojiParser;
|
import com.vdurmont.emoji.EmojiParser;
|
||||||
import org.gitnex.tea4j.models.IssueComments;
|
import org.gitnex.tea4j.models.IssueComments;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.activities.ProfileActivity;
|
||||||
import org.mian.gitnex.clients.PicassoService;
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
import org.mian.gitnex.clients.RetrofitClient;
|
import org.mian.gitnex.clients.RetrofitClient;
|
||||||
import org.mian.gitnex.fragments.BottomSheetReplyFragment;
|
import org.mian.gitnex.fragments.BottomSheetReplyFragment;
|
||||||
@ -50,6 +51,7 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
|
|||||||
private final List<IssueComments> issuesComments;
|
private final List<IssueComments> issuesComments;
|
||||||
private final FragmentManager fragmentManager;
|
private final FragmentManager fragmentManager;
|
||||||
private final BottomSheetReplyFragment.OnInteractedListener onInteractedListener;
|
private final BottomSheetReplyFragment.OnInteractedListener onInteractedListener;
|
||||||
|
private final Locale locale;
|
||||||
|
|
||||||
public IssueCommentsAdapter(Context ctx, Bundle bundle, List<IssueComments> issuesCommentsMain, FragmentManager fragmentManager, BottomSheetReplyFragment.OnInteractedListener onInteractedListener) {
|
public IssueCommentsAdapter(Context ctx, Bundle bundle, List<IssueComments> issuesCommentsMain, FragmentManager fragmentManager, BottomSheetReplyFragment.OnInteractedListener onInteractedListener) {
|
||||||
|
|
||||||
@ -58,8 +60,8 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
|
|||||||
this.issuesComments = issuesCommentsMain;
|
this.issuesComments = issuesCommentsMain;
|
||||||
this.fragmentManager = fragmentManager;
|
this.fragmentManager = fragmentManager;
|
||||||
this.onInteractedListener = onInteractedListener;
|
this.onInteractedListener = onInteractedListener;
|
||||||
|
|
||||||
tinyDB = TinyDB.getInstance(ctx);
|
tinyDB = TinyDB.getInstance(ctx);
|
||||||
|
locale = ctx.getResources().getConfiguration().locale;
|
||||||
}
|
}
|
||||||
|
|
||||||
class IssueCommentViewHolder extends RecyclerView.ViewHolder {
|
class IssueCommentViewHolder extends RecyclerView.ViewHolder {
|
||||||
@ -86,10 +88,9 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
|
|||||||
|
|
||||||
menu.setOnClickListener(v -> {
|
menu.setOnClickListener(v -> {
|
||||||
|
|
||||||
final Context ctx = v.getContext();
|
|
||||||
final String loginUid = tinyDB.getString("loginUid");
|
final String loginUid = tinyDB.getString("loginUid");
|
||||||
|
|
||||||
@SuppressLint("InflateParams") View vw = LayoutInflater.from(ctx).inflate(R.layout.bottom_sheet_issue_comments, null);
|
@SuppressLint("InflateParams") View vw = LayoutInflater.from(context).inflate(R.layout.bottom_sheet_issue_comments, null);
|
||||||
|
|
||||||
TextView commentMenuEdit = vw.findViewById(R.id.commentMenuEdit);
|
TextView commentMenuEdit = vw.findViewById(R.id.commentMenuEdit);
|
||||||
TextView commentShare = vw.findViewById(R.id.issueCommentShare);
|
TextView commentShare = vw.findViewById(R.id.issueCommentShare);
|
||||||
@ -107,7 +108,7 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
|
|||||||
commentMenuCopy.setVisibility(View.GONE);
|
commentMenuCopy.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
BottomSheetDialog dialog = new BottomSheetDialog(ctx);
|
BottomSheetDialog dialog = new BottomSheetDialog(context);
|
||||||
dialog.setContentView(vw);
|
dialog.setContentView(vw);
|
||||||
dialog.show();
|
dialog.show();
|
||||||
|
|
||||||
@ -117,20 +118,17 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
|
|||||||
bundle1.putAll(bundle);
|
bundle1.putAll(bundle);
|
||||||
bundle1.putInt("commentId", issueComment.getId());
|
bundle1.putInt("commentId", issueComment.getId());
|
||||||
|
|
||||||
ReactionSpinner reactionSpinner = new ReactionSpinner(ctx, bundle1);
|
ReactionSpinner reactionSpinner = new ReactionSpinner(context, bundle1);
|
||||||
reactionSpinner.setOnInteractedListener(() -> {
|
reactionSpinner.setOnInteractedListener(() -> {
|
||||||
|
|
||||||
tinyDB.putBoolean("commentEdited", true);
|
tinyDB.putBoolean("commentEdited", true);
|
||||||
|
|
||||||
onInteractedListener.onInteracted();
|
onInteractedListener.onInteracted();
|
||||||
dialog.dismiss();
|
dialog.dismiss();
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
linearLayout.addView(reactionSpinner);
|
linearLayout.addView(reactionSpinner);
|
||||||
|
|
||||||
commentMenuEdit.setOnClickListener(v1 -> {
|
commentMenuEdit.setOnClickListener(v1 -> {
|
||||||
|
|
||||||
Bundle bundle = new Bundle();
|
Bundle bundle = new Bundle();
|
||||||
bundle.putInt("commentId", issueComment.getId());
|
bundle.putInt("commentId", issueComment.getId());
|
||||||
bundle.putString("commentAction", "edit");
|
bundle.putString("commentAction", "edit");
|
||||||
@ -141,56 +139,48 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
|
|||||||
bottomSheetReplyFragment.show(fragmentManager, "replyBottomSheet");
|
bottomSheetReplyFragment.show(fragmentManager, "replyBottomSheet");
|
||||||
|
|
||||||
dialog.dismiss();
|
dialog.dismiss();
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
commentShare.setOnClickListener(v1 -> {
|
commentShare.setOnClickListener(v1 -> {
|
||||||
|
|
||||||
// get comment Url
|
// get comment Url
|
||||||
CharSequence commentUrl = issueComment.getHtml_url();
|
CharSequence commentUrl = issueComment.getHtml_url();
|
||||||
|
|
||||||
// share issue comment
|
// share issue comment
|
||||||
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
|
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
|
||||||
sharingIntent.setType("text/plain");
|
sharingIntent.setType("text/plain");
|
||||||
String intentHeader = tinyDB.getString("issueNumber") + ctx.getResources().getString(R.string.hash) + "issuecomment-" + issueComment.getId() + " " + tinyDB.getString("issueTitle");
|
String intentHeader = tinyDB.getString("issueNumber") + context.getResources().getString(R.string.hash) + "issuecomment-" + issueComment.getId() + " " + tinyDB.getString("issueTitle");
|
||||||
sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, intentHeader);
|
sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, intentHeader);
|
||||||
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, commentUrl);
|
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, commentUrl);
|
||||||
ctx.startActivity(Intent.createChooser(sharingIntent, intentHeader));
|
context.startActivity(Intent.createChooser(sharingIntent, intentHeader));
|
||||||
|
|
||||||
dialog.dismiss();
|
dialog.dismiss();
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
issueCommentCopyUrl.setOnClickListener(v1 -> {
|
issueCommentCopyUrl.setOnClickListener(v1 -> {
|
||||||
|
|
||||||
// comment Url
|
// comment Url
|
||||||
CharSequence commentUrl = issueComment.getHtml_url();
|
CharSequence commentUrl = issueComment.getHtml_url();
|
||||||
|
|
||||||
ClipboardManager clipboard = (ClipboardManager) Objects.requireNonNull(ctx).getSystemService(Context.CLIPBOARD_SERVICE);
|
ClipboardManager clipboard = (ClipboardManager) Objects.requireNonNull(context).getSystemService(Context.CLIPBOARD_SERVICE);
|
||||||
assert clipboard != null;
|
assert clipboard != null;
|
||||||
|
|
||||||
ClipData clip = ClipData.newPlainText(commentUrl, commentUrl);
|
ClipData clip = ClipData.newPlainText(commentUrl, commentUrl);
|
||||||
clipboard.setPrimaryClip(clip);
|
clipboard.setPrimaryClip(clip);
|
||||||
|
|
||||||
dialog.dismiss();
|
dialog.dismiss();
|
||||||
Toasty.success(ctx, ctx.getString(R.string.copyIssueUrlToastMsg));
|
Toasty.success(context, context.getString(R.string.copyIssueUrlToastMsg));
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
commentMenuQuote.setOnClickListener(v1 -> {
|
commentMenuQuote.setOnClickListener(v1 -> {
|
||||||
|
|
||||||
StringBuilder stringBuilder = new StringBuilder();
|
StringBuilder stringBuilder = new StringBuilder();
|
||||||
String commenterName = issueComment.getUser().getUsername();
|
String commenterName = issueComment.getUser().getUsername();
|
||||||
|
|
||||||
if(!commenterName.equals(tinyDB.getString("userLogin"))) {
|
if(!commenterName.equals(tinyDB.getString("userLogin"))) {
|
||||||
|
|
||||||
stringBuilder.append("@").append(commenterName).append("\n\n");
|
stringBuilder.append("@").append(commenterName).append("\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
String[] lines = issueComment.getBody().split("\\R");
|
String[] lines = issueComment.getBody().split("\\R");
|
||||||
|
|
||||||
for(String line : lines) {
|
for(String line : lines) {
|
||||||
|
|
||||||
stringBuilder.append(">").append(line).append("\n");
|
stringBuilder.append(">").append(line).append("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,40 +192,37 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
|
|||||||
|
|
||||||
dialog.dismiss();
|
dialog.dismiss();
|
||||||
BottomSheetReplyFragment.newInstance(bundle).show(fragmentManager, "replyBottomSheet");
|
BottomSheetReplyFragment.newInstance(bundle).show(fragmentManager, "replyBottomSheet");
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
commentMenuCopy.setOnClickListener(v1 -> {
|
commentMenuCopy.setOnClickListener(v1 -> {
|
||||||
|
ClipboardManager clipboard = (ClipboardManager) Objects.requireNonNull(context).getSystemService(Context.CLIPBOARD_SERVICE);
|
||||||
ClipboardManager clipboard = (ClipboardManager) Objects.requireNonNull(ctx).getSystemService(Context.CLIPBOARD_SERVICE);
|
|
||||||
assert clipboard != null;
|
assert clipboard != null;
|
||||||
|
|
||||||
ClipData clip = ClipData.newPlainText("Comment on issue #" + tinyDB.getString("issueNumber"), issueComment.getBody());
|
ClipData clip = ClipData.newPlainText("Comment on issue #" + tinyDB.getString("issueNumber"), issueComment.getBody());
|
||||||
clipboard.setPrimaryClip(clip);
|
clipboard.setPrimaryClip(clip);
|
||||||
|
|
||||||
dialog.dismiss();
|
dialog.dismiss();
|
||||||
Toasty.success(ctx, ctx.getString(R.string.copyIssueCommentToastMsg));
|
Toasty.success(context, context.getString(R.string.copyIssueCommentToastMsg));
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
commentMenuDelete.setOnClickListener(v1 -> {
|
commentMenuDelete.setOnClickListener(v1 -> {
|
||||||
|
deleteIssueComment(context, issueComment.getId(), getAdapterPosition());
|
||||||
deleteIssueComment(ctx, issueComment.getId(), getAdapterPosition());
|
|
||||||
dialog.dismiss();
|
dialog.dismiss();
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
avatar.setOnClickListener(loginId -> {
|
avatar.setOnClickListener(loginId -> {
|
||||||
|
Intent intent = new Intent(context, ProfileActivity.class);
|
||||||
Context context = loginId.getContext();
|
intent.putExtra("username", userLoginId);
|
||||||
|
context.startActivity(intent);
|
||||||
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
avatar.setOnLongClickListener(loginId -> {
|
||||||
|
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
|
||||||
|
return true;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateAdapter(int position) {
|
private void updateAdapter(int position) {
|
||||||
@ -243,7 +230,6 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
|
|||||||
issuesComments.remove(position);
|
issuesComments.remove(position);
|
||||||
notifyItemRemoved(position);
|
notifyItemRemoved(position);
|
||||||
notifyItemRangeChanged(position, issuesComments.size());
|
notifyItemRangeChanged(position, issuesComments.size());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void deleteIssueComment(final Context ctx, final int commentId, int position) {
|
private void deleteIssueComment(final Context ctx, final int commentId, int position) {
|
||||||
@ -337,14 +323,11 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
|
|||||||
if(issueComment.getCreated_at() != null) {
|
if(issueComment.getCreated_at() != null) {
|
||||||
|
|
||||||
if(timeFormat.equals("pretty")) {
|
if(timeFormat.equals("pretty")) {
|
||||||
|
informationBuilder = new StringBuilder(TimeHelper.formatTime(issueComment.getCreated_at(), locale, "pretty", context));
|
||||||
informationBuilder = new StringBuilder(TimeHelper.formatTime(issueComment.getCreated_at(), Locale.getDefault(), "pretty", context));
|
|
||||||
holder.information.setOnClickListener(v -> TimeHelper.customDateFormatForToastDateFormat(issueComment.getCreated_at()));
|
holder.information.setOnClickListener(v -> TimeHelper.customDateFormatForToastDateFormat(issueComment.getCreated_at()));
|
||||||
|
|
||||||
}
|
}
|
||||||
else if(timeFormat.equals("normal")) {
|
else if(timeFormat.equals("normal")) {
|
||||||
|
informationBuilder = new StringBuilder(TimeHelper.formatTime(issueComment.getCreated_at(), locale, "normal", context));
|
||||||
informationBuilder = new StringBuilder(TimeHelper.formatTime(issueComment.getCreated_at(), Locale.getDefault(), "normal", context));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!issueComment.getCreated_at().equals(issueComment.getUpdated_at())) {
|
if(!issueComment.getCreated_at().equals(issueComment.getUpdated_at())) {
|
||||||
@ -374,7 +357,6 @@ public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdap
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getItemCount() {
|
public int getItemCount() {
|
||||||
|
|
||||||
return issuesComments.size();
|
return issuesComments.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@ import com.vdurmont.emoji.EmojiParser;
|
|||||||
import org.gitnex.tea4j.models.Issues;
|
import org.gitnex.tea4j.models.Issues;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
import org.mian.gitnex.activities.IssueDetailActivity;
|
import org.mian.gitnex.activities.IssueDetailActivity;
|
||||||
|
import org.mian.gitnex.activities.ProfileActivity;
|
||||||
import org.mian.gitnex.clients.PicassoService;
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
import org.mian.gitnex.helpers.AppUtil;
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
import org.mian.gitnex.helpers.ClickListener;
|
import org.mian.gitnex.helpers.ClickListener;
|
||||||
@ -110,9 +111,6 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
|||||||
issueCreatedTime = itemView.findViewById(R.id.issueCreatedTime);
|
issueCreatedTime = itemView.findViewById(R.id.issueCreatedTime);
|
||||||
|
|
||||||
itemView.setOnClickListener(layoutView -> {
|
itemView.setOnClickListener(layoutView -> {
|
||||||
|
|
||||||
Context context = layoutView.getContext();
|
|
||||||
|
|
||||||
Intent intent = new Intent(context, IssueDetailActivity.class);
|
Intent intent = new Intent(context, IssueDetailActivity.class);
|
||||||
intent.putExtra("issueNumber", issue.getNumber());
|
intent.putExtra("issueNumber", issue.getNumber());
|
||||||
|
|
||||||
@ -123,19 +121,22 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
|||||||
});
|
});
|
||||||
|
|
||||||
issueAssigneeAvatar.setOnClickListener(v -> {
|
issueAssigneeAvatar.setOnClickListener(v -> {
|
||||||
Context context = v.getContext();
|
Intent intent = new Intent(context, ProfileActivity.class);
|
||||||
String userLoginId = issue.getUser().getLogin();
|
intent.putExtra("username", issue.getUser().getLogin());
|
||||||
|
context.startActivity(intent);
|
||||||
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
issueAssigneeAvatar.setOnLongClickListener(loginId -> {
|
||||||
|
AppUtil.copyToClipboard(context, issue.getUser().getLogin(), context.getString(R.string.copyLoginIdToClipBoard, issue.getUser().getLogin()));
|
||||||
|
return true;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("SetTextI18n")
|
@SuppressLint("SetTextI18n")
|
||||||
void bindData(Issues issue) {
|
void bindData(Issues issue) {
|
||||||
|
|
||||||
TinyDB tinyDb = TinyDB.getInstance(context);
|
TinyDB tinyDb = TinyDB.getInstance(context);
|
||||||
String locale = tinyDb.getString("locale");
|
Locale locale = context.getResources().getConfiguration().locale;
|
||||||
String timeFormat = tinyDb.getString("dateFormat");
|
String timeFormat = tinyDb.getString("dateFormat");
|
||||||
|
|
||||||
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
||||||
@ -156,20 +157,20 @@ public class IssuesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
|||||||
|
|
||||||
switch(timeFormat) {
|
switch(timeFormat) {
|
||||||
case "pretty": {
|
case "pretty": {
|
||||||
PrettyTime prettyTime = new PrettyTime(new Locale(locale));
|
PrettyTime prettyTime = new PrettyTime(locale);
|
||||||
String createdTime = prettyTime.format(issue.getCreated_at());
|
String createdTime = prettyTime.format(issue.getCreated_at());
|
||||||
this.issueCreatedTime.setText(createdTime);
|
this.issueCreatedTime.setText(createdTime);
|
||||||
this.issueCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(issue.getCreated_at()), context));
|
this.issueCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(issue.getCreated_at()), context));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "normal": {
|
case "normal": {
|
||||||
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
|
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
|
||||||
String createdTime = formatter.format(issue.getCreated_at());
|
String createdTime = formatter.format(issue.getCreated_at());
|
||||||
this.issueCreatedTime.setText(createdTime);
|
this.issueCreatedTime.setText(createdTime);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "normal1": {
|
case "normal1": {
|
||||||
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
|
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
|
||||||
String createdTime = formatter.format(issue.getCreated_at());
|
String createdTime = formatter.format(issue.getCreated_at());
|
||||||
this.issueCreatedTime.setText(createdTime);
|
this.issueCreatedTime.setText(createdTime);
|
||||||
break;
|
break;
|
||||||
|
@ -2,6 +2,7 @@ package org.mian.gitnex.adapters;
|
|||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
import android.text.Html;
|
import android.text.Html;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@ -13,6 +14,7 @@ import android.widget.ImageView;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import org.gitnex.tea4j.models.UserInfo;
|
import org.gitnex.tea4j.models.UserInfo;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.activities.ProfileActivity;
|
||||||
import org.mian.gitnex.clients.PicassoService;
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
import org.mian.gitnex.helpers.AppUtil;
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
import org.mian.gitnex.helpers.RoundedTransformation;
|
||||||
@ -29,7 +31,7 @@ public class MembersByOrgAdapter extends BaseAdapter implements Filterable {
|
|||||||
private final Context context;
|
private final Context context;
|
||||||
private final List<UserInfo> membersListFull;
|
private final List<UserInfo> membersListFull;
|
||||||
|
|
||||||
private static class ViewHolder {
|
private class ViewHolder {
|
||||||
|
|
||||||
private String userLoginId;
|
private String userLoginId;
|
||||||
|
|
||||||
@ -42,10 +44,14 @@ public class MembersByOrgAdapter extends BaseAdapter implements Filterable {
|
|||||||
memberName = v.findViewById(R.id.memberName);
|
memberName = v.findViewById(R.id.memberName);
|
||||||
|
|
||||||
memberAvatar.setOnClickListener(loginId -> {
|
memberAvatar.setOnClickListener(loginId -> {
|
||||||
|
Intent intent = new Intent(context, ProfileActivity.class);
|
||||||
|
intent.putExtra("username", userLoginId);
|
||||||
|
context.startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
Context context = loginId.getContext();
|
memberAvatar.setOnLongClickListener(loginId -> {
|
||||||
|
|
||||||
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
|
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
|
||||||
|
return true;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -148,7 +148,7 @@ public class MilestonesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
|||||||
|
|
||||||
this.milestones = dataModel;
|
this.milestones = dataModel;
|
||||||
final TinyDB tinyDb = TinyDB.getInstance(context);
|
final TinyDB tinyDb = TinyDB.getInstance(context);
|
||||||
final String locale = tinyDb.getString("locale");
|
final String locale = context.getResources().getConfiguration().locale.getLanguage();
|
||||||
final String timeFormat = tinyDb.getString("dateFormat");
|
final String timeFormat = tinyDb.getString("dateFormat");
|
||||||
|
|
||||||
Markdown.render(context, dataModel.getTitle(), msTitle);
|
Markdown.render(context, dataModel.getTitle(), msTitle);
|
||||||
|
@ -18,7 +18,7 @@ import java.util.List;
|
|||||||
* Author M M Arif
|
* Author M M Arif
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class ProfileEmailsAdapter extends RecyclerView.Adapter<ProfileEmailsAdapter.EmailsViewHolder> {
|
public class MyProfileEmailsAdapter extends RecyclerView.Adapter<MyProfileEmailsAdapter.EmailsViewHolder> {
|
||||||
|
|
||||||
private final List<Emails> emailsList;
|
private final List<Emails> emailsList;
|
||||||
private final Context context;
|
private final Context context;
|
||||||
@ -37,20 +37,20 @@ public class ProfileEmailsAdapter extends RecyclerView.Adapter<ProfileEmailsAdap
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ProfileEmailsAdapter(Context ctx, List<Emails> emailsListMain) {
|
public MyProfileEmailsAdapter(Context ctx, List<Emails> emailsListMain) {
|
||||||
this.context = ctx;
|
this.context = ctx;
|
||||||
this.emailsList = emailsListMain;
|
this.emailsList = emailsListMain;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public ProfileEmailsAdapter.EmailsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
public MyProfileEmailsAdapter.EmailsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_profile_emails, parent, false);
|
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_profile_emails, parent, false);
|
||||||
return new ProfileEmailsAdapter.EmailsViewHolder(v);
|
return new MyProfileEmailsAdapter.EmailsViewHolder(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(@NonNull ProfileEmailsAdapter.EmailsViewHolder holder, int position) {
|
public void onBindViewHolder(@NonNull MyProfileEmailsAdapter.EmailsViewHolder holder, int position) {
|
||||||
|
|
||||||
Emails currentItem = emailsList.get(position);
|
Emails currentItem = emailsList.get(position);
|
||||||
|
|
@ -1,6 +1,7 @@
|
|||||||
package org.mian.gitnex.adapters;
|
package org.mian.gitnex.adapters;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
import android.text.Html;
|
import android.text.Html;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@ -11,6 +12,7 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import org.gitnex.tea4j.models.UserInfo;
|
import org.gitnex.tea4j.models.UserInfo;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.activities.ProfileActivity;
|
||||||
import org.mian.gitnex.clients.PicassoService;
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
import org.mian.gitnex.helpers.AppUtil;
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
import org.mian.gitnex.helpers.RoundedTransformation;
|
||||||
@ -20,12 +22,12 @@ import java.util.List;
|
|||||||
* Author M M Arif
|
* Author M M Arif
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class ProfileFollowersAdapter extends RecyclerView.Adapter<ProfileFollowersAdapter.FollowersViewHolder> {
|
public class MyProfileFollowersAdapter extends RecyclerView.Adapter<MyProfileFollowersAdapter.FollowersViewHolder> {
|
||||||
|
|
||||||
private final List<UserInfo> followersList;
|
private final List<UserInfo> followersList;
|
||||||
private final Context context;
|
private final Context context;
|
||||||
|
|
||||||
static class FollowersViewHolder extends RecyclerView.ViewHolder {
|
class FollowersViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
private String userLoginId;
|
private String userLoginId;
|
||||||
|
|
||||||
@ -41,16 +43,20 @@ public class ProfileFollowersAdapter extends RecyclerView.Adapter<ProfileFollowe
|
|||||||
userFullName = itemView.findViewById(R.id.userFullName);
|
userFullName = itemView.findViewById(R.id.userFullName);
|
||||||
userName = itemView.findViewById(R.id.userName);
|
userName = itemView.findViewById(R.id.userName);
|
||||||
|
|
||||||
userAvatar.setOnClickListener(loginId -> {
|
itemView.setOnClickListener(loginId -> {
|
||||||
|
Intent intent = new Intent(context, ProfileActivity.class);
|
||||||
Context context = loginId.getContext();
|
intent.putExtra("username", userLoginId);
|
||||||
|
context.startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
|
itemView.setOnLongClickListener(loginId -> {
|
||||||
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
|
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
|
||||||
|
return true;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ProfileFollowersAdapter(Context ctx, List<UserInfo> followersListMain) {
|
public MyProfileFollowersAdapter(Context ctx, List<UserInfo> followersListMain) {
|
||||||
|
|
||||||
this.context = ctx;
|
this.context = ctx;
|
||||||
this.followersList = followersListMain;
|
this.followersList = followersListMain;
|
||||||
@ -58,14 +64,14 @@ public class ProfileFollowersAdapter extends RecyclerView.Adapter<ProfileFollowe
|
|||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public ProfileFollowersAdapter.FollowersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
public MyProfileFollowersAdapter.FollowersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
|
|
||||||
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_profile_followers, parent, false);
|
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_profile_followers_following, parent, false);
|
||||||
return new FollowersViewHolder(v);
|
return new FollowersViewHolder(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(@NonNull ProfileFollowersAdapter.FollowersViewHolder holder, int position) {
|
public void onBindViewHolder(@NonNull MyProfileFollowersAdapter.FollowersViewHolder holder, int position) {
|
||||||
|
|
||||||
UserInfo currentItem = followersList.get(position);
|
UserInfo currentItem = followersList.get(position);
|
||||||
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
@ -1,6 +1,7 @@
|
|||||||
package org.mian.gitnex.adapters;
|
package org.mian.gitnex.adapters;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
import android.text.Html;
|
import android.text.Html;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@ -11,6 +12,7 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import org.gitnex.tea4j.models.UserInfo;
|
import org.gitnex.tea4j.models.UserInfo;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.activities.ProfileActivity;
|
||||||
import org.mian.gitnex.clients.PicassoService;
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
import org.mian.gitnex.helpers.AppUtil;
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
import org.mian.gitnex.helpers.RoundedTransformation;
|
||||||
@ -20,12 +22,12 @@ import java.util.List;
|
|||||||
* Author M M Arif
|
* Author M M Arif
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class ProfileFollowingAdapter extends RecyclerView.Adapter<ProfileFollowingAdapter.FollowingViewHolder> {
|
public class MyProfileFollowingAdapter extends RecyclerView.Adapter<MyProfileFollowingAdapter.FollowingViewHolder> {
|
||||||
|
|
||||||
private final List<UserInfo> followingList;
|
private final List<UserInfo> followingList;
|
||||||
private final Context context;
|
private final Context context;
|
||||||
|
|
||||||
static class FollowingViewHolder extends RecyclerView.ViewHolder {
|
class FollowingViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
private String userLoginId;
|
private String userLoginId;
|
||||||
|
|
||||||
@ -41,16 +43,20 @@ public class ProfileFollowingAdapter extends RecyclerView.Adapter<ProfileFollowi
|
|||||||
userFullName = itemView.findViewById(R.id.userFullName);
|
userFullName = itemView.findViewById(R.id.userFullName);
|
||||||
userName = itemView.findViewById(R.id.userName);
|
userName = itemView.findViewById(R.id.userName);
|
||||||
|
|
||||||
userAvatar.setOnClickListener(loginId -> {
|
itemView.setOnClickListener(loginId -> {
|
||||||
|
Intent intent = new Intent(context, ProfileActivity.class);
|
||||||
Context context = loginId.getContext();
|
intent.putExtra("username", userLoginId);
|
||||||
|
context.startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
|
itemView.setOnLongClickListener(loginId -> {
|
||||||
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
|
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
|
||||||
|
return true;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ProfileFollowingAdapter(Context ctx, List<UserInfo> followingListMain) {
|
public MyProfileFollowingAdapter(Context ctx, List<UserInfo> followingListMain) {
|
||||||
|
|
||||||
this.context = ctx;
|
this.context = ctx;
|
||||||
this.followingList = followingListMain;
|
this.followingList = followingListMain;
|
||||||
@ -58,14 +64,14 @@ public class ProfileFollowingAdapter extends RecyclerView.Adapter<ProfileFollowi
|
|||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public ProfileFollowingAdapter.FollowingViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
public MyProfileFollowingAdapter.FollowingViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
|
|
||||||
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_profile_following, parent, false);
|
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_profile_followers_following, parent, false);
|
||||||
return new FollowingViewHolder(v);
|
return new FollowingViewHolder(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(@NonNull ProfileFollowingAdapter.FollowingViewHolder holder, int position) {
|
public void onBindViewHolder(@NonNull MyProfileFollowingAdapter.FollowingViewHolder holder, int position) {
|
||||||
|
|
||||||
UserInfo currentItem = followingList.get(position);
|
UserInfo currentItem = followingList.get(position);
|
||||||
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
@ -190,7 +190,7 @@ public class MyReposListAdapter extends RecyclerView.Adapter<MyReposListAdapter.
|
|||||||
UserRepositories currentItem = reposList.get(position);
|
UserRepositories currentItem = reposList.get(position);
|
||||||
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
||||||
|
|
||||||
String locale = tinyDb.getString("locale");
|
Locale locale = context.getResources().getConfiguration().locale;
|
||||||
String timeFormat = tinyDb.getString("dateFormat");
|
String timeFormat = tinyDb.getString("dateFormat");
|
||||||
holder.userRepositories = currentItem;
|
holder.userRepositories = currentItem;
|
||||||
holder.orgName.setText(currentItem.getFullName().split("/")[0]);
|
holder.orgName.setText(currentItem.getFullName().split("/")[0]);
|
||||||
@ -219,20 +219,20 @@ public class MyReposListAdapter extends RecyclerView.Adapter<MyReposListAdapter.
|
|||||||
|
|
||||||
switch(timeFormat) {
|
switch(timeFormat) {
|
||||||
case "pretty": {
|
case "pretty": {
|
||||||
PrettyTime prettyTime = new PrettyTime(new Locale(locale));
|
PrettyTime prettyTime = new PrettyTime(locale);
|
||||||
String createdTime = prettyTime.format(currentItem.getUpdated_at());
|
String createdTime = prettyTime.format(currentItem.getUpdated_at());
|
||||||
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
||||||
holder.repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), context));
|
holder.repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), context));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "normal": {
|
case "normal": {
|
||||||
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
|
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
|
||||||
String createdTime = formatter.format(currentItem.getUpdated_at());
|
String createdTime = formatter.format(currentItem.getUpdated_at());
|
||||||
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "normal1": {
|
case "normal1": {
|
||||||
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
|
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
|
||||||
String createdTime = formatter.format(currentItem.getUpdated_at());
|
String createdTime = formatter.format(currentItem.getUpdated_at());
|
||||||
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
||||||
break;
|
break;
|
||||||
|
@ -16,6 +16,7 @@ import com.vdurmont.emoji.EmojiParser;
|
|||||||
import org.gitnex.tea4j.models.PullRequests;
|
import org.gitnex.tea4j.models.PullRequests;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
import org.mian.gitnex.activities.IssueDetailActivity;
|
import org.mian.gitnex.activities.IssueDetailActivity;
|
||||||
|
import org.mian.gitnex.activities.ProfileActivity;
|
||||||
import org.mian.gitnex.clients.PicassoService;
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
import org.mian.gitnex.helpers.AppUtil;
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
import org.mian.gitnex.helpers.ClickListener;
|
import org.mian.gitnex.helpers.ClickListener;
|
||||||
@ -38,7 +39,6 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
|||||||
private boolean isLoading = false, isMoreDataAvailable = true;
|
private boolean isLoading = false, isMoreDataAvailable = true;
|
||||||
|
|
||||||
public PullRequestsAdapter(Context context, List<PullRequests> prListMain) {
|
public PullRequestsAdapter(Context context, List<PullRequests> prListMain) {
|
||||||
|
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.prList = prListMain;
|
this.prList = prListMain;
|
||||||
}
|
}
|
||||||
@ -84,7 +84,6 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getItemCount() {
|
public int getItemCount() {
|
||||||
|
|
||||||
return prList.size();
|
return prList.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,9 +105,6 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
|||||||
prCreatedTime = itemView.findViewById(R.id.prCreatedTime);
|
prCreatedTime = itemView.findViewById(R.id.prCreatedTime);
|
||||||
|
|
||||||
itemView.setOnClickListener(v -> {
|
itemView.setOnClickListener(v -> {
|
||||||
|
|
||||||
Context context = v.getContext();
|
|
||||||
|
|
||||||
Intent intent = new Intent(context, IssueDetailActivity.class);
|
Intent intent = new Intent(context, IssueDetailActivity.class);
|
||||||
intent.putExtra("issueNumber", pullRequest.getNumber());
|
intent.putExtra("issueNumber", pullRequest.getNumber());
|
||||||
intent.putExtra("prMergeable", pullRequest.isMergeable());
|
intent.putExtra("prMergeable", pullRequest.isMergeable());
|
||||||
@ -135,19 +131,22 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
|||||||
});
|
});
|
||||||
|
|
||||||
assigneeAvatar.setOnClickListener(v -> {
|
assigneeAvatar.setOnClickListener(v -> {
|
||||||
Context context = v.getContext();
|
Intent intent = new Intent(context, ProfileActivity.class);
|
||||||
String userLoginId = pullRequest.getUser().getLogin();
|
intent.putExtra("username", pullRequest.getUser().getLogin());
|
||||||
|
context.startActivity(intent);
|
||||||
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
assigneeAvatar.setOnLongClickListener(loginId -> {
|
||||||
|
AppUtil.copyToClipboard(context, pullRequest.getUser().getLogin(), context.getString(R.string.copyLoginIdToClipBoard, pullRequest.getUser().getLogin()));
|
||||||
|
return true;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("SetTextI18n")
|
@SuppressLint("SetTextI18n")
|
||||||
void bindData(PullRequests pullRequest) {
|
void bindData(PullRequests pullRequest) {
|
||||||
|
|
||||||
TinyDB tinyDb = TinyDB.getInstance(context);
|
TinyDB tinyDb = TinyDB.getInstance(context);
|
||||||
String locale = tinyDb.getString("locale");
|
Locale locale = context.getResources().getConfiguration().locale;
|
||||||
String timeFormat = tinyDb.getString("dateFormat");
|
String timeFormat = tinyDb.getString("dateFormat");
|
||||||
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
||||||
|
|
||||||
@ -165,7 +164,7 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
|||||||
|
|
||||||
this.prTitle.setText(HtmlCompat.fromHtml(prNumber_ + " " + EmojiParser.parseToUnicode(pullRequest.getTitle()), HtmlCompat.FROM_HTML_MODE_LEGACY));
|
this.prTitle.setText(HtmlCompat.fromHtml(prNumber_ + " " + EmojiParser.parseToUnicode(pullRequest.getTitle()), HtmlCompat.FROM_HTML_MODE_LEGACY));
|
||||||
this.prCommentsCount.setText(String.valueOf(pullRequest.getComments()));
|
this.prCommentsCount.setText(String.valueOf(pullRequest.getComments()));
|
||||||
this.prCreatedTime.setText(TimeHelper.formatTime(pullRequest.getCreated_at(), new Locale(locale), timeFormat, context));
|
this.prCreatedTime.setText(TimeHelper.formatTime(pullRequest.getCreated_at(), locale, timeFormat, context));
|
||||||
|
|
||||||
if(timeFormat.equals("pretty")) {
|
if(timeFormat.equals("pretty")) {
|
||||||
this.prCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(pullRequest.getCreated_at()), context));
|
this.prCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(pullRequest.getCreated_at()), context));
|
||||||
@ -176,38 +175,30 @@ public class PullRequestsAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
|||||||
static class LoadHolder extends RecyclerView.ViewHolder {
|
static class LoadHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
LoadHolder(View itemView) {
|
LoadHolder(View itemView) {
|
||||||
|
|
||||||
super(itemView);
|
super(itemView);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMoreDataAvailable(boolean moreDataAvailable) {
|
public void setMoreDataAvailable(boolean moreDataAvailable) {
|
||||||
|
|
||||||
isMoreDataAvailable = moreDataAvailable;
|
isMoreDataAvailable = moreDataAvailable;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void notifyDataChanged() {
|
public void notifyDataChanged() {
|
||||||
|
|
||||||
notifyDataSetChanged();
|
notifyDataSetChanged();
|
||||||
isLoading = false;
|
isLoading = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface OnLoadMoreListener {
|
public interface OnLoadMoreListener {
|
||||||
|
|
||||||
void onLoadMore();
|
void onLoadMore();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLoadMoreListener(PullRequestsAdapter.OnLoadMoreListener loadMoreListener) {
|
public void setLoadMoreListener(PullRequestsAdapter.OnLoadMoreListener loadMoreListener) {
|
||||||
|
|
||||||
this.loadMoreListener = loadMoreListener;
|
this.loadMoreListener = loadMoreListener;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateList(List<PullRequests> list) {
|
public void updateList(List<PullRequests> list) {
|
||||||
|
|
||||||
prList = list;
|
prList = list;
|
||||||
notifyDataSetChanged();
|
notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package org.mian.gitnex.adapters;
|
package org.mian.gitnex.adapters;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
import android.text.method.LinkMovementMethod;
|
import android.text.method.LinkMovementMethod;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@ -14,6 +15,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
|
|||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import org.gitnex.tea4j.models.Releases;
|
import org.gitnex.tea4j.models.Releases;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.activities.ProfileActivity;
|
||||||
import org.mian.gitnex.clients.PicassoService;
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
import org.mian.gitnex.helpers.AppUtil;
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
import org.mian.gitnex.helpers.ClickListener;
|
import org.mian.gitnex.helpers.ClickListener;
|
||||||
@ -35,6 +37,8 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
|
|||||||
|
|
||||||
static class ReleasesViewHolder extends RecyclerView.ViewHolder {
|
static class ReleasesViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
|
private Releases releases;
|
||||||
|
|
||||||
private final TextView releaseType;
|
private final TextView releaseType;
|
||||||
private final TextView releaseName;
|
private final TextView releaseName;
|
||||||
private final ImageView authorAvatar;
|
private final ImageView authorAvatar;
|
||||||
@ -70,6 +74,14 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
|
|||||||
|
|
||||||
downloadList.setHasFixedSize(true);
|
downloadList.setHasFixedSize(true);
|
||||||
downloadList.setLayoutManager(new LinearLayoutManager(itemView.getContext()));
|
downloadList.setLayoutManager(new LinearLayoutManager(itemView.getContext()));
|
||||||
|
|
||||||
|
authorAvatar.setOnClickListener(loginId -> {
|
||||||
|
Context context = loginId.getContext();
|
||||||
|
|
||||||
|
Intent intent = new Intent(context, ProfileActivity.class);
|
||||||
|
intent.putExtra("username", releases.getAuthor().getLogin());
|
||||||
|
context.startActivity(intent);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,11 +101,12 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
|
|||||||
public void onBindViewHolder(@NonNull ReleasesAdapter.ReleasesViewHolder holder, int position) {
|
public void onBindViewHolder(@NonNull ReleasesAdapter.ReleasesViewHolder holder, int position) {
|
||||||
|
|
||||||
final TinyDB tinyDb = TinyDB.getInstance(context);
|
final TinyDB tinyDb = TinyDB.getInstance(context);
|
||||||
final String locale = tinyDb.getString("locale");
|
final Locale locale = context.getResources().getConfiguration().locale;
|
||||||
final String timeFormat = tinyDb.getString("dateFormat");
|
final String timeFormat = tinyDb.getString("dateFormat");
|
||||||
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
||||||
|
|
||||||
Releases currentItem = releasesList.get(position);
|
Releases currentItem = releasesList.get(position);
|
||||||
|
holder.releases = currentItem;
|
||||||
|
|
||||||
holder.releaseName.setText(currentItem.getName());
|
holder.releaseName.setText(currentItem.getName());
|
||||||
|
|
||||||
@ -120,7 +133,7 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(currentItem.getPublished_at() != null) {
|
if(currentItem.getPublished_at() != null) {
|
||||||
holder.releaseDate.setText(TimeHelper.formatTime(currentItem.getPublished_at(), new Locale(locale), timeFormat, context));
|
holder.releaseDate.setText(TimeHelper.formatTime(currentItem.getPublished_at(), locale, timeFormat, context));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(timeFormat.equals("pretty")) {
|
if(timeFormat.equals("pretty")) {
|
||||||
|
@ -132,7 +132,7 @@ public class RepoForksAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
|
|||||||
TinyDB tinyDb = TinyDB.getInstance(context);
|
TinyDB tinyDb = TinyDB.getInstance(context);
|
||||||
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
||||||
|
|
||||||
String locale = tinyDb.getString("locale");
|
Locale locale = context.getResources().getConfiguration().locale;
|
||||||
String timeFormat = tinyDb.getString("dateFormat");
|
String timeFormat = tinyDb.getString("dateFormat");
|
||||||
this.userRepositories = forksModel;
|
this.userRepositories = forksModel;
|
||||||
orgName.setText(forksModel.getFullName().split("/")[0]);
|
orgName.setText(forksModel.getFullName().split("/")[0]);
|
||||||
@ -164,20 +164,20 @@ public class RepoForksAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
|
|||||||
|
|
||||||
switch(timeFormat) {
|
switch(timeFormat) {
|
||||||
case "pretty": {
|
case "pretty": {
|
||||||
PrettyTime prettyTime = new PrettyTime(new Locale(locale));
|
PrettyTime prettyTime = new PrettyTime(locale);
|
||||||
String createdTime = prettyTime.format(forksModel.getUpdated_at());
|
String createdTime = prettyTime.format(forksModel.getUpdated_at());
|
||||||
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
||||||
repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(forksModel.getUpdated_at()), context));
|
repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(forksModel.getUpdated_at()), context));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "normal": {
|
case "normal": {
|
||||||
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
|
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
|
||||||
String createdTime = formatter.format(forksModel.getUpdated_at());
|
String createdTime = formatter.format(forksModel.getUpdated_at());
|
||||||
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "normal1": {
|
case "normal1": {
|
||||||
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
|
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
|
||||||
String createdTime = formatter.format(forksModel.getUpdated_at());
|
String createdTime = formatter.format(forksModel.getUpdated_at());
|
||||||
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
||||||
break;
|
break;
|
||||||
|
@ -2,6 +2,7 @@ package org.mian.gitnex.adapters;
|
|||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
import android.graphics.Typeface;
|
import android.graphics.Typeface;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@ -11,6 +12,7 @@ import android.widget.ImageView;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import org.gitnex.tea4j.models.UserInfo;
|
import org.gitnex.tea4j.models.UserInfo;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.activities.ProfileActivity;
|
||||||
import org.mian.gitnex.clients.PicassoService;
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
import org.mian.gitnex.helpers.AppUtil;
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
import org.mian.gitnex.helpers.RoundedTransformation;
|
||||||
@ -26,7 +28,9 @@ public class RepoStargazersAdapter extends BaseAdapter {
|
|||||||
private final List<UserInfo> stargazersList;
|
private final List<UserInfo> stargazersList;
|
||||||
private final Context context;
|
private final Context context;
|
||||||
|
|
||||||
private static class ViewHolder {
|
private class ViewHolder {
|
||||||
|
|
||||||
|
private UserInfo userInfo;
|
||||||
|
|
||||||
private final ImageView memberAvatar;
|
private final ImageView memberAvatar;
|
||||||
private final TextView memberName;
|
private final TextView memberName;
|
||||||
@ -34,6 +38,17 @@ public class RepoStargazersAdapter extends BaseAdapter {
|
|||||||
ViewHolder(View v) {
|
ViewHolder(View v) {
|
||||||
memberAvatar = v.findViewById(R.id.memberAvatar);
|
memberAvatar = v.findViewById(R.id.memberAvatar);
|
||||||
memberName = v.findViewById(R.id.memberName);
|
memberName = v.findViewById(R.id.memberName);
|
||||||
|
|
||||||
|
memberAvatar.setOnClickListener(loginId -> {
|
||||||
|
Intent intent = new Intent(context, ProfileActivity.class);
|
||||||
|
intent.putExtra("username", userInfo.getLogin());
|
||||||
|
context.startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
|
memberAvatar.setOnLongClickListener(loginId -> {
|
||||||
|
AppUtil.copyToClipboard(context, userInfo.getLogin(), context.getString(R.string.copyLoginIdToClipBoard, userInfo.getLogin()));
|
||||||
|
return true;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,6 +95,7 @@ public class RepoStargazersAdapter extends BaseAdapter {
|
|||||||
private void initData(RepoStargazersAdapter.ViewHolder viewHolder, int position) {
|
private void initData(RepoStargazersAdapter.ViewHolder viewHolder, int position) {
|
||||||
|
|
||||||
UserInfo currentItem = stargazersList.get(position);
|
UserInfo currentItem = stargazersList.get(position);
|
||||||
|
viewHolder.userInfo = currentItem;
|
||||||
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
||||||
|
|
||||||
PicassoService.getInstance(context).get().load(currentItem.getAvatar()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(180, 180).centerCrop().into(viewHolder.memberAvatar);
|
PicassoService.getInstance(context).get().load(currentItem.getAvatar()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(180, 180).centerCrop().into(viewHolder.memberAvatar);
|
||||||
|
@ -2,6 +2,7 @@ package org.mian.gitnex.adapters;
|
|||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
import android.graphics.Typeface;
|
import android.graphics.Typeface;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@ -11,6 +12,7 @@ import android.widget.ImageView;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import org.gitnex.tea4j.models.UserInfo;
|
import org.gitnex.tea4j.models.UserInfo;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.activities.ProfileActivity;
|
||||||
import org.mian.gitnex.clients.PicassoService;
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
import org.mian.gitnex.helpers.AppUtil;
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
import org.mian.gitnex.helpers.RoundedTransformation;
|
||||||
@ -26,7 +28,9 @@ public class RepoWatchersAdapter extends BaseAdapter {
|
|||||||
private final List<UserInfo> watchersList;
|
private final List<UserInfo> watchersList;
|
||||||
private final Context context;
|
private final Context context;
|
||||||
|
|
||||||
private static class ViewHolder {
|
private class ViewHolder {
|
||||||
|
|
||||||
|
private UserInfo userInfo;
|
||||||
|
|
||||||
private final ImageView memberAvatar;
|
private final ImageView memberAvatar;
|
||||||
private final TextView memberName;
|
private final TextView memberName;
|
||||||
@ -34,6 +38,17 @@ public class RepoWatchersAdapter extends BaseAdapter {
|
|||||||
ViewHolder(View v) {
|
ViewHolder(View v) {
|
||||||
memberAvatar = v.findViewById(R.id.memberAvatar);
|
memberAvatar = v.findViewById(R.id.memberAvatar);
|
||||||
memberName = v.findViewById(R.id.memberName);
|
memberName = v.findViewById(R.id.memberName);
|
||||||
|
|
||||||
|
memberAvatar.setOnClickListener(loginId -> {
|
||||||
|
Intent intent = new Intent(context, ProfileActivity.class);
|
||||||
|
intent.putExtra("username", userInfo.getLogin());
|
||||||
|
context.startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
|
memberAvatar.setOnLongClickListener(loginId -> {
|
||||||
|
AppUtil.copyToClipboard(context, userInfo.getLogin(), context.getString(R.string.copyLoginIdToClipBoard, userInfo.getLogin()));
|
||||||
|
return true;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,6 +95,7 @@ public class RepoWatchersAdapter extends BaseAdapter {
|
|||||||
private void initData(RepoWatchersAdapter.ViewHolder viewHolder, int position) {
|
private void initData(RepoWatchersAdapter.ViewHolder viewHolder, int position) {
|
||||||
|
|
||||||
UserInfo currentItem = watchersList.get(position);
|
UserInfo currentItem = watchersList.get(position);
|
||||||
|
viewHolder.userInfo = currentItem;
|
||||||
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
||||||
|
|
||||||
PicassoService.getInstance(context).get().load(currentItem.getAvatar()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(180, 180).centerCrop().into(viewHolder.memberAvatar);
|
PicassoService.getInstance(context).get().load(currentItem.getAvatar()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(180, 180).centerCrop().into(viewHolder.memberAvatar);
|
||||||
|
@ -189,7 +189,7 @@ public class ReposListAdapter extends RecyclerView.Adapter<ReposListAdapter.Repo
|
|||||||
UserRepositories currentItem = reposList.get(position);
|
UserRepositories currentItem = reposList.get(position);
|
||||||
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
||||||
|
|
||||||
String locale = tinyDb.getString("locale");
|
Locale locale = context.getResources().getConfiguration().locale;
|
||||||
String timeFormat = tinyDb.getString("dateFormat");
|
String timeFormat = tinyDb.getString("dateFormat");
|
||||||
holder.userRepositories = currentItem;
|
holder.userRepositories = currentItem;
|
||||||
holder.orgName.setText(currentItem.getFullName().split("/")[0]);
|
holder.orgName.setText(currentItem.getFullName().split("/")[0]);
|
||||||
@ -218,20 +218,20 @@ public class ReposListAdapter extends RecyclerView.Adapter<ReposListAdapter.Repo
|
|||||||
|
|
||||||
switch(timeFormat) {
|
switch(timeFormat) {
|
||||||
case "pretty": {
|
case "pretty": {
|
||||||
PrettyTime prettyTime = new PrettyTime(new Locale(locale));
|
PrettyTime prettyTime = new PrettyTime(locale);
|
||||||
String createdTime = prettyTime.format(currentItem.getUpdated_at());
|
String createdTime = prettyTime.format(currentItem.getUpdated_at());
|
||||||
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
||||||
holder.repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), context));
|
holder.repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), context));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "normal": {
|
case "normal": {
|
||||||
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
|
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
|
||||||
String createdTime = formatter.format(currentItem.getUpdated_at());
|
String createdTime = formatter.format(currentItem.getUpdated_at());
|
||||||
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "normal1": {
|
case "normal1": {
|
||||||
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
|
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
|
||||||
String createdTime = formatter.format(currentItem.getUpdated_at());
|
String createdTime = formatter.format(currentItem.getUpdated_at());
|
||||||
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
||||||
break;
|
break;
|
||||||
|
@ -186,7 +186,7 @@ public class RepositoriesByOrgAdapter extends RecyclerView.Adapter<RepositoriesB
|
|||||||
UserRepositories currentItem = reposList.get(position);
|
UserRepositories currentItem = reposList.get(position);
|
||||||
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
||||||
|
|
||||||
String locale = tinyDb.getString("locale");
|
Locale locale = context.getResources().getConfiguration().locale;
|
||||||
String timeFormat = tinyDb.getString("dateFormat");
|
String timeFormat = tinyDb.getString("dateFormat");
|
||||||
holder.userRepositories = currentItem;
|
holder.userRepositories = currentItem;
|
||||||
holder.orgName.setText(currentItem.getFullName().split("/")[0]);
|
holder.orgName.setText(currentItem.getFullName().split("/")[0]);
|
||||||
@ -222,20 +222,20 @@ public class RepositoriesByOrgAdapter extends RecyclerView.Adapter<RepositoriesB
|
|||||||
|
|
||||||
switch(timeFormat) {
|
switch(timeFormat) {
|
||||||
case "pretty": {
|
case "pretty": {
|
||||||
PrettyTime prettyTime = new PrettyTime(new Locale(locale));
|
PrettyTime prettyTime = new PrettyTime(locale);
|
||||||
String createdTime = prettyTime.format(currentItem.getUpdated_at());
|
String createdTime = prettyTime.format(currentItem.getUpdated_at());
|
||||||
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
||||||
holder.repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), context));
|
holder.repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), context));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "normal": {
|
case "normal": {
|
||||||
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
|
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
|
||||||
String createdTime = formatter.format(currentItem.getUpdated_at());
|
String createdTime = formatter.format(currentItem.getUpdated_at());
|
||||||
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "normal1": {
|
case "normal1": {
|
||||||
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
|
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
|
||||||
String createdTime = formatter.format(currentItem.getUpdated_at());
|
String createdTime = formatter.format(currentItem.getUpdated_at());
|
||||||
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
||||||
break;
|
break;
|
||||||
|
@ -187,7 +187,7 @@ public class StarredReposListAdapter extends RecyclerView.Adapter<StarredReposLi
|
|||||||
UserRepositories currentItem = reposList.get(position);
|
UserRepositories currentItem = reposList.get(position);
|
||||||
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
||||||
|
|
||||||
String locale = tinyDb.getString("locale");
|
Locale locale = context.getResources().getConfiguration().locale;
|
||||||
String timeFormat = tinyDb.getString("dateFormat");
|
String timeFormat = tinyDb.getString("dateFormat");
|
||||||
holder.userRepositories = currentItem;
|
holder.userRepositories = currentItem;
|
||||||
holder.orgName.setText(currentItem.getFullName().split("/")[0]);
|
holder.orgName.setText(currentItem.getFullName().split("/")[0]);
|
||||||
@ -223,20 +223,20 @@ public class StarredReposListAdapter extends RecyclerView.Adapter<StarredReposLi
|
|||||||
|
|
||||||
switch(timeFormat) {
|
switch(timeFormat) {
|
||||||
case "pretty": {
|
case "pretty": {
|
||||||
PrettyTime prettyTime = new PrettyTime(new Locale(locale));
|
PrettyTime prettyTime = new PrettyTime(locale);
|
||||||
String createdTime = prettyTime.format(currentItem.getUpdated_at());
|
String createdTime = prettyTime.format(currentItem.getUpdated_at());
|
||||||
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
||||||
holder.repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), context));
|
holder.repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), context));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "normal": {
|
case "normal": {
|
||||||
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
|
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
|
||||||
String createdTime = formatter.format(currentItem.getUpdated_at());
|
String createdTime = formatter.format(currentItem.getUpdated_at());
|
||||||
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "normal1": {
|
case "normal1": {
|
||||||
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
|
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + context.getResources().getString(R.string.timeAtText) + "' HH:mm", locale);
|
||||||
String createdTime = formatter.format(currentItem.getUpdated_at());
|
String createdTime = formatter.format(currentItem.getUpdated_at());
|
||||||
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
holder.repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, createdTime));
|
||||||
break;
|
break;
|
||||||
|
@ -2,6 +2,7 @@ package org.mian.gitnex.adapters;
|
|||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
import android.graphics.Typeface;
|
import android.graphics.Typeface;
|
||||||
import android.text.Html;
|
import android.text.Html;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
@ -12,6 +13,7 @@ import android.widget.ImageView;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import org.gitnex.tea4j.models.UserInfo;
|
import org.gitnex.tea4j.models.UserInfo;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.activities.ProfileActivity;
|
||||||
import org.mian.gitnex.clients.PicassoService;
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
import org.mian.gitnex.helpers.AppUtil;
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
import org.mian.gitnex.helpers.RoundedTransformation;
|
||||||
@ -27,7 +29,7 @@ public class TeamMembersByOrgAdapter extends BaseAdapter {
|
|||||||
private final List<UserInfo> teamMembersList;
|
private final List<UserInfo> teamMembersList;
|
||||||
private final Context context;
|
private final Context context;
|
||||||
|
|
||||||
private static class ViewHolder {
|
private class ViewHolder {
|
||||||
|
|
||||||
private String userLoginId;
|
private String userLoginId;
|
||||||
|
|
||||||
@ -40,10 +42,14 @@ public class TeamMembersByOrgAdapter extends BaseAdapter {
|
|||||||
memberName = v.findViewById(R.id.memberName);
|
memberName = v.findViewById(R.id.memberName);
|
||||||
|
|
||||||
memberAvatar.setOnClickListener(loginId -> {
|
memberAvatar.setOnClickListener(loginId -> {
|
||||||
|
Intent intent = new Intent(context, ProfileActivity.class);
|
||||||
|
intent.putExtra("username", userLoginId);
|
||||||
|
context.startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
Context context = loginId.getContext();
|
memberAvatar.setOnLongClickListener(loginId -> {
|
||||||
|
|
||||||
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
|
AppUtil.copyToClipboard(context, userLoginId, context.getString(R.string.copyLoginIdToClipBoard, userLoginId));
|
||||||
|
return true;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package org.mian.gitnex.adapters;
|
package org.mian.gitnex.adapters;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
import android.text.Html;
|
import android.text.Html;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
@ -16,6 +17,7 @@ import org.gitnex.tea4j.models.Collaborators;
|
|||||||
import org.gitnex.tea4j.models.UserInfo;
|
import org.gitnex.tea4j.models.UserInfo;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
import org.mian.gitnex.actions.CollaboratorActions;
|
import org.mian.gitnex.actions.CollaboratorActions;
|
||||||
|
import org.mian.gitnex.activities.ProfileActivity;
|
||||||
import org.mian.gitnex.clients.PicassoService;
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
import org.mian.gitnex.clients.RetrofitClient;
|
import org.mian.gitnex.clients.RetrofitClient;
|
||||||
import org.mian.gitnex.helpers.AlertDialogs;
|
import org.mian.gitnex.helpers.AlertDialogs;
|
||||||
@ -42,7 +44,7 @@ public class UserSearchAdapter extends RecyclerView.Adapter<UserSearchAdapter.Us
|
|||||||
this.usersSearchList = dataList;
|
this.usersSearchList = dataList;
|
||||||
}
|
}
|
||||||
|
|
||||||
static class UserSearchViewHolder extends RecyclerView.ViewHolder {
|
class UserSearchViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
private UserInfo userInfo;
|
private UserInfo userInfo;
|
||||||
|
|
||||||
@ -65,9 +67,6 @@ public class UserSearchAdapter extends RecyclerView.Adapter<UserSearchAdapter.Us
|
|||||||
addCollaboratorButtonRemove = itemView.findViewById(R.id.addCollaboratorButtonRemove);
|
addCollaboratorButtonRemove = itemView.findViewById(R.id.addCollaboratorButtonRemove);
|
||||||
|
|
||||||
addCollaboratorButtonAdd.setOnClickListener(v -> {
|
addCollaboratorButtonAdd.setOnClickListener(v -> {
|
||||||
|
|
||||||
final Context context = v.getContext();
|
|
||||||
|
|
||||||
AlertDialog.Builder pBuilder = new AlertDialog.Builder(context);
|
AlertDialog.Builder pBuilder = new AlertDialog.Builder(context);
|
||||||
|
|
||||||
pBuilder.setTitle(R.string.newTeamPermission);
|
pBuilder.setTitle(R.string.newTeamPermission);
|
||||||
@ -89,9 +88,6 @@ public class UserSearchAdapter extends RecyclerView.Adapter<UserSearchAdapter.Us
|
|||||||
});
|
});
|
||||||
|
|
||||||
addCollaboratorButtonRemove.setOnClickListener(v -> {
|
addCollaboratorButtonRemove.setOnClickListener(v -> {
|
||||||
|
|
||||||
Context context = v.getContext();
|
|
||||||
|
|
||||||
AlertDialogs.collaboratorRemoveDialog(context, userInfo.getUsername(),
|
AlertDialogs.collaboratorRemoveDialog(context, userInfo.getUsername(),
|
||||||
context.getResources().getString(R.string.removeCollaboratorTitle),
|
context.getResources().getString(R.string.removeCollaboratorTitle),
|
||||||
context.getResources().getString(R.string.removeCollaboratorMessage),
|
context.getResources().getString(R.string.removeCollaboratorMessage),
|
||||||
@ -99,6 +95,16 @@ public class UserSearchAdapter extends RecyclerView.Adapter<UserSearchAdapter.Us
|
|||||||
context.getResources().getString(R.string.cancelButton), "fa");
|
context.getResources().getString(R.string.cancelButton), "fa");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
userAvatar.setOnClickListener(loginId -> {
|
||||||
|
Intent intent = new Intent(context, ProfileActivity.class);
|
||||||
|
intent.putExtra("username", userInfo.getLogin());
|
||||||
|
context.startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
|
userAvatar.setOnLongClickListener(loginId -> {
|
||||||
|
AppUtil.copyToClipboard(context, userInfo.getLogin(), context.getString(R.string.copyLoginIdToClipBoard, userInfo.getLogin()));
|
||||||
|
return true;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package org.mian.gitnex.adapters;
|
package org.mian.gitnex.adapters;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
import android.text.Html;
|
import android.text.Html;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@ -11,6 +12,7 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import org.gitnex.tea4j.models.UserInfo;
|
import org.gitnex.tea4j.models.UserInfo;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.activities.ProfileActivity;
|
||||||
import org.mian.gitnex.clients.PicassoService;
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
import org.mian.gitnex.clients.RetrofitClient;
|
import org.mian.gitnex.clients.RetrofitClient;
|
||||||
import org.mian.gitnex.helpers.AlertDialogs;
|
import org.mian.gitnex.helpers.AlertDialogs;
|
||||||
@ -40,7 +42,7 @@ public class UserSearchForTeamMemberAdapter extends RecyclerView.Adapter<UserSea
|
|||||||
UserSearchForTeamMemberAdapter.teamId = teamId;
|
UserSearchForTeamMemberAdapter.teamId = teamId;
|
||||||
}
|
}
|
||||||
|
|
||||||
static class UserSearchViewHolder extends RecyclerView.ViewHolder {
|
class UserSearchViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
private UserInfo userInfo;
|
private UserInfo userInfo;
|
||||||
|
|
||||||
@ -60,9 +62,6 @@ public class UserSearchForTeamMemberAdapter extends RecyclerView.Adapter<UserSea
|
|||||||
addMemberButtonRemove = itemView.findViewById(R.id.addCollaboratorButtonRemove);
|
addMemberButtonRemove = itemView.findViewById(R.id.addCollaboratorButtonRemove);
|
||||||
|
|
||||||
addMemberButtonAdd.setOnClickListener(v -> {
|
addMemberButtonAdd.setOnClickListener(v -> {
|
||||||
|
|
||||||
Context context = v.getContext();
|
|
||||||
|
|
||||||
AlertDialogs.addMemberDialog(context, userInfo.getLogin(),
|
AlertDialogs.addMemberDialog(context, userInfo.getLogin(),
|
||||||
context.getResources().getString(R.string.addTeamMemberTitle),
|
context.getResources().getString(R.string.addTeamMemberTitle),
|
||||||
context.getResources().getString(R.string.addTeamMemberMessage),
|
context.getResources().getString(R.string.addTeamMemberMessage),
|
||||||
@ -71,15 +70,23 @@ public class UserSearchForTeamMemberAdapter extends RecyclerView.Adapter<UserSea
|
|||||||
});
|
});
|
||||||
|
|
||||||
addMemberButtonRemove.setOnClickListener(v -> {
|
addMemberButtonRemove.setOnClickListener(v -> {
|
||||||
|
|
||||||
Context context = v.getContext();
|
|
||||||
|
|
||||||
AlertDialogs.removeMemberDialog(context, userInfo.getLogin(),
|
AlertDialogs.removeMemberDialog(context, userInfo.getLogin(),
|
||||||
context.getResources().getString(R.string.removeTeamMemberTitle),
|
context.getResources().getString(R.string.removeTeamMemberTitle),
|
||||||
context.getResources().getString(R.string.removeTeamMemberMessage),
|
context.getResources().getString(R.string.removeTeamMemberMessage),
|
||||||
context.getResources().getString(R.string.removeButton),
|
context.getResources().getString(R.string.removeButton),
|
||||||
context.getResources().getString(R.string.cancelButton), Integer.parseInt(String.valueOf(teamId)));
|
context.getResources().getString(R.string.cancelButton), Integer.parseInt(String.valueOf(teamId)));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
userAvatar.setOnClickListener(loginId -> {
|
||||||
|
Intent intent = new Intent(context, ProfileActivity.class);
|
||||||
|
intent.putExtra("username", userInfo.getLogin());
|
||||||
|
context.startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
|
userAvatar.setOnLongClickListener(loginId -> {
|
||||||
|
AppUtil.copyToClipboard(context, userInfo.getLogin(), context.getString(R.string.copyLoginIdToClipBoard, userInfo.getLogin()));
|
||||||
|
return true;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,166 @@
|
|||||||
|
package org.mian.gitnex.adapters.profile;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.text.Html;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
import org.gitnex.tea4j.models.UserInfo;
|
||||||
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.activities.ProfileActivity;
|
||||||
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
|
import org.mian.gitnex.helpers.RoundedTransformation;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Author M M Arif
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class FollowersAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||||
|
|
||||||
|
private final Context context;
|
||||||
|
private final int TYPE_LOAD = 0;
|
||||||
|
private List<UserInfo> usersList;
|
||||||
|
private OnLoadMoreListener loadMoreListener;
|
||||||
|
private boolean isLoading = false, isMoreDataAvailable = true;
|
||||||
|
|
||||||
|
public FollowersAdapter(Context ctx, List<UserInfo> usersListMain) {
|
||||||
|
this.context = ctx;
|
||||||
|
this.usersList = usersListMain;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
|
|
||||||
|
LayoutInflater inflater = LayoutInflater.from(context);
|
||||||
|
|
||||||
|
if(viewType == TYPE_LOAD) {
|
||||||
|
return new UsersHolder(inflater.inflate(R.layout.list_profile_followers_following, parent, false));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return new LoadHolder(inflater.inflate(R.layout.row_load, parent, false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
||||||
|
|
||||||
|
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
|
||||||
|
isLoading = true;
|
||||||
|
loadMoreListener.onLoadMore();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(getItemViewType(position) == TYPE_LOAD) {
|
||||||
|
((UsersHolder) holder).bindData(usersList.get(position));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemViewType(int position) {
|
||||||
|
if(usersList.get(position).getUsername() != null) {
|
||||||
|
return TYPE_LOAD;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return usersList.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
class UsersHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
|
private UserInfo userInfo;
|
||||||
|
|
||||||
|
private final ImageView userAvatar;
|
||||||
|
private final TextView userFullName;
|
||||||
|
private final TextView userName;
|
||||||
|
|
||||||
|
UsersHolder(View itemView) {
|
||||||
|
|
||||||
|
super(itemView);
|
||||||
|
Context context = itemView.getContext();
|
||||||
|
|
||||||
|
userAvatar = itemView.findViewById(R.id.userAvatar);
|
||||||
|
userFullName = itemView.findViewById(R.id.userFullName);
|
||||||
|
userName = itemView.findViewById(R.id.userName);
|
||||||
|
|
||||||
|
itemView.setOnClickListener(loginId -> {
|
||||||
|
Intent intent = new Intent(context, ProfileActivity.class);
|
||||||
|
intent.putExtra("username", userInfo.getLogin());
|
||||||
|
context.startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
|
itemView.setOnLongClickListener(loginId -> {
|
||||||
|
AppUtil.copyToClipboard(context, userInfo.getLogin(), context.getString(R.string.copyLoginIdToClipBoard, userInfo.getLogin()));
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("SetTextI18n")
|
||||||
|
void bindData(UserInfo userInfo) {
|
||||||
|
|
||||||
|
this.userInfo = userInfo;
|
||||||
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
||||||
|
|
||||||
|
//Locale locale = context.getResources().getConfiguration().locale;
|
||||||
|
|
||||||
|
if(!userInfo.getFullname().equals("")) {
|
||||||
|
userFullName.setText(Html.fromHtml(userInfo.getFullname()));
|
||||||
|
userName.setText(context.getResources().getString(R.string.usernameWithAt, userInfo.getUsername()));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
userFullName.setText(userInfo.getUsername());
|
||||||
|
userName.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
PicassoService.getInstance(context)
|
||||||
|
.get()
|
||||||
|
.load(userInfo.getAvatar())
|
||||||
|
.placeholder(R.drawable.loader_animated)
|
||||||
|
.transform(new RoundedTransformation(imgRadius, 0))
|
||||||
|
.resize(120, 120)
|
||||||
|
.centerCrop()
|
||||||
|
.into(userAvatar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class LoadHolder extends RecyclerView.ViewHolder {
|
||||||
|
LoadHolder(View itemView) {
|
||||||
|
super(itemView);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMoreDataAvailable(boolean moreDataAvailable) {
|
||||||
|
isMoreDataAvailable = moreDataAvailable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void notifyDataChanged() {
|
||||||
|
notifyDataSetChanged();
|
||||||
|
isLoading = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface OnLoadMoreListener {
|
||||||
|
void onLoadMore();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLoadMoreListener(OnLoadMoreListener loadMoreListener) {
|
||||||
|
this.loadMoreListener = loadMoreListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateList(List<UserInfo> list) {
|
||||||
|
usersList = list;
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,166 @@
|
|||||||
|
package org.mian.gitnex.adapters.profile;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.text.Html;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
import org.gitnex.tea4j.models.UserInfo;
|
||||||
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.activities.ProfileActivity;
|
||||||
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
|
import org.mian.gitnex.helpers.RoundedTransformation;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Author M M Arif
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class FollowingAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||||
|
|
||||||
|
private final Context context;
|
||||||
|
private final int TYPE_LOAD = 0;
|
||||||
|
private List<UserInfo> usersList;
|
||||||
|
private OnLoadMoreListener loadMoreListener;
|
||||||
|
private boolean isLoading = false, isMoreDataAvailable = true;
|
||||||
|
|
||||||
|
public FollowingAdapter(Context ctx, List<UserInfo> usersListMain) {
|
||||||
|
this.context = ctx;
|
||||||
|
this.usersList = usersListMain;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
|
|
||||||
|
LayoutInflater inflater = LayoutInflater.from(context);
|
||||||
|
|
||||||
|
if(viewType == TYPE_LOAD) {
|
||||||
|
return new UsersHolder(inflater.inflate(R.layout.list_profile_followers_following, parent, false));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return new LoadHolder(inflater.inflate(R.layout.row_load, parent, false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
||||||
|
|
||||||
|
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
|
||||||
|
isLoading = true;
|
||||||
|
loadMoreListener.onLoadMore();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(getItemViewType(position) == TYPE_LOAD) {
|
||||||
|
((UsersHolder) holder).bindData(usersList.get(position));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemViewType(int position) {
|
||||||
|
if(usersList.get(position).getUsername() != null) {
|
||||||
|
return TYPE_LOAD;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return usersList.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
class UsersHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
|
private UserInfo userInfo;
|
||||||
|
|
||||||
|
private final ImageView userAvatar;
|
||||||
|
private final TextView userFullName;
|
||||||
|
private final TextView userName;
|
||||||
|
|
||||||
|
UsersHolder(View itemView) {
|
||||||
|
|
||||||
|
super(itemView);
|
||||||
|
Context context = itemView.getContext();
|
||||||
|
|
||||||
|
userAvatar = itemView.findViewById(R.id.userAvatar);
|
||||||
|
userFullName = itemView.findViewById(R.id.userFullName);
|
||||||
|
userName = itemView.findViewById(R.id.userName);
|
||||||
|
|
||||||
|
itemView.setOnClickListener(loginId -> {
|
||||||
|
Intent intent = new Intent(context, ProfileActivity.class);
|
||||||
|
intent.putExtra("username", userInfo.getLogin());
|
||||||
|
context.startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
|
itemView.setOnLongClickListener(loginId -> {
|
||||||
|
AppUtil.copyToClipboard(context, userInfo.getLogin(), context.getString(R.string.copyLoginIdToClipBoard, userInfo.getLogin()));
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("SetTextI18n")
|
||||||
|
void bindData(UserInfo userInfo) {
|
||||||
|
|
||||||
|
this.userInfo = userInfo;
|
||||||
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
||||||
|
|
||||||
|
//Locale locale = context.getResources().getConfiguration().locale;
|
||||||
|
|
||||||
|
if(!userInfo.getFullname().equals("")) {
|
||||||
|
userFullName.setText(Html.fromHtml(userInfo.getFullname()));
|
||||||
|
userName.setText(context.getResources().getString(R.string.usernameWithAt, userInfo.getUsername()));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
userFullName.setText(userInfo.getUsername());
|
||||||
|
userName.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
PicassoService
|
||||||
|
.getInstance(context)
|
||||||
|
.get()
|
||||||
|
.load(userInfo.getAvatar())
|
||||||
|
.placeholder(R.drawable.loader_animated)
|
||||||
|
.transform(new RoundedTransformation(imgRadius, 0))
|
||||||
|
.resize(120, 120)
|
||||||
|
.centerCrop()
|
||||||
|
.into(userAvatar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class LoadHolder extends RecyclerView.ViewHolder {
|
||||||
|
LoadHolder(View itemView) {
|
||||||
|
super(itemView);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMoreDataAvailable(boolean moreDataAvailable) {
|
||||||
|
isMoreDataAvailable = moreDataAvailable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void notifyDataChanged() {
|
||||||
|
notifyDataSetChanged();
|
||||||
|
isLoading = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface OnLoadMoreListener {
|
||||||
|
void onLoadMore();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLoadMoreListener(OnLoadMoreListener loadMoreListener) {
|
||||||
|
this.loadMoreListener = loadMoreListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateList(List<UserInfo> list) {
|
||||||
|
usersList = list;
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,137 @@
|
|||||||
|
package org.mian.gitnex.adapters.profile;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
import org.gitnex.tea4j.models.UserOrganizations;
|
||||||
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
|
import org.mian.gitnex.helpers.RoundedTransformation;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Author M M Arif
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class OrganizationsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||||
|
|
||||||
|
private final Context context;
|
||||||
|
private final int TYPE_LOAD = 0;
|
||||||
|
private List<UserOrganizations> organizationsList;
|
||||||
|
private RepositoriesAdapter.OnLoadMoreListener loadMoreListener;
|
||||||
|
private boolean isLoading = false, isMoreDataAvailable = true;
|
||||||
|
|
||||||
|
public OrganizationsAdapter(Context ctx, List<UserOrganizations> organizationsListMain) {
|
||||||
|
this.context = ctx;
|
||||||
|
this.organizationsList = organizationsListMain;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
|
|
||||||
|
LayoutInflater inflater = LayoutInflater.from(context);
|
||||||
|
|
||||||
|
if(viewType == TYPE_LOAD) {
|
||||||
|
return new OrganizationsHolder(inflater.inflate(R.layout.list_organizations, parent, false));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return new LoadHolder(inflater.inflate(R.layout.row_load, parent, false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
||||||
|
|
||||||
|
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
|
||||||
|
isLoading = true;
|
||||||
|
loadMoreListener.onLoadMore();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(getItemViewType(position) == TYPE_LOAD) {
|
||||||
|
((OrganizationsHolder) holder).bindData(organizationsList.get(position));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemViewType(int position) {
|
||||||
|
if(organizationsList.get(position).getUsername() != null) {
|
||||||
|
return TYPE_LOAD;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return organizationsList.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
class OrganizationsHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
|
private UserOrganizations userOrganizations;
|
||||||
|
|
||||||
|
private final ImageView image;
|
||||||
|
private final TextView orgName;
|
||||||
|
private final TextView orgDescription;
|
||||||
|
|
||||||
|
OrganizationsHolder(View itemView) {
|
||||||
|
|
||||||
|
super(itemView);
|
||||||
|
orgName = itemView.findViewById(R.id.orgName);
|
||||||
|
orgDescription = itemView.findViewById(R.id.orgDescription);
|
||||||
|
image = itemView.findViewById(R.id.imageAvatar);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("SetTextI18n")
|
||||||
|
void bindData(UserOrganizations userOrganizations) {
|
||||||
|
|
||||||
|
this.userOrganizations = userOrganizations;
|
||||||
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
||||||
|
|
||||||
|
orgName.setText(userOrganizations.getUsername());
|
||||||
|
|
||||||
|
PicassoService.getInstance(context).get().load(userOrganizations.getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop().into(image);
|
||||||
|
|
||||||
|
if (!userOrganizations.getDescription().equals("")) {
|
||||||
|
orgDescription.setText(userOrganizations.getDescription());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class LoadHolder extends RecyclerView.ViewHolder {
|
||||||
|
LoadHolder(View itemView) {
|
||||||
|
super(itemView);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMoreDataAvailable(boolean moreDataAvailable) {
|
||||||
|
isMoreDataAvailable = moreDataAvailable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void notifyDataChanged() {
|
||||||
|
notifyDataSetChanged();
|
||||||
|
isLoading = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface OnLoadMoreListener {
|
||||||
|
void onLoadMore();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLoadMoreListener(RepositoriesAdapter.OnLoadMoreListener loadMoreListener) {
|
||||||
|
this.loadMoreListener = loadMoreListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateList(List<UserOrganizations> list) {
|
||||||
|
organizationsList = list;
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,196 @@
|
|||||||
|
package org.mian.gitnex.adapters.profile;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Typeface;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.CheckBox;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
import com.amulyakhare.textdrawable.TextDrawable;
|
||||||
|
import com.amulyakhare.textdrawable.util.ColorGenerator;
|
||||||
|
import org.gitnex.tea4j.models.UserRepositories;
|
||||||
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
|
import org.mian.gitnex.helpers.ClickListener;
|
||||||
|
import org.mian.gitnex.helpers.RoundedTransformation;
|
||||||
|
import org.mian.gitnex.helpers.TimeHelper;
|
||||||
|
import org.mian.gitnex.helpers.TinyDB;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Author M M Arif
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class RepositoriesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||||
|
|
||||||
|
private final Context context;
|
||||||
|
private final int TYPE_LOAD = 0;
|
||||||
|
private List<UserRepositories> reposList;
|
||||||
|
private OnLoadMoreListener loadMoreListener;
|
||||||
|
private boolean isLoading = false, isMoreDataAvailable = true;
|
||||||
|
|
||||||
|
public RepositoriesAdapter(Context ctx, List<UserRepositories> reposListMain) {
|
||||||
|
this.context = ctx;
|
||||||
|
this.reposList = reposListMain;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
|
|
||||||
|
LayoutInflater inflater = LayoutInflater.from(context);
|
||||||
|
|
||||||
|
if(viewType == TYPE_LOAD) {
|
||||||
|
return new RepositoriesAdapter.RepositoriesHolder(inflater.inflate(R.layout.list_repositories, parent, false));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return new RepositoriesAdapter.LoadHolder(inflater.inflate(R.layout.row_load, parent, false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
||||||
|
|
||||||
|
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
|
||||||
|
isLoading = true;
|
||||||
|
loadMoreListener.onLoadMore();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(getItemViewType(position) == TYPE_LOAD) {
|
||||||
|
((RepositoriesAdapter.RepositoriesHolder) holder).bindData(reposList.get(position));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemViewType(int position) {
|
||||||
|
if(reposList.get(position).getFullName() != null) {
|
||||||
|
return TYPE_LOAD;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return reposList.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
class RepositoriesHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
|
private UserRepositories userRepositories;
|
||||||
|
|
||||||
|
private final ImageView avatar;
|
||||||
|
private final TextView repoName;
|
||||||
|
private final TextView orgName;
|
||||||
|
private final TextView repoDescription;
|
||||||
|
private CheckBox isRepoAdmin;
|
||||||
|
private final TextView repoStars;
|
||||||
|
private final TextView repoLastUpdated;
|
||||||
|
|
||||||
|
RepositoriesHolder(View itemView) {
|
||||||
|
|
||||||
|
super(itemView);
|
||||||
|
repoName = itemView.findViewById(R.id.repoName);
|
||||||
|
orgName = itemView.findViewById(R.id.orgName);
|
||||||
|
repoDescription = itemView.findViewById(R.id.repoDescription);
|
||||||
|
isRepoAdmin = itemView.findViewById(R.id.repoIsAdmin);
|
||||||
|
avatar = itemView.findViewById(R.id.imageAvatar);
|
||||||
|
repoStars = itemView.findViewById(R.id.repoStars);
|
||||||
|
repoLastUpdated = itemView.findViewById(R.id.repoLastUpdated);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("SetTextI18n")
|
||||||
|
void bindData(UserRepositories userRepositories) {
|
||||||
|
|
||||||
|
this.userRepositories = userRepositories;
|
||||||
|
TinyDB tinyDb = TinyDB.getInstance(context);
|
||||||
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
||||||
|
|
||||||
|
Locale locale = context.getResources().getConfiguration().locale;
|
||||||
|
String timeFormat = tinyDb.getString("dateFormat");
|
||||||
|
|
||||||
|
orgName.setText(userRepositories.getFullName().split("/")[0]);
|
||||||
|
repoName.setText(userRepositories.getFullName().split("/")[1]);
|
||||||
|
repoStars.setText(userRepositories.getStars_count());
|
||||||
|
|
||||||
|
ColorGenerator generator = ColorGenerator.MATERIAL;
|
||||||
|
int color = generator.getColor(userRepositories.getName());
|
||||||
|
String firstCharacter = String.valueOf(userRepositories.getFullName().charAt(0));
|
||||||
|
|
||||||
|
TextDrawable drawable = TextDrawable.builder().beginConfig().useFont(Typeface.DEFAULT).fontSize(18).toUpperCase().width(28).height(28).endConfig().buildRoundRect(firstCharacter, color, 3);
|
||||||
|
|
||||||
|
if(userRepositories.getAvatar_url() != null) {
|
||||||
|
if(!userRepositories.getAvatar_url().equals("")) {
|
||||||
|
PicassoService
|
||||||
|
.getInstance(context).get().load(userRepositories.getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop().into(avatar);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
avatar.setImageDrawable(drawable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
avatar.setImageDrawable(drawable);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(userRepositories.getUpdated_at() != null) {
|
||||||
|
|
||||||
|
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, TimeHelper.formatTime(userRepositories.getUpdated_at(), locale, timeFormat, context)));
|
||||||
|
if(timeFormat.equals("pretty")) {
|
||||||
|
repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(userRepositories.getUpdated_at()), context));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
repoLastUpdated.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!userRepositories.getDescription().equals("")) {
|
||||||
|
repoDescription.setText(userRepositories.getDescription());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
repoDescription.setText(context.getString(R.string.noDataDescription));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isRepoAdmin == null) {
|
||||||
|
isRepoAdmin = new CheckBox(context);
|
||||||
|
}
|
||||||
|
isRepoAdmin.setChecked(userRepositories.getPermissions().isAdmin());
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class LoadHolder extends RecyclerView.ViewHolder {
|
||||||
|
LoadHolder(View itemView) {
|
||||||
|
super(itemView);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMoreDataAvailable(boolean moreDataAvailable) {
|
||||||
|
isMoreDataAvailable = moreDataAvailable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void notifyDataChanged() {
|
||||||
|
notifyDataSetChanged();
|
||||||
|
isLoading = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface OnLoadMoreListener {
|
||||||
|
void onLoadMore();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLoadMoreListener(OnLoadMoreListener loadMoreListener) {
|
||||||
|
this.loadMoreListener = loadMoreListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateList(List<UserRepositories> list) {
|
||||||
|
reposList = list;
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,197 @@
|
|||||||
|
package org.mian.gitnex.adapters.profile;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Typeface;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.CheckBox;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
import com.amulyakhare.textdrawable.TextDrawable;
|
||||||
|
import com.amulyakhare.textdrawable.util.ColorGenerator;
|
||||||
|
import org.gitnex.tea4j.models.UserRepositories;
|
||||||
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
|
import org.mian.gitnex.helpers.ClickListener;
|
||||||
|
import org.mian.gitnex.helpers.RoundedTransformation;
|
||||||
|
import org.mian.gitnex.helpers.TimeHelper;
|
||||||
|
import org.mian.gitnex.helpers.TinyDB;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Author M M Arif
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class StarredRepositoriesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||||
|
|
||||||
|
private final Context context;
|
||||||
|
private final int TYPE_LOAD = 0;
|
||||||
|
private List<UserRepositories> reposList;
|
||||||
|
private OnLoadMoreListener loadMoreListener;
|
||||||
|
private boolean isLoading = false, isMoreDataAvailable = true;
|
||||||
|
|
||||||
|
public StarredRepositoriesAdapter(Context ctx, List<UserRepositories> reposListMain) {
|
||||||
|
this.context = ctx;
|
||||||
|
this.reposList = reposListMain;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
|
|
||||||
|
LayoutInflater inflater = LayoutInflater.from(context);
|
||||||
|
|
||||||
|
if(viewType == TYPE_LOAD) {
|
||||||
|
return new StarredRepositoriesAdapter.StarredRepositoriesHolder(inflater.inflate(R.layout.list_repositories, parent, false));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return new StarredRepositoriesAdapter.LoadHolder(inflater.inflate(R.layout.row_load, parent, false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
||||||
|
|
||||||
|
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
|
||||||
|
isLoading = true;
|
||||||
|
loadMoreListener.onLoadMore();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(getItemViewType(position) == TYPE_LOAD) {
|
||||||
|
((StarredRepositoriesAdapter.StarredRepositoriesHolder) holder).bindData(reposList.get(position));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemViewType(int position) {
|
||||||
|
if(reposList.get(position).getFullName() != null) {
|
||||||
|
return TYPE_LOAD;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return reposList.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
class StarredRepositoriesHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
|
private UserRepositories userRepositories;
|
||||||
|
|
||||||
|
private final ImageView avatar;
|
||||||
|
private final TextView repoName;
|
||||||
|
private final TextView orgName;
|
||||||
|
private final TextView repoDescription;
|
||||||
|
private CheckBox isRepoAdmin;
|
||||||
|
private final TextView repoStars;
|
||||||
|
private final TextView repoLastUpdated;
|
||||||
|
|
||||||
|
StarredRepositoriesHolder(View itemView) {
|
||||||
|
|
||||||
|
super(itemView);
|
||||||
|
repoName = itemView.findViewById(R.id.repoName);
|
||||||
|
orgName = itemView.findViewById(R.id.orgName);
|
||||||
|
repoDescription = itemView.findViewById(R.id.repoDescription);
|
||||||
|
isRepoAdmin = itemView.findViewById(R.id.repoIsAdmin);
|
||||||
|
avatar = itemView.findViewById(R.id.imageAvatar);
|
||||||
|
repoStars = itemView.findViewById(R.id.repoStars);
|
||||||
|
repoLastUpdated = itemView.findViewById(R.id.repoLastUpdated);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("SetTextI18n")
|
||||||
|
void bindData(UserRepositories userRepositories) {
|
||||||
|
|
||||||
|
this.userRepositories = userRepositories;
|
||||||
|
TinyDB tinyDb = TinyDB.getInstance(context);
|
||||||
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
||||||
|
|
||||||
|
Locale locale = context.getResources().getConfiguration().locale;
|
||||||
|
String timeFormat = tinyDb.getString("dateFormat");
|
||||||
|
|
||||||
|
orgName.setText(userRepositories.getFullName().split("/")[0]);
|
||||||
|
repoName.setText(userRepositories.getFullName().split("/")[1]);
|
||||||
|
repoStars.setText(userRepositories.getStars_count());
|
||||||
|
|
||||||
|
ColorGenerator generator = ColorGenerator.MATERIAL;
|
||||||
|
int color = generator.getColor(userRepositories.getName());
|
||||||
|
String firstCharacter = String.valueOf(userRepositories.getFullName().charAt(0));
|
||||||
|
|
||||||
|
TextDrawable drawable = TextDrawable.builder().beginConfig().useFont(Typeface.DEFAULT).fontSize(18).toUpperCase().width(28).height(28).endConfig().buildRoundRect(firstCharacter, color, 3);
|
||||||
|
|
||||||
|
if(userRepositories.getAvatar_url() != null) {
|
||||||
|
if(!userRepositories.getAvatar_url().equals("")) {
|
||||||
|
PicassoService
|
||||||
|
.getInstance(context).get().load(userRepositories.getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(imgRadius, 0)).resize(120, 120).centerCrop().into(avatar);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
avatar.setImageDrawable(drawable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
avatar.setImageDrawable(drawable);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(userRepositories.getUpdated_at() != null) {
|
||||||
|
|
||||||
|
repoLastUpdated.setText(context.getString(R.string.lastUpdatedAt, TimeHelper
|
||||||
|
.formatTime(userRepositories.getUpdated_at(), locale, timeFormat, context)));
|
||||||
|
if(timeFormat.equals("pretty")) {
|
||||||
|
repoLastUpdated.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(userRepositories.getUpdated_at()), context));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
repoLastUpdated.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!userRepositories.getDescription().equals("")) {
|
||||||
|
repoDescription.setText(userRepositories.getDescription());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
repoDescription.setText(context.getString(R.string.noDataDescription));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isRepoAdmin == null) {
|
||||||
|
isRepoAdmin = new CheckBox(context);
|
||||||
|
}
|
||||||
|
isRepoAdmin.setChecked(userRepositories.getPermissions().isAdmin());
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class LoadHolder extends RecyclerView.ViewHolder {
|
||||||
|
LoadHolder(View itemView) {
|
||||||
|
super(itemView);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMoreDataAvailable(boolean moreDataAvailable) {
|
||||||
|
isMoreDataAvailable = moreDataAvailable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void notifyDataChanged() {
|
||||||
|
notifyDataSetChanged();
|
||||||
|
isLoading = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface OnLoadMoreListener {
|
||||||
|
void onLoadMore();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLoadMoreListener(OnLoadMoreListener loadMoreListener) {
|
||||||
|
this.loadMoreListener = loadMoreListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateList(List<UserRepositories> list) {
|
||||||
|
reposList = list;
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
}
|
@ -152,5 +152,20 @@ public class MainApplication extends Application {
|
|||||||
tinyDB.putInt("homeScreenId", 0);
|
tinyDB.putInt("homeScreenId", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(tinyDB.getString("localeStr").isEmpty()) {
|
||||||
|
tinyDB.putString("localeStr", getString(R.string.settingsLanguageSystem));
|
||||||
|
tinyDB.putInt("langId", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(tinyDB.getInt("darkThemeTimeHour", 100) == 100) {
|
||||||
|
tinyDB.putInt("lightThemeTimeHour", 6);
|
||||||
|
tinyDB.putInt("lightThemeTimeMinute", 0);
|
||||||
|
tinyDB.putInt("darkThemeTimeHour", 18);
|
||||||
|
tinyDB.putInt("darkThemeTimeMinute", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(tinyDB.getString("timeStr").isEmpty()) {
|
||||||
|
tinyDB.putString("timeStr", getString(R.string.settingsDateTimeHeaderDefault));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,72 +0,0 @@
|
|||||||
package org.mian.gitnex.fragments;
|
|
||||||
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
import org.mian.gitnex.R;
|
|
||||||
import org.mian.gitnex.activities.MainActivity;
|
|
||||||
import org.mian.gitnex.databinding.FragmentAboutBinding;
|
|
||||||
import org.mian.gitnex.helpers.AppUtil;
|
|
||||||
import org.mian.gitnex.helpers.TinyDB;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author M M Arif
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class AboutFragment extends Fragment {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
|
||||||
|
|
||||||
FragmentAboutBinding viewBinding = FragmentAboutBinding.inflate(inflater, container, false);
|
|
||||||
TinyDB tinyDb = TinyDB.getInstance(getContext());
|
|
||||||
|
|
||||||
viewBinding.appVersion.setText(AppUtil.getAppVersion(requireContext()));
|
|
||||||
viewBinding.userServerVersion.setText(tinyDb.getString("giteaVersion"));
|
|
||||||
viewBinding.appBuild.setText(String.valueOf(AppUtil.getAppBuildNo(requireContext())));
|
|
||||||
|
|
||||||
((MainActivity) requireActivity()).setActionBarTitle(getResources().getString(R.string.pageTitleAbout));
|
|
||||||
|
|
||||||
viewBinding.donationLinkPatreon.setOnClickListener(v12 -> {
|
|
||||||
|
|
||||||
Intent intent = new Intent();
|
|
||||||
intent.setAction(Intent.ACTION_VIEW);
|
|
||||||
intent.addCategory(Intent.CATEGORY_BROWSABLE);
|
|
||||||
intent.setData(Uri.parse(getResources().getString(R.string.supportLinkPatreon)));
|
|
||||||
startActivity(intent);
|
|
||||||
});
|
|
||||||
|
|
||||||
viewBinding.translateLink.setOnClickListener(v13 -> {
|
|
||||||
|
|
||||||
Intent intent = new Intent();
|
|
||||||
intent.setAction(Intent.ACTION_VIEW);
|
|
||||||
intent.addCategory(Intent.CATEGORY_BROWSABLE);
|
|
||||||
intent.setData(Uri.parse(getResources().getString(R.string.crowdInLink)));
|
|
||||||
startActivity(intent);
|
|
||||||
});
|
|
||||||
|
|
||||||
viewBinding.appWebsite.setOnClickListener(v14 -> {
|
|
||||||
|
|
||||||
Intent intent = new Intent();
|
|
||||||
intent.setAction(Intent.ACTION_VIEW);
|
|
||||||
intent.addCategory(Intent.CATEGORY_BROWSABLE);
|
|
||||||
intent.setData(Uri.parse(getResources().getString(R.string.appWebsiteLink)));
|
|
||||||
startActivity(intent);
|
|
||||||
});
|
|
||||||
|
|
||||||
if(AppUtil.isPro(requireContext())) {
|
|
||||||
|
|
||||||
viewBinding.supportHeader.setVisibility(View.GONE);
|
|
||||||
viewBinding.dividerSupport.setVisibility(View.GONE);
|
|
||||||
viewBinding.donationLinkPatreon.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return viewBinding.getRoot();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -40,6 +40,16 @@ public class AdministrationFragment extends Fragment {
|
|||||||
|
|
||||||
fragmentAdministrationBinding.adminCron.setOnClickListener(v1 -> startActivity(new Intent(getContext(), AdminCronTasksActivity.class)));
|
fragmentAdministrationBinding.adminCron.setOnClickListener(v1 -> startActivity(new Intent(getContext(), AdminCronTasksActivity.class)));
|
||||||
|
|
||||||
|
String action = requireActivity().getIntent().getStringExtra("giteaAdminAction");
|
||||||
|
if(action != null) {
|
||||||
|
if(action.equals("users")) {
|
||||||
|
startActivity(new Intent(getContext(), AdminGetUsersActivity.class));
|
||||||
|
}
|
||||||
|
else if(action.equals("monitor")) {
|
||||||
|
startActivity(new Intent(getContext(), AdminCronTasksActivity.class));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return fragmentAdministrationBinding.getRoot();
|
return fragmentAdministrationBinding.getRoot();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -8,14 +8,14 @@ import android.view.ViewGroup;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
|
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
|
||||||
import org.mian.gitnex.activities.ProfileEmailActivity;
|
import org.mian.gitnex.activities.MyProfileEmailActivity;
|
||||||
import org.mian.gitnex.databinding.BottomSheetProfileBinding;
|
import org.mian.gitnex.databinding.BottomSheetProfileBinding;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Author M M Arif
|
* Author M M Arif
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class BottomSheetProfileFragment extends BottomSheetDialogFragment {
|
public class BottomSheetMyProfileFragment extends BottomSheetDialogFragment {
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@ -25,7 +25,7 @@ public class BottomSheetProfileFragment extends BottomSheetDialogFragment {
|
|||||||
|
|
||||||
bottomSheetProfileBinding.addNewEmailAddress.setOnClickListener(v1 -> {
|
bottomSheetProfileBinding.addNewEmailAddress.setOnClickListener(v1 -> {
|
||||||
|
|
||||||
startActivity(new Intent(getContext(), ProfileEmailActivity.class));
|
startActivity(new Intent(getContext(), MyProfileEmailActivity.class));
|
||||||
dismiss();
|
dismiss();
|
||||||
});
|
});
|
||||||
|
|
@ -13,17 +13,24 @@ import android.widget.TextView;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
|
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
import org.mian.gitnex.actions.IssueActions;
|
import org.mian.gitnex.actions.IssueActions;
|
||||||
|
import org.mian.gitnex.actions.PullRequestActions;
|
||||||
import org.mian.gitnex.activities.EditIssueActivity;
|
import org.mian.gitnex.activities.EditIssueActivity;
|
||||||
import org.mian.gitnex.activities.FileDiffActivity;
|
import org.mian.gitnex.activities.FileDiffActivity;
|
||||||
import org.mian.gitnex.activities.MergePullRequestActivity;
|
import org.mian.gitnex.activities.MergePullRequestActivity;
|
||||||
|
import org.mian.gitnex.clients.RetrofitClient;
|
||||||
import org.mian.gitnex.databinding.BottomSheetSingleIssueBinding;
|
import org.mian.gitnex.databinding.BottomSheetSingleIssueBinding;
|
||||||
|
import org.mian.gitnex.helpers.AlertDialogs;
|
||||||
|
import org.mian.gitnex.helpers.Authorization;
|
||||||
import org.mian.gitnex.helpers.TinyDB;
|
import org.mian.gitnex.helpers.TinyDB;
|
||||||
import org.mian.gitnex.helpers.Toasty;
|
import org.mian.gitnex.helpers.Toasty;
|
||||||
import org.mian.gitnex.helpers.Version;
|
import org.mian.gitnex.helpers.Version;
|
||||||
import org.mian.gitnex.views.ReactionSpinner;
|
import org.mian.gitnex.views.ReactionSpinner;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import retrofit2.Call;
|
||||||
|
import retrofit2.Callback;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Author M M Arif
|
* Author M M Arif
|
||||||
@ -50,6 +57,7 @@ public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment {
|
|||||||
TextView copyIssueUrl = bottomSheetSingleIssueBinding.copyIssueUrl;
|
TextView copyIssueUrl = bottomSheetSingleIssueBinding.copyIssueUrl;
|
||||||
TextView openFilesDiff = bottomSheetSingleIssueBinding.openFilesDiff;
|
TextView openFilesDiff = bottomSheetSingleIssueBinding.openFilesDiff;
|
||||||
TextView mergePullRequest = bottomSheetSingleIssueBinding.mergePullRequest;
|
TextView mergePullRequest = bottomSheetSingleIssueBinding.mergePullRequest;
|
||||||
|
TextView deletePullRequestBranch = bottomSheetSingleIssueBinding.deletePrHeadBranch;
|
||||||
TextView shareIssue = bottomSheetSingleIssueBinding.shareIssue;
|
TextView shareIssue = bottomSheetSingleIssueBinding.shareIssue;
|
||||||
TextView subscribeIssue = bottomSheetSingleIssueBinding.subscribeIssue;
|
TextView subscribeIssue = bottomSheetSingleIssueBinding.subscribeIssue;
|
||||||
TextView unsubscribeIssue = bottomSheetSingleIssueBinding.unsubscribeIssue;
|
TextView unsubscribeIssue = bottomSheetSingleIssueBinding.unsubscribeIssue;
|
||||||
@ -85,9 +93,11 @@ public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment {
|
|||||||
|
|
||||||
if(tinyDB.getBoolean("prMerged") || tinyDB.getString("repoPrState").equals("closed")) {
|
if(tinyDB.getBoolean("prMerged") || tinyDB.getString("repoPrState").equals("closed")) {
|
||||||
mergePullRequest.setVisibility(View.GONE);
|
mergePullRequest.setVisibility(View.GONE);
|
||||||
|
deletePullRequestBranch.setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
mergePullRequest.setVisibility(View.VISIBLE);
|
mergePullRequest.setVisibility(View.VISIBLE);
|
||||||
|
deletePullRequestBranch.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.13.0")) {
|
if(new Version(tinyDB.getString("giteaVersion")).higherOrEqual("1.13.0")) {
|
||||||
@ -104,6 +114,7 @@ public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment {
|
|||||||
else {
|
else {
|
||||||
|
|
||||||
mergePullRequest.setVisibility(View.GONE);
|
mergePullRequest.setVisibility(View.GONE);
|
||||||
|
deletePullRequestBranch.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
mergePullRequest.setOnClickListener(v13 -> {
|
mergePullRequest.setOnClickListener(v13 -> {
|
||||||
@ -112,6 +123,12 @@ public class BottomSheetSingleIssueFragment extends BottomSheetDialogFragment {
|
|||||||
dismiss();
|
dismiss();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
deletePullRequestBranch.setOnClickListener(v -> {
|
||||||
|
|
||||||
|
PullRequestActions.deleteHeadBranch(ctx, parts[0], parts[1], tinyDB.getString("prHeadBranch"), true);
|
||||||
|
dismiss();
|
||||||
|
});
|
||||||
|
|
||||||
openFilesDiff.setOnClickListener(v14 -> {
|
openFilesDiff.setOnClickListener(v14 -> {
|
||||||
|
|
||||||
startActivity(new Intent(ctx, FileDiffActivity.class));
|
startActivity(new Intent(ctx, FileDiffActivity.class));
|
||||||
|
@ -24,9 +24,6 @@ import org.mian.gitnex.helpers.TinyDB;
|
|||||||
|
|
||||||
public class ExploreFragment extends Fragment {
|
public class ExploreFragment extends Fragment {
|
||||||
|
|
||||||
private Context ctx;
|
|
||||||
private TinyDB tinyDB;
|
|
||||||
|
|
||||||
private int tabsCount;
|
private int tabsCount;
|
||||||
public ViewPager mViewPager;
|
public ViewPager mViewPager;
|
||||||
|
|
||||||
@ -36,8 +33,8 @@ public class ExploreFragment extends Fragment {
|
|||||||
|
|
||||||
View view = inflater.inflate(R.layout.fragment_explore, container, false);
|
View view = inflater.inflate(R.layout.fragment_explore, container, false);
|
||||||
|
|
||||||
ctx = getContext();
|
Context ctx = getContext();
|
||||||
tinyDB = TinyDB.getInstance(ctx);
|
TinyDB tinyDB = TinyDB.getInstance(ctx);
|
||||||
|
|
||||||
((MainActivity) requireActivity()).setActionBarTitle(getResources().getString(R.string.navExplore));
|
((MainActivity) requireActivity()).setActionBarTitle(getResources().getString(R.string.navExplore));
|
||||||
|
|
||||||
@ -87,6 +84,10 @@ public class ExploreFragment extends Fragment {
|
|||||||
SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());
|
SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());
|
||||||
mViewPager.setAdapter(mSectionsPagerAdapter);
|
mViewPager.setAdapter(mSectionsPagerAdapter);
|
||||||
|
|
||||||
|
if(requireActivity().getIntent().getBooleanExtra("exploreOrgs", false)) {
|
||||||
|
mViewPager.setCurrentItem(2);
|
||||||
|
}
|
||||||
|
|
||||||
return view;
|
return view;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -111,7 +112,11 @@ public class ExploreFragment extends Fragment {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 1: // Issues
|
case 1: // Issues
|
||||||
fragment = new SearchIssuesFragment();
|
fragment = new ExploreIssuesFragment();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2: // Organizations
|
||||||
|
fragment = new ExplorePublicOrganizationsFragment();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,13 +13,12 @@ import androidx.fragment.app.Fragment;
|
|||||||
import androidx.recyclerview.widget.DividerItemDecoration;
|
import androidx.recyclerview.widget.DividerItemDecoration;
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import org.gitnex.tea4j.models.Issues;
|
import org.gitnex.tea4j.models.Issues;
|
||||||
import org.mian.gitnex.adapters.SearchIssuesAdapter;
|
import org.mian.gitnex.adapters.ExploreIssuesAdapter;
|
||||||
import org.mian.gitnex.clients.RetrofitClient;
|
import org.mian.gitnex.clients.RetrofitClient;
|
||||||
import org.mian.gitnex.databinding.FragmentSearchIssuesBinding;
|
import org.mian.gitnex.databinding.FragmentSearchIssuesBinding;
|
||||||
import org.mian.gitnex.helpers.AppUtil;
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
import org.mian.gitnex.helpers.Authorization;
|
import org.mian.gitnex.helpers.Authorization;
|
||||||
import org.mian.gitnex.helpers.InfiniteScrollListener;
|
import org.mian.gitnex.helpers.InfiniteScrollListener;
|
||||||
import org.mian.gitnex.helpers.TinyDB;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@ -31,30 +30,25 @@ import retrofit2.Response;
|
|||||||
* Author M M Arif
|
* Author M M Arif
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class SearchIssuesFragment extends Fragment {
|
public class ExploreIssuesFragment extends Fragment {
|
||||||
|
|
||||||
private Context ctx;
|
|
||||||
private TinyDB tinyDb;
|
|
||||||
private FragmentSearchIssuesBinding viewBinding;
|
private FragmentSearchIssuesBinding viewBinding;
|
||||||
private SearchIssuesAdapter adapter;
|
private ExploreIssuesAdapter adapter;
|
||||||
private List<Issues> dataList;
|
private List<Issues> dataList;
|
||||||
|
Context ctx;
|
||||||
|
|
||||||
private int apiCallCurrentValue = 10;
|
private int apiCallCurrentValue = 10;
|
||||||
private int pageCurrentIndex = 1;
|
private int pageCurrentIndex = 1;
|
||||||
private String type = "issues";
|
|
||||||
private String state = "open";
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||||
|
|
||||||
viewBinding = FragmentSearchIssuesBinding.inflate(inflater, container, false);
|
viewBinding = FragmentSearchIssuesBinding.inflate(inflater, container, false);
|
||||||
setHasOptionsMenu(true);
|
setHasOptionsMenu(true);
|
||||||
|
|
||||||
ctx = getContext();
|
ctx = getContext();
|
||||||
tinyDb = TinyDB.getInstance(getContext());
|
|
||||||
|
|
||||||
dataList = new ArrayList<>();
|
dataList = new ArrayList<>();
|
||||||
adapter = new SearchIssuesAdapter(dataList, ctx);
|
adapter = new ExploreIssuesAdapter(dataList, ctx);
|
||||||
|
|
||||||
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(ctx);
|
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(ctx);
|
||||||
|
|
||||||
@ -65,11 +59,8 @@ public class SearchIssuesFragment extends Fragment {
|
|||||||
viewBinding.recyclerViewSearchIssues.setAdapter(adapter);
|
viewBinding.recyclerViewSearchIssues.setAdapter(adapter);
|
||||||
|
|
||||||
viewBinding.searchKeyword.setOnEditorActionListener((v1, actionId, event) -> {
|
viewBinding.searchKeyword.setOnEditorActionListener((v1, actionId, event) -> {
|
||||||
|
|
||||||
if(actionId == EditorInfo.IME_ACTION_SEND) {
|
if(actionId == EditorInfo.IME_ACTION_SEND) {
|
||||||
|
|
||||||
if(!Objects.requireNonNull(viewBinding.searchKeyword.getText()).toString().equals("")) {
|
if(!Objects.requireNonNull(viewBinding.searchKeyword.getText()).toString().equals("")) {
|
||||||
|
|
||||||
InputMethodManager imm = (InputMethodManager) requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
|
InputMethodManager imm = (InputMethodManager) requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||||
imm.hideSoftInputFromWindow(viewBinding.searchKeyword.getWindowToken(), 0);
|
imm.hideSoftInputFromWindow(viewBinding.searchKeyword.getWindowToken(), 0);
|
||||||
|
|
||||||
@ -79,27 +70,21 @@ public class SearchIssuesFragment extends Fragment {
|
|||||||
loadData(false, viewBinding.searchKeyword.getText().toString());
|
loadData(false, viewBinding.searchKeyword.getText().toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
viewBinding.recyclerViewSearchIssues.addOnScrollListener(new InfiniteScrollListener(pageCurrentIndex, linearLayoutManager) {
|
viewBinding.recyclerViewSearchIssues.addOnScrollListener(new InfiniteScrollListener(pageCurrentIndex, linearLayoutManager) {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onScrolledToEnd(int firstVisibleItemPosition) {
|
public void onScrolledToEnd(int firstVisibleItemPosition) {
|
||||||
|
|
||||||
pageCurrentIndex++;
|
pageCurrentIndex++;
|
||||||
loadData(true, Objects.requireNonNull(viewBinding.searchKeyword.getText()).toString());
|
loadData(true, Objects.requireNonNull(viewBinding.searchKeyword.getText()).toString());
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
viewBinding.pullToRefresh.setOnRefreshListener(() -> {
|
viewBinding.pullToRefresh.setOnRefreshListener(() -> {
|
||||||
|
|
||||||
pageCurrentIndex = 1;
|
pageCurrentIndex = 1;
|
||||||
apiCallCurrentValue = 10;
|
apiCallCurrentValue = 10;
|
||||||
loadData(false, Objects.requireNonNull(viewBinding.searchKeyword.getText()).toString());
|
loadData(false, Objects.requireNonNull(viewBinding.searchKeyword.getText()).toString());
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
loadData(false, "");
|
loadData(false, "");
|
||||||
@ -117,69 +102,50 @@ public class SearchIssuesFragment extends Fragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(pageCurrentIndex == 1 || !append) {
|
if(pageCurrentIndex == 1 || !append) {
|
||||||
|
|
||||||
dataList.clear();
|
dataList.clear();
|
||||||
adapter.notifyDataSetChanged();
|
adapter.notifyDataSetChanged();
|
||||||
viewBinding.pullToRefresh.setRefreshing(false);
|
viewBinding.pullToRefresh.setRefreshing(false);
|
||||||
viewBinding.progressBar.setVisibility(View.VISIBLE);
|
viewBinding.progressBar.setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
viewBinding.loadingMoreView.setVisibility(View.VISIBLE);
|
viewBinding.loadingMoreView.setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
Call<List<Issues>> call = RetrofitClient.getApiInterface(getContext())
|
Call<List<Issues>> call = RetrofitClient.getApiInterface(getContext())
|
||||||
.queryIssues(Authorization.get(getContext()), searchKeyword, type, state, pageCurrentIndex);
|
.queryIssues(Authorization.get(getContext()), searchKeyword, "issues", "open", pageCurrentIndex);
|
||||||
|
|
||||||
call.enqueue(new Callback<List<Issues>>() {
|
call.enqueue(new Callback<List<Issues>>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onResponse(@NonNull Call<List<Issues>> call, @NonNull Response<List<Issues>> response) {
|
public void onResponse(@NonNull Call<List<Issues>> call, @NonNull Response<List<Issues>> response) {
|
||||||
|
|
||||||
if(response.code() == 200) {
|
if(response.code() == 200) {
|
||||||
|
|
||||||
assert response.body() != null;
|
assert response.body() != null;
|
||||||
apiCallCurrentValue = response.body().size();
|
apiCallCurrentValue = response.body().size();
|
||||||
|
|
||||||
if(!append) {
|
if(!append) {
|
||||||
|
|
||||||
dataList.clear();
|
dataList.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
dataList.addAll(response.body());
|
dataList.addAll(response.body());
|
||||||
adapter.notifyDataSetChanged();
|
adapter.notifyDataSetChanged();
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
dataList.clear();
|
dataList.clear();
|
||||||
adapter.notifyDataChanged();
|
adapter.notifyDataChanged();
|
||||||
viewBinding.noData.setVisibility(View.VISIBLE);
|
viewBinding.noData.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
onCleanup();
|
onCleanup();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFailure(@NonNull Call<List<Issues>> call, @NonNull Throwable t) {
|
public void onFailure(@NonNull Call<List<Issues>> call, @NonNull Throwable t) {
|
||||||
|
|
||||||
Log.e("onFailure", Objects.requireNonNull(t.getMessage()));
|
Log.e("onFailure", Objects.requireNonNull(t.getMessage()));
|
||||||
onCleanup();
|
onCleanup();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onCleanup() {
|
private void onCleanup() {
|
||||||
|
|
||||||
AppUtil.setMultiVisibility(View.GONE, viewBinding.loadingMoreView, viewBinding.progressBar);
|
AppUtil.setMultiVisibility(View.GONE, viewBinding.loadingMoreView, viewBinding.progressBar);
|
||||||
|
|
||||||
if(dataList.isEmpty()) {
|
if(dataList.isEmpty()) {
|
||||||
|
|
||||||
viewBinding.noData.setVisibility(View.VISIBLE);
|
viewBinding.noData.setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1,160 @@
|
|||||||
|
package org.mian.gitnex.fragments;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.recyclerview.widget.DividerItemDecoration;
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
import org.gitnex.tea4j.models.Organization;
|
||||||
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.adapters.ExplorePublicOrganizationsAdapter;
|
||||||
|
import org.mian.gitnex.clients.RetrofitClient;
|
||||||
|
import org.mian.gitnex.databinding.FragmentOrganizationsBinding;
|
||||||
|
import org.mian.gitnex.helpers.Authorization;
|
||||||
|
import org.mian.gitnex.helpers.Constants;
|
||||||
|
import org.mian.gitnex.helpers.SnackBar;
|
||||||
|
import org.mian.gitnex.helpers.TinyDB;
|
||||||
|
import org.mian.gitnex.helpers.Version;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import retrofit2.Call;
|
||||||
|
import retrofit2.Callback;
|
||||||
|
import retrofit2.Response;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Author M M Arif
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class ExplorePublicOrganizationsFragment extends Fragment {
|
||||||
|
|
||||||
|
private FragmentOrganizationsBinding fragmentPublicOrgBinding;
|
||||||
|
private List<Organization> organizationsList;
|
||||||
|
private ExplorePublicOrganizationsAdapter adapter;
|
||||||
|
private Context context;
|
||||||
|
private int pageSize;
|
||||||
|
private final String TAG = Constants.publicOrganizations;
|
||||||
|
private int resultLimit = Constants.resultLimitOldGiteaInstances;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||||
|
|
||||||
|
fragmentPublicOrgBinding = FragmentOrganizationsBinding.inflate(inflater, container, false);
|
||||||
|
context = getContext();
|
||||||
|
|
||||||
|
TinyDB tinyDb = TinyDB.getInstance(getContext());
|
||||||
|
final String loginUid = tinyDb.getString("loginUid");
|
||||||
|
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
|
||||||
|
|
||||||
|
// if gitea is 1.12 or higher use the new limit
|
||||||
|
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) {
|
||||||
|
resultLimit = Constants.resultLimitNewGiteaInstances;
|
||||||
|
}
|
||||||
|
|
||||||
|
fragmentPublicOrgBinding.addNewOrganization.setVisibility(View.GONE);
|
||||||
|
organizationsList = new ArrayList<>();
|
||||||
|
|
||||||
|
fragmentPublicOrgBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
||||||
|
fragmentPublicOrgBinding.pullToRefresh.setRefreshing(false);
|
||||||
|
loadInitial(instanceToken, resultLimit);
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
}, 200));
|
||||||
|
|
||||||
|
adapter = new ExplorePublicOrganizationsAdapter(getContext(), organizationsList);
|
||||||
|
adapter.setLoadMoreListener(() -> fragmentPublicOrgBinding.recyclerView.post(() -> {
|
||||||
|
if(organizationsList.size() == resultLimit || pageSize == resultLimit) {
|
||||||
|
int page = (organizationsList.size() + resultLimit) / resultLimit;
|
||||||
|
loadMore(Authorization.get(getContext()), page, resultLimit);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(fragmentPublicOrgBinding.recyclerView.getContext(), DividerItemDecoration.VERTICAL);
|
||||||
|
fragmentPublicOrgBinding.recyclerView.setHasFixedSize(true);
|
||||||
|
fragmentPublicOrgBinding.recyclerView.addItemDecoration(dividerItemDecoration);
|
||||||
|
fragmentPublicOrgBinding.recyclerView.setLayoutManager(new LinearLayoutManager(context));
|
||||||
|
fragmentPublicOrgBinding.recyclerView.setAdapter(adapter);
|
||||||
|
|
||||||
|
loadInitial(Authorization.get(getContext()), resultLimit);
|
||||||
|
|
||||||
|
return fragmentPublicOrgBinding.getRoot();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadInitial(String token, int resultLimit) {
|
||||||
|
|
||||||
|
Call<List<Organization>> call = RetrofitClient
|
||||||
|
.getApiInterface(context).getAllOrgs(token, Constants.publicOrganizationsPageInit, resultLimit);
|
||||||
|
call.enqueue(new Callback<List<Organization>>() {
|
||||||
|
@Override
|
||||||
|
public void onResponse(@NonNull Call<List<Organization>> call, @NonNull Response<List<Organization>> response) {
|
||||||
|
if(response.isSuccessful()) {
|
||||||
|
if(response.body() != null && response.body().size() > 0) {
|
||||||
|
organizationsList.clear();
|
||||||
|
organizationsList.addAll(response.body());
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
fragmentPublicOrgBinding.noDataOrg.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
organizationsList.clear();
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
fragmentPublicOrgBinding.noDataOrg.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
fragmentPublicOrgBinding.progressBar.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
else if(response.code() == 404) {
|
||||||
|
fragmentPublicOrgBinding.noDataOrg.setVisibility(View.VISIBLE);
|
||||||
|
fragmentPublicOrgBinding.progressBar.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Log.e(TAG, String.valueOf(response.code()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NonNull Call<List<Organization>> call, @NonNull Throwable t) {
|
||||||
|
Log.e(TAG, t.toString());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadMore(String token, int page, int resultLimit) {
|
||||||
|
|
||||||
|
fragmentPublicOrgBinding.progressLoadMore.setVisibility(View.VISIBLE);
|
||||||
|
Call<List<Organization>> call = RetrofitClient.getApiInterface(context).getAllOrgs(token, page, resultLimit);
|
||||||
|
call.enqueue(new Callback<List<Organization>>() {
|
||||||
|
@Override
|
||||||
|
public void onResponse(@NonNull Call<List<Organization>> call, @NonNull Response<List<Organization>> response) {
|
||||||
|
if(response.isSuccessful()) {
|
||||||
|
List<Organization> result = response.body();
|
||||||
|
if(result != null) {
|
||||||
|
if(result.size() > 0) {
|
||||||
|
pageSize = result.size();
|
||||||
|
organizationsList.addAll(result);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SnackBar.info(context, fragmentPublicOrgBinding.getRoot(), getString(R.string.noMoreData));
|
||||||
|
adapter.setMoreDataAvailable(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
fragmentPublicOrgBinding.progressLoadMore.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Log.e(TAG, String.valueOf(response.code()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NonNull Call<List<Organization>> call, @NonNull Throwable t) {
|
||||||
|
Log.e(TAG, t.toString());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -261,54 +261,21 @@ public class ExploreRepositoriesFragment extends Fragment {
|
|||||||
dialogFilterOptions.setContentView(view);
|
dialogFilterOptions.setContentView(view);
|
||||||
|
|
||||||
filterBinding.includeTopic.setOnClickListener(includeTopic -> {
|
filterBinding.includeTopic.setOnClickListener(includeTopic -> {
|
||||||
|
tinyDb.putBoolean("exploreRepoIncludeTopic", filterBinding.includeTopic.isChecked());
|
||||||
if(filterBinding.includeTopic.isChecked()) {
|
|
||||||
|
|
||||||
tinyDb.putBoolean("exploreRepoIncludeTopic", true);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
tinyDb.putBoolean("exploreRepoIncludeTopic", false);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
filterBinding.includeDesc.setOnClickListener(includeDesc -> {
|
filterBinding.includeDesc.setOnClickListener(includeDesc -> {
|
||||||
|
tinyDb.putBoolean("exploreRepoIncludeDescription", filterBinding.includeDesc.isChecked());
|
||||||
if(filterBinding.includeDesc.isChecked()) {
|
|
||||||
|
|
||||||
tinyDb.putBoolean("exploreRepoIncludeDescription", true);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
tinyDb.putBoolean("exploreRepoIncludeDescription", false);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
filterBinding.includeTemplate.setOnClickListener(includeTemplate -> {
|
filterBinding.includeTemplate.setOnClickListener(includeTemplate -> {
|
||||||
|
tinyDb.putBoolean("exploreRepoIncludeTemplate", filterBinding.includeTemplate.isChecked());
|
||||||
if(filterBinding.includeTemplate.isChecked()) {
|
|
||||||
|
|
||||||
tinyDb.putBoolean("exploreRepoIncludeTemplate", true);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
tinyDb.putBoolean("exploreRepoIncludeTemplate", false);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
filterBinding.onlyArchived.setOnClickListener(onlyArchived -> {
|
filterBinding.onlyArchived.setOnClickListener(onlyArchived -> {
|
||||||
|
tinyDb.putBoolean("exploreRepoOnlyArchived", filterBinding.onlyArchived.isChecked());
|
||||||
if(filterBinding.onlyArchived.isChecked()) {
|
|
||||||
|
|
||||||
tinyDb.putBoolean("exploreRepoOnlyArchived", true);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
tinyDb.putBoolean("exploreRepoOnlyArchived", false);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
filterBinding.includeTopic.setChecked(tinyDb.getBoolean("exploreRepoIncludeTopic"));
|
filterBinding.includeTopic.setChecked(tinyDb.getBoolean("exploreRepoIncludeTopic"));
|
||||||
filterBinding.includeDesc.setChecked(tinyDb.getBoolean("exploreRepoIncludeDescription"));
|
filterBinding.includeDesc.setChecked(tinyDb.getBoolean("exploreRepoIncludeDescription"));
|
||||||
filterBinding.includeTemplate.setChecked(tinyDb.getBoolean("exploreRepoIncludeTemplate"));
|
filterBinding.includeTemplate.setChecked(tinyDb.getBoolean("exploreRepoIncludeTemplate"));
|
||||||
|
@ -130,7 +130,17 @@ public class FilesFragment extends Fragment implements FilesAdapter.FilesAdapter
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
fetchDataAsync(Authorization.get(getContext()), repoOwner, repoName, ref);
|
String dir = requireActivity().getIntent().getStringExtra("dir");
|
||||||
|
if(dir != null) {
|
||||||
|
fetchDataAsyncSub(Authorization.get(getContext()), repoOwner, repoName, dir, ref);
|
||||||
|
for(String segment: dir.split("/")) {
|
||||||
|
binding.breadcrumbsView.addItem(new BreadcrumbItem(Collections.singletonList(segment)));
|
||||||
|
path.add(segment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fetchDataAsync(Authorization.get(getContext()), repoOwner, repoName, ref);
|
||||||
|
}
|
||||||
|
|
||||||
return binding.getRoot();
|
return binding.getRoot();
|
||||||
}
|
}
|
||||||
|
@ -29,8 +29,8 @@ import org.mian.gitnex.clients.RetrofitClient;
|
|||||||
import org.mian.gitnex.databinding.FragmentIssuesBinding;
|
import org.mian.gitnex.databinding.FragmentIssuesBinding;
|
||||||
import org.mian.gitnex.helpers.Authorization;
|
import org.mian.gitnex.helpers.Authorization;
|
||||||
import org.mian.gitnex.helpers.Constants;
|
import org.mian.gitnex.helpers.Constants;
|
||||||
|
import org.mian.gitnex.helpers.SnackBar;
|
||||||
import org.mian.gitnex.helpers.TinyDB;
|
import org.mian.gitnex.helpers.TinyDB;
|
||||||
import org.mian.gitnex.helpers.Toasty;
|
|
||||||
import org.mian.gitnex.helpers.Version;
|
import org.mian.gitnex.helpers.Version;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -44,6 +44,7 @@ import retrofit2.Response;
|
|||||||
|
|
||||||
public class IssuesFragment extends Fragment {
|
public class IssuesFragment extends Fragment {
|
||||||
|
|
||||||
|
private FragmentIssuesBinding fragmentIssuesBinding;
|
||||||
private Menu menu;
|
private Menu menu;
|
||||||
private RecyclerView recyclerView;
|
private RecyclerView recyclerView;
|
||||||
private List<Issues> issuesList;
|
private List<Issues> issuesList;
|
||||||
@ -51,18 +52,17 @@ public class IssuesFragment extends Fragment {
|
|||||||
private Context context;
|
private Context context;
|
||||||
private int pageSize = Constants.issuesPageInit;
|
private int pageSize = Constants.issuesPageInit;
|
||||||
private ProgressBar mProgressBar;
|
private ProgressBar mProgressBar;
|
||||||
private String TAG = Constants.tagIssuesList;
|
private final String TAG = Constants.tagIssuesList;
|
||||||
private TextView noDataIssues;
|
private TextView noDataIssues;
|
||||||
private int resultLimit = Constants.resultLimitOldGiteaInstances;
|
private int resultLimit = Constants.resultLimitOldGiteaInstances;
|
||||||
private String requestType = Constants.issuesRequestType;
|
private final String requestType = Constants.issuesRequestType;
|
||||||
private ProgressBar progressLoadMore;
|
private ProgressBar progressLoadMore;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||||
|
|
||||||
FragmentIssuesBinding fragmentIssuesBinding = FragmentIssuesBinding.inflate(inflater, container, false);
|
fragmentIssuesBinding = FragmentIssuesBinding.inflate(inflater, container, false);
|
||||||
|
|
||||||
setHasOptionsMenu(true);
|
setHasOptionsMenu(true);
|
||||||
context = getContext();
|
context = getContext();
|
||||||
|
|
||||||
@ -89,23 +89,17 @@ public class IssuesFragment extends Fragment {
|
|||||||
noDataIssues = fragmentIssuesBinding.noDataIssues;
|
noDataIssues = fragmentIssuesBinding.noDataIssues;
|
||||||
|
|
||||||
swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
||||||
|
|
||||||
swipeRefresh.setRefreshing(false);
|
swipeRefresh.setRefreshing(false);
|
||||||
loadInitial(instanceToken, repoOwner, repoName, resultLimit, requestType, tinyDb.getString("repoIssuesState"));
|
loadInitial(instanceToken, repoOwner, repoName, resultLimit, requestType, tinyDb.getString("repoIssuesState"));
|
||||||
adapter.notifyDataChanged();
|
adapter.notifyDataChanged();
|
||||||
|
|
||||||
}, 200));
|
}, 200));
|
||||||
|
|
||||||
adapter = new IssuesAdapter(getContext(), issuesList);
|
adapter = new IssuesAdapter(getContext(), issuesList);
|
||||||
adapter.setLoadMoreListener(() -> recyclerView.post(() -> {
|
adapter.setLoadMoreListener(() -> recyclerView.post(() -> {
|
||||||
|
|
||||||
if(issuesList.size() == resultLimit || pageSize == resultLimit) {
|
if(issuesList.size() == resultLimit || pageSize == resultLimit) {
|
||||||
|
|
||||||
int page = (issuesList.size() + resultLimit) / resultLimit;
|
int page = (issuesList.size() + resultLimit) / resultLimit;
|
||||||
loadMore(Authorization.get(getContext()), repoOwner, repoName, page, resultLimit, requestType, tinyDb.getString("repoIssuesState"));
|
loadMore(Authorization.get(getContext()), repoOwner, repoName, page, resultLimit, requestType, tinyDb.getString("repoIssuesState"));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL);
|
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL);
|
||||||
@ -129,12 +123,9 @@ public class IssuesFragment extends Fragment {
|
|||||||
adapter.setLoadMoreListener(() -> recyclerView.post(() -> {
|
adapter.setLoadMoreListener(() -> recyclerView.post(() -> {
|
||||||
|
|
||||||
if(issuesList.size() == resultLimit || pageSize == resultLimit) {
|
if(issuesList.size() == resultLimit || pageSize == resultLimit) {
|
||||||
|
|
||||||
int page = (issuesList.size() + resultLimit) / resultLimit;
|
int page = (issuesList.size() + resultLimit) / resultLimit;
|
||||||
loadMore(Authorization.get(getContext()), repoOwner, repoName, page, resultLimit, requestType, tinyDb.getString("repoIssuesState"));
|
loadMore(Authorization.get(getContext()), repoOwner, repoName, page, resultLimit, requestType, tinyDb.getString("repoIssuesState"));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
tinyDb.putString("repoIssuesState", issueState);
|
tinyDb.putString("repoIssuesState", issueState);
|
||||||
@ -144,13 +135,11 @@ public class IssuesFragment extends Fragment {
|
|||||||
|
|
||||||
loadInitial(Authorization.get(getContext()), repoOwner, repoName, resultLimit, requestType, issueState);
|
loadInitial(Authorization.get(getContext()), repoOwner, repoName, resultLimit, requestType, issueState);
|
||||||
recyclerView.setAdapter(adapter);
|
recyclerView.setAdapter(adapter);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
loadInitial(Authorization.get(getContext()), repoOwner, repoName, resultLimit, requestType, tinyDb.getString("repoIssuesState"));
|
loadInitial(Authorization.get(getContext()), repoOwner, repoName, resultLimit, requestType, tinyDb.getString("repoIssuesState"));
|
||||||
|
|
||||||
return fragmentIssuesBinding.getRoot();
|
return fragmentIssuesBinding.getRoot();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -165,11 +154,9 @@ public class IssuesFragment extends Fragment {
|
|||||||
final String repoName = parts[1];
|
final String repoName = parts[1];
|
||||||
|
|
||||||
if(tinyDb.getBoolean("resumeIssues")) {
|
if(tinyDb.getBoolean("resumeIssues")) {
|
||||||
|
|
||||||
loadInitial(Authorization.get(getContext()), repoOwner, repoName, resultLimit, requestType, tinyDb.getString("repoIssuesState"));
|
loadInitial(Authorization.get(getContext()), repoOwner, repoName, resultLimit, requestType, tinyDb.getString("repoIssuesState"));
|
||||||
tinyDb.putBoolean("resumeIssues", false);
|
tinyDb.putBoolean("resumeIssues", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadInitial(String token, String repoOwner, String repoName, int resultLimit, String requestType, String issueState) {
|
private void loadInitial(String token, String repoOwner, String repoName, int resultLimit, String requestType, String issueState) {
|
||||||
@ -177,49 +164,38 @@ public class IssuesFragment extends Fragment {
|
|||||||
Call<List<Issues>> call = RetrofitClient.getApiInterface(context).getIssues(token, repoOwner, repoName, 1, resultLimit, requestType, issueState);
|
Call<List<Issues>> call = RetrofitClient.getApiInterface(context).getIssues(token, repoOwner, repoName, 1, resultLimit, requestType, issueState);
|
||||||
|
|
||||||
call.enqueue(new Callback<List<Issues>>() {
|
call.enqueue(new Callback<List<Issues>>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onResponse(@NonNull Call<List<Issues>> call, @NonNull Response<List<Issues>> response) {
|
public void onResponse(@NonNull Call<List<Issues>> call, @NonNull Response<List<Issues>> response) {
|
||||||
|
|
||||||
if(response.code() == 200) {
|
if(response.code() == 200) {
|
||||||
|
|
||||||
assert response.body() != null;
|
assert response.body() != null;
|
||||||
if(response.body().size() > 0) {
|
if(response.body().size() > 0) {
|
||||||
|
|
||||||
issuesList.clear();
|
issuesList.clear();
|
||||||
issuesList.addAll(response.body());
|
issuesList.addAll(response.body());
|
||||||
adapter.notifyDataChanged();
|
adapter.notifyDataChanged();
|
||||||
noDataIssues.setVisibility(View.GONE);
|
noDataIssues.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
issuesList.clear();
|
issuesList.clear();
|
||||||
adapter.notifyDataChanged();
|
adapter.notifyDataChanged();
|
||||||
noDataIssues.setVisibility(View.VISIBLE);
|
noDataIssues.setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
mProgressBar.setVisibility(View.GONE);
|
mProgressBar.setVisibility(View.GONE);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if(response.code() == 404) {
|
else if(response.code() == 404) {
|
||||||
|
|
||||||
noDataIssues.setVisibility(View.VISIBLE);
|
noDataIssues.setVisibility(View.VISIBLE);
|
||||||
mProgressBar.setVisibility(View.GONE);
|
mProgressBar.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Log.e(TAG, String.valueOf(response.code()));
|
Log.e(TAG, String.valueOf(response.code()));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFailure(@NonNull Call<List<Issues>> call, @NonNull Throwable t) {
|
public void onFailure(@NonNull Call<List<Issues>> call, @NonNull Throwable t) {
|
||||||
|
|
||||||
Log.e(TAG, t.toString());
|
Log.e(TAG, t.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadMore(String token, String repoOwner, String repoName, int page, int resultLimit, String requestType, String issueState) {
|
private void loadMore(String token, String repoOwner, String repoName, int page, int resultLimit, String requestType, String issueState) {
|
||||||
@ -232,44 +208,29 @@ public class IssuesFragment extends Fragment {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onResponse(@NonNull Call<List<Issues>> call, @NonNull Response<List<Issues>> response) {
|
public void onResponse(@NonNull Call<List<Issues>> call, @NonNull Response<List<Issues>> response) {
|
||||||
|
|
||||||
if(response.code() == 200) {
|
if(response.code() == 200) {
|
||||||
|
|
||||||
List<Issues> result = response.body();
|
List<Issues> result = response.body();
|
||||||
|
|
||||||
assert result != null;
|
assert result != null;
|
||||||
if(result.size() > 0) {
|
if(result.size() > 0) {
|
||||||
|
|
||||||
pageSize = result.size();
|
pageSize = result.size();
|
||||||
issuesList.addAll(result);
|
issuesList.addAll(result);
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
SnackBar.info(context, fragmentIssuesBinding.getRoot(), getString(R.string.noMoreData));
|
||||||
Toasty.warning(context, getString(R.string.noMoreData));
|
|
||||||
adapter.setMoreDataAvailable(false);
|
adapter.setMoreDataAvailable(false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
adapter.notifyDataChanged();
|
adapter.notifyDataChanged();
|
||||||
progressLoadMore.setVisibility(View.GONE);
|
progressLoadMore.setVisibility(View.GONE);
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
Log.e(TAG, String.valueOf(response.code()));
|
Log.e(TAG, String.valueOf(response.code()));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFailure(@NonNull Call<List<Issues>> call, @NonNull Throwable t) {
|
public void onFailure(@NonNull Call<List<Issues>> call, @NonNull Throwable t) {
|
||||||
|
|
||||||
Log.e(TAG, t.toString());
|
Log.e(TAG, t.toString());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -298,19 +259,15 @@ public class IssuesFragment extends Fragment {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onQueryTextSubmit(String query) {
|
public boolean onQueryTextSubmit(String query) {
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onQueryTextChange(String newText) {
|
public boolean onQueryTextChange(String newText) {
|
||||||
|
|
||||||
filter(newText);
|
filter(newText);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void filter(String text) {
|
private void filter(String text) {
|
||||||
@ -328,5 +285,4 @@ public class IssuesFragment extends Fragment {
|
|||||||
|
|
||||||
adapter.updateList(arr);
|
adapter.updateList(arr);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,8 @@ public class MilestonesFragment extends Fragment {
|
|||||||
private String TAG = Constants.tagMilestonesFragment;
|
private String TAG = Constants.tagMilestonesFragment;
|
||||||
private int resultLimit = Constants.resultLimitOldGiteaInstances;
|
private int resultLimit = Constants.resultLimitOldGiteaInstances;
|
||||||
|
|
||||||
|
private String milestoneId;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||||
|
|
||||||
@ -63,6 +65,9 @@ public class MilestonesFragment extends Fragment {
|
|||||||
final String loginUid = tinyDb.getString("loginUid");
|
final String loginUid = tinyDb.getString("loginUid");
|
||||||
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
|
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
|
||||||
|
|
||||||
|
milestoneId = requireActivity().getIntent().getStringExtra("milestoneId");
|
||||||
|
requireActivity().getIntent().removeExtra("milestoneId");
|
||||||
|
|
||||||
viewBinding.recyclerView.setHasFixedSize(true);
|
viewBinding.recyclerView.setHasFixedSize(true);
|
||||||
viewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
viewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
||||||
|
|
||||||
@ -188,6 +193,10 @@ public class MilestonesFragment extends Fragment {
|
|||||||
adapter.notifyDataChanged();
|
adapter.notifyDataChanged();
|
||||||
viewBinding.noDataMilestone.setVisibility(View.GONE);
|
viewBinding.noDataMilestone.setVisibility(View.GONE);
|
||||||
|
|
||||||
|
if(milestoneId != null) {
|
||||||
|
viewBinding.recyclerView.scrollToPosition(getMilestoneIndex(Integer.parseInt(milestoneId), response.body()));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
@ -216,6 +225,15 @@ public class MilestonesFragment extends Fragment {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static int getMilestoneIndex(int milestoneId, List<Milestones> milestones) {
|
||||||
|
for (Milestones milestone : milestones) {
|
||||||
|
if(milestone.getId() == milestoneId) {
|
||||||
|
return milestones.indexOf(milestone);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
private void loadMore(String token, String repoOwner, String repoName, int page, int resultLimit, String milestoneState) {
|
private void loadMore(String token, String repoOwner, String repoName, int page, int resultLimit, String milestoneState) {
|
||||||
|
|
||||||
viewBinding.progressLoadMore.setVisibility(View.VISIBLE);
|
viewBinding.progressLoadMore.setVisibility(View.VISIBLE);
|
||||||
|
@ -18,7 +18,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
|
|||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||||
import org.gitnex.tea4j.models.Emails;
|
import org.gitnex.tea4j.models.Emails;
|
||||||
import org.mian.gitnex.adapters.ProfileEmailsAdapter;
|
import org.mian.gitnex.adapters.MyProfileEmailsAdapter;
|
||||||
import org.mian.gitnex.databinding.FragmentProfileEmailsBinding;
|
import org.mian.gitnex.databinding.FragmentProfileEmailsBinding;
|
||||||
import org.mian.gitnex.helpers.Authorization;
|
import org.mian.gitnex.helpers.Authorization;
|
||||||
import org.mian.gitnex.viewmodels.ProfileEmailsViewModel;
|
import org.mian.gitnex.viewmodels.ProfileEmailsViewModel;
|
||||||
@ -28,10 +28,10 @@ import java.util.List;
|
|||||||
* Author M M Arif
|
* Author M M Arif
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class ProfileEmailsFragment extends Fragment {
|
public class MyProfileEmailsFragment extends Fragment {
|
||||||
|
|
||||||
private ProgressBar mProgressBar;
|
private ProgressBar mProgressBar;
|
||||||
private ProfileEmailsAdapter adapter;
|
private MyProfileEmailsAdapter adapter;
|
||||||
private RecyclerView mRecyclerView;
|
private RecyclerView mRecyclerView;
|
||||||
private TextView noDataEmails;
|
private TextView noDataEmails;
|
||||||
private static String repoNameF = "param2";
|
private static String repoNameF = "param2";
|
||||||
@ -42,11 +42,11 @@ public class ProfileEmailsFragment extends Fragment {
|
|||||||
|
|
||||||
private OnFragmentInteractionListener mListener;
|
private OnFragmentInteractionListener mListener;
|
||||||
|
|
||||||
public ProfileEmailsFragment() {
|
public MyProfileEmailsFragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ProfileEmailsFragment newInstance(String param1, String param2) {
|
public static MyProfileEmailsFragment newInstance(String param1, String param2) {
|
||||||
ProfileEmailsFragment fragment = new ProfileEmailsFragment();
|
MyProfileEmailsFragment fragment = new MyProfileEmailsFragment();
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
args.putString(repoOwnerF, param1);
|
args.putString(repoOwnerF, param1);
|
||||||
args.putString(repoNameF, param2);
|
args.putString(repoNameF, param2);
|
||||||
@ -102,7 +102,7 @@ public class ProfileEmailsFragment extends Fragment {
|
|||||||
profileEmailModel.getEmailsList(instanceToken, getContext()).observe(getViewLifecycleOwner(), new Observer<List<Emails>>() {
|
profileEmailModel.getEmailsList(instanceToken, getContext()).observe(getViewLifecycleOwner(), new Observer<List<Emails>>() {
|
||||||
@Override
|
@Override
|
||||||
public void onChanged(@Nullable List<Emails> emailsListMain) {
|
public void onChanged(@Nullable List<Emails> emailsListMain) {
|
||||||
adapter = new ProfileEmailsAdapter(getContext(), emailsListMain);
|
adapter = new MyProfileEmailsAdapter(getContext(), emailsListMain);
|
||||||
if(adapter.getItemCount() > 0) {
|
if(adapter.getItemCount() > 0) {
|
||||||
mRecyclerView.setAdapter(adapter);
|
mRecyclerView.setAdapter(adapter);
|
||||||
noDataEmails.setVisibility(View.GONE);
|
noDataEmails.setVisibility(View.GONE);
|
@ -16,8 +16,8 @@ import androidx.recyclerview.widget.DividerItemDecoration;
|
|||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||||
import org.mian.gitnex.adapters.ProfileFollowersAdapter;
|
import org.mian.gitnex.adapters.MyProfileFollowersAdapter;
|
||||||
import org.mian.gitnex.databinding.FragmentProfileFollowersBinding;
|
import org.mian.gitnex.databinding.FragmentProfileFollowersFollowingBinding;
|
||||||
import org.mian.gitnex.helpers.Authorization;
|
import org.mian.gitnex.helpers.Authorization;
|
||||||
import org.mian.gitnex.viewmodels.ProfileFollowersViewModel;
|
import org.mian.gitnex.viewmodels.ProfileFollowersViewModel;
|
||||||
|
|
||||||
@ -25,10 +25,10 @@ import org.mian.gitnex.viewmodels.ProfileFollowersViewModel;
|
|||||||
* Author M M Arif
|
* Author M M Arif
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class ProfileFollowersFragment extends Fragment {
|
public class MyProfileFollowersFragment extends Fragment {
|
||||||
|
|
||||||
private ProgressBar mProgressBar;
|
private ProgressBar mProgressBar;
|
||||||
private ProfileFollowersAdapter adapter;
|
private MyProfileFollowersAdapter adapter;
|
||||||
private RecyclerView mRecyclerView;
|
private RecyclerView mRecyclerView;
|
||||||
private TextView noDataFollowers;
|
private TextView noDataFollowers;
|
||||||
private static String repoNameF = "param2";
|
private static String repoNameF = "param2";
|
||||||
@ -39,11 +39,11 @@ public class ProfileFollowersFragment extends Fragment {
|
|||||||
|
|
||||||
private OnFragmentInteractionListener mListener;
|
private OnFragmentInteractionListener mListener;
|
||||||
|
|
||||||
public ProfileFollowersFragment() {
|
public MyProfileFollowersFragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ProfileFollowersFragment newInstance(String param1, String param2) {
|
public static MyProfileFollowersFragment newInstance(String param1, String param2) {
|
||||||
ProfileFollowersFragment fragment = new ProfileFollowersFragment();
|
MyProfileFollowersFragment fragment = new MyProfileFollowersFragment();
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
args.putString(repoOwnerF, param1);
|
args.putString(repoOwnerF, param1);
|
||||||
args.putString(repoNameF, param2);
|
args.putString(repoNameF, param2);
|
||||||
@ -64,12 +64,12 @@ public class ProfileFollowersFragment extends Fragment {
|
|||||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||||
Bundle savedInstanceState) {
|
Bundle savedInstanceState) {
|
||||||
|
|
||||||
FragmentProfileFollowersBinding fragmentProfileFollowersBinding = FragmentProfileFollowersBinding.inflate(inflater, container, false);
|
FragmentProfileFollowersFollowingBinding fragmentProfileFollowersFollowingBinding = FragmentProfileFollowersFollowingBinding.inflate(inflater, container, false);
|
||||||
|
|
||||||
final SwipeRefreshLayout swipeRefresh = fragmentProfileFollowersBinding.pullToRefresh;
|
final SwipeRefreshLayout swipeRefresh = fragmentProfileFollowersFollowingBinding.pullToRefresh;
|
||||||
|
|
||||||
noDataFollowers = fragmentProfileFollowersBinding.noDataFollowers;
|
noDataFollowers = fragmentProfileFollowersFollowingBinding.noData;
|
||||||
mRecyclerView = fragmentProfileFollowersBinding.recyclerView;
|
mRecyclerView = fragmentProfileFollowersFollowingBinding.recyclerView;
|
||||||
|
|
||||||
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(), DividerItemDecoration.VERTICAL);
|
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(), DividerItemDecoration.VERTICAL);
|
||||||
|
|
||||||
@ -77,7 +77,7 @@ public class ProfileFollowersFragment extends Fragment {
|
|||||||
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
||||||
mRecyclerView.addItemDecoration(dividerItemDecoration);
|
mRecyclerView.addItemDecoration(dividerItemDecoration);
|
||||||
|
|
||||||
mProgressBar = fragmentProfileFollowersBinding.progressBar;
|
mProgressBar = fragmentProfileFollowersFollowingBinding.progressBar;
|
||||||
|
|
||||||
swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
||||||
|
|
||||||
@ -88,7 +88,7 @@ public class ProfileFollowersFragment extends Fragment {
|
|||||||
|
|
||||||
fetchDataAsync(Authorization.get(getContext()));
|
fetchDataAsync(Authorization.get(getContext()));
|
||||||
|
|
||||||
return fragmentProfileFollowersBinding.getRoot();
|
return fragmentProfileFollowersFollowingBinding.getRoot();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void fetchDataAsync(String instanceToken) {
|
private void fetchDataAsync(String instanceToken) {
|
||||||
@ -97,7 +97,7 @@ public class ProfileFollowersFragment extends Fragment {
|
|||||||
|
|
||||||
pfModel.getFollowersList(instanceToken, getContext()).observe(getViewLifecycleOwner(), pfListMain -> {
|
pfModel.getFollowersList(instanceToken, getContext()).observe(getViewLifecycleOwner(), pfListMain -> {
|
||||||
|
|
||||||
adapter = new ProfileFollowersAdapter(getContext(), pfListMain);
|
adapter = new MyProfileFollowersAdapter(getContext(), pfListMain);
|
||||||
|
|
||||||
if(adapter.getItemCount() > 0) {
|
if(adapter.getItemCount() > 0) {
|
||||||
mRecyclerView.setAdapter(adapter);
|
mRecyclerView.setAdapter(adapter);
|
@ -16,8 +16,8 @@ import androidx.recyclerview.widget.DividerItemDecoration;
|
|||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||||
import org.mian.gitnex.adapters.ProfileFollowingAdapter;
|
import org.mian.gitnex.adapters.MyProfileFollowingAdapter;
|
||||||
import org.mian.gitnex.databinding.FragmentProfileFollowingBinding;
|
import org.mian.gitnex.databinding.FragmentProfileFollowersFollowingBinding;
|
||||||
import org.mian.gitnex.helpers.Authorization;
|
import org.mian.gitnex.helpers.Authorization;
|
||||||
import org.mian.gitnex.helpers.TinyDB;
|
import org.mian.gitnex.helpers.TinyDB;
|
||||||
import org.mian.gitnex.viewmodels.ProfileFollowingViewModel;
|
import org.mian.gitnex.viewmodels.ProfileFollowingViewModel;
|
||||||
@ -26,25 +26,25 @@ import org.mian.gitnex.viewmodels.ProfileFollowingViewModel;
|
|||||||
* Author M M Arif
|
* Author M M Arif
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class ProfileFollowingFragment extends Fragment {
|
public class MyProfileFollowingFragment extends Fragment {
|
||||||
|
|
||||||
private ProgressBar mProgressBar;
|
private ProgressBar mProgressBar;
|
||||||
private ProfileFollowingAdapter adapter;
|
private MyProfileFollowingAdapter adapter;
|
||||||
private RecyclerView mRecyclerView;
|
private RecyclerView mRecyclerView;
|
||||||
private TextView noDataFollowing;
|
private TextView noDataFollowing;
|
||||||
private static String repoNameF = "param2";
|
private static final String repoNameF = "param2";
|
||||||
private static String repoOwnerF = "param1";
|
private static final String repoOwnerF = "param1";
|
||||||
|
|
||||||
private String repoName;
|
private String repoName;
|
||||||
private String repoOwner;
|
private String repoOwner;
|
||||||
|
|
||||||
private OnFragmentInteractionListener mListener;
|
private OnFragmentInteractionListener mListener;
|
||||||
|
|
||||||
public ProfileFollowingFragment() {
|
public MyProfileFollowingFragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ProfileFollowingFragment newInstance(String param1, String param2) {
|
public static MyProfileFollowingFragment newInstance(String param1, String param2) {
|
||||||
ProfileFollowingFragment fragment = new ProfileFollowingFragment();
|
MyProfileFollowingFragment fragment = new MyProfileFollowingFragment();
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
args.putString(repoOwnerF, param1);
|
args.putString(repoOwnerF, param1);
|
||||||
args.putString(repoNameF, param2);
|
args.putString(repoNameF, param2);
|
||||||
@ -65,14 +65,14 @@ public class ProfileFollowingFragment extends Fragment {
|
|||||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||||
Bundle savedInstanceState) {
|
Bundle savedInstanceState) {
|
||||||
|
|
||||||
FragmentProfileFollowingBinding fragmentProfileFollowingBinding = FragmentProfileFollowingBinding.inflate(inflater, container, false);
|
FragmentProfileFollowersFollowingBinding fragmentProfileFollowersFollowingBinding = FragmentProfileFollowersFollowingBinding.inflate(inflater, container, false);
|
||||||
|
|
||||||
TinyDB tinyDb = TinyDB.getInstance(getContext());
|
TinyDB tinyDb = TinyDB.getInstance(getContext());
|
||||||
|
|
||||||
final SwipeRefreshLayout swipeRefresh = fragmentProfileFollowingBinding.pullToRefresh;
|
final SwipeRefreshLayout swipeRefresh = fragmentProfileFollowersFollowingBinding.pullToRefresh;
|
||||||
|
|
||||||
noDataFollowing = fragmentProfileFollowingBinding.noDataFollowing;
|
noDataFollowing = fragmentProfileFollowersFollowingBinding.noData;
|
||||||
mRecyclerView = fragmentProfileFollowingBinding.recyclerView;
|
mRecyclerView = fragmentProfileFollowersFollowingBinding.recyclerView;
|
||||||
|
|
||||||
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(), DividerItemDecoration.VERTICAL);
|
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(), DividerItemDecoration.VERTICAL);
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ public class ProfileFollowingFragment extends Fragment {
|
|||||||
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
||||||
mRecyclerView.addItemDecoration(dividerItemDecoration);
|
mRecyclerView.addItemDecoration(dividerItemDecoration);
|
||||||
|
|
||||||
mProgressBar = fragmentProfileFollowingBinding.progressBar;
|
mProgressBar = fragmentProfileFollowersFollowingBinding.progressBar;
|
||||||
|
|
||||||
swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
swipeRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
||||||
|
|
||||||
@ -91,7 +91,7 @@ public class ProfileFollowingFragment extends Fragment {
|
|||||||
|
|
||||||
fetchDataAsync(Authorization.get(getContext()));
|
fetchDataAsync(Authorization.get(getContext()));
|
||||||
|
|
||||||
return fragmentProfileFollowingBinding.getRoot();
|
return fragmentProfileFollowersFollowingBinding.getRoot();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void fetchDataAsync(String instanceToken) {
|
private void fetchDataAsync(String instanceToken) {
|
||||||
@ -100,7 +100,7 @@ public class ProfileFollowingFragment extends Fragment {
|
|||||||
|
|
||||||
pfModel.getFollowingList(instanceToken, getContext()).observe(getViewLifecycleOwner(), pfListMain -> {
|
pfModel.getFollowingList(instanceToken, getContext()).observe(getViewLifecycleOwner(), pfListMain -> {
|
||||||
|
|
||||||
adapter = new ProfileFollowingAdapter(getContext(), pfListMain);
|
adapter = new MyProfileFollowingAdapter(getContext(), pfListMain);
|
||||||
|
|
||||||
if(adapter.getItemCount() > 0) {
|
if(adapter.getItemCount() > 0) {
|
||||||
mRecyclerView.setAdapter(adapter);
|
mRecyclerView.setAdapter(adapter);
|
@ -36,7 +36,7 @@ import jp.wasabeef.picasso.transformations.BlurTransformation;
|
|||||||
* Author M M Arif
|
* Author M M Arif
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class ProfileFragment extends Fragment {
|
public class MyProfileFragment extends Fragment {
|
||||||
|
|
||||||
private Context ctx;
|
private Context ctx;
|
||||||
|
|
||||||
@ -61,18 +61,14 @@ public class ProfileFragment extends Fragment {
|
|||||||
TextView userLanguage = v.findViewById(R.id.userLanguage);
|
TextView userLanguage = v.findViewById(R.id.userLanguage);
|
||||||
ImageView userLanguageIcon = v.findViewById(R.id.userLanguageIcon);
|
ImageView userLanguageIcon = v.findViewById(R.id.userLanguageIcon);
|
||||||
|
|
||||||
ViewGroup aboutFrame = v.findViewById(R.id.aboutFrame);
|
|
||||||
|
|
||||||
String[] userLanguageCodes = tinyDb.getString("userLang").split("-");
|
String[] userLanguageCodes = tinyDb.getString("userLang").split("-");
|
||||||
|
|
||||||
if(userLanguageCodes.length >= 2) {
|
if(userLanguageCodes.length >= 2) {
|
||||||
|
|
||||||
Locale locale = new Locale(userLanguageCodes[0], userLanguageCodes[1]);
|
Locale locale = new Locale(userLanguageCodes[0], userLanguageCodes[1]);
|
||||||
userLanguage.setText(locale.getDisplayLanguage());
|
userLanguage.setText(locale.getDisplayLanguage());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
userLanguage.setText(getResources().getConfiguration().locale.getDisplayLanguage());
|
||||||
userLanguage.setText(R.string.notSupported);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
userAvatar.setOnClickListener(loginId ->
|
userAvatar.setOnClickListener(loginId ->
|
||||||
@ -112,7 +108,7 @@ public class ProfileFragment extends Fragment {
|
|||||||
@Override public void onError(Exception e) {}
|
@Override public void onError(Exception e) {}
|
||||||
});
|
});
|
||||||
|
|
||||||
ProfileFragment.SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());
|
MyProfileFragment.SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());
|
||||||
|
|
||||||
ViewPager mViewPager = v.findViewById(R.id.container);
|
ViewPager mViewPager = v.findViewById(R.id.container);
|
||||||
mViewPager.setAdapter(mSectionsPagerAdapter);
|
mViewPager.setAdapter(mSectionsPagerAdapter);
|
||||||
@ -159,7 +155,6 @@ public class ProfileFragment extends Fragment {
|
|||||||
tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
|
tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
|
||||||
|
|
||||||
return v;
|
return v;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class SectionsPagerAdapter extends FragmentStatePagerAdapter {
|
public static class SectionsPagerAdapter extends FragmentStatePagerAdapter {
|
||||||
@ -175,25 +170,23 @@ public class ProfileFragment extends Fragment {
|
|||||||
switch (position) {
|
switch (position) {
|
||||||
|
|
||||||
case 0: // followers
|
case 0: // followers
|
||||||
return ProfileFollowersFragment.newInstance("repoOwner", "repoName");
|
return MyProfileFollowersFragment.newInstance("repoOwner", "repoName");
|
||||||
|
|
||||||
case 1: // following
|
case 1: // following
|
||||||
return ProfileFollowingFragment.newInstance("repoOwner", "repoName");
|
return MyProfileFollowingFragment.newInstance("repoOwner", "repoName");
|
||||||
|
|
||||||
case 2: // emails
|
case 2: // emails
|
||||||
return ProfileEmailsFragment.newInstance("repoOwner", "repoName");
|
return MyProfileEmailsFragment.newInstance("repoOwner", "repoName");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getCount() {
|
public int getCount() {
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -202,7 +195,6 @@ public class ProfileFragment extends Fragment {
|
|||||||
menu.clear();
|
menu.clear();
|
||||||
requireActivity().getMenuInflater().inflate(R.menu.profile_dotted_menu, menu);
|
requireActivity().getMenuInflater().inflate(R.menu.profile_dotted_menu, menu);
|
||||||
super.onCreateOptionsMenu(menu, inflater);
|
super.onCreateOptionsMenu(menu, inflater);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -210,21 +202,18 @@ public class ProfileFragment extends Fragment {
|
|||||||
|
|
||||||
int id = item.getItemId();
|
int id = item.getItemId();
|
||||||
|
|
||||||
switch (id) {
|
if(id == android.R.id.home) {
|
||||||
|
((MainActivity)ctx).finish();
|
||||||
case android.R.id.home:
|
return true;
|
||||||
((MainActivity)ctx).finish();
|
}
|
||||||
return true;
|
else if(id == R.id.profileMenu) {
|
||||||
|
BottomSheetMyProfileFragment bottomSheet = new BottomSheetMyProfileFragment();
|
||||||
case R.id.profileMenu:
|
bottomSheet.show(getChildFragmentManager(), "profileBottomSheet");
|
||||||
BottomSheetProfileFragment bottomSheet = new BottomSheetProfileFragment();
|
return true;
|
||||||
bottomSheet.show(getChildFragmentManager(), "profileBottomSheet");
|
}
|
||||||
return true;
|
else {
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
default:
|
}
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -16,6 +16,7 @@ import android.widget.TextView;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.recyclerview.widget.DividerItemDecoration;
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||||
@ -95,12 +96,15 @@ public class NotificationsFragment extends Fragment implements NotificationsAdap
|
|||||||
notificationsActions = new NotificationsActions(context);
|
notificationsActions = new NotificationsActions(context);
|
||||||
notificationsAdapter = new NotificationsAdapter(context, notificationThreads, this, this);
|
notificationsAdapter = new NotificationsAdapter(context, notificationThreads, this, this);
|
||||||
|
|
||||||
|
RecyclerView recyclerView = fragmentNotificationsBinding.notifications;
|
||||||
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
|
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
|
||||||
|
|
||||||
RecyclerView recyclerView = fragmentNotificationsBinding.notifications;
|
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL);
|
||||||
|
|
||||||
recyclerView.setHasFixedSize(true);
|
recyclerView.setHasFixedSize(true);
|
||||||
recyclerView.setLayoutManager(linearLayoutManager);
|
recyclerView.setLayoutManager(linearLayoutManager);
|
||||||
recyclerView.setAdapter(notificationsAdapter);
|
recyclerView.setAdapter(notificationsAdapter);
|
||||||
|
recyclerView.addItemDecoration(dividerItemDecoration);
|
||||||
recyclerView.addOnScrollListener(new InfiniteScrollListener(pageResultLimit, linearLayoutManager) {
|
recyclerView.addOnScrollListener(new InfiniteScrollListener(pageResultLimit, linearLayoutManager) {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -249,6 +253,10 @@ public class NotificationsFragment extends Fragment implements NotificationsAdap
|
|||||||
if(notificationThreads.isEmpty()) {
|
if(notificationThreads.isEmpty()) {
|
||||||
|
|
||||||
noDataNotifications.setVisibility(View.VISIBLE);
|
noDataNotifications.setVisibility(View.VISIBLE);
|
||||||
|
markAllAsRead.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
markAllAsRead.setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -29,7 +29,7 @@ import retrofit2.Callback;
|
|||||||
|
|
||||||
public class OrganizationInfoFragment extends Fragment {
|
public class OrganizationInfoFragment extends Fragment {
|
||||||
|
|
||||||
private Context ctx = getContext();
|
private Context ctx;
|
||||||
private ProgressBar mProgressBar;
|
private ProgressBar mProgressBar;
|
||||||
private static String orgNameF = "param1";
|
private static String orgNameF = "param1";
|
||||||
|
|
||||||
@ -67,6 +67,8 @@ public class OrganizationInfoFragment extends Fragment {
|
|||||||
|
|
||||||
FragmentOrganizationInfoBinding fragmentOrganizationInfoBinding = FragmentOrganizationInfoBinding.inflate(inflater, container, false);
|
FragmentOrganizationInfoBinding fragmentOrganizationInfoBinding = FragmentOrganizationInfoBinding.inflate(inflater, container, false);
|
||||||
|
|
||||||
|
ctx = getContext();
|
||||||
|
|
||||||
mProgressBar = fragmentOrganizationInfoBinding.progressBar;
|
mProgressBar = fragmentOrganizationInfoBinding.progressBar;
|
||||||
orgAvatar = fragmentOrganizationInfoBinding.orgAvatar;
|
orgAvatar = fragmentOrganizationInfoBinding.orgAvatar;
|
||||||
TextView orgNameInfo = fragmentOrganizationInfoBinding.orgNameInfo;
|
TextView orgNameInfo = fragmentOrganizationInfoBinding.orgNameInfo;
|
||||||
|
@ -18,6 +18,7 @@ import androidx.recyclerview.widget.DividerItemDecoration;
|
|||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||||
|
import org.gitnex.tea4j.models.IssueComments;
|
||||||
import org.gitnex.tea4j.models.Releases;
|
import org.gitnex.tea4j.models.Releases;
|
||||||
import org.mian.gitnex.adapters.ReleasesAdapter;
|
import org.mian.gitnex.adapters.ReleasesAdapter;
|
||||||
import org.mian.gitnex.databinding.FragmentReleasesBinding;
|
import org.mian.gitnex.databinding.FragmentReleasesBinding;
|
||||||
@ -41,6 +42,7 @@ public class ReleasesFragment extends Fragment {
|
|||||||
|
|
||||||
private String repoName;
|
private String repoName;
|
||||||
private String repoOwner;
|
private String repoOwner;
|
||||||
|
private String releaseTag;
|
||||||
|
|
||||||
private OnFragmentInteractionListener mListener;
|
private OnFragmentInteractionListener mListener;
|
||||||
|
|
||||||
@ -63,6 +65,7 @@ public class ReleasesFragment extends Fragment {
|
|||||||
repoName = getArguments().getString(repoNameF);
|
repoName = getArguments().getString(repoNameF);
|
||||||
repoOwner = getArguments().getString(repoOwnerF);
|
repoOwner = getArguments().getString(repoOwnerF);
|
||||||
}
|
}
|
||||||
|
releaseTag = requireActivity().getIntent().getStringExtra("releaseTagName");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -137,6 +140,13 @@ public class ReleasesFragment extends Fragment {
|
|||||||
adapter = new ReleasesAdapter(getContext(), releasesListMain);
|
adapter = new ReleasesAdapter(getContext(), releasesListMain);
|
||||||
if(adapter.getItemCount() > 0) {
|
if(adapter.getItemCount() > 0) {
|
||||||
mRecyclerView.setAdapter(adapter);
|
mRecyclerView.setAdapter(adapter);
|
||||||
|
if(releasesListMain != null && releaseTag != null) {
|
||||||
|
int index = getReleaseIndex(releaseTag, releasesListMain);
|
||||||
|
releaseTag = null;
|
||||||
|
if(index != -1) {
|
||||||
|
mRecyclerView.scrollToPosition(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
noDataReleases.setVisibility(View.GONE);
|
noDataReleases.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -150,4 +160,13 @@ public class ReleasesFragment extends Fragment {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static int getReleaseIndex(String tag, List<Releases> releases) {
|
||||||
|
for (Releases release : releases) {
|
||||||
|
if(release.getTag_name().equals(tag)) {
|
||||||
|
return releases.indexOf(release);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -42,6 +42,7 @@ public class RepoInfoFragment extends Fragment {
|
|||||||
private LinearLayout pageContent;
|
private LinearLayout pageContent;
|
||||||
private static final String repoNameF = "param2";
|
private static final String repoNameF = "param2";
|
||||||
private static final String repoOwnerF = "param1";
|
private static final String repoOwnerF = "param1";
|
||||||
|
private Locale locale;
|
||||||
|
|
||||||
private FragmentRepoInfoBinding binding;
|
private FragmentRepoInfoBinding binding;
|
||||||
|
|
||||||
@ -74,17 +75,16 @@ public class RepoInfoFragment extends Fragment {
|
|||||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||||
|
|
||||||
binding = FragmentRepoInfoBinding.inflate(inflater, container, false);
|
binding = FragmentRepoInfoBinding.inflate(inflater, container, false);
|
||||||
|
|
||||||
TinyDB tinyDb = TinyDB.getInstance(getContext());
|
TinyDB tinyDb = TinyDB.getInstance(getContext());
|
||||||
|
|
||||||
ctx = getContext();
|
ctx = getContext();
|
||||||
|
locale = getResources().getConfiguration().locale;
|
||||||
|
|
||||||
pageContent = binding.repoInfoLayout;
|
pageContent = binding.repoInfoLayout;
|
||||||
pageContent.setVisibility(View.GONE);
|
pageContent.setVisibility(View.GONE);
|
||||||
|
|
||||||
binding.repoMetaFrame.setVisibility(View.GONE);
|
binding.repoMetaFrame.setVisibility(View.GONE);
|
||||||
|
|
||||||
getRepoInfo(Authorization.get(getContext()), repoOwner, repoName, tinyDb.getString("locale"), tinyDb.getString("dateFormat"));
|
getRepoInfo(Authorization.get(getContext()), repoOwner, repoName, locale, tinyDb.getString("dateFormat"));
|
||||||
getFileContents(Authorization.get(getContext()), repoOwner, repoName, getResources().getString(R.string.defaultFilename));
|
getFileContents(Authorization.get(getContext()), repoOwner, repoName, getResources().getString(R.string.defaultFilename));
|
||||||
|
|
||||||
if(isExpandViewVisible()) {
|
if(isExpandViewVisible()) {
|
||||||
@ -173,7 +173,7 @@ public class RepoInfoFragment extends Fragment {
|
|||||||
return binding.repoMetaFrame.getVisibility() == View.VISIBLE;
|
return binding.repoMetaFrame.getVisibility() == View.VISIBLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void getRepoInfo(String token, final String owner, String repo, final String locale, final String timeFormat) {
|
private void getRepoInfo(String token, final String owner, String repo, Locale locale, final String timeFormat) {
|
||||||
|
|
||||||
final TinyDB tinyDb = TinyDB.getInstance(getContext());
|
final TinyDB tinyDb = TinyDB.getInstance(getContext());
|
||||||
|
|
||||||
@ -217,12 +217,12 @@ public class RepoInfoFragment extends Fragment {
|
|||||||
binding.repoMetaWatchers.setText(repoInfo.getWatchers_count());
|
binding.repoMetaWatchers.setText(repoInfo.getWatchers_count());
|
||||||
binding.repoMetaSize.setText(FileUtils.byteCountToDisplaySize((int) repoInfo.getSize() * 1024));
|
binding.repoMetaSize.setText(FileUtils.byteCountToDisplaySize((int) repoInfo.getSize() * 1024));
|
||||||
|
|
||||||
binding.repoMetaCreatedAt.setText(TimeHelper.formatTime(repoInfo.getCreated_at(), new Locale(locale), timeFormat, ctx));
|
binding.repoMetaCreatedAt.setText(TimeHelper.formatTime(repoInfo.getCreated_at(), locale, timeFormat, ctx));
|
||||||
if(timeFormat.equals("pretty")) {
|
if(timeFormat.equals("pretty")) {
|
||||||
binding.repoMetaCreatedAt.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(repoInfo.getCreated_at()), ctx));
|
binding.repoMetaCreatedAt.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(repoInfo.getCreated_at()), ctx));
|
||||||
}
|
}
|
||||||
|
|
||||||
String repoMetaUpdatedAt = TimeHelper.formatTime(repoInfo.getUpdated_at(), new Locale(locale), timeFormat, ctx);
|
String repoMetaUpdatedAt = TimeHelper.formatTime(repoInfo.getUpdated_at(), locale, timeFormat, ctx);
|
||||||
|
|
||||||
String website = (repoInfo.getWebsite().isEmpty()) ? getResources().getString(R.string.noDataWebsite) : repoInfo.getWebsite();
|
String website = (repoInfo.getWebsite().isEmpty()) ? getResources().getString(R.string.noDataWebsite) : repoInfo.getWebsite();
|
||||||
binding.repoMetaWebsite.setText(website);
|
binding.repoMetaWebsite.setText(website);
|
||||||
|
@ -69,7 +69,6 @@ public class RepositoriesFragment extends Fragment {
|
|||||||
createNewRepo = fragmentRepositoriesBinding.addNewRepo;
|
createNewRepo = fragmentRepositoriesBinding.addNewRepo;
|
||||||
|
|
||||||
createNewRepo.setOnClickListener(view -> {
|
createNewRepo.setOnClickListener(view -> {
|
||||||
|
|
||||||
Intent intent = new Intent(view.getContext(), CreateRepoActivity.class);
|
Intent intent = new Intent(view.getContext(), CreateRepoActivity.class);
|
||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
});
|
});
|
||||||
@ -79,9 +78,9 @@ public class RepositoriesFragment extends Fragment {
|
|||||||
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
|
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
|
||||||
if (dy > 0 && createNewRepo.isShown()) {
|
if (dy > 0 && createNewRepo.isShown()) {
|
||||||
createNewRepo.setVisibility(View.GONE);
|
createNewRepo.setVisibility(View.GONE);
|
||||||
} else if (dy < 0 ) {
|
}
|
||||||
|
else if (dy < 0 ) {
|
||||||
createNewRepo.setVisibility(View.VISIBLE);
|
createNewRepo.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,7 +134,6 @@ public class RepositoriesFragment extends Fragment {
|
|||||||
}
|
}
|
||||||
mProgressBar.setVisibility(View.GONE);
|
mProgressBar.setVisibility(View.GONE);
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -147,11 +145,6 @@ public class RepositoriesFragment extends Fragment {
|
|||||||
MenuItem searchItem = menu.findItem(R.id.action_search);
|
MenuItem searchItem = menu.findItem(R.id.action_search);
|
||||||
androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) searchItem.getActionView();
|
androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) searchItem.getActionView();
|
||||||
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
|
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
|
||||||
//searchView.setQueryHint(getContext().getString(R.string.strFilter));
|
|
||||||
|
|
||||||
/*if(!connToInternet) {
|
|
||||||
return;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
|
searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
|
||||||
@Override
|
@Override
|
||||||
@ -167,7 +160,6 @@ public class RepositoriesFragment extends Fragment {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,11 @@
|
|||||||
package org.mian.gitnex.fragments;
|
package org.mian.gitnex.fragments;
|
||||||
|
|
||||||
|
import android.app.Dialog;
|
||||||
import android.content.ActivityNotFoundException;
|
import android.content.ActivityNotFoundException;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.graphics.drawable.ColorDrawable;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
@ -20,7 +23,9 @@ import org.mian.gitnex.activities.SettingsNotificationsActivity;
|
|||||||
import org.mian.gitnex.activities.SettingsReportsActivity;
|
import org.mian.gitnex.activities.SettingsReportsActivity;
|
||||||
import org.mian.gitnex.activities.SettingsSecurityActivity;
|
import org.mian.gitnex.activities.SettingsSecurityActivity;
|
||||||
import org.mian.gitnex.activities.SettingsTranslationActivity;
|
import org.mian.gitnex.activities.SettingsTranslationActivity;
|
||||||
|
import org.mian.gitnex.databinding.CustomAboutDialogBinding;
|
||||||
import org.mian.gitnex.databinding.FragmentSettingsBinding;
|
import org.mian.gitnex.databinding.FragmentSettingsBinding;
|
||||||
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
import org.mian.gitnex.helpers.TinyDB;
|
import org.mian.gitnex.helpers.TinyDB;
|
||||||
import org.mian.gitnex.helpers.Version;
|
import org.mian.gitnex.helpers.Version;
|
||||||
|
|
||||||
@ -32,6 +37,7 @@ public class SettingsFragment extends Fragment {
|
|||||||
|
|
||||||
private Context ctx;
|
private Context ctx;
|
||||||
private TinyDB tinyDB;
|
private TinyDB tinyDB;
|
||||||
|
private Dialog aboutAppDialog;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@ -41,6 +47,7 @@ public class SettingsFragment extends Fragment {
|
|||||||
|
|
||||||
ctx = getContext();
|
ctx = getContext();
|
||||||
tinyDB = TinyDB.getInstance(ctx);
|
tinyDB = TinyDB.getInstance(ctx);
|
||||||
|
aboutAppDialog = new Dialog(ctx, R.style.ThemeOverlay_MaterialComponents_Dialog_Alert);
|
||||||
|
|
||||||
((MainActivity) requireActivity()).setActionBarTitle(getResources().getString(R.string.navSettings));
|
((MainActivity) requireActivity()).setActionBarTitle(getResources().getString(R.string.navSettings));
|
||||||
|
|
||||||
@ -63,37 +70,78 @@ public class SettingsFragment extends Fragment {
|
|||||||
|
|
||||||
fragmentSettingsBinding.reportsFrame.setOnClickListener(v1 -> startActivity(new Intent(ctx, SettingsReportsActivity.class)));
|
fragmentSettingsBinding.reportsFrame.setOnClickListener(v1 -> startActivity(new Intent(ctx, SettingsReportsActivity.class)));
|
||||||
|
|
||||||
fragmentSettingsBinding.rateAppFrame.setOnClickListener(aboutApp -> rateThisApp());
|
fragmentSettingsBinding.rateAppFrame.setOnClickListener(rateApp -> rateThisApp());
|
||||||
|
|
||||||
fragmentSettingsBinding.aboutAppFrame.setOnClickListener(aboutApp -> requireActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new AboutFragment()).commit());
|
fragmentSettingsBinding.aboutAppFrame.setOnClickListener(aboutApp -> showAboutAppDialog());
|
||||||
|
|
||||||
return fragmentSettingsBinding.getRoot();
|
return fragmentSettingsBinding.getRoot();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showAboutAppDialog() {
|
||||||
|
|
||||||
|
if (aboutAppDialog.getWindow() != null) {
|
||||||
|
aboutAppDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
|
||||||
|
}
|
||||||
|
|
||||||
|
CustomAboutDialogBinding aboutAppDialogBinding = CustomAboutDialogBinding.inflate(LayoutInflater.from(ctx));
|
||||||
|
View view = aboutAppDialogBinding.getRoot();
|
||||||
|
aboutAppDialog.setContentView(view);
|
||||||
|
|
||||||
|
aboutAppDialogBinding.appVersionBuild.setText(getString(R.string.appVersionBuild, AppUtil.getAppVersion(ctx), AppUtil.getAppBuildNo(ctx)));
|
||||||
|
aboutAppDialogBinding.userServerVersion.setText(tinyDB.getString("giteaVersion"));
|
||||||
|
|
||||||
|
aboutAppDialogBinding.donationLinkPatreon.setOnClickListener(v12 -> {
|
||||||
|
Intent intent = new Intent();
|
||||||
|
intent.setAction(Intent.ACTION_VIEW);
|
||||||
|
intent.addCategory(Intent.CATEGORY_BROWSABLE);
|
||||||
|
intent.setData(Uri.parse(getResources().getString(R.string.supportLinkPatreon)));
|
||||||
|
startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
|
aboutAppDialogBinding.translateLink.setOnClickListener(v13 -> {
|
||||||
|
Intent intent = new Intent();
|
||||||
|
intent.setAction(Intent.ACTION_VIEW);
|
||||||
|
intent.addCategory(Intent.CATEGORY_BROWSABLE);
|
||||||
|
intent.setData(Uri.parse(getResources().getString(R.string.crowdInLink)));
|
||||||
|
startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
|
aboutAppDialogBinding.appWebsite.setOnClickListener(v14 -> {
|
||||||
|
Intent intent = new Intent();
|
||||||
|
intent.setAction(Intent.ACTION_VIEW);
|
||||||
|
intent.addCategory(Intent.CATEGORY_BROWSABLE);
|
||||||
|
intent.setData(Uri.parse(getResources().getString(R.string.appWebsiteLink)));
|
||||||
|
startActivity(intent);
|
||||||
|
});
|
||||||
|
|
||||||
|
if(AppUtil.isPro(requireContext())) {
|
||||||
|
aboutAppDialogBinding.supportHeader.setVisibility(View.GONE);
|
||||||
|
aboutAppDialogBinding.dividerSupport.setVisibility(View.GONE);
|
||||||
|
aboutAppDialogBinding.donationLinkPatreon.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
aboutAppDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
|
||||||
|
aboutAppDialog.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void rateThisApp() {
|
public void rateThisApp() {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + requireActivity().getPackageName())));
|
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + requireActivity().getPackageName())));
|
||||||
}
|
}
|
||||||
catch(ActivityNotFoundException e) {
|
catch(ActivityNotFoundException e) {
|
||||||
|
|
||||||
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + requireActivity().getPackageName())));
|
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + requireActivity().getPackageName())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onResume() {
|
public void onResume() {
|
||||||
|
|
||||||
super.onResume();
|
super.onResume();
|
||||||
|
|
||||||
if(tinyDB.getBoolean("refreshParent")) {
|
if(tinyDB.getBoolean("refreshParent")) {
|
||||||
|
|
||||||
requireActivity().recreate();
|
requireActivity().recreate();
|
||||||
requireActivity().overridePendingTransition(0, 0);
|
requireActivity().overridePendingTransition(0, 0);
|
||||||
tinyDB.putBoolean("refreshParent", false);
|
tinyDB.putBoolean("refreshParent", false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,160 @@
|
|||||||
|
package org.mian.gitnex.fragments.profile;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import org.gitnex.tea4j.models.UserInfo;
|
||||||
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.clients.PicassoService;
|
||||||
|
import org.mian.gitnex.clients.RetrofitClient;
|
||||||
|
import org.mian.gitnex.databinding.FragmentProfileDetailBinding;
|
||||||
|
import org.mian.gitnex.helpers.AlertDialogs;
|
||||||
|
import org.mian.gitnex.helpers.AppUtil;
|
||||||
|
import org.mian.gitnex.helpers.Authorization;
|
||||||
|
import org.mian.gitnex.helpers.ClickListener;
|
||||||
|
import org.mian.gitnex.helpers.ColorInverter;
|
||||||
|
import org.mian.gitnex.helpers.RoundedTransformation;
|
||||||
|
import org.mian.gitnex.helpers.TimeHelper;
|
||||||
|
import org.mian.gitnex.helpers.TinyDB;
|
||||||
|
import org.mian.gitnex.helpers.Toasty;
|
||||||
|
import java.util.Locale;
|
||||||
|
import jp.wasabeef.picasso.transformations.BlurTransformation;
|
||||||
|
import retrofit2.Call;
|
||||||
|
import retrofit2.Callback;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Author M M Arif
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class DetailFragment extends Fragment {
|
||||||
|
|
||||||
|
private Context context;
|
||||||
|
private FragmentProfileDetailBinding binding;
|
||||||
|
Locale locale;
|
||||||
|
TinyDB tinyDb;
|
||||||
|
|
||||||
|
private static final String usernameBundle = "";
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
public DetailFragment() {}
|
||||||
|
|
||||||
|
public static DetailFragment newInstance(String username) {
|
||||||
|
DetailFragment fragment = new DetailFragment();
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
args.putString(usernameBundle, username);
|
||||||
|
fragment.setArguments(args);
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
if (getArguments() != null) {
|
||||||
|
username = getArguments().getString(usernameBundle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||||
|
|
||||||
|
binding = FragmentProfileDetailBinding.inflate(inflater, container, false);
|
||||||
|
context = getContext();
|
||||||
|
tinyDb = TinyDB.getInstance(context);
|
||||||
|
locale = getResources().getConfiguration().locale;
|
||||||
|
|
||||||
|
getProfileDetail(username);
|
||||||
|
|
||||||
|
return binding.getRoot();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void getProfileDetail(String username) {
|
||||||
|
|
||||||
|
Call<UserInfo> call = RetrofitClient
|
||||||
|
.getApiInterface(context)
|
||||||
|
.getUserProfile(Authorization.get(context), username);
|
||||||
|
|
||||||
|
call.enqueue(new Callback<UserInfo>() {
|
||||||
|
@Override
|
||||||
|
public void onResponse(@NonNull Call<UserInfo> call, @NonNull retrofit2.Response<UserInfo> response) {
|
||||||
|
|
||||||
|
if(response.isSuccessful() && response.body() != null) {
|
||||||
|
|
||||||
|
switch(response.code()) {
|
||||||
|
case 200:
|
||||||
|
String username = !response.body().getFullname().isEmpty() ? response.body().getFullname() : response.body().getUsername();
|
||||||
|
String email = !response.body().getEmail().isEmpty() ? response.body().getEmail() : "";
|
||||||
|
|
||||||
|
int imgRadius = AppUtil.getPixelsFromDensity(context, 3);
|
||||||
|
String timeFormat = tinyDb.getString("dateFormat");
|
||||||
|
|
||||||
|
binding.userFullName.setText(username);
|
||||||
|
binding.userLogin.setText(getString(R.string.usernameWithAt, response.body().getLogin()));
|
||||||
|
binding.userEmail.setText(email);
|
||||||
|
|
||||||
|
String[] userLanguageCodes = response.body().getLang().split("-");
|
||||||
|
|
||||||
|
if(userLanguageCodes.length >= 2) {
|
||||||
|
Locale locale = new Locale(userLanguageCodes[0], userLanguageCodes[1]);
|
||||||
|
binding.userLang.setText(locale.getDisplayLanguage());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
binding.userLang.setText(locale.getDisplayLanguage());
|
||||||
|
}
|
||||||
|
|
||||||
|
PicassoService.getInstance(context).get()
|
||||||
|
.load(response.body().getAvatar())
|
||||||
|
.transform(new RoundedTransformation(imgRadius, 0))
|
||||||
|
.placeholder(R.drawable.loader_animated)
|
||||||
|
.resize(120, 120)
|
||||||
|
.centerCrop()
|
||||||
|
.into(binding.userAvatar);
|
||||||
|
|
||||||
|
PicassoService.getInstance(context).get()
|
||||||
|
.load(response.body().getAvatar())
|
||||||
|
.transform(new BlurTransformation(context))
|
||||||
|
.into(binding.userAvatarBackground, new com.squareup.picasso.Callback() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSuccess() {
|
||||||
|
int invertedColor = new ColorInverter().getImageViewContrastColor(binding.userAvatarBackground);
|
||||||
|
|
||||||
|
binding.userFullName.setTextColor(invertedColor);
|
||||||
|
binding.userLogin.setTextColor(invertedColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public void onError(Exception e) {}
|
||||||
|
});
|
||||||
|
|
||||||
|
binding.userJoinedOn.setText(TimeHelper.formatTime(response.body().getCreated(), locale, timeFormat, context));
|
||||||
|
if(timeFormat.equals("pretty")) {
|
||||||
|
binding.userJoinedOn.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(response.body().getCreated()), context));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 401:
|
||||||
|
AlertDialogs
|
||||||
|
.authorizationTokenRevokedDialog(context, context.getResources().getString(R.string.alertDialogTokenRevokedTitle), context.getResources().getString(R.string.alertDialogTokenRevokedMessage), context.getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton), context.getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 403:
|
||||||
|
Toasty.error(context, context.getString(R.string.authorizeError));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NonNull Call<UserInfo> call, @NonNull Throwable t) {
|
||||||
|
Toasty.error(context, context.getResources().getString(R.string.genericError));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,272 @@
|
|||||||
|
package org.mian.gitnex.fragments.profile;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuInflater;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.view.inputmethod.EditorInfo;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.recyclerview.widget.DividerItemDecoration;
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
import org.gitnex.tea4j.models.UserInfo;
|
||||||
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.adapters.profile.FollowersAdapter;
|
||||||
|
import org.mian.gitnex.clients.RetrofitClient;
|
||||||
|
import org.mian.gitnex.databinding.FragmentProfileFollowersFollowingBinding;
|
||||||
|
import org.mian.gitnex.helpers.AlertDialogs;
|
||||||
|
import org.mian.gitnex.helpers.Authorization;
|
||||||
|
import org.mian.gitnex.helpers.Constants;
|
||||||
|
import org.mian.gitnex.helpers.SnackBar;
|
||||||
|
import org.mian.gitnex.helpers.TinyDB;
|
||||||
|
import org.mian.gitnex.helpers.Toasty;
|
||||||
|
import org.mian.gitnex.helpers.Version;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import retrofit2.Call;
|
||||||
|
import retrofit2.Callback;
|
||||||
|
import retrofit2.Response;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Author M M Arif
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class FollowersFragment extends Fragment {
|
||||||
|
|
||||||
|
private Context context;
|
||||||
|
private FragmentProfileFollowersFollowingBinding fragmentProfileFollowersFollowingBinding;
|
||||||
|
|
||||||
|
private List<UserInfo> usersList;
|
||||||
|
private FollowersAdapter adapter;
|
||||||
|
|
||||||
|
private int pageSize;
|
||||||
|
private int resultLimit = Constants.resultLimitOldGiteaInstances;
|
||||||
|
|
||||||
|
private static final String usernameBundle = "";
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
public FollowersFragment() {}
|
||||||
|
|
||||||
|
public static FollowersFragment newInstance(String username) {
|
||||||
|
FollowersFragment fragment = new FollowersFragment();
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
args.putString(usernameBundle, username);
|
||||||
|
fragment.setArguments(args);
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
if (getArguments() != null) {
|
||||||
|
username = getArguments().getString(usernameBundle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||||
|
|
||||||
|
fragmentProfileFollowersFollowingBinding = FragmentProfileFollowersFollowingBinding.inflate(inflater, container, false);
|
||||||
|
setHasOptionsMenu(true);
|
||||||
|
context = getContext();
|
||||||
|
|
||||||
|
TinyDB tinyDb = TinyDB.getInstance(context);
|
||||||
|
|
||||||
|
// if gitea is 1.12 or higher use the new limit
|
||||||
|
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) {
|
||||||
|
resultLimit = Constants.resultLimitNewGiteaInstances;
|
||||||
|
}
|
||||||
|
|
||||||
|
usersList = new ArrayList<>();
|
||||||
|
|
||||||
|
fragmentProfileFollowersFollowingBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
||||||
|
fragmentProfileFollowersFollowingBinding.pullToRefresh.setRefreshing(false);
|
||||||
|
loadInitial(Authorization.get(context), username, resultLimit);
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
}, 200));
|
||||||
|
|
||||||
|
adapter = new FollowersAdapter(context, usersList);
|
||||||
|
adapter.setLoadMoreListener(() -> fragmentProfileFollowersFollowingBinding.recyclerView.post(() -> {
|
||||||
|
if(usersList.size() == resultLimit || pageSize == resultLimit) {
|
||||||
|
int page = (usersList.size() + resultLimit) / resultLimit;
|
||||||
|
loadMore(Authorization.get(context), username, page, resultLimit);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(context, DividerItemDecoration.VERTICAL);
|
||||||
|
fragmentProfileFollowersFollowingBinding.recyclerView.setHasFixedSize(true);
|
||||||
|
fragmentProfileFollowersFollowingBinding.recyclerView.addItemDecoration(dividerItemDecoration);
|
||||||
|
fragmentProfileFollowersFollowingBinding.recyclerView.setLayoutManager(new LinearLayoutManager(context));
|
||||||
|
fragmentProfileFollowersFollowingBinding.recyclerView.setAdapter(adapter);
|
||||||
|
|
||||||
|
loadInitial(Authorization.get(context), username, resultLimit);
|
||||||
|
|
||||||
|
return fragmentProfileFollowersFollowingBinding.getRoot();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadInitial(String token, String username, int resultLimit) {
|
||||||
|
|
||||||
|
Call<List<UserInfo>> call = RetrofitClient
|
||||||
|
.getApiInterface(context)
|
||||||
|
.getUserFollowers(token, username, 1, resultLimit);
|
||||||
|
|
||||||
|
call.enqueue(new Callback<List<UserInfo>>() {
|
||||||
|
@Override
|
||||||
|
public void onResponse(@NonNull Call<List<UserInfo>> call, @NonNull Response<List<UserInfo>> response) {
|
||||||
|
|
||||||
|
if(response.isSuccessful()) {
|
||||||
|
|
||||||
|
switch(response.code()) {
|
||||||
|
case 200:
|
||||||
|
assert response.body() != null;
|
||||||
|
if(response.body().size() > 0) {
|
||||||
|
usersList.clear();
|
||||||
|
usersList.addAll(response.body());
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
fragmentProfileFollowersFollowingBinding.noData.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
usersList.clear();
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
fragmentProfileFollowersFollowingBinding.noData.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
fragmentProfileFollowersFollowingBinding.progressBar.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 401:
|
||||||
|
AlertDialogs.authorizationTokenRevokedDialog(context, getResources().getString(R.string.alertDialogTokenRevokedTitle),
|
||||||
|
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
|
||||||
|
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 403:
|
||||||
|
Toasty.error(context, context.getString(R.string.authorizeError));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 404:
|
||||||
|
fragmentProfileFollowersFollowingBinding.noData.setVisibility(View.VISIBLE);
|
||||||
|
fragmentProfileFollowersFollowingBinding.progressBar.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NonNull Call<List<UserInfo>> call, @NonNull Throwable t) {
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadMore(String token, String username, int page, int resultLimit) {
|
||||||
|
|
||||||
|
fragmentProfileFollowersFollowingBinding.progressLoadMore.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
|
Call<List<UserInfo>> call = RetrofitClient
|
||||||
|
.getApiInterface(context)
|
||||||
|
.getUserFollowers(token, username, page, resultLimit);
|
||||||
|
|
||||||
|
call.enqueue(new Callback<List<UserInfo>>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResponse(@NonNull Call<List<UserInfo>> call, @NonNull Response<List<UserInfo>> response) {
|
||||||
|
|
||||||
|
if(response.isSuccessful()) {
|
||||||
|
|
||||||
|
switch(response.code()) {
|
||||||
|
case 200:
|
||||||
|
List<UserInfo> result = response.body();
|
||||||
|
assert result != null;
|
||||||
|
if(result.size() > 0) {
|
||||||
|
pageSize = result.size();
|
||||||
|
usersList.addAll(result);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SnackBar.info(context, fragmentProfileFollowersFollowingBinding.getRoot(), getString(R.string.noMoreData));
|
||||||
|
adapter.setMoreDataAvailable(false);
|
||||||
|
}
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
fragmentProfileFollowersFollowingBinding.progressLoadMore.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 401:
|
||||||
|
AlertDialogs.authorizationTokenRevokedDialog(context, getResources().getString(R.string.alertDialogTokenRevokedTitle),
|
||||||
|
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
|
||||||
|
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 403:
|
||||||
|
Toasty.error(context, context.getString(R.string.authorizeError));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 404:
|
||||||
|
fragmentProfileFollowersFollowingBinding.noData.setVisibility(View.VISIBLE);
|
||||||
|
fragmentProfileFollowersFollowingBinding.progressBar.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NonNull Call<List<UserInfo>> call, @NonNull Throwable t) {
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
|
||||||
|
|
||||||
|
inflater.inflate(R.menu.search_menu, menu);
|
||||||
|
super.onCreateOptionsMenu(menu, inflater);
|
||||||
|
|
||||||
|
MenuItem searchItem = menu.findItem(R.id.action_search);
|
||||||
|
androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) searchItem.getActionView();
|
||||||
|
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
|
||||||
|
|
||||||
|
searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onQueryTextSubmit(String query) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onQueryTextChange(String newText) {
|
||||||
|
filter(newText);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void filter(String text) {
|
||||||
|
|
||||||
|
List<UserInfo> arr = new ArrayList<>();
|
||||||
|
|
||||||
|
for(UserInfo d : usersList) {
|
||||||
|
if(d == null || d.getUsername() == null || d.getFullname() == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(d.getUsername().toLowerCase().contains(text) || d.getFullname().toLowerCase().contains(text)) {
|
||||||
|
arr.add(d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
adapter.updateList(arr);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,273 @@
|
|||||||
|
package org.mian.gitnex.fragments.profile;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuInflater;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.view.inputmethod.EditorInfo;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.recyclerview.widget.DividerItemDecoration;
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
import org.gitnex.tea4j.models.UserInfo;
|
||||||
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.adapters.profile.FollowersAdapter;
|
||||||
|
import org.mian.gitnex.adapters.profile.FollowingAdapter;
|
||||||
|
import org.mian.gitnex.clients.RetrofitClient;
|
||||||
|
import org.mian.gitnex.databinding.FragmentProfileFollowersFollowingBinding;
|
||||||
|
import org.mian.gitnex.helpers.AlertDialogs;
|
||||||
|
import org.mian.gitnex.helpers.Authorization;
|
||||||
|
import org.mian.gitnex.helpers.Constants;
|
||||||
|
import org.mian.gitnex.helpers.SnackBar;
|
||||||
|
import org.mian.gitnex.helpers.TinyDB;
|
||||||
|
import org.mian.gitnex.helpers.Toasty;
|
||||||
|
import org.mian.gitnex.helpers.Version;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import retrofit2.Call;
|
||||||
|
import retrofit2.Callback;
|
||||||
|
import retrofit2.Response;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Author M M Arif
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class FollowingFragment extends Fragment {
|
||||||
|
|
||||||
|
private Context context;
|
||||||
|
private FragmentProfileFollowersFollowingBinding fragmentProfileFollowersFollowingBinding;
|
||||||
|
|
||||||
|
private List<UserInfo> usersList;
|
||||||
|
private FollowingAdapter adapter;
|
||||||
|
|
||||||
|
private int pageSize;
|
||||||
|
private int resultLimit = Constants.resultLimitOldGiteaInstances;
|
||||||
|
|
||||||
|
private static final String usernameBundle = "";
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
public FollowingFragment() {}
|
||||||
|
|
||||||
|
public static FollowingFragment newInstance(String username) {
|
||||||
|
FollowingFragment fragment = new FollowingFragment();
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
args.putString(usernameBundle, username);
|
||||||
|
fragment.setArguments(args);
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
if (getArguments() != null) {
|
||||||
|
username = getArguments().getString(usernameBundle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||||
|
|
||||||
|
fragmentProfileFollowersFollowingBinding = FragmentProfileFollowersFollowingBinding.inflate(inflater, container, false);
|
||||||
|
setHasOptionsMenu(true);
|
||||||
|
context = getContext();
|
||||||
|
|
||||||
|
TinyDB tinyDb = TinyDB.getInstance(context);
|
||||||
|
|
||||||
|
// if gitea is 1.12 or higher use the new limit
|
||||||
|
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) {
|
||||||
|
resultLimit = Constants.resultLimitNewGiteaInstances;
|
||||||
|
}
|
||||||
|
|
||||||
|
usersList = new ArrayList<>();
|
||||||
|
|
||||||
|
fragmentProfileFollowersFollowingBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
||||||
|
fragmentProfileFollowersFollowingBinding.pullToRefresh.setRefreshing(false);
|
||||||
|
loadInitial(Authorization.get(context), username, resultLimit);
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
}, 200));
|
||||||
|
|
||||||
|
adapter = new FollowingAdapter(context, usersList);
|
||||||
|
adapter.setLoadMoreListener(() -> fragmentProfileFollowersFollowingBinding.recyclerView.post(() -> {
|
||||||
|
if(usersList.size() == resultLimit || pageSize == resultLimit) {
|
||||||
|
int page = (usersList.size() + resultLimit) / resultLimit;
|
||||||
|
loadMore(Authorization.get(context), username, page, resultLimit);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(context, DividerItemDecoration.VERTICAL);
|
||||||
|
fragmentProfileFollowersFollowingBinding.recyclerView.setHasFixedSize(true);
|
||||||
|
fragmentProfileFollowersFollowingBinding.recyclerView.addItemDecoration(dividerItemDecoration);
|
||||||
|
fragmentProfileFollowersFollowingBinding.recyclerView.setLayoutManager(new LinearLayoutManager(context));
|
||||||
|
fragmentProfileFollowersFollowingBinding.recyclerView.setAdapter(adapter);
|
||||||
|
|
||||||
|
loadInitial(Authorization.get(context), username, resultLimit);
|
||||||
|
|
||||||
|
return fragmentProfileFollowersFollowingBinding.getRoot();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadInitial(String token, String username, int resultLimit) {
|
||||||
|
|
||||||
|
Call<List<UserInfo>> call = RetrofitClient
|
||||||
|
.getApiInterface(context)
|
||||||
|
.getUserFollowing(token, username, 1, resultLimit);
|
||||||
|
|
||||||
|
call.enqueue(new Callback<List<UserInfo>>() {
|
||||||
|
@Override
|
||||||
|
public void onResponse(@NonNull Call<List<UserInfo>> call, @NonNull Response<List<UserInfo>> response) {
|
||||||
|
|
||||||
|
if(response.isSuccessful()) {
|
||||||
|
|
||||||
|
switch(response.code()) {
|
||||||
|
case 200:
|
||||||
|
assert response.body() != null;
|
||||||
|
if(response.body().size() > 0) {
|
||||||
|
usersList.clear();
|
||||||
|
usersList.addAll(response.body());
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
fragmentProfileFollowersFollowingBinding.noData.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
usersList.clear();
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
fragmentProfileFollowersFollowingBinding.noData.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
fragmentProfileFollowersFollowingBinding.progressBar.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 401:
|
||||||
|
AlertDialogs.authorizationTokenRevokedDialog(context, getResources().getString(R.string.alertDialogTokenRevokedTitle),
|
||||||
|
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
|
||||||
|
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 403:
|
||||||
|
Toasty.error(context, context.getString(R.string.authorizeError));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 404:
|
||||||
|
fragmentProfileFollowersFollowingBinding.noData.setVisibility(View.VISIBLE);
|
||||||
|
fragmentProfileFollowersFollowingBinding.progressBar.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NonNull Call<List<UserInfo>> call, @NonNull Throwable t) {
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadMore(String token, String username, int page, int resultLimit) {
|
||||||
|
|
||||||
|
fragmentProfileFollowersFollowingBinding.progressLoadMore.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
|
Call<List<UserInfo>> call = RetrofitClient
|
||||||
|
.getApiInterface(context)
|
||||||
|
.getUserFollowing(token, username, page, resultLimit);
|
||||||
|
|
||||||
|
call.enqueue(new Callback<List<UserInfo>>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResponse(@NonNull Call<List<UserInfo>> call, @NonNull Response<List<UserInfo>> response) {
|
||||||
|
|
||||||
|
if(response.isSuccessful()) {
|
||||||
|
|
||||||
|
switch(response.code()) {
|
||||||
|
case 200:
|
||||||
|
List<UserInfo> result = response.body();
|
||||||
|
assert result != null;
|
||||||
|
if(result.size() > 0) {
|
||||||
|
pageSize = result.size();
|
||||||
|
usersList.addAll(result);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SnackBar.info(context, fragmentProfileFollowersFollowingBinding.getRoot(), getString(R.string.noMoreData));
|
||||||
|
adapter.setMoreDataAvailable(false);
|
||||||
|
}
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
fragmentProfileFollowersFollowingBinding.progressLoadMore.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 401:
|
||||||
|
AlertDialogs.authorizationTokenRevokedDialog(context, getResources().getString(R.string.alertDialogTokenRevokedTitle),
|
||||||
|
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
|
||||||
|
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 403:
|
||||||
|
Toasty.error(context, context.getString(R.string.authorizeError));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 404:
|
||||||
|
fragmentProfileFollowersFollowingBinding.noData.setVisibility(View.VISIBLE);
|
||||||
|
fragmentProfileFollowersFollowingBinding.progressBar.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NonNull Call<List<UserInfo>> call, @NonNull Throwable t) {
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
|
||||||
|
|
||||||
|
inflater.inflate(R.menu.search_menu, menu);
|
||||||
|
super.onCreateOptionsMenu(menu, inflater);
|
||||||
|
|
||||||
|
MenuItem searchItem = menu.findItem(R.id.action_search);
|
||||||
|
androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) searchItem.getActionView();
|
||||||
|
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
|
||||||
|
|
||||||
|
searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onQueryTextSubmit(String query) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onQueryTextChange(String newText) {
|
||||||
|
filter(newText);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void filter(String text) {
|
||||||
|
|
||||||
|
List<UserInfo> arr = new ArrayList<>();
|
||||||
|
|
||||||
|
for(UserInfo d : usersList) {
|
||||||
|
if(d == null || d.getUsername() == null || d.getFullname() == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(d.getUsername().toLowerCase().contains(text) || d.getFullname().toLowerCase().contains(text)) {
|
||||||
|
arr.add(d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
adapter.updateList(arr);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,274 @@
|
|||||||
|
package org.mian.gitnex.fragments.profile;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuInflater;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.view.inputmethod.EditorInfo;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.recyclerview.widget.DividerItemDecoration;
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
import org.gitnex.tea4j.models.UserOrganizations;
|
||||||
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.adapters.profile.OrganizationsAdapter;
|
||||||
|
import org.mian.gitnex.clients.RetrofitClient;
|
||||||
|
import org.mian.gitnex.databinding.FragmentOrganizationsBinding;
|
||||||
|
import org.mian.gitnex.helpers.AlertDialogs;
|
||||||
|
import org.mian.gitnex.helpers.Authorization;
|
||||||
|
import org.mian.gitnex.helpers.Constants;
|
||||||
|
import org.mian.gitnex.helpers.SnackBar;
|
||||||
|
import org.mian.gitnex.helpers.TinyDB;
|
||||||
|
import org.mian.gitnex.helpers.Toasty;
|
||||||
|
import org.mian.gitnex.helpers.Version;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import retrofit2.Call;
|
||||||
|
import retrofit2.Callback;
|
||||||
|
import retrofit2.Response;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Author M M Arif
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class OrganizationsFragment extends Fragment {
|
||||||
|
|
||||||
|
private Context context;
|
||||||
|
private FragmentOrganizationsBinding fragmentOrganizationsBinding;
|
||||||
|
|
||||||
|
private List<UserOrganizations> organizationsList;
|
||||||
|
private OrganizationsAdapter adapter;
|
||||||
|
|
||||||
|
private int pageSize;
|
||||||
|
private int resultLimit = Constants.resultLimitOldGiteaInstances;
|
||||||
|
|
||||||
|
private static final String usernameBundle = "";
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
public OrganizationsFragment() {}
|
||||||
|
|
||||||
|
public static OrganizationsFragment newInstance(String username) {
|
||||||
|
OrganizationsFragment fragment = new OrganizationsFragment();
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
args.putString(usernameBundle, username);
|
||||||
|
fragment.setArguments(args);
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
if (getArguments() != null) {
|
||||||
|
username = getArguments().getString(usernameBundle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||||
|
|
||||||
|
fragmentOrganizationsBinding = FragmentOrganizationsBinding.inflate(inflater, container, false);
|
||||||
|
setHasOptionsMenu(true);
|
||||||
|
context = getContext();
|
||||||
|
|
||||||
|
TinyDB tinyDb = TinyDB.getInstance(context);
|
||||||
|
|
||||||
|
// if gitea is 1.12 or higher use the new limit
|
||||||
|
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) {
|
||||||
|
resultLimit = Constants.resultLimitNewGiteaInstances;
|
||||||
|
}
|
||||||
|
|
||||||
|
organizationsList = new ArrayList<>();
|
||||||
|
|
||||||
|
fragmentOrganizationsBinding.addNewOrganization.setVisibility(View.GONE);
|
||||||
|
|
||||||
|
fragmentOrganizationsBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
||||||
|
fragmentOrganizationsBinding.pullToRefresh.setRefreshing(false);
|
||||||
|
loadInitial(Authorization.get(context), username, resultLimit);
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
}, 200));
|
||||||
|
|
||||||
|
adapter = new OrganizationsAdapter(context, organizationsList);
|
||||||
|
adapter.setLoadMoreListener(() -> fragmentOrganizationsBinding.recyclerView.post(() -> {
|
||||||
|
if(organizationsList.size() == resultLimit || pageSize == resultLimit) {
|
||||||
|
int page = (organizationsList.size() + resultLimit) / resultLimit;
|
||||||
|
loadMore(Authorization.get(context), username, page, resultLimit);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(context, DividerItemDecoration.VERTICAL);
|
||||||
|
fragmentOrganizationsBinding.recyclerView.setHasFixedSize(true);
|
||||||
|
fragmentOrganizationsBinding.recyclerView.addItemDecoration(dividerItemDecoration);
|
||||||
|
fragmentOrganizationsBinding.recyclerView.setLayoutManager(new LinearLayoutManager(context));
|
||||||
|
fragmentOrganizationsBinding.recyclerView.setAdapter(adapter);
|
||||||
|
|
||||||
|
loadInitial(Authorization.get(context), username, resultLimit);
|
||||||
|
|
||||||
|
return fragmentOrganizationsBinding.getRoot();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadInitial(String token, String username, int resultLimit) {
|
||||||
|
|
||||||
|
Call<List<UserOrganizations>> call = RetrofitClient
|
||||||
|
.getApiInterface(context)
|
||||||
|
.getUserProfileOrganizations(token, username, 1, resultLimit);
|
||||||
|
|
||||||
|
call.enqueue(new Callback<List<UserOrganizations>>() {
|
||||||
|
@Override
|
||||||
|
public void onResponse(@NonNull Call<List<UserOrganizations>> call, @NonNull Response<List<UserOrganizations>> response) {
|
||||||
|
|
||||||
|
if(response.isSuccessful()) {
|
||||||
|
|
||||||
|
switch(response.code()) {
|
||||||
|
case 200:
|
||||||
|
assert response.body() != null;
|
||||||
|
if(response.body().size() > 0) {
|
||||||
|
organizationsList.clear();
|
||||||
|
organizationsList.addAll(response.body());
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
fragmentOrganizationsBinding.noDataOrg.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
organizationsList.clear();
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
fragmentOrganizationsBinding.noDataOrg.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
fragmentOrganizationsBinding.progressBar.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 401:
|
||||||
|
AlertDialogs.authorizationTokenRevokedDialog(context, getResources().getString(R.string.alertDialogTokenRevokedTitle),
|
||||||
|
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
|
||||||
|
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 403:
|
||||||
|
Toasty.error(context, context.getString(R.string.authorizeError));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 404:
|
||||||
|
fragmentOrganizationsBinding.noDataOrg.setVisibility(View.VISIBLE);
|
||||||
|
fragmentOrganizationsBinding.progressBar.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NonNull Call<List<UserOrganizations>> call, @NonNull Throwable t) {
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadMore(String token, String username, int page, int resultLimit) {
|
||||||
|
|
||||||
|
fragmentOrganizationsBinding.progressLoadMore.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
|
Call<List<UserOrganizations>> call = RetrofitClient
|
||||||
|
.getApiInterface(context)
|
||||||
|
.getUserProfileOrganizations(token, username, page, resultLimit);
|
||||||
|
|
||||||
|
call.enqueue(new Callback<List<UserOrganizations>>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResponse(@NonNull Call<List<UserOrganizations>> call, @NonNull Response<List<UserOrganizations>> response) {
|
||||||
|
|
||||||
|
if(response.isSuccessful()) {
|
||||||
|
|
||||||
|
switch(response.code()) {
|
||||||
|
case 200:
|
||||||
|
List<UserOrganizations> result = response.body();
|
||||||
|
assert result != null;
|
||||||
|
if(result.size() > 0) {
|
||||||
|
pageSize = result.size();
|
||||||
|
organizationsList.addAll(result);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SnackBar.info(context, fragmentOrganizationsBinding.getRoot(), getString(R.string.noMoreData));
|
||||||
|
adapter.setMoreDataAvailable(false);
|
||||||
|
}
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
fragmentOrganizationsBinding.progressLoadMore.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 401:
|
||||||
|
AlertDialogs.authorizationTokenRevokedDialog(context, getResources().getString(R.string.alertDialogTokenRevokedTitle),
|
||||||
|
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
|
||||||
|
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 403:
|
||||||
|
Toasty.error(context, context.getString(R.string.authorizeError));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 404:
|
||||||
|
fragmentOrganizationsBinding.noDataOrg.setVisibility(View.VISIBLE);
|
||||||
|
fragmentOrganizationsBinding.progressBar.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NonNull Call<List<UserOrganizations>> call, @NonNull Throwable t) {
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
|
||||||
|
|
||||||
|
inflater.inflate(R.menu.search_menu, menu);
|
||||||
|
super.onCreateOptionsMenu(menu, inflater);
|
||||||
|
|
||||||
|
MenuItem searchItem = menu.findItem(R.id.action_search);
|
||||||
|
androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) searchItem.getActionView();
|
||||||
|
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
|
||||||
|
|
||||||
|
searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onQueryTextSubmit(String query) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onQueryTextChange(String newText) {
|
||||||
|
filter(newText);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void filter(String text) {
|
||||||
|
|
||||||
|
List<UserOrganizations> arr = new ArrayList<>();
|
||||||
|
|
||||||
|
for(UserOrganizations d : organizationsList) {
|
||||||
|
if(d == null || d.getUsername() == null || d.getDescription() == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(d.getUsername().toLowerCase().contains(text) || d.getDescription().toLowerCase().contains(text)) {
|
||||||
|
arr.add(d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
adapter.updateList(arr);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,271 @@
|
|||||||
|
package org.mian.gitnex.fragments.profile;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuInflater;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.view.inputmethod.EditorInfo;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.recyclerview.widget.DividerItemDecoration;
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
import org.gitnex.tea4j.models.UserRepositories;
|
||||||
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.adapters.profile.RepositoriesAdapter;
|
||||||
|
import org.mian.gitnex.clients.RetrofitClient;
|
||||||
|
import org.mian.gitnex.databinding.FragmentRepositoriesBinding;
|
||||||
|
import org.mian.gitnex.helpers.AlertDialogs;
|
||||||
|
import org.mian.gitnex.helpers.Authorization;
|
||||||
|
import org.mian.gitnex.helpers.Constants;
|
||||||
|
import org.mian.gitnex.helpers.SnackBar;
|
||||||
|
import org.mian.gitnex.helpers.TinyDB;
|
||||||
|
import org.mian.gitnex.helpers.Toasty;
|
||||||
|
import org.mian.gitnex.helpers.Version;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import retrofit2.Call;
|
||||||
|
import retrofit2.Callback;
|
||||||
|
import retrofit2.Response;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Author M M Arif
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class RepositoriesFragment extends Fragment {
|
||||||
|
|
||||||
|
private Context context;
|
||||||
|
private FragmentRepositoriesBinding fragmentRepositoriesBinding;
|
||||||
|
|
||||||
|
private List<UserRepositories> reposList;
|
||||||
|
private RepositoriesAdapter adapter;
|
||||||
|
|
||||||
|
private int pageSize;
|
||||||
|
private int resultLimit = Constants.resultLimitOldGiteaInstances;
|
||||||
|
|
||||||
|
private static final String usernameBundle = "";
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
public RepositoriesFragment() {}
|
||||||
|
|
||||||
|
public static RepositoriesFragment newInstance(String username) {
|
||||||
|
RepositoriesFragment fragment = new RepositoriesFragment();
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
args.putString(usernameBundle, username);
|
||||||
|
fragment.setArguments(args);
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
if (getArguments() != null) {
|
||||||
|
username = getArguments().getString(usernameBundle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||||
|
|
||||||
|
fragmentRepositoriesBinding = FragmentRepositoriesBinding.inflate(inflater, container, false);
|
||||||
|
setHasOptionsMenu(true);
|
||||||
|
context = getContext();
|
||||||
|
|
||||||
|
TinyDB tinyDb = TinyDB.getInstance(context);
|
||||||
|
|
||||||
|
// if gitea is 1.12 or higher use the new limit
|
||||||
|
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) {
|
||||||
|
resultLimit = Constants.resultLimitNewGiteaInstances;
|
||||||
|
}
|
||||||
|
|
||||||
|
reposList = new ArrayList<>();
|
||||||
|
|
||||||
|
fragmentRepositoriesBinding.addNewRepo.setVisibility(View.GONE);
|
||||||
|
|
||||||
|
fragmentRepositoriesBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
||||||
|
fragmentRepositoriesBinding.pullToRefresh.setRefreshing(false);
|
||||||
|
loadInitial(Authorization.get(context), username, resultLimit);
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
}, 200));
|
||||||
|
|
||||||
|
adapter = new RepositoriesAdapter(context, reposList);
|
||||||
|
adapter.setLoadMoreListener(() -> fragmentRepositoriesBinding.recyclerView.post(() -> {
|
||||||
|
if(reposList.size() == resultLimit || pageSize == resultLimit) {
|
||||||
|
int page = (reposList.size() + resultLimit) / resultLimit;
|
||||||
|
loadMore(Authorization.get(context), username, page, resultLimit);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(context, DividerItemDecoration.VERTICAL);
|
||||||
|
fragmentRepositoriesBinding.recyclerView.setHasFixedSize(true);
|
||||||
|
fragmentRepositoriesBinding.recyclerView.addItemDecoration(dividerItemDecoration);
|
||||||
|
fragmentRepositoriesBinding.recyclerView.setLayoutManager(new LinearLayoutManager(context));
|
||||||
|
fragmentRepositoriesBinding.recyclerView.setAdapter(adapter);
|
||||||
|
|
||||||
|
loadInitial(Authorization.get(context), username, resultLimit);
|
||||||
|
|
||||||
|
return fragmentRepositoriesBinding.getRoot();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadInitial(String token, String username, int resultLimit) {
|
||||||
|
|
||||||
|
Call<List<UserRepositories>> call = RetrofitClient
|
||||||
|
.getApiInterface(context).getUserProfileRepositories(token, username, 1, resultLimit);
|
||||||
|
|
||||||
|
call.enqueue(new Callback<List<UserRepositories>>() {
|
||||||
|
@Override
|
||||||
|
public void onResponse(@NonNull Call<List<UserRepositories>> call, @NonNull Response<List<UserRepositories>> response) {
|
||||||
|
|
||||||
|
if(response.isSuccessful()) {
|
||||||
|
|
||||||
|
switch(response.code()) {
|
||||||
|
case 200:
|
||||||
|
assert response.body() != null;
|
||||||
|
if(response.body().size() > 0) {
|
||||||
|
reposList.clear();
|
||||||
|
reposList.addAll(response.body());
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
fragmentRepositoriesBinding.noData.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
reposList.clear();
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
fragmentRepositoriesBinding.noData.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
fragmentRepositoriesBinding.progressBar.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 401:
|
||||||
|
AlertDialogs.authorizationTokenRevokedDialog(context, getResources().getString(R.string.alertDialogTokenRevokedTitle),
|
||||||
|
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
|
||||||
|
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 403:
|
||||||
|
Toasty.error(context, context.getString(R.string.authorizeError));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 404:
|
||||||
|
fragmentRepositoriesBinding.noData.setVisibility(View.VISIBLE);
|
||||||
|
fragmentRepositoriesBinding.progressBar.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NonNull Call<List<UserRepositories>> call, @NonNull Throwable t) {
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadMore(String token, String username, int page, int resultLimit) {
|
||||||
|
|
||||||
|
fragmentRepositoriesBinding.progressLoadMore.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
|
Call<List<UserRepositories>> call = RetrofitClient.getApiInterface(context).getUserProfileRepositories(token, username, page, resultLimit);
|
||||||
|
|
||||||
|
call.enqueue(new Callback<List<UserRepositories>>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResponse(@NonNull Call<List<UserRepositories>> call, @NonNull Response<List<UserRepositories>> response) {
|
||||||
|
|
||||||
|
if(response.isSuccessful()) {
|
||||||
|
|
||||||
|
switch(response.code()) {
|
||||||
|
case 200:
|
||||||
|
List<UserRepositories> result = response.body();
|
||||||
|
assert result != null;
|
||||||
|
if(result.size() > 0) {
|
||||||
|
pageSize = result.size();
|
||||||
|
reposList.addAll(result);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SnackBar.info(context, fragmentRepositoriesBinding.getRoot(), getString(R.string.noMoreData));
|
||||||
|
adapter.setMoreDataAvailable(false);
|
||||||
|
}
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
fragmentRepositoriesBinding.progressLoadMore.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 401:
|
||||||
|
AlertDialogs.authorizationTokenRevokedDialog(context, getResources().getString(R.string.alertDialogTokenRevokedTitle),
|
||||||
|
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
|
||||||
|
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 403:
|
||||||
|
Toasty.error(context, context.getString(R.string.authorizeError));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 404:
|
||||||
|
fragmentRepositoriesBinding.noData.setVisibility(View.VISIBLE);
|
||||||
|
fragmentRepositoriesBinding.progressBar.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NonNull Call<List<UserRepositories>> call, @NonNull Throwable t) {
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
|
||||||
|
|
||||||
|
inflater.inflate(R.menu.search_menu, menu);
|
||||||
|
super.onCreateOptionsMenu(menu, inflater);
|
||||||
|
|
||||||
|
MenuItem searchItem = menu.findItem(R.id.action_search);
|
||||||
|
androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) searchItem.getActionView();
|
||||||
|
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
|
||||||
|
|
||||||
|
searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onQueryTextSubmit(String query) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onQueryTextChange(String newText) {
|
||||||
|
filter(newText);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void filter(String text) {
|
||||||
|
|
||||||
|
List<UserRepositories> arr = new ArrayList<>();
|
||||||
|
|
||||||
|
for(UserRepositories d : reposList) {
|
||||||
|
if(d == null || d.getFullName() == null || d.getDescription() == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(d.getFullName().toLowerCase().contains(text) || d.getDescription().toLowerCase().contains(text)) {
|
||||||
|
arr.add(d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
adapter.updateList(arr);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,273 @@
|
|||||||
|
package org.mian.gitnex.fragments.profile;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuInflater;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.view.inputmethod.EditorInfo;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.recyclerview.widget.DividerItemDecoration;
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
import org.gitnex.tea4j.models.UserRepositories;
|
||||||
|
import org.mian.gitnex.R;
|
||||||
|
import org.mian.gitnex.adapters.profile.StarredRepositoriesAdapter;
|
||||||
|
import org.mian.gitnex.clients.RetrofitClient;
|
||||||
|
import org.mian.gitnex.databinding.FragmentRepositoriesBinding;
|
||||||
|
import org.mian.gitnex.helpers.AlertDialogs;
|
||||||
|
import org.mian.gitnex.helpers.Authorization;
|
||||||
|
import org.mian.gitnex.helpers.Constants;
|
||||||
|
import org.mian.gitnex.helpers.SnackBar;
|
||||||
|
import org.mian.gitnex.helpers.TinyDB;
|
||||||
|
import org.mian.gitnex.helpers.Toasty;
|
||||||
|
import org.mian.gitnex.helpers.Version;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import retrofit2.Call;
|
||||||
|
import retrofit2.Callback;
|
||||||
|
import retrofit2.Response;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Author M M Arif
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class StarredRepositoriesFragment extends Fragment {
|
||||||
|
|
||||||
|
private Context context;
|
||||||
|
private FragmentRepositoriesBinding fragmentRepositoriesBinding;
|
||||||
|
|
||||||
|
private List<UserRepositories> reposList;
|
||||||
|
private StarredRepositoriesAdapter adapter;
|
||||||
|
|
||||||
|
private int pageSize;
|
||||||
|
private int resultLimit = Constants.resultLimitOldGiteaInstances;
|
||||||
|
|
||||||
|
private static final String usernameBundle = "";
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
public StarredRepositoriesFragment() {}
|
||||||
|
|
||||||
|
public static StarredRepositoriesFragment newInstance(String username) {
|
||||||
|
StarredRepositoriesFragment fragment = new StarredRepositoriesFragment();
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
args.putString(usernameBundle, username);
|
||||||
|
fragment.setArguments(args);
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
if (getArguments() != null) {
|
||||||
|
username = getArguments().getString(usernameBundle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||||
|
|
||||||
|
fragmentRepositoriesBinding = org.mian.gitnex.databinding.FragmentRepositoriesBinding.inflate(inflater, container, false);
|
||||||
|
setHasOptionsMenu(true);
|
||||||
|
context = getContext();
|
||||||
|
TinyDB tinyDb = TinyDB.getInstance(context);
|
||||||
|
|
||||||
|
// if gitea is 1.12 or higher use the new limit
|
||||||
|
if(new Version(tinyDb.getString("giteaVersion")).higherOrEqual("1.12.0")) {
|
||||||
|
resultLimit = Constants.resultLimitNewGiteaInstances;
|
||||||
|
}
|
||||||
|
|
||||||
|
reposList = new ArrayList<>();
|
||||||
|
|
||||||
|
fragmentRepositoriesBinding.addNewRepo.setVisibility(View.GONE);
|
||||||
|
|
||||||
|
fragmentRepositoriesBinding.pullToRefresh.setOnRefreshListener(() -> new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
||||||
|
fragmentRepositoriesBinding.pullToRefresh.setRefreshing(false);
|
||||||
|
loadInitial(Authorization.get(context), username, resultLimit);
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
}, 200));
|
||||||
|
|
||||||
|
adapter = new StarredRepositoriesAdapter(context, reposList);
|
||||||
|
adapter.setLoadMoreListener(() -> fragmentRepositoriesBinding.recyclerView.post(() -> {
|
||||||
|
if(reposList.size() == resultLimit || pageSize == resultLimit) {
|
||||||
|
int page = (reposList.size() + resultLimit) / resultLimit;
|
||||||
|
loadMore(Authorization.get(context), username, page, resultLimit);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(context, DividerItemDecoration.VERTICAL);
|
||||||
|
fragmentRepositoriesBinding.recyclerView.setHasFixedSize(true);
|
||||||
|
fragmentRepositoriesBinding.recyclerView.addItemDecoration(dividerItemDecoration);
|
||||||
|
fragmentRepositoriesBinding.recyclerView.setLayoutManager(new LinearLayoutManager(context));
|
||||||
|
fragmentRepositoriesBinding.recyclerView.setAdapter(adapter);
|
||||||
|
|
||||||
|
loadInitial(Authorization.get(context), username, resultLimit);
|
||||||
|
|
||||||
|
return fragmentRepositoriesBinding.getRoot();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadInitial(String token, String username, int resultLimit) {
|
||||||
|
|
||||||
|
Call<List<UserRepositories>> call = RetrofitClient
|
||||||
|
.getApiInterface(context)
|
||||||
|
.getUserProfileStarredRepositories(token, username, 1, resultLimit);
|
||||||
|
|
||||||
|
call.enqueue(new Callback<List<UserRepositories>>() {
|
||||||
|
@Override
|
||||||
|
public void onResponse(@NonNull Call<List<UserRepositories>> call, @NonNull Response<List<UserRepositories>> response) {
|
||||||
|
|
||||||
|
if(response.isSuccessful()) {
|
||||||
|
|
||||||
|
switch(response.code()) {
|
||||||
|
case 200:
|
||||||
|
assert response.body() != null;
|
||||||
|
if(response.body().size() > 0) {
|
||||||
|
reposList.clear();
|
||||||
|
reposList.addAll(response.body());
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
fragmentRepositoriesBinding.noData.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
reposList.clear();
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
fragmentRepositoriesBinding.noData.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
fragmentRepositoriesBinding.progressBar.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 401:
|
||||||
|
AlertDialogs.authorizationTokenRevokedDialog(context, getResources().getString(R.string.alertDialogTokenRevokedTitle),
|
||||||
|
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
|
||||||
|
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 403:
|
||||||
|
Toasty.error(context, context.getString(R.string.authorizeError));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 404:
|
||||||
|
fragmentRepositoriesBinding.noData.setVisibility(View.VISIBLE);
|
||||||
|
fragmentRepositoriesBinding.progressBar.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NonNull Call<List<UserRepositories>> call, @NonNull Throwable t) {
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadMore(String token, String username, int page, int resultLimit) {
|
||||||
|
|
||||||
|
fragmentRepositoriesBinding.progressLoadMore.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
|
Call<List<UserRepositories>> call = RetrofitClient
|
||||||
|
.getApiInterface(context)
|
||||||
|
.getUserProfileStarredRepositories(token, username, page, resultLimit);
|
||||||
|
|
||||||
|
call.enqueue(new Callback<List<UserRepositories>>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResponse(@NonNull Call<List<UserRepositories>> call, @NonNull Response<List<UserRepositories>> response) {
|
||||||
|
|
||||||
|
if(response.isSuccessful()) {
|
||||||
|
|
||||||
|
switch(response.code()) {
|
||||||
|
case 200:
|
||||||
|
List<UserRepositories> result = response.body();
|
||||||
|
assert result != null;
|
||||||
|
if(result.size() > 0) {
|
||||||
|
pageSize = result.size();
|
||||||
|
reposList.addAll(result);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SnackBar.info(context, fragmentRepositoriesBinding.getRoot(), getString(R.string.noMoreData));
|
||||||
|
adapter.setMoreDataAvailable(false);
|
||||||
|
}
|
||||||
|
adapter.notifyDataChanged();
|
||||||
|
fragmentRepositoriesBinding.progressLoadMore.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 401:
|
||||||
|
AlertDialogs.authorizationTokenRevokedDialog(context, getResources().getString(R.string.alertDialogTokenRevokedTitle),
|
||||||
|
getResources().getString(R.string.alertDialogTokenRevokedMessage), getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
|
||||||
|
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 403:
|
||||||
|
Toasty.error(context, context.getString(R.string.authorizeError));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 404:
|
||||||
|
fragmentRepositoriesBinding.noData.setVisibility(View.VISIBLE);
|
||||||
|
fragmentRepositoriesBinding.progressBar.setVisibility(View.GONE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NonNull Call<List<UserRepositories>> call, @NonNull Throwable t) {
|
||||||
|
Toasty.error(context, getString(R.string.genericError));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
|
||||||
|
|
||||||
|
inflater.inflate(R.menu.search_menu, menu);
|
||||||
|
super.onCreateOptionsMenu(menu, inflater);
|
||||||
|
|
||||||
|
MenuItem searchItem = menu.findItem(R.id.action_search);
|
||||||
|
androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) searchItem.getActionView();
|
||||||
|
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
|
||||||
|
|
||||||
|
searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onQueryTextSubmit(String query) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onQueryTextChange(String newText) {
|
||||||
|
filter(newText);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void filter(String text) {
|
||||||
|
|
||||||
|
List<UserRepositories> arr = new ArrayList<>();
|
||||||
|
|
||||||
|
for(UserRepositories d : reposList) {
|
||||||
|
if(d == null || d.getFullName() == null || d.getDescription() == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(d.getFullName().toLowerCase().contains(text) || d.getDescription().toLowerCase().contains(text)) {
|
||||||
|
arr.add(d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
adapter.updateList(arr);
|
||||||
|
}
|
||||||
|
}
|
@ -27,9 +27,9 @@ public class Constants {
|
|||||||
public static final String tagMilestonesAdapter = "MilestonesAdapter";
|
public static final String tagMilestonesAdapter = "MilestonesAdapter";
|
||||||
public static final String draftsApi = "DraftsApi";
|
public static final String draftsApi = "DraftsApi";
|
||||||
public static final String repositoriesApi = "RepositoriesApi";
|
public static final String repositoriesApi = "RepositoriesApi";
|
||||||
public static final String replyToIssueActivity = "ReplyToIssueActivity";
|
|
||||||
public static final String tagDraftsBottomSheet = "BottomSheetDraftsFragment";
|
public static final String tagDraftsBottomSheet = "BottomSheetDraftsFragment";
|
||||||
public static final String userAccountsApi = "UserAccountsApi";
|
public static final String userAccountsApi = "UserAccountsApi";
|
||||||
|
public static final String publicOrganizations = "PublicOrganizations";
|
||||||
|
|
||||||
// issues variables
|
// issues variables
|
||||||
public static final int issuesPageInit = 1;
|
public static final int issuesPageInit = 1;
|
||||||
@ -51,6 +51,9 @@ public class Constants {
|
|||||||
public static final int defaultPollingDelay = 15;
|
public static final int defaultPollingDelay = 15;
|
||||||
public static final int maximumPollingDelay = 720;
|
public static final int maximumPollingDelay = 720;
|
||||||
|
|
||||||
|
// public organizations
|
||||||
|
public static final int publicOrganizationsPageInit = 1;
|
||||||
|
|
||||||
public static final int maximumFileViewerSize = 3 * 1024 * 1024;
|
public static final int maximumFileViewerSize = 3 * 1024 * 1024;
|
||||||
|
|
||||||
public static final String mainNotificationChannelId = "main_channel";
|
public static final String mainNotificationChannelId = "main_channel";
|
||||||
|
@ -3,6 +3,7 @@ package org.mian.gitnex.helpers;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Typeface;
|
import android.graphics.Typeface;
|
||||||
import android.text.Spanned;
|
import android.text.Spanned;
|
||||||
|
import android.text.method.LinkMovementMethod;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.core.content.res.ResourcesCompat;
|
import androidx.core.content.res.ResourcesCompat;
|
||||||
@ -79,6 +80,7 @@ public class Markdown {
|
|||||||
public static void render(Context context, String markdown, TextView textView) {
|
public static void render(Context context, String markdown, TextView textView) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
textView.setMovementMethod(LinkMovementMethod.getInstance());
|
||||||
Renderer renderer = rendererPool.claim(timeout);
|
Renderer renderer = rendererPool.claim(timeout);
|
||||||
|
|
||||||
if(renderer != null) {
|
if(renderer != null) {
|
||||||
|
46
app/src/main/java/org/mian/gitnex/helpers/SnackBar.java
Normal file
46
app/src/main/java/org/mian/gitnex/helpers/SnackBar.java
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
package org.mian.gitnex.helpers;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import com.google.android.material.snackbar.Snackbar;
|
||||||
|
import org.mian.gitnex.R;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Author M M Arif
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class SnackBar {
|
||||||
|
|
||||||
|
public static void info(Context context, View view, String message) {
|
||||||
|
Snackbar snackBar = Snackbar.make(view, message, Snackbar.LENGTH_LONG);
|
||||||
|
View sbView = snackBar.getView();
|
||||||
|
TextView textView = sbView.findViewById(R.id.snackbar_text);
|
||||||
|
textView.setTextColor(context.getResources().getColor(R.color.colorWhite));
|
||||||
|
snackBar.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void success(Context context, View view, String message) {
|
||||||
|
Snackbar snackBar = Snackbar.make(view, message, Snackbar.LENGTH_LONG);
|
||||||
|
View sbView = snackBar.getView();
|
||||||
|
TextView textView = sbView.findViewById(R.id.snackbar_text);
|
||||||
|
textView.setTextColor(context.getResources().getColor(R.color.colorLightGreen));
|
||||||
|
snackBar.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void warning(Context context, View view, String message) {
|
||||||
|
Snackbar snackBar = Snackbar.make(view, message, Snackbar.LENGTH_LONG);
|
||||||
|
View sbView = snackBar.getView();
|
||||||
|
TextView textView = sbView.findViewById(R.id.snackbar_text);
|
||||||
|
textView.setTextColor(context.getResources().getColor(R.color.lightYellow));
|
||||||
|
snackBar.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void error(Context context, View view, String message) {
|
||||||
|
Snackbar snackBar = Snackbar.make(view, message, Snackbar.LENGTH_LONG);
|
||||||
|
View sbView = snackBar.getView();
|
||||||
|
TextView textView = sbView.findViewById(R.id.snackbar_text);
|
||||||
|
textView.setTextColor(context.getResources().getColor(R.color.darkRed));
|
||||||
|
snackBar.show();
|
||||||
|
}
|
||||||
|
}
|
@ -43,7 +43,7 @@ public class TimeHelper {
|
|||||||
switch(timeFormat) {
|
switch(timeFormat) {
|
||||||
|
|
||||||
case "pretty": {
|
case "pretty": {
|
||||||
PrettyTime prettyTime = new PrettyTime(Locale.getDefault());
|
PrettyTime prettyTime = new PrettyTime(locale);
|
||||||
return prettyTime.format(date);
|
return prettyTime.format(date);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,17 +69,17 @@ public class TimeHelper {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean timeBetweenHours(int fromHour, int toHour) {
|
public static boolean timeBetweenHours(int fromHour, int toHour, int fromMinute, int toMinute) {
|
||||||
|
|
||||||
Calendar cal = Calendar.getInstance();
|
Calendar cal = Calendar.getInstance();
|
||||||
|
|
||||||
Calendar from = Calendar.getInstance();
|
Calendar from = Calendar.getInstance();
|
||||||
from.set(Calendar.HOUR_OF_DAY, fromHour);
|
from.set(Calendar.HOUR_OF_DAY, fromHour);
|
||||||
from.set(Calendar.MINUTE, 0);
|
from.set(Calendar.MINUTE, fromMinute);
|
||||||
|
|
||||||
Calendar to = Calendar.getInstance();
|
Calendar to = Calendar.getInstance();
|
||||||
to.set(Calendar.HOUR_OF_DAY, toHour);
|
to.set(Calendar.HOUR_OF_DAY, toHour);
|
||||||
to.set(Calendar.MINUTE, 0);
|
to.set(Calendar.MINUTE, toMinute);
|
||||||
|
|
||||||
if(to.before(from)) {
|
if(to.before(from)) {
|
||||||
if(cal.after(to)) {
|
if(cal.after(to)) {
|
||||||
|
@ -424,16 +424,16 @@ public class MemorizingTrustManager implements X509TrustManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void certDetails(StringBuilder stringBuilder, X509Certificate c) {
|
private void certDetails(StringBuilder stringBuilder, X509Certificate c) {
|
||||||
|
|
||||||
SimpleDateFormat validityDateFormater = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
|
SimpleDateFormat validityDateFormatter = new SimpleDateFormat("yyyy-MM-dd", context.getResources().getConfiguration().locale);
|
||||||
|
|
||||||
stringBuilder.append("\n")
|
stringBuilder.append("\n")
|
||||||
.append(c.getSubjectDN().toString())
|
.append(c.getSubjectDN().toString())
|
||||||
.append("\n")
|
.append("\n")
|
||||||
.append(validityDateFormater.format(c.getNotBefore()))
|
.append(validityDateFormatter.format(c.getNotBefore()))
|
||||||
.append(" - ")
|
.append(" - ")
|
||||||
.append(validityDateFormater.format(c.getNotAfter()))
|
.append(validityDateFormatter.format(c.getNotAfter()))
|
||||||
.append("\nSHA-256: ")
|
.append("\nSHA-256: ")
|
||||||
.append(certHash(c, "SHA-256"))
|
.append(certHash(c, "SHA-256"))
|
||||||
.append("\nSHA-1: ")
|
.append("\nSHA-1: ")
|
||||||
|
@ -42,39 +42,23 @@ public class FilesViewModel extends ViewModel {
|
|||||||
.getFiles(token, owner, repo, ref);
|
.getFiles(token, owner, repo, ref);
|
||||||
|
|
||||||
call.enqueue(new Callback<List<Files>>() {
|
call.enqueue(new Callback<List<Files>>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onResponse(@NonNull Call<List<Files>> call, @NonNull Response<List<Files>> response) {
|
public void onResponse(@NonNull Call<List<Files>> call, @NonNull Response<List<Files>> response) {
|
||||||
|
|
||||||
if (response.code() == 200) {
|
if(response.isSuccessful() && response.body() != null && !response.body().isEmpty()) {
|
||||||
|
Collections.sort(response.body(), (byType1, byType2) -> byType1.getType().compareTo(byType2.getType()));
|
||||||
assert response.body() != null;
|
filesList.postValue(response.body());
|
||||||
|
|
||||||
if(response.body().size() > 0) {
|
|
||||||
|
|
||||||
Collections.sort(response.body(), (byType1, byType2) -> byType1.getType().compareTo(byType2.getType()));
|
|
||||||
filesList.postValue(response.body());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
progressBar.setVisibility(View.GONE);
|
|
||||||
noDataFiles.setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
progressBar.setVisibility(View.GONE);
|
progressBar.setVisibility(View.GONE);
|
||||||
noDataFiles.setVisibility(View.VISIBLE);
|
noDataFiles.setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFailure(@NonNull Call<List<Files>> call, @NonNull Throwable t) {
|
public void onFailure(@NonNull Call<List<Files>> call, @NonNull Throwable t) {
|
||||||
|
|
||||||
Toasty.error(ctx, ctx.getString(R.string.errorOnLogin));
|
Toasty.error(ctx, ctx.getString(R.string.errorOnLogin));
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,27 +77,14 @@ public class FilesViewModel extends ViewModel {
|
|||||||
.getDirFiles(token, owner, repo, filesDir, ref);
|
.getDirFiles(token, owner, repo, filesDir, ref);
|
||||||
|
|
||||||
call.enqueue(new Callback<List<Files>>() {
|
call.enqueue(new Callback<List<Files>>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onResponse(@NonNull Call<List<Files>> call, @NonNull Response<List<Files>> response) {
|
public void onResponse(@NonNull Call<List<Files>> call, @NonNull Response<List<Files>> response) {
|
||||||
|
|
||||||
if (response.code() == 200) {
|
if(response.isSuccessful() && response.body() != null && !response.body().isEmpty()) {
|
||||||
|
Collections.sort(response.body(), (byType1, byType2) -> byType1.getType().compareTo(byType2.getType()));
|
||||||
assert response.body() != null;
|
filesList2.postValue(response.body());
|
||||||
|
|
||||||
if(response.body().size() > 0) {
|
|
||||||
|
|
||||||
Collections.sort(response.body(), (byType1, byType2) -> byType1.getType().compareTo(byType2.getType()));
|
|
||||||
filesList2.postValue(response.body());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
progressBar.setVisibility(View.GONE);
|
|
||||||
noDataFiles.setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
progressBar.setVisibility(View.GONE);
|
progressBar.setVisibility(View.GONE);
|
||||||
noDataFiles.setVisibility(View.VISIBLE);
|
noDataFiles.setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
@ -121,10 +92,8 @@ public class FilesViewModel extends ViewModel {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFailure(@NonNull Call<List<Files>> call, @NonNull Throwable t) {
|
public void onFailure(@NonNull Call<List<Files>> call, @NonNull Throwable t) {
|
||||||
|
|
||||||
Toasty.error(ctx, ctx.getString(R.string.errorOnLogin));
|
Toasty.error(ctx, ctx.getString(R.string.errorOnLogin));
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ public class OrganizationListViewModel extends ViewModel {
|
|||||||
|
|
||||||
Call<List<UserOrganizations>> call = RetrofitClient
|
Call<List<UserOrganizations>> call = RetrofitClient
|
||||||
.getApiInterface(ctx)
|
.getApiInterface(ctx)
|
||||||
.getUserOrgs(token);
|
.getUserOrgs(token, 1, 50);
|
||||||
|
|
||||||
call.enqueue(new Callback<List<UserOrganizations>>() {
|
call.enqueue(new Callback<List<UserOrganizations>>() {
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ public class ProfileFollowersViewModel extends ViewModel {
|
|||||||
|
|
||||||
Call<List<UserInfo>> call = RetrofitClient
|
Call<List<UserInfo>> call = RetrofitClient
|
||||||
.getApiInterface(ctx)
|
.getApiInterface(ctx)
|
||||||
.getFollowers(token);
|
.getFollowers(token, 1, 50);
|
||||||
|
|
||||||
call.enqueue(new Callback<List<UserInfo>>() {
|
call.enqueue(new Callback<List<UserInfo>>() {
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ public class ProfileFollowingViewModel extends ViewModel {
|
|||||||
|
|
||||||
Call<List<UserInfo>> call = RetrofitClient
|
Call<List<UserInfo>> call = RetrofitClient
|
||||||
.getApiInterface(ctx)
|
.getApiInterface(ctx)
|
||||||
.getFollowing(token);
|
.getFollowing(token, 1, 50);
|
||||||
|
|
||||||
call.enqueue(new Callback<List<UserInfo>>() {
|
call.enqueue(new Callback<List<UserInfo>>() {
|
||||||
|
|
||||||
|
5
app/src/main/res/drawable/shape_list_divider.xml
Normal file
5
app/src/main/res/drawable/shape_list_divider.xml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<size android:width="1px" android:height="1px" />
|
||||||
|
<solid android:color="@color/toastBackground" />
|
||||||
|
</shape>
|
@ -10,6 +10,7 @@
|
|||||||
android:id="@+id/appbar"
|
android:id="@+id/appbar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
app:elevation="0dp"
|
||||||
android:theme="@style/Widget.AppCompat.SearchView">
|
android:theme="@style/Widget.AppCompat.SearchView">
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:theme="@style/Widget.AppCompat.SearchView"
|
android:theme="@style/Widget.AppCompat.SearchView"
|
||||||
|
app:elevation="0dp"
|
||||||
app:layout_constraintTop_toTopOf="parent">
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
android:id="@+id/appbar"
|
android:id="@+id/appbar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
app:elevation="0dp"
|
||||||
android:theme="@style/Widget.AppCompat.SearchView">
|
android:theme="@style/Widget.AppCompat.SearchView">
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:background="?attr/primaryBackgroundColor"
|
android:background="?attr/primaryBackgroundColor"
|
||||||
android:fitsSystemWindows="true"
|
android:fitsSystemWindows="true"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
@ -11,6 +11,7 @@
|
|||||||
android:id="@+id/appbar"
|
android:id="@+id/appbar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
app:elevation="0dp"
|
||||||
android:theme="@style/Widget.AppCompat.SearchView">
|
android:theme="@style/Widget.AppCompat.SearchView">
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:background="?attr/primaryBackgroundColor"
|
android:background="?attr/primaryBackgroundColor"
|
||||||
android:fitsSystemWindows="true"
|
android:fitsSystemWindows="true"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
@ -11,6 +11,7 @@
|
|||||||
android:id="@+id/appbar"
|
android:id="@+id/appbar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
app:elevation="0dp"
|
||||||
android:theme="@style/Widget.AppCompat.SearchView">
|
android:theme="@style/Widget.AppCompat.SearchView">
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
android:id="@+id/appbar"
|
android:id="@+id/appbar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
app:elevation="0dp"
|
||||||
android:theme="@style/Widget.AppCompat.SearchView">
|
android:theme="@style/Widget.AppCompat.SearchView">
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user