mirror of
https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy.git
synced 2025-11-17 17:17:47 +01:00
Compare commits
169 Commits
v0.0.8
...
feature/pr
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d5092f50f6 | ||
|
|
d216fc4640 | ||
|
|
f61c12a30b | ||
|
|
495a1d025f | ||
|
|
0e31e40ef1 | ||
|
|
bae68d4a99 | ||
|
|
3e17e3364d | ||
|
|
9626500586 | ||
|
|
92fcb811c3 | ||
|
|
81e2fdcf91 | ||
|
|
171338f492 | ||
|
|
cc21588a66 | ||
|
|
b5356ee5eb | ||
|
|
ec9be3f6af | ||
|
|
ac5e67c032 | ||
|
|
fd24f04254 | ||
|
|
0b74574fa6 | ||
|
|
2704ff0ecf | ||
|
|
f4c33e08e2 | ||
|
|
5dddf2e39d | ||
|
|
487afce565 | ||
|
|
f31a13568c | ||
|
|
04341991bf | ||
|
|
a7c2a67d0c | ||
|
|
4ec6666f93 | ||
|
|
fcc0181075 | ||
|
|
1c4e5f3659 | ||
|
|
a120fcf068 | ||
|
|
0328f34df2 | ||
|
|
7849115000 | ||
|
|
41e14aab9d | ||
|
|
074b5d012c | ||
|
|
8a3ee7931d | ||
|
|
dce5a8d89c | ||
|
|
a82f2b68e3 | ||
|
|
a36ddccefd | ||
|
|
bbe696a37b | ||
|
|
13ec5f84c4 | ||
|
|
587ebbb309 | ||
|
|
485611970f | ||
|
|
c0738947b7 | ||
|
|
f1145d826e | ||
|
|
aa4f587443 | ||
|
|
e559e4acd2 | ||
|
|
db1e000325 | ||
|
|
4f57c17f73 | ||
|
|
21af736fa4 | ||
|
|
72ba80ff87 | ||
|
|
450e96fdbe | ||
|
|
fcc60e1b16 | ||
|
|
e888282d24 | ||
|
|
237d33f2e4 | ||
|
|
babb0d28bb | ||
|
|
53eb7cbe91 | ||
|
|
fed84f9942 | ||
|
|
d4896a1f87 | ||
|
|
21879bec7d | ||
|
|
bb143cfecb | ||
|
|
6475b4808a | ||
|
|
57a58cc518 | ||
|
|
8a5b6aa972 | ||
|
|
6813770d57 | ||
|
|
118b6cd430 | ||
|
|
b984e35284 | ||
|
|
f2a2a3029d | ||
|
|
b4ab1ba414 | ||
|
|
d244e0ed42 | ||
|
|
81c190a9c0 | ||
|
|
e2f36c334b | ||
|
|
891215fcb3 | ||
|
|
04e022cbbc | ||
|
|
1f4f3a475d | ||
|
|
3e6d435116 | ||
|
|
9c6f946602 | ||
|
|
053c9e73b0 | ||
|
|
acd1aef851 | ||
|
|
a3a753a9dd | ||
|
|
0ea491bcfc | ||
|
|
946d35b5d9 | ||
|
|
5098cb698d | ||
|
|
47a06c372e | ||
|
|
7877001533 | ||
|
|
23d41846d0 | ||
|
|
dc4dc17b6c | ||
|
|
6c8892938a | ||
|
|
2f2d86bc3f | ||
|
|
ecd3d008de | ||
|
|
f5172a17db | ||
|
|
662a5bd597 | ||
|
|
6621748de5 | ||
|
|
37fa76b79a | ||
|
|
c7acb50522 | ||
|
|
64304ad637 | ||
|
|
635ca332da | ||
|
|
e2a15ab925 | ||
|
|
016801419f | ||
|
|
48d79bc353 | ||
|
|
b8094fded8 | ||
|
|
8c82ba0e91 | ||
|
|
3ff9c06843 | ||
|
|
45ae8342ee | ||
|
|
b8c3dae807 | ||
|
|
3afd2601f0 | ||
|
|
82414bba55 | ||
|
|
7a39b2341b | ||
|
|
37ab47bc34 | ||
|
|
21b111cc2d | ||
|
|
b3c2f6213d | ||
|
|
c3de94012a | ||
|
|
804eb64b5b | ||
|
|
6a4aa8075d | ||
|
|
692aca4eca | ||
|
|
dd00802561 | ||
|
|
a3e0fea200 | ||
|
|
304125ea0d | ||
|
|
a465ebb5b4 | ||
|
|
b39d00eba6 | ||
|
|
1ebdce309d | ||
|
|
d29b7585f7 | ||
|
|
276560678c | ||
|
|
10c23a65c5 | ||
|
|
4e4f4377e7 | ||
|
|
2e6c9db614 | ||
|
|
2375ba9d35 | ||
|
|
a11ccb7cf6 | ||
|
|
a54241294d | ||
|
|
46b509c1fb | ||
|
|
b13dd58c70 | ||
|
|
4312b250ce | ||
|
|
ff4c9180a0 | ||
|
|
be0bd40995 | ||
|
|
726d6d0faf | ||
|
|
14ce356c4d | ||
|
|
930a425af5 | ||
|
|
7168cecbcb | ||
|
|
7f067023e7 | ||
|
|
167aecb696 | ||
|
|
9872e6e806 | ||
|
|
05adc343a2 | ||
|
|
58e3dfa084 | ||
|
|
3068423c01 | ||
|
|
3c960f60d1 | ||
|
|
a153fc4afb | ||
|
|
4a19fbb745 | ||
|
|
bb8c10fc98 | ||
|
|
97af73f055 | ||
|
|
73d18082c4 | ||
|
|
4b78e80edd | ||
|
|
78ba4b0fda | ||
|
|
a1c5baac6b | ||
|
|
c4b811090d | ||
|
|
fbdccfb639 | ||
|
|
c1162fd618 | ||
|
|
4d7a148cfe | ||
|
|
c7b1602648 | ||
|
|
a82a454ad2 | ||
|
|
9533378003 | ||
|
|
dc1edcc78c | ||
|
|
6d8b040f6d | ||
|
|
60f07f7707 | ||
|
|
f6b7130d0c | ||
|
|
9fea056063 | ||
|
|
859e9ab5d6 | ||
|
|
4821718407 | ||
|
|
67a13f8ecb | ||
|
|
40e4782b32 | ||
|
|
2ab5ab3ce5 | ||
|
|
88fb054640 | ||
|
|
4ce8fd6a63 |
BIN
.assets/IzzyOnDroid.png
Normal file
BIN
.assets/IzzyOnDroid.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
BIN
.assets/codeberg.png
Normal file
BIN
.assets/codeberg.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
@@ -1,4 +1,4 @@
|
||||
pipeline:
|
||||
steps:
|
||||
build:
|
||||
image: alvrme/alpine-android:android-33-jdk11
|
||||
commands:
|
||||
@@ -25,3 +25,5 @@ pipeline:
|
||||
note: "This is an alpha release. Expect many bugs and unfinished features!"
|
||||
when:
|
||||
event: [ tag ]
|
||||
when:
|
||||
event: [ push, tag, pull_request ]
|
||||
|
||||
76
.woodpecker/nightly.yaml
Normal file
76
.woodpecker/nightly.yaml
Normal file
@@ -0,0 +1,76 @@
|
||||
clone:
|
||||
git:
|
||||
image: woodpeckerci/plugin-git
|
||||
settings:
|
||||
partial: false
|
||||
|
||||
steps:
|
||||
build:
|
||||
image: alvrme/alpine-android:android-33-jdk11
|
||||
commands:
|
||||
- ./gradlew :app:assembleNightly
|
||||
sign:
|
||||
image: alvrme/alpine-android:android-33-jdk11
|
||||
commands:
|
||||
- ./scripts/apk-sign.sh eu.toldi.infinityforlemmy.nightly.apk app/build/outputs/apk/nightly/eu.toldi.infinityforlemmy.nightly.apk
|
||||
secrets: [ APK_KS_PASS, APK_KS, APK_KS_ALIAS ]
|
||||
pull-repo-config:
|
||||
image: codeberg.org/freeyourgadget/android-fdroid-tools:latest
|
||||
commands:
|
||||
- cd ..
|
||||
- pwd
|
||||
- mkdir repoconfig
|
||||
- cd repoconfig
|
||||
- pwd
|
||||
- git clone --depth 1 https://codeberg.org/Bazsalanszky/fdroid-repo-config
|
||||
- cp /woodpecker/src/codeberg.org/Bazsalanszky/Infinity-For-Lemmy/eu.toldi.infinityforlemmy.nightly.apk fdroid-repo-config/repo/
|
||||
|
||||
pull-pages:
|
||||
image: codeberg.org/freeyourgadget/android-fdroid-tools:latest
|
||||
commands:
|
||||
- cd ..
|
||||
- pwd
|
||||
- mkdir pages
|
||||
- cd pages
|
||||
- pwd
|
||||
- git clone --depth 2 https://codeberg.org/Bazsalanszky/pages
|
||||
- cd pages
|
||||
- git config user.name "CODEBERG CI"
|
||||
- git config user.email "noreply@nodomain.nodomain"
|
||||
# reset and remove, later force push, to keep repo size small
|
||||
- git reset --soft HEAD~1
|
||||
- git status
|
||||
|
||||
update-fdroid-data:
|
||||
image: cs8898/android-fdroid-sdk:33.0.0
|
||||
commands:
|
||||
- pwd
|
||||
- cd ../repoconfig/fdroid-repo-config/
|
||||
- echo -n "$${FDROID_KS}" | base64 -d > keystore.p12
|
||||
- cat keystore.p12 | sha256sum
|
||||
- sed -i "s|KS_PASS|$${FDROID_KS_PASS}|g" config.yml
|
||||
- sed -i "s|KEY_PASS|$${FDROID_KEY_PASS}|g" config.yml
|
||||
- fdroid update
|
||||
- fdroid deploy
|
||||
- ls -laR repo
|
||||
secrets: [ FDROID_KS_PASS, FDROID_KEY_PASS, FDROID_KS ]
|
||||
push-pages-update-repo:
|
||||
image: codeberg.org/freeyourgadget/android-fdroid-tools:latest
|
||||
commands:
|
||||
- if [ -f .do_not_build ]; then return 0; fi
|
||||
- cd ../pages/pages/
|
||||
- git add -A
|
||||
- git status
|
||||
- git diff
|
||||
- ls -lsR fdroid/repo
|
||||
- git commit -m "autodeploy"
|
||||
- git remote remove origin
|
||||
- git remote add origin https://Bazsalanszky:"$${GITEA_ACCESS_TOKEN}"@codeberg.org/Bazsalanszky/pages.git
|
||||
# force push as we removed all data
|
||||
- git push -f origin main
|
||||
- cd ../../
|
||||
- pwd
|
||||
- ls -la
|
||||
secrets: [ GITEA_ACCESS_TOKEN ]
|
||||
when:
|
||||
event: cron
|
||||
31
README.md
31
README.md
@@ -6,32 +6,28 @@
|
||||
|
||||
A Lemmy client for Android written in Java. It's a fork of the [Infinity for Reddit](https://github.com/Docile-Alligator/Infinity-For-Reddit) project, currenty in early development.
|
||||
|
||||
<img align="right" src="https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy/raw/branch/master/fastlane/metadata/android/en-US/images/icon.png" width=200>
|
||||
|
||||
</div>
|
||||
|
||||
<br>
|
||||
|
||||
|
||||
<div align="center">
|
||||
<img src="https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy/raw/branch/master/fastlane/metadata/android/en-US/images/icon.png" width=256>
|
||||
|
||||
[](https://ci.codeberg.org/12474)
|
||||
[](https://ci.codeberg.org/repos/12474)
|
||||
[](https://liberapay.com/Bazsalanszky)
|
||||
|
||||
<a href="https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy/issues">Report a Bug</a>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<br>
|
||||
|
||||
<div align="center">
|
||||
|
||||
<a href="https://apt.izzysoft.de/fdroid/index/apk/eu.toldi.infinityforlemmy">
|
||||
<img src="./.assets/IzzyOnDroid.png" height="80">
|
||||
</a>
|
||||
<a href="https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy/releases/">
|
||||
<img src="./.assets/codeberg.png" height="80">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
## Action Items for Infinity for Lemmy
|
||||
@@ -53,7 +49,6 @@ Infinity for Lemmy is currently in the early stages of development. Expect many
|
||||
- [ ] Account editing function
|
||||
- [ ] Multi community view?
|
||||
|
||||
|
||||
## Contributing
|
||||
|
||||
First off, thanks for taking the time to contribute! Contributions are what makes the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**.
|
||||
@@ -69,10 +64,15 @@ Don't forget to give the project a star! Thanks again!
|
||||
4. Push to the Branch (`git push origin feature/AmazingFeature`)
|
||||
5. Open a Pull Request
|
||||
|
||||
Here are other ways you can help:
|
||||
### Translation
|
||||
|
||||
- [Report Bugs](https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy/issues)
|
||||
You can alos help Infinity for Lemmy by translating it to your native langugage! Translations are done via [Weblate](https://translate.codeberg.org/projects/infinity-for-lemmy/app/)!
|
||||
|
||||
[](https://translate.codeberg.org/engage/infinity-for-lemmy/)
|
||||
|
||||
### Reporting bugs
|
||||
|
||||
You can also contribute by [reporting bugs](https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy/issues)
|
||||
|
||||
<p align="right">(<a href="#top">back to top</a>)</p>
|
||||
|
||||
@@ -86,7 +86,6 @@ Distributed under the AGPL-3.0 License. See <a href="https://codeberg.org/Bazsal
|
||||
|
||||
[@bazsalanszky@lemmy.toldi.eu](https://lemmy.toldi.eu/u/bazsalanszky) - (Owner)
|
||||
|
||||
|
||||
Project Link: [https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy](https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy)
|
||||
|
||||
<p align="right">(<a href="#top">back to top</a>)</p>
|
||||
|
||||
@@ -1,5 +1,18 @@
|
||||
plugins {
|
||||
id 'com.android.application'
|
||||
id 'org.jetbrains.kotlin.android'
|
||||
}
|
||||
def getCommitVersionCode = { ->
|
||||
try {
|
||||
def stdout = new ByteArrayOutputStream()
|
||||
exec {
|
||||
commandLine 'git', 'rev-list', 'HEAD', '--count'
|
||||
standardOutput = stdout
|
||||
}
|
||||
return Integer.valueOf(stdout.toString().trim())
|
||||
} catch (ignored) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
android {
|
||||
@@ -18,10 +31,12 @@ android {
|
||||
}
|
||||
}
|
||||
buildTypes {
|
||||
|
||||
release {
|
||||
minifyEnabled false
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
|
||||
minifiedRelease {
|
||||
initWith buildTypes.release
|
||||
zipAlignEnabled true
|
||||
@@ -33,7 +48,33 @@ android {
|
||||
applicationIdSuffix '.debug'
|
||||
versionNameSuffix ' (DEBUG)'
|
||||
}
|
||||
|
||||
nightly {
|
||||
minifyEnabled false
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
applicationIdSuffix '.nightly'
|
||||
versionNameSuffix ' (NIGHTLY)'
|
||||
}
|
||||
applicationVariants.all { variant ->
|
||||
variant.resValue "string", "applicationId", variant.applicationId
|
||||
|
||||
|
||||
if (variant.buildType.name == 'nightly') {
|
||||
variant.outputs.all {
|
||||
setVersionCodeOverride(getCommitVersionCode())
|
||||
|
||||
setVersionNameOverride(variant.versionName)
|
||||
outputFileName = "${applicationId}.apk"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main.java.srcDirs += 'src/main/kotlin'
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_11
|
||||
targetCompatibility JavaVersion.VERSION_11
|
||||
@@ -201,3 +242,4 @@ dependencies {
|
||||
// debugImplementation because LeakCanary should only run in debug builds.
|
||||
//debugImplementation 'com.squareup.leakcanary:leakcanary-android:x.y'
|
||||
}
|
||||
|
||||
|
||||
@@ -402,6 +402,11 @@
|
||||
android:label="@string/subscriptions"
|
||||
android:parentActivityName=".activities.MainActivity"
|
||||
android:theme="@style/AppTheme.Slidable" />
|
||||
<activity
|
||||
android:name=".activities.BlockedThingListingActivity"
|
||||
android:label="@string/blocks"
|
||||
android:parentActivityName=".activities.MainActivity"
|
||||
android:theme="@style/AppTheme.Slidable" />
|
||||
<activity
|
||||
android:name=".activities.SubredditSelectionActivity"
|
||||
android:label="@string/community_selection_activity_label"
|
||||
|
||||
@@ -8,6 +8,7 @@ import dagger.BindsInstance;
|
||||
import dagger.Component;
|
||||
import eu.toldi.infinityforlemmy.activities.AccountPostsActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.AccountSavedThingActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.BlockedThingListingActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.CommentActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.CreateMultiRedditActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.CustomThemeListingActivity;
|
||||
@@ -65,7 +66,10 @@ import eu.toldi.infinityforlemmy.activities.ViewVideoActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.WebViewActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.WikiActivity;
|
||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.AccountChooserBottomSheetFragment;
|
||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.CommentMoreBottomSheetFragment;
|
||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.FlairBottomSheetFragment;
|
||||
import eu.toldi.infinityforlemmy.fragments.BlockedCommunitiesListingFragment;
|
||||
import eu.toldi.infinityforlemmy.fragments.BlockedUsersListingFragment;
|
||||
import eu.toldi.infinityforlemmy.fragments.CommentsListingFragment;
|
||||
import eu.toldi.infinityforlemmy.fragments.FollowedUsersListingFragment;
|
||||
import eu.toldi.infinityforlemmy.fragments.HistoryPostFragment;
|
||||
@@ -73,6 +77,7 @@ import eu.toldi.infinityforlemmy.fragments.InboxFragment;
|
||||
import eu.toldi.infinityforlemmy.fragments.MorePostsInfoFragment;
|
||||
import eu.toldi.infinityforlemmy.fragments.MultiRedditListingFragment;
|
||||
import eu.toldi.infinityforlemmy.fragments.PostFragment;
|
||||
import eu.toldi.infinityforlemmy.fragments.PrivateMessageFragment;
|
||||
import eu.toldi.infinityforlemmy.fragments.SidebarFragment;
|
||||
import eu.toldi.infinityforlemmy.fragments.SubredditListingFragment;
|
||||
import eu.toldi.infinityforlemmy.fragments.SubscribedSubredditsListingFragment;
|
||||
@@ -307,6 +312,15 @@ public interface AppComponent {
|
||||
|
||||
void inject(MorePostsInfoFragment morePostsInfoFragment);
|
||||
|
||||
void inject(BlockedThingListingActivity blockedThingListingActivity);
|
||||
|
||||
void inject(BlockedCommunitiesListingFragment blockedCommunitiesListingFragment);
|
||||
|
||||
void inject(BlockedUsersListingFragment blockedUsersListingFragment);
|
||||
|
||||
void inject(CommentMoreBottomSheetFragment commentMoreBottomSheetFragment);
|
||||
|
||||
void inject(PrivateMessageFragment privateMessageFragment);
|
||||
|
||||
@Component.Factory
|
||||
interface Factory {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package eu.toldi.infinityforlemmy;
|
||||
|
||||
import android.os.AsyncTask;
|
||||
import android.text.Html;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
@@ -9,9 +8,6 @@ import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import eu.toldi.infinityforlemmy.apis.LemmyAPI;
|
||||
import eu.toldi.infinityforlemmy.apis.RedditAPI;
|
||||
import eu.toldi.infinityforlemmy.utils.APIUtils;
|
||||
import eu.toldi.infinityforlemmy.utils.JSONUtils;
|
||||
import eu.toldi.infinityforlemmy.utils.LemmyUtils;
|
||||
import retrofit2.Call;
|
||||
import retrofit2.Callback;
|
||||
@@ -83,7 +79,7 @@ public class FetchMyInfo {
|
||||
if (!person.isNull("banner")) {
|
||||
bannerImageUrl = person.getString("banner");
|
||||
}
|
||||
display_name = person.getString("name");
|
||||
display_name = (person.has("display_name")) ? person.getString("display_name") : person.getString("name");
|
||||
redditDataRoomDatabase.accountDao().updateAccountInfo(name, profileImageUrl, bannerImageUrl);
|
||||
} catch (JSONException e) {
|
||||
parseFailed = true;
|
||||
|
||||
@@ -10,15 +10,14 @@ import javax.inject.Singleton;
|
||||
import dagger.Module;
|
||||
import dagger.Provides;
|
||||
import eu.toldi.infinityforlemmy.apis.StreamableAPI;
|
||||
import eu.toldi.infinityforlemmy.network.SortTypeConverterFactory;
|
||||
import eu.toldi.infinityforlemmy.privatemessage.LemmyPrivateMessageAPI;
|
||||
import eu.toldi.infinityforlemmy.comment.LemmyCommentAPI;
|
||||
import eu.toldi.infinityforlemmy.post.LemmyPostAPI;
|
||||
import eu.toldi.infinityforlemmy.utils.APIUtils;
|
||||
import okhttp3.ConnectionPool;
|
||||
import okhttp3.Interceptor;
|
||||
import okhttp3.OkHttpClient;
|
||||
import retrofit2.Retrofit;
|
||||
import retrofit2.adapter.guava.GuavaCallAdapterFactory;
|
||||
import retrofit2.converter.gson.GsonConverterFactory;
|
||||
import retrofit2.converter.scalars.ScalarsConverterFactory;
|
||||
|
||||
@Module(includes = AppModule.class)
|
||||
abstract class NetworkModule {
|
||||
@@ -216,4 +215,22 @@ abstract class NetworkModule {
|
||||
static StreamableAPI provideStreamableApi(@Named("streamable") Retrofit streamableRetrofit) {
|
||||
return streamableRetrofit.create(StreamableAPI.class);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
static LemmyPostAPI providePostAPI(@Named("no_oauth") RetrofitHolder retrofitHolder) {
|
||||
return new LemmyPostAPI(retrofitHolder);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
static LemmyCommentAPI provideCommentAPI(@Named("no_oauth") RetrofitHolder retrofitHolder) {
|
||||
return new LemmyCommentAPI(retrofitHolder);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
static LemmyPrivateMessageAPI provideLemmyPrivateMessageAPI(@Named("base") RetrofitHolder retrofit) {
|
||||
return new LemmyPrivateMessageAPI(retrofit);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,9 +110,9 @@ class ParseSubscribedThing {
|
||||
boolean postingRestrictedToMods = community.getBoolean("posting_restricted_to_mods");
|
||||
int instanceId = community.getInt("instance_id");
|
||||
int subscribers = data.getJSONObject("counts").getInt("subscribers");
|
||||
|
||||
boolean isBlocked = data.getBoolean("blocked");
|
||||
newSubscribedSubredditData.add(new SubscribedSubredditData(id, title, LemmyUtils.actorID2FullName(actorId), iconUrl, accountName));
|
||||
newSubredditData.add(new SubredditData(id,name,title,description,removed,published,updated,deleted,nsfw,actorId,local,iconUrl,bannerImageUrl,hidden,postingRestrictedToMods,instanceId,subscribers));
|
||||
newSubredditData.add(new SubredditData(id, name, title, description, removed, published, updated, deleted, nsfw, actorId, local, iconUrl, bannerImageUrl, hidden, postingRestrictedToMods, instanceId, subscribers, isBlocked));
|
||||
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
|
||||
@@ -13,6 +13,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase;
|
||||
|
||||
import eu.toldi.infinityforlemmy.account.Account;
|
||||
import eu.toldi.infinityforlemmy.account.AccountDao;
|
||||
import eu.toldi.infinityforlemmy.blockedcommunity.BlockedCommunityDao;
|
||||
import eu.toldi.infinityforlemmy.blockedcommunity.BlockedCommunityData;
|
||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserDao;
|
||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserData;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomTheme;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeDao;
|
||||
import eu.toldi.infinityforlemmy.multireddit.AnonymousMultiredditSubreddit;
|
||||
@@ -38,7 +42,7 @@ import eu.toldi.infinityforlemmy.user.UserData;
|
||||
|
||||
@Database(entities = {Account.class, SubredditData.class, SubscribedSubredditData.class, UserData.class,
|
||||
SubscribedUserData.class, MultiReddit.class, CustomTheme.class, RecentSearchQuery.class,
|
||||
ReadPost.class, PostFilter.class, PostFilterUsage.class, AnonymousMultiredditSubreddit.class}, version = 24)
|
||||
ReadPost.class, PostFilter.class, PostFilterUsage.class, AnonymousMultiredditSubreddit.class, BlockedUserData.class, BlockedCommunityData.class}, version = 26)
|
||||
public abstract class RedditDataRoomDatabase extends RoomDatabase {
|
||||
|
||||
public static RedditDataRoomDatabase create(final Context context) {
|
||||
@@ -49,7 +53,7 @@ public abstract class RedditDataRoomDatabase extends RoomDatabase {
|
||||
MIGRATION_9_10, MIGRATION_10_11, MIGRATION_11_12, MIGRATION_12_13,
|
||||
MIGRATION_13_14, MIGRATION_14_15, MIGRATION_15_16, MIGRATION_16_17,
|
||||
MIGRATION_17_18, MIGRATION_18_19, MIGRATION_19_20, MIGRATION_20_21,
|
||||
MIGRATION_21_22, MIGRATION_22_23, MIGRATION_23_24)
|
||||
MIGRATION_21_22, MIGRATION_22_23, MIGRATION_23_24, MIGRATION_24_25, MIGRATION_25_26)
|
||||
.build();
|
||||
}
|
||||
|
||||
@@ -59,6 +63,10 @@ public abstract class RedditDataRoomDatabase extends RoomDatabase {
|
||||
|
||||
public abstract SubscribedSubredditDao subscribedSubredditDao();
|
||||
|
||||
public abstract BlockedUserDao blockedUserDao();
|
||||
|
||||
public abstract BlockedCommunityDao blockedCommunityDao();
|
||||
|
||||
public abstract UserDao userDao();
|
||||
|
||||
public abstract SubscribedUserDao subscribedUserDao();
|
||||
@@ -390,4 +398,22 @@ public abstract class RedditDataRoomDatabase extends RoomDatabase {
|
||||
database.execSQL("ALTER TABLE accounts ADD COLUMN can_downvote INTEGER DEFAULT 1 NOT NULL");
|
||||
}
|
||||
};
|
||||
|
||||
private static final Migration MIGRATION_24_25 = new Migration(24, 25) {
|
||||
@Override
|
||||
public void migrate(@NonNull SupportSQLiteDatabase database) {
|
||||
database.execSQL("ALTER TABLE subreddits ADD COLUMN blocked INTEGER DEFAULT 1 NOT NULL");
|
||||
}
|
||||
};
|
||||
|
||||
private static final Migration MIGRATION_25_26 = new Migration(25, 26) {
|
||||
@Override
|
||||
public void migrate(@NonNull SupportSQLiteDatabase database) {
|
||||
database.execSQL("CREATE TABLE blocked_users" +
|
||||
"(name TEXT, id INTEGER NOT NULL, avatar TEXT, qualified_name TEXT, account_name TEXT NOT NULL, PRIMARY KEY( id, account_name))");
|
||||
database.execSQL("CREATE TABLE blocked_communities" +
|
||||
"(name TEXT, icon TEXT, id INTEGER NOT NULL, qualified_name TEXT, account_name TEXT NOT NULL, PRIMARY KEY( id, account_name))");
|
||||
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -24,7 +24,11 @@ public class RetrofitHolder {
|
||||
}
|
||||
|
||||
public String getBaseURL() {
|
||||
return baseURL;
|
||||
String result = baseURL;
|
||||
if (baseURL.endsWith("/")) {
|
||||
result = baseURL.substring(0, baseURL.length() - 1);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public RetrofitHolder(OkHttpClient okHttpClient) {
|
||||
|
||||
@@ -43,7 +43,7 @@ public class SortType {
|
||||
TOP_TWELVE_HOURS("TopTwelveHour", "Top"),
|
||||
TOP_DAY("TopDay", "Top"),
|
||||
TOP_WEEK("TopWeek", "Top"),
|
||||
TOP_MONTH("month", "Top"),
|
||||
TOP_MONTH("TopMonth", "Top"),
|
||||
TOP_THREE_MONTHS("TopThreeMonths", "Top"),
|
||||
TOP_SIX_MONTHS("TopSixMonths", "Top"),
|
||||
TOP_NINE_MONTHS("TopNineMonths", "Top"),
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
package eu.toldi.infinityforlemmy.account;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import eu.toldi.infinityforlemmy.apis.LemmyAPI;
|
||||
import eu.toldi.infinityforlemmy.blockedcommunity.BlockedCommunityData;
|
||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserData;
|
||||
import eu.toldi.infinityforlemmy.subreddit.ParseSubredditData;
|
||||
import eu.toldi.infinityforlemmy.subreddit.SubredditData;
|
||||
import eu.toldi.infinityforlemmy.utils.LemmyUtils;
|
||||
import retrofit2.Call;
|
||||
import retrofit2.Callback;
|
||||
import retrofit2.Retrofit;
|
||||
|
||||
public class FetchBlockedThings {
|
||||
|
||||
public static void fetchBlockedThings(Retrofit mRetrofit, String accessToken, String accountName, FetchBlockedThingsListener fetchBlockedThingsListener) {
|
||||
LemmyAPI lemmyAPI = mRetrofit.create(LemmyAPI.class);
|
||||
|
||||
Call<String> call = lemmyAPI.getSiteInfo(accessToken);
|
||||
call.enqueue(new Callback<String>() {
|
||||
@Override
|
||||
public void onResponse(Call<String> call, retrofit2.Response<String> response) {
|
||||
if (response.isSuccessful()) {
|
||||
String siteInfo = response.body();
|
||||
if (siteInfo != null) {
|
||||
List<BlockedUserData> blockedUsers = new ArrayList<>();
|
||||
List<BlockedCommunityData> blockedCommunities = new ArrayList<>();
|
||||
try {
|
||||
JSONObject siteInfoJson = new JSONObject(siteInfo).getJSONObject("my_user");
|
||||
JSONArray blockedUsersJson = (siteInfoJson.has("person_blocks")) ? siteInfoJson.getJSONArray("person_blocks") : null;
|
||||
JSONArray blockedCommunitiesJson = (siteInfoJson.has("community_blocks")) ? siteInfoJson.getJSONArray("community_blocks") : null;
|
||||
if (blockedUsersJson != null) {
|
||||
for (int i = 0; i < blockedUsersJson.length(); i++) {
|
||||
JSONObject blockedUserJson = blockedUsersJson.getJSONObject(i).getJSONObject("target");
|
||||
int id = blockedUserJson.getInt("id");
|
||||
String name = blockedUserJson.getString("name");
|
||||
String avatar = "";
|
||||
if (blockedUserJson.has("avatar"))
|
||||
avatar = blockedUserJson.getString("avatar");
|
||||
|
||||
String qualifiedName = LemmyUtils.actorID2FullName(blockedUserJson.getString("actor_id"));
|
||||
BlockedUserData blockedUserData = new BlockedUserData(id, name, avatar, qualifiedName, accountName);
|
||||
|
||||
blockedUsers.add(blockedUserData);
|
||||
}
|
||||
}
|
||||
if (blockedCommunitiesJson != null) {
|
||||
for (int i = 0; i < blockedCommunitiesJson.length(); i++) {
|
||||
JSONObject blockedCommunityJson = blockedCommunitiesJson.getJSONObject(i);
|
||||
SubredditData blockedCommunityData = ParseSubredditData.parseSubredditData(blockedCommunityJson, true);
|
||||
blockedCommunities.add(new BlockedCommunityData(blockedCommunityData, accountName));
|
||||
}
|
||||
}
|
||||
fetchBlockedThingsListener.onFetchBlockedThingsSuccess(blockedUsers, blockedCommunities);
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
fetchBlockedThingsListener.onFetchBlockedThingsFailure();
|
||||
}
|
||||
} else {
|
||||
fetchBlockedThingsListener.onFetchBlockedThingsFailure();
|
||||
}
|
||||
} else {
|
||||
fetchBlockedThingsListener.onFetchBlockedThingsFailure();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Call<String> call, Throwable t) {
|
||||
fetchBlockedThingsListener.onFetchBlockedThingsFailure();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public interface FetchBlockedThingsListener {
|
||||
void onFetchBlockedThingsSuccess(List<BlockedUserData> blockedUsers, List<BlockedCommunityData> blockedCommunities);
|
||||
|
||||
void onFetchBlockedThingsFailure();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,462 @@
|
||||
package eu.toldi.infinityforlemmy.activities;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.text.Editable;
|
||||
import android.text.TextWatcher;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.EditText;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.coordinatorlayout.widget.CoordinatorLayout;
|
||||
import androidx.core.view.inputmethod.EditorInfoCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentPagerAdapter;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
|
||||
import com.google.android.material.appbar.AppBarLayout;
|
||||
import com.google.android.material.appbar.CollapsingToolbarLayout;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import eu.toldi.infinityforlemmy.ActivityToolbarInterface;
|
||||
import eu.toldi.infinityforlemmy.FragmentCommunicator;
|
||||
import eu.toldi.infinityforlemmy.Infinity;
|
||||
import eu.toldi.infinityforlemmy.R;
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
import eu.toldi.infinityforlemmy.RetrofitHolder;
|
||||
import eu.toldi.infinityforlemmy.account.FetchBlockedThings;
|
||||
import eu.toldi.infinityforlemmy.asynctasks.InsertBlockedThings;
|
||||
import eu.toldi.infinityforlemmy.blockedcommunity.BlockedCommunityData;
|
||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserData;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||
import eu.toldi.infinityforlemmy.customviews.ViewPagerBugFixed;
|
||||
import eu.toldi.infinityforlemmy.customviews.slidr.Slidr;
|
||||
import eu.toldi.infinityforlemmy.events.GoBackToMainPageEvent;
|
||||
import eu.toldi.infinityforlemmy.events.SwitchAccountEvent;
|
||||
import eu.toldi.infinityforlemmy.fragments.BlockedCommunitiesListingFragment;
|
||||
import eu.toldi.infinityforlemmy.fragments.BlockedUsersListingFragment;
|
||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
|
||||
import eu.toldi.infinityforlemmy.utils.Utils;
|
||||
import retrofit2.Retrofit;
|
||||
|
||||
|
||||
public class BlockedThingListingActivity extends BaseActivity implements ActivityToolbarInterface {
|
||||
|
||||
public static final String EXTRA_SHOW_MULTIREDDITS = "ESM";
|
||||
private static final String INSERT_SUBSCRIBED_SUBREDDIT_STATE = "ISSS";
|
||||
private static final String INSERT_MULTIREDDIT_STATE = "IMS";
|
||||
|
||||
@BindView(R.id.coordinator_layout_subscribed_thing_listing_activity)
|
||||
CoordinatorLayout coordinatorLayout;
|
||||
@BindView(R.id.appbar_layout_subscribed_thing_listing_activity)
|
||||
AppBarLayout appBarLayout;
|
||||
@BindView(R.id.collapsing_toolbar_layout_subscribed_thing_listing_activity)
|
||||
CollapsingToolbarLayout collapsingToolbarLayout;
|
||||
@BindView(R.id.toolbar_subscribed_thing_listing_activity)
|
||||
Toolbar toolbar;
|
||||
@BindView(R.id.search_edit_text_subscribed_thing_listing_activity)
|
||||
EditText searchEditText;
|
||||
@BindView(R.id.tab_layout_subscribed_thing_listing_activity)
|
||||
TabLayout tabLayout;
|
||||
@BindView(R.id.view_pager_subscribed_thing_listing_activity)
|
||||
ViewPagerBugFixed viewPager;
|
||||
@BindView(R.id.fab_subscribed_thing_listing_activity)
|
||||
FloatingActionButton fab;
|
||||
@Inject
|
||||
@Named("oauth")
|
||||
Retrofit mOauthRetrofit;
|
||||
|
||||
@Inject
|
||||
@Named("no_oauth")
|
||||
RetrofitHolder mRetrofit;
|
||||
@Inject
|
||||
RedditDataRoomDatabase mRedditDataRoomDatabase;
|
||||
@Inject
|
||||
@Named("default")
|
||||
SharedPreferences mSharedPreferences;
|
||||
@Inject
|
||||
@Named("current_account")
|
||||
SharedPreferences mCurrentAccountSharedPreferences;
|
||||
@Inject
|
||||
CustomThemeWrapper mCustomThemeWrapper;
|
||||
@Inject
|
||||
Executor mExecutor;
|
||||
private String mAccessToken;
|
||||
private String mAccountName;
|
||||
|
||||
private String mAccountQualifiedName;
|
||||
private boolean mInsertSuccess = false;
|
||||
private boolean mInsertMultiredditSuccess = false;
|
||||
private boolean showMultiReddits = false;
|
||||
private SectionsPagerAdapter sectionsPagerAdapter;
|
||||
private Menu mMenu;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
((Infinity) getApplication()).getAppComponent().inject(this);
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setContentView(R.layout.activity_subscribed_thing_listing);
|
||||
|
||||
ButterKnife.bind(this);
|
||||
|
||||
EventBus.getDefault().register(this);
|
||||
|
||||
applyCustomTheme();
|
||||
|
||||
if (mSharedPreferences.getBoolean(SharedPreferencesUtils.SWIPE_RIGHT_TO_GO_BACK, true)) {
|
||||
mSliderPanel = Slidr.attach(this);
|
||||
}
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
Window window = getWindow();
|
||||
|
||||
if (isChangeStatusBarIconColor()) {
|
||||
addOnOffsetChangedListener(appBarLayout);
|
||||
}
|
||||
|
||||
if (isImmersiveInterface()) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||
window.setDecorFitsSystemWindows(false);
|
||||
} else {
|
||||
window.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
|
||||
}
|
||||
adjustToolbar(toolbar);
|
||||
|
||||
int navBarHeight = getNavBarHeight();
|
||||
if (navBarHeight > 0) {
|
||||
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) fab.getLayoutParams();
|
||||
params.bottomMargin += navBarHeight;
|
||||
fab.setLayoutParams(params);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setSupportActionBar(toolbar);
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
setToolbarGoToTop(toolbar);
|
||||
|
||||
mAccessToken = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN, null);
|
||||
mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_NAME, "-");
|
||||
mAccountQualifiedName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_QUALIFIED_NAME, "-");
|
||||
|
||||
if (savedInstanceState != null) {
|
||||
mInsertSuccess = savedInstanceState.getBoolean(INSERT_SUBSCRIBED_SUBREDDIT_STATE);
|
||||
mInsertMultiredditSuccess = savedInstanceState.getBoolean(INSERT_MULTIREDDIT_STATE);
|
||||
} else {
|
||||
showMultiReddits = getIntent().getBooleanExtra(EXTRA_SHOW_MULTIREDDITS, false);
|
||||
}
|
||||
|
||||
if (mAccessToken == null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
searchEditText.setImeOptions(searchEditText.getImeOptions() | EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING);
|
||||
}
|
||||
|
||||
searchEditText.addTextChangedListener(new TextWatcher() {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable editable) {
|
||||
sectionsPagerAdapter.changeSearchQuery(editable.toString());
|
||||
}
|
||||
});
|
||||
initializeViewPagerAndLoadSubscriptions();
|
||||
}
|
||||
|
||||
@Override
|
||||
public SharedPreferences getDefaultSharedPreferences() {
|
||||
return mSharedPreferences;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected CustomThemeWrapper getCustomThemeWrapper() {
|
||||
return mCustomThemeWrapper;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void applyCustomTheme() {
|
||||
coordinatorLayout.setBackgroundColor(mCustomThemeWrapper.getBackgroundColor());
|
||||
applyAppBarLayoutAndCollapsingToolbarLayoutAndToolbarTheme(appBarLayout, collapsingToolbarLayout, toolbar);
|
||||
applyTabLayoutTheme(tabLayout);
|
||||
applyFABTheme(fab, mSharedPreferences.getBoolean(SharedPreferencesUtils.USE_CIRCULAR_FAB, false));
|
||||
searchEditText.setTextColor(mCustomThemeWrapper.getToolbarPrimaryTextAndIconColor());
|
||||
searchEditText.setHintTextColor(mCustomThemeWrapper.getToolbarSecondaryTextColor());
|
||||
}
|
||||
|
||||
private void initializeViewPagerAndLoadSubscriptions() {
|
||||
fab.setOnClickListener(view -> {
|
||||
Intent intent = new Intent(this, CreateMultiRedditActivity.class);
|
||||
startActivity(intent);
|
||||
});
|
||||
sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
|
||||
viewPager.setAdapter(sectionsPagerAdapter);
|
||||
viewPager.setOffscreenPageLimit(2);
|
||||
if (viewPager.getCurrentItem() != 2) {
|
||||
fab.hide();
|
||||
}
|
||||
viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
|
||||
@Override
|
||||
public void onPageSelected(int position) {
|
||||
if (position == 0) {
|
||||
unlockSwipeRightToGoBack();
|
||||
fab.hide();
|
||||
} else {
|
||||
lockSwipeRightToGoBack();
|
||||
if (position != 2) {
|
||||
fab.hide();
|
||||
} else {
|
||||
fab.show();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
tabLayout.setupWithViewPager(viewPager);
|
||||
|
||||
if (showMultiReddits) {
|
||||
viewPager.setCurrentItem(2, false);
|
||||
}
|
||||
|
||||
loadBlocks(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.subscribed_thing_listing_activity, menu);
|
||||
mMenu = menu;
|
||||
applyMenuItemTheme(menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||
if (item.getItemId() == R.id.action_search_subscribed_thing_listing_activity) {
|
||||
item.setVisible(false);
|
||||
searchEditText.setVisibility(View.VISIBLE);
|
||||
searchEditText.requestFocus();
|
||||
if (searchEditText.requestFocus()) {
|
||||
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.showSoftInput(searchEditText, InputMethodManager.SHOW_IMPLICIT);
|
||||
}
|
||||
return true;
|
||||
} else if (item.getItemId() == android.R.id.home) {
|
||||
if (searchEditText.getVisibility() == View.VISIBLE) {
|
||||
Utils.hideKeyboard(this);
|
||||
searchEditText.setVisibility(View.GONE);
|
||||
searchEditText.setText("");
|
||||
mMenu.findItem(R.id.action_search_subscribed_thing_listing_activity).setVisible(true);
|
||||
sectionsPagerAdapter.changeSearchQuery("");
|
||||
return true;
|
||||
}
|
||||
finish();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (searchEditText.getVisibility() == View.VISIBLE) {
|
||||
Utils.hideKeyboard(this);
|
||||
searchEditText.setVisibility(View.GONE);
|
||||
searchEditText.setText("");
|
||||
mMenu.findItem(R.id.action_search_subscribed_thing_listing_activity).setVisible(true);
|
||||
sectionsPagerAdapter.changeSearchQuery("");
|
||||
} else {
|
||||
super.onBackPressed();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSaveInstanceState(@NonNull Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
outState.putBoolean(INSERT_SUBSCRIBED_SUBREDDIT_STATE, mInsertSuccess);
|
||||
outState.putBoolean(INSERT_MULTIREDDIT_STATE, mInsertMultiredditSuccess);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
EventBus.getDefault().unregister(this);
|
||||
}
|
||||
|
||||
public void loadBlocks(boolean forceLoad) {
|
||||
if (mAccessToken != null && !(!forceLoad && mInsertSuccess)) {
|
||||
FetchBlockedThings.fetchBlockedThings(mRetrofit.getRetrofit(), mAccessToken, mAccountQualifiedName, new FetchBlockedThings.FetchBlockedThingsListener() {
|
||||
@Override
|
||||
public void onFetchBlockedThingsSuccess(List<BlockedUserData> blockedUsers, List<BlockedCommunityData> blockedCommunities) {
|
||||
InsertBlockedThings.insertBlockedThings(mExecutor, new Handler(), mRedditDataRoomDatabase, mAccountQualifiedName,
|
||||
blockedCommunities, blockedUsers, () -> {
|
||||
mInsertSuccess = true;
|
||||
sectionsPagerAdapter.stopRefreshProgressbar();
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFetchBlockedThingsFailure() {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Subscribe
|
||||
public void onAccountSwitchEvent(SwitchAccountEvent event) {
|
||||
finish();
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void goBackToMainPageEvent(GoBackToMainPageEvent event) {
|
||||
finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLongPress() {
|
||||
if (sectionsPagerAdapter != null) {
|
||||
sectionsPagerAdapter.goBackToTop();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void lockSwipeRightToGoBack() {
|
||||
if (mSliderPanel != null) {
|
||||
mSliderPanel.lock();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unlockSwipeRightToGoBack() {
|
||||
if (mSliderPanel != null) {
|
||||
mSliderPanel.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
private class SectionsPagerAdapter extends FragmentPagerAdapter {
|
||||
|
||||
private BlockedCommunitiesListingFragment blockedCommunitiesListingFragment;
|
||||
private BlockedUsersListingFragment followedUsersListingFragment;
|
||||
|
||||
public SectionsPagerAdapter(FragmentManager fm) {
|
||||
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Fragment getItem(int position) {
|
||||
switch (position) {
|
||||
default:
|
||||
case 0: {
|
||||
BlockedCommunitiesListingFragment fragment = new BlockedCommunitiesListingFragment();
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putBoolean(BlockedCommunitiesListingFragment.EXTRA_IS_SUBREDDIT_SELECTION, false);
|
||||
bundle.putString(BlockedCommunitiesListingFragment.EXTRA_ACCOUNT_NAME, mAccountName);
|
||||
bundle.putString(BlockedCommunitiesListingFragment.EXTRA_ACCOUNT_QUALIFIED_NAME, mAccountQualifiedName);
|
||||
bundle.putString(BlockedCommunitiesListingFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
|
||||
fragment.setArguments(bundle);
|
||||
return fragment;
|
||||
}
|
||||
case 1: {
|
||||
BlockedUsersListingFragment fragment = new BlockedUsersListingFragment();
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putString(BlockedUsersListingFragment.EXTRA_ACCOUNT_NAME, mAccountQualifiedName);
|
||||
bundle.putString(BlockedUsersListingFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
|
||||
fragment.setArguments(bundle);
|
||||
return fragment;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getPageTitle(int position) {
|
||||
switch (position) {
|
||||
case 0:
|
||||
return Utils.getTabTextWithCustomFont(typeface, getString(R.string.communities));
|
||||
case 1:
|
||||
return Utils.getTabTextWithCustomFont(typeface, getString(R.string.users));
|
||||
case 2:
|
||||
return Utils.getTabTextWithCustomFont(typeface, getString(R.string.multi_reddits));
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Object instantiateItem(@NonNull ViewGroup container, int position) {
|
||||
Fragment fragment = (Fragment) super.instantiateItem(container, position);
|
||||
if (position == 0) {
|
||||
blockedCommunitiesListingFragment = (BlockedCommunitiesListingFragment) fragment;
|
||||
} else if (position == 1) {
|
||||
followedUsersListingFragment = (BlockedUsersListingFragment) fragment;
|
||||
}
|
||||
|
||||
return fragment;
|
||||
}
|
||||
|
||||
void stopRefreshProgressbar() {
|
||||
if (blockedCommunitiesListingFragment != null) {
|
||||
((FragmentCommunicator) blockedCommunitiesListingFragment).stopRefreshProgressbar();
|
||||
}
|
||||
if (followedUsersListingFragment != null) {
|
||||
((FragmentCommunicator) followedUsersListingFragment).stopRefreshProgressbar();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void goBackToTop() {
|
||||
if (viewPager.getCurrentItem() == 0) {
|
||||
blockedCommunitiesListingFragment.goBackToTop();
|
||||
} else if (viewPager.getCurrentItem() == 1) {
|
||||
followedUsersListingFragment.goBackToTop();
|
||||
}
|
||||
}
|
||||
|
||||
void changeSearchQuery(String searchQuery) {
|
||||
if (blockedCommunitiesListingFragment != null) {
|
||||
blockedCommunitiesListingFragment.changeSearchQuery(searchQuery);
|
||||
}
|
||||
if (followedUsersListingFragment != null) {
|
||||
followedUsersListingFragment.changeSearchQuery(searchQuery);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -308,7 +308,7 @@ public class EditPostActivity extends BaseActivity implements UploadImageEnabled
|
||||
isSubmitting = true;
|
||||
|
||||
Snackbar.make(coordinatorLayout, R.string.posting, Snackbar.LENGTH_SHORT).show();
|
||||
mRetrofit.getRetrofit().create(LemmyAPI.class).postUpdate(new EditPostDTO(mPost.getId(), titleEditText.getText().toString(), linkEditText.getText().toString(), contentEditText.getText().toString(), mPost.isNSFW(), null, mAccessToken))
|
||||
mRetrofit.getRetrofit().create(LemmyAPI.class).postUpdate(new EditPostDTO(mPost.getId(), titleEditText.getText().toString(), (linkEditText.getText().toString().isEmpty()) ? null : linkEditText.getText().toString(), contentEditText.getText().toString(), mPost.isNSFW(), null, mAccessToken))
|
||||
.enqueue(new Callback<String>() {
|
||||
@Override
|
||||
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
|
||||
|
||||
@@ -272,7 +272,7 @@ public class FilteredPostsActivity extends BaseActivity implements SortTypeSelec
|
||||
switch (postType) {
|
||||
case PostPagingSource.TYPE_FRONT_PAGE:
|
||||
case PostPagingSource.TYPE_ANONYMOUS_FRONT_PAGE:
|
||||
getSupportActionBar().setTitle(R.string.home);
|
||||
getSupportActionBar().setTitle(R.string.subscribed_feed);
|
||||
break;
|
||||
case PostPagingSource.TYPE_SEARCH:
|
||||
getSupportActionBar().setTitle(R.string.search);
|
||||
|
||||
@@ -55,6 +55,7 @@ import eu.toldi.infinityforlemmy.events.PassPrivateMessageEvent;
|
||||
import eu.toldi.infinityforlemmy.events.PassPrivateMessageIndexEvent;
|
||||
import eu.toldi.infinityforlemmy.events.SwitchAccountEvent;
|
||||
import eu.toldi.infinityforlemmy.fragments.InboxFragment;
|
||||
import eu.toldi.infinityforlemmy.fragments.PrivateMessageFragment;
|
||||
import eu.toldi.infinityforlemmy.message.CommentInteraction;
|
||||
import eu.toldi.infinityforlemmy.message.FetchMessage;
|
||||
import eu.toldi.infinityforlemmy.message.ReadMessage;
|
||||
@@ -180,7 +181,7 @@ public class InboxActivity extends BaseActivity implements ActivityToolbarInterf
|
||||
if (i == EditorInfo.IME_ACTION_DONE) {
|
||||
Utils.hideKeyboard(this);
|
||||
Intent pmIntent = new Intent(this, SendPrivateMessageActivity.class);
|
||||
pmIntent.putExtra(SendPrivateMessageActivity.EXTRA_RECIPIENT_USERNAME, thingEditText.getText().toString());
|
||||
//pmIntent.putExtra(SendPrivateMessageActivity.EXTRA_RECIPIENT_USERNAME, thingEditText.getText().toString());
|
||||
startActivity(pmIntent);
|
||||
return true;
|
||||
}
|
||||
@@ -193,7 +194,7 @@ public class InboxActivity extends BaseActivity implements ActivityToolbarInterf
|
||||
-> {
|
||||
Utils.hideKeyboard(this);
|
||||
Intent pmIntent = new Intent(this, SendPrivateMessageActivity.class);
|
||||
pmIntent.putExtra(SendPrivateMessageActivity.EXTRA_RECIPIENT_USERNAME, thingEditText.getText().toString());
|
||||
//pmIntent.putExtra(SendPrivateMessageActivity.EXTRA_RECIPIENT_USERNAME, thingEditText.getText().toString());
|
||||
startActivity(pmIntent);
|
||||
})
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
@@ -330,7 +331,7 @@ public class InboxActivity extends BaseActivity implements ActivityToolbarInterf
|
||||
if (resultCode == RESULT_OK && requestCode == SEARCH_USER_REQUEST_CODE && data != null) {
|
||||
String username = data.getStringExtra(SearchActivity.EXTRA_RETURN_USER_NAME);
|
||||
Intent intent = new Intent(this, SendPrivateMessageActivity.class);
|
||||
intent.putExtra(SendPrivateMessageActivity.EXTRA_RECIPIENT_USERNAME, username);
|
||||
//intent.putExtra(SendPrivateMessageActivity.EXTRA_RECIPIENT_USERNAME, username);
|
||||
startActivity(intent);
|
||||
}
|
||||
}
|
||||
@@ -441,7 +442,7 @@ public class InboxActivity extends BaseActivity implements ActivityToolbarInterf
|
||||
@NonNull
|
||||
@Override
|
||||
public Fragment createFragment(int position) {
|
||||
InboxFragment fragment = new InboxFragment();
|
||||
Fragment fragment = new InboxFragment();
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putString(InboxFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
|
||||
switch (position) {
|
||||
@@ -450,11 +451,9 @@ public class InboxActivity extends BaseActivity implements ActivityToolbarInterf
|
||||
break;
|
||||
case 1:
|
||||
bundle.putString(InboxFragment.EXTRA_MESSAGE_WHERE, FetchMessage.WHERE_MENTIONS);
|
||||
fragment.setArguments(bundle);
|
||||
break;
|
||||
case 2:
|
||||
bundle.putString(InboxFragment.EXTRA_MESSAGE_WHERE, FetchMessage.WHERE_MESSAGES);
|
||||
fragment.setArguments(bundle);
|
||||
fragment = new PrivateMessageFragment();
|
||||
break;
|
||||
}
|
||||
fragment.setArguments(bundle);
|
||||
|
||||
@@ -79,9 +79,9 @@ public class LinkResolverActivity extends AppCompatActivity {
|
||||
|
||||
private Uri getRedditUriByPath(String path) {
|
||||
if (path.charAt(0) != '/') {
|
||||
return Uri.parse("https://www.reddit.com/" + path);
|
||||
return Uri.parse(mRetrofit.getBaseURL() + path);
|
||||
} else {
|
||||
return Uri.parse("https://www.reddit.com" + path);
|
||||
return Uri.parse(mRetrofit.getBaseURL() + path);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,6 +91,10 @@ public class LinkResolverActivity extends AppCompatActivity {
|
||||
|
||||
((Infinity) getApplication()).getAppComponent().inject(this);
|
||||
mAccessToken = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN, null);
|
||||
if (mAccessToken != null) {
|
||||
String instance = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_INSTANCE, null);
|
||||
mRetrofit.setBaseURL(instance);
|
||||
}
|
||||
|
||||
Uri uri = getIntent().getData();
|
||||
if (uri == null) {
|
||||
|
||||
@@ -6,6 +6,7 @@ import android.content.SharedPreferences;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.text.Editable;
|
||||
import android.util.Log;
|
||||
import android.util.Patterns;
|
||||
import android.view.InflateException;
|
||||
@@ -26,6 +27,8 @@ import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import javax.inject.Inject;
|
||||
@@ -139,15 +142,18 @@ public class LoginActivity extends BaseActivity {
|
||||
|
||||
loginButton.setOnClickListener(view -> {
|
||||
Log.i("LoginActivity", "Login button clicked");
|
||||
if(!checkFields())
|
||||
return;
|
||||
loginButton.setEnabled(false);
|
||||
progressBar.setVisibility(ProgressBar.VISIBLE);
|
||||
String username = username_input.getText().toString().trim();
|
||||
String instance = correctURL(instance_input.getText().toString().trim());
|
||||
if (!Patterns.WEB_URL.matcher(instance).matches()) {
|
||||
instance_input.setError("Invalid instance URL");
|
||||
try {
|
||||
URL urlObj = new URL(instance);
|
||||
instance = urlObj.getProtocol() + "://" + urlObj.getHost() + "/";
|
||||
} catch (MalformedURLException e) {
|
||||
instance_input.setError("Invalid URL");
|
||||
Toast.makeText(LoginActivity.this, "Invalid instance URL", Toast.LENGTH_SHORT).show();
|
||||
loginButton.setEnabled(true);
|
||||
progressBar.setVisibility(ProgressBar.GONE);
|
||||
return;
|
||||
}
|
||||
Log.i("LoginActivity", "Instance: " + instance);
|
||||
@@ -155,6 +161,7 @@ public class LoginActivity extends BaseActivity {
|
||||
mRetrofit.setBaseURL(instance);
|
||||
LemmyAPI api = mRetrofit.getRetrofit().create(LemmyAPI.class);
|
||||
Call<String> accessTokenCall = api.userLogin(accountLoginDTO);
|
||||
String finalInstance = instance;
|
||||
accessTokenCall.enqueue(new Callback<String>() {
|
||||
@Override
|
||||
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
|
||||
@@ -182,7 +189,7 @@ public class LoginActivity extends BaseActivity {
|
||||
@Override
|
||||
public void onFetchSiteInfoSuccess(SiteInfo siteInfo) {
|
||||
boolean canDownvote = siteInfo.isEnable_downvotes();
|
||||
ParseAndInsertNewAccount.parseAndInsertNewAccount(mExecutor, new Handler(), name,display_name, accessToken, profileImageUrl, bannerImageUrl, authCode,instance,canDownvote, mRedditDataRoomDatabase.accountDao(),
|
||||
ParseAndInsertNewAccount.parseAndInsertNewAccount(mExecutor, new Handler(), name,display_name, accessToken, profileImageUrl, bannerImageUrl, authCode, finalInstance,canDownvote, mRedditDataRoomDatabase.accountDao(),
|
||||
() -> {
|
||||
Intent resultIntent = new Intent();
|
||||
setResult(Activity.RESULT_OK, resultIntent);
|
||||
@@ -193,7 +200,7 @@ public class LoginActivity extends BaseActivity {
|
||||
|
||||
@Override
|
||||
public void onFetchSiteInfoFailed() {
|
||||
ParseAndInsertNewAccount.parseAndInsertNewAccount(mExecutor, new Handler(), name,display_name, accessToken, profileImageUrl, bannerImageUrl, authCode,instance,true, mRedditDataRoomDatabase.accountDao(),
|
||||
ParseAndInsertNewAccount.parseAndInsertNewAccount(mExecutor, new Handler(), name,display_name, accessToken, profileImageUrl, bannerImageUrl, authCode, finalInstance,true, mRedditDataRoomDatabase.accountDao(),
|
||||
() -> {
|
||||
Intent resultIntent = new Intent();
|
||||
setResult(Activity.RESULT_OK, resultIntent);
|
||||
@@ -205,7 +212,7 @@ public class LoginActivity extends BaseActivity {
|
||||
mCurrentAccountSharedPreferences.edit().putString(SharedPreferencesUtils.ACCESS_TOKEN, accessToken)
|
||||
.putString(SharedPreferencesUtils.ACCOUNT_NAME, display_name)
|
||||
.putString(SharedPreferencesUtils.ACCOUNT_QUALIFIED_NAME, name)
|
||||
.putString(SharedPreferencesUtils.ACCOUNT_INSTANCE,instance)
|
||||
.putString(SharedPreferencesUtils.ACCOUNT_INSTANCE,finalInstance)
|
||||
.putString(SharedPreferencesUtils.ACCOUNT_IMAGE_URL, profileImageUrl).apply();
|
||||
}
|
||||
|
||||
@@ -260,6 +267,26 @@ public class LoginActivity extends BaseActivity {
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
private boolean checkFields() {
|
||||
boolean result = true;
|
||||
Editable username = username_input.getText();
|
||||
Editable password = password_input.getText();
|
||||
Editable instance = instance_input.getText();
|
||||
if(instance == null || instance.toString().isEmpty()) {
|
||||
instance_input.setError(getString(R.string.instance_cannot_be_empty));
|
||||
result = false;
|
||||
}
|
||||
if(username == null || username.toString().isEmpty()) {
|
||||
username_input.setError(getString(R.string.username_cannot_be_empty));
|
||||
result = false;
|
||||
}
|
||||
if(password == null || password.toString().isEmpty()) {
|
||||
password_input.setError(getString(R.string.password_cannot_be_empty));
|
||||
result = false;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
private static String correctURL(String url) {
|
||||
if (url == null || url.isEmpty()) {
|
||||
throw new IllegalArgumentException("URL cannot be null or empty");
|
||||
|
||||
@@ -481,7 +481,6 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
|
||||
Intent intent = new Intent(this, ViewUserDetailActivity.class);
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, mAccountName);
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_QUALIFIED_USER_NAME_KEY, mAccountQualifiedName);
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_QUALIFIED_USER_NAME_KEY, mAccountName);
|
||||
startActivity(intent);
|
||||
break;
|
||||
}
|
||||
@@ -808,7 +807,7 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
|
||||
|
||||
adapter = new NavigationDrawerRecyclerViewMergedAdapter(this, mSharedPreferences,
|
||||
mNsfwAndSpoilerSharedPreferences, mNavigationDrawerSharedPreferences, mSecuritySharedPreferences,
|
||||
mCustomThemeWrapper, mAccountName, new NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener() {
|
||||
mCustomThemeWrapper, mAccountName, mAccountQualifiedName, new NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener() {
|
||||
@Override
|
||||
public void onMenuClick(int stringId) {
|
||||
Intent intent = null;
|
||||
@@ -883,6 +882,8 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
|
||||
});
|
||||
} else if (stringId == R.string.anonymous_account_instance) {
|
||||
changeAnonymousAccountInstance();
|
||||
} else if (stringId == R.string.blocks) {
|
||||
intent = new Intent(MainActivity.this, BlockedThingListingActivity.class);
|
||||
}
|
||||
if (intent != null) {
|
||||
startActivity(intent);
|
||||
@@ -931,7 +932,7 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
|
||||
new TabLayoutMediator(tabLayout, viewPager2, (tab, position) -> {
|
||||
switch (position) {
|
||||
case 0:
|
||||
Utils.setTitleWithCustomFontToTab(typeface, tab, mMainActivityTabsSharedPreferences.getString((mAccountName == null ? "" : mAccountName) + SharedPreferencesUtils.MAIN_PAGE_TAB_1_TITLE, getString(R.string.home)));
|
||||
Utils.setTitleWithCustomFontToTab(typeface, tab, mMainActivityTabsSharedPreferences.getString((mAccountName == null ? "" : mAccountName) + SharedPreferencesUtils.MAIN_PAGE_TAB_1_TITLE, getString(R.string.subscribed_feed)));
|
||||
break;
|
||||
case 1:
|
||||
Utils.setTitleWithCustomFontToTab(typeface, tab, mMainActivityTabsSharedPreferences.getString((mAccountName == null ? "" : mAccountName) + SharedPreferencesUtils.MAIN_PAGE_TAB_2_TITLE, getString(R.string.local)));
|
||||
|
||||
@@ -511,7 +511,7 @@ public class PostImageActivity extends BaseActivity implements FlairBottomSheetF
|
||||
}
|
||||
|
||||
private void loadSubredditIcon() {
|
||||
LoadSubredditIcon.loadSubredditIcon(mExecutor, new Handler(), mRedditDataRoomDatabase, subredditName, mAccessToken, mOauthRetrofit, mRetrofit.getRetrofit(), iconImageUrl -> {
|
||||
LoadSubredditIcon.loadSubredditIcon(mExecutor, new Handler(), mRedditDataRoomDatabase, communityData.getQualified_name(), mAccessToken, mOauthRetrofit, mRetrofit.getRetrofit(), iconImageUrl -> {
|
||||
iconUrl = iconImageUrl;
|
||||
displaySubredditIcon();
|
||||
loadSubredditIconSuccessful = true;
|
||||
|
||||
@@ -488,7 +488,7 @@ public class PostLinkActivity extends BaseActivity implements FlairBottomSheetFr
|
||||
}
|
||||
|
||||
private void loadSubredditIcon() {
|
||||
LoadSubredditIcon.loadSubredditIcon(mExecutor, new Handler(), mRedditDataRoomDatabase, subredditName,
|
||||
LoadSubredditIcon.loadSubredditIcon(mExecutor, new Handler(), mRedditDataRoomDatabase, communityData.getQualified_name(),
|
||||
mAccessToken, mOauthRetrofit, mRetrofit.getRetrofit(), iconImageUrl -> {
|
||||
iconUrl = iconImageUrl;
|
||||
displaySubredditIcon();
|
||||
|
||||
@@ -450,7 +450,7 @@ public class PostTextActivity extends BaseActivity implements FlairBottomSheetFr
|
||||
}
|
||||
|
||||
private void loadSubredditIcon() {
|
||||
LoadSubredditIcon.loadSubredditIcon(mExecutor, new Handler(), mRedditDataRoomDatabase, subredditName,
|
||||
LoadSubredditIcon.loadSubredditIcon(mExecutor, new Handler(), mRedditDataRoomDatabase, communityData.getQualified_name(),
|
||||
mAccessToken, mOauthRetrofit, mRetrofit.getRetrofit(), iconImageUrl -> {
|
||||
iconUrl = iconImageUrl;
|
||||
displaySubredditIcon();
|
||||
|
||||
@@ -784,7 +784,8 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect
|
||||
bundle.putString(SubredditListingFragment.EXTRA_QUERY, mQuery);
|
||||
bundle.putBoolean(SubredditListingFragment.EXTRA_IS_GETTING_SUBREDDIT_INFO, false);
|
||||
bundle.putString(SubredditListingFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
|
||||
bundle.putString(SubredditListingFragment.EXTRA_ACCOUNT_NAME, mAccountQualifiedName);
|
||||
bundle.putString(SubredditListingFragment.EXTRA_ACCOUNT_NAME, mAccountName);
|
||||
bundle.putString(SubredditListingFragment.EXTRA_ACCOUNT_QUALIFIED_NAME, mAccountQualifiedName);
|
||||
mFragment.setArguments(bundle);
|
||||
return mFragment;
|
||||
}
|
||||
|
||||
@@ -119,7 +119,8 @@ public class SearchSubredditsResultActivity extends BaseActivity implements Acti
|
||||
bundle.putString(SubredditListingFragment.EXTRA_QUERY, query);
|
||||
bundle.putBoolean(SubredditListingFragment.EXTRA_IS_GETTING_SUBREDDIT_INFO, true);
|
||||
bundle.putString(SubredditListingFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
|
||||
bundle.putString(SubredditListingFragment.EXTRA_ACCOUNT_NAME, mAccountQualifiedName);
|
||||
bundle.putString(SubredditListingFragment.EXTRA_ACCOUNT_NAME, mAccountName);
|
||||
bundle.putString(SubredditListingFragment.EXTRA_ACCOUNT_QUALIFIED_NAME, mAccountQualifiedName);
|
||||
bundle.putBoolean(SubredditListingFragment.EXTRA_IS_MULTI_SELECTION, getIntent().getBooleanExtra(EXTRA_IS_MULTI_SELECTION, false));
|
||||
mFragment.setArguments(bundle);
|
||||
} else {
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
package eu.toldi.infinityforlemmy.activities;
|
||||
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Environment;
|
||||
import android.provider.MediaStore;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
@@ -10,12 +15,20 @@ import android.widget.EditText;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.coordinatorlayout.widget.CoordinatorLayout;
|
||||
import androidx.core.content.FileProvider;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.appbar.AppBarLayout;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
|
||||
@@ -23,13 +36,24 @@ import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import eu.toldi.infinityforlemmy.Infinity;
|
||||
import eu.toldi.infinityforlemmy.R;
|
||||
import eu.toldi.infinityforlemmy.RetrofitHolder;
|
||||
import eu.toldi.infinityforlemmy.UploadImageEnabledActivity;
|
||||
import eu.toldi.infinityforlemmy.UploadedImage;
|
||||
import eu.toldi.infinityforlemmy.adapters.MarkdownBottomBarRecyclerViewAdapter;
|
||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.UploadedImagesBottomSheetFragment;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||
import eu.toldi.infinityforlemmy.message.ComposeMessage;
|
||||
import eu.toldi.infinityforlemmy.customviews.LinearLayoutManagerBugFixed;
|
||||
import eu.toldi.infinityforlemmy.privatemessage.LemmyPrivateMessageAPI;
|
||||
import eu.toldi.infinityforlemmy.privatemessage.PrivateMessage;
|
||||
import eu.toldi.infinityforlemmy.user.BasicUserInfo;
|
||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
|
||||
import retrofit2.Retrofit;
|
||||
import eu.toldi.infinityforlemmy.utils.Utils;
|
||||
|
||||
public class SendPrivateMessageActivity extends BaseActivity {
|
||||
public static final String EXTRA_RECIPIENT_USERNAME = "ERU";
|
||||
public class SendPrivateMessageActivity extends BaseActivity implements UploadImageEnabledActivity {
|
||||
public static final String EXTRA_RECIPIENT_USER_INFO = "ERUI";
|
||||
|
||||
private static final int PICK_IMAGE_REQUEST_CODE = 100;
|
||||
private static final int CAPTURE_IMAGE_REQUEST_CODE = 200;
|
||||
@BindView(R.id.coordinator_layout_send_private_message_activity)
|
||||
CoordinatorLayout coordinatorLayout;
|
||||
@BindView(R.id.appbar_layout_send_private_message_activity)
|
||||
@@ -40,15 +64,20 @@ public class SendPrivateMessageActivity extends BaseActivity {
|
||||
EditText usernameEditText;
|
||||
@BindView(R.id.divider_1_send_private_message_activity)
|
||||
View divider1;
|
||||
@BindView(R.id.subjet_edit_text_send_private_message_activity)
|
||||
EditText subjectEditText;
|
||||
@BindView(R.id.divider_2_send_private_message_activity)
|
||||
View divider2;
|
||||
@BindView(R.id.content_edit_text_send_private_message_activity)
|
||||
EditText messageEditText;
|
||||
|
||||
@BindView(R.id.markdown_bottom_bar_recycler_view_send_private_message_activity)
|
||||
RecyclerView markdownBottomBarRecyclerView;
|
||||
@Inject
|
||||
@Named("oauth")
|
||||
Retrofit mOauthRetrofit;
|
||||
@Named("no_oauth")
|
||||
RetrofitHolder mRetrofit;
|
||||
|
||||
@Inject
|
||||
Executor mExecutor;
|
||||
|
||||
@Inject
|
||||
@Named("default")
|
||||
SharedPreferences mSharedPreferences;
|
||||
@@ -57,9 +86,18 @@ public class SendPrivateMessageActivity extends BaseActivity {
|
||||
SharedPreferences mCurrentAccountSharedPreferences;
|
||||
@Inject
|
||||
CustomThemeWrapper mCustomThemeWrapper;
|
||||
|
||||
@Inject
|
||||
LemmyPrivateMessageAPI mLemmyPrivateMessageAPI;
|
||||
private String mAccessToken;
|
||||
|
||||
private BasicUserInfo mRecipientBasicUserInfo;
|
||||
private boolean isSubmitting = false;
|
||||
|
||||
private ArrayList<UploadedImage> uploadedImages = new ArrayList<>();
|
||||
|
||||
private Uri capturedImageUri;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
((Infinity) getApplication()).getAppComponent().inject(this);
|
||||
@@ -77,14 +115,66 @@ public class SendPrivateMessageActivity extends BaseActivity {
|
||||
addOnOffsetChangedListener(appBarLayout);
|
||||
}
|
||||
|
||||
MarkdownBottomBarRecyclerViewAdapter adapter = new MarkdownBottomBarRecyclerViewAdapter(
|
||||
mCustomThemeWrapper, new MarkdownBottomBarRecyclerViewAdapter.ItemClickListener() {
|
||||
@Override
|
||||
public void onClick(int item) {
|
||||
MarkdownBottomBarRecyclerViewAdapter.bindEditTextWithItemClickListener(
|
||||
SendPrivateMessageActivity.this, messageEditText, item);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUploadImage() {
|
||||
Utils.hideKeyboard(SendPrivateMessageActivity.this);
|
||||
UploadedImagesBottomSheetFragment fragment = new UploadedImagesBottomSheetFragment();
|
||||
Bundle arguments = new Bundle();
|
||||
arguments.putParcelableArrayList(UploadedImagesBottomSheetFragment.EXTRA_UPLOADED_IMAGES,
|
||||
uploadedImages);
|
||||
fragment.setArguments(arguments);
|
||||
fragment.show(getSupportFragmentManager(), fragment.getTag());
|
||||
}
|
||||
});
|
||||
|
||||
markdownBottomBarRecyclerView.setLayoutManager(new LinearLayoutManagerBugFixed(this,
|
||||
LinearLayoutManagerBugFixed.HORIZONTAL, false));
|
||||
markdownBottomBarRecyclerView.setAdapter(adapter);
|
||||
|
||||
mAccessToken = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN, null);
|
||||
|
||||
setSupportActionBar(toolbar);
|
||||
|
||||
String username = getIntent().getStringExtra(EXTRA_RECIPIENT_USERNAME);
|
||||
if (username != null) {
|
||||
usernameEditText.setText(username);
|
||||
if (savedInstanceState != null) {
|
||||
mRecipientBasicUserInfo = savedInstanceState.getParcelable(EXTRA_RECIPIENT_USER_INFO);
|
||||
} else {
|
||||
mRecipientBasicUserInfo = getIntent().getParcelableExtra(EXTRA_RECIPIENT_USER_INFO);
|
||||
}
|
||||
|
||||
if (mRecipientBasicUserInfo != null) {
|
||||
usernameEditText.setText(mRecipientBasicUserInfo.getQualifiedName());
|
||||
usernameEditText.setEnabled(false);
|
||||
} else {
|
||||
finish();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
if (resultCode == RESULT_OK) {
|
||||
if (requestCode == PICK_IMAGE_REQUEST_CODE) {
|
||||
if (data == null) {
|
||||
Toast.makeText(SendPrivateMessageActivity.this, R.string.error_getting_image, Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
Utils.uploadImageToReddit(this, mExecutor, mRetrofit,
|
||||
mAccessToken, messageEditText, coordinatorLayout, data.getData(), uploadedImages);
|
||||
} else if (requestCode == CAPTURE_IMAGE_REQUEST_CODE) {
|
||||
Utils.uploadImageToReddit(this, mExecutor, mRetrofit,
|
||||
mAccessToken, messageEditText, coordinatorLayout, capturedImageUri, uploadedImages);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -108,12 +198,6 @@ public class SendPrivateMessageActivity extends BaseActivity {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (subjectEditText.getText() == null || subjectEditText.getText().toString().equals("")) {
|
||||
isSubmitting = false;
|
||||
Snackbar.make(coordinatorLayout, R.string.message_subject_required, Snackbar.LENGTH_LONG).show();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (messageEditText.getText() == null || messageEditText.getText().toString().equals("")) {
|
||||
isSubmitting = false;
|
||||
Snackbar.make(coordinatorLayout, R.string.message_content_required, Snackbar.LENGTH_LONG).show();
|
||||
@@ -125,11 +209,9 @@ public class SendPrivateMessageActivity extends BaseActivity {
|
||||
Snackbar sendingSnackbar = Snackbar.make(coordinatorLayout, R.string.sending_message, Snackbar.LENGTH_INDEFINITE);
|
||||
sendingSnackbar.show();
|
||||
|
||||
ComposeMessage.composeMessage(mOauthRetrofit, mAccessToken, getResources().getConfiguration().locale,
|
||||
usernameEditText.getText().toString(), subjectEditText.getText().toString(),
|
||||
messageEditText.getText().toString(), new ComposeMessage.ComposeMessageListener() {
|
||||
mLemmyPrivateMessageAPI.sendPrivateMessage(mAccessToken, mRecipientBasicUserInfo.getId(), messageEditText.getText().toString(), new LemmyPrivateMessageAPI.PrivateMessageSentListener() {
|
||||
@Override
|
||||
public void composeMessageSuccess() {
|
||||
public void onPrivateMessageSentSuccess(@NonNull PrivateMessage privateMessage) {
|
||||
isSubmitting = false;
|
||||
item.setEnabled(true);
|
||||
item.getIcon().setAlpha(255);
|
||||
@@ -138,17 +220,13 @@ public class SendPrivateMessageActivity extends BaseActivity {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void composeMessageFailed(String errorMessage) {
|
||||
public void onPrivateMessageSentError() {
|
||||
isSubmitting = false;
|
||||
sendingSnackbar.dismiss();
|
||||
item.setEnabled(true);
|
||||
item.getIcon().setAlpha(255);
|
||||
|
||||
if (errorMessage == null || errorMessage.equals("")) {
|
||||
Snackbar.make(coordinatorLayout, R.string.send_message_failed, Snackbar.LENGTH_LONG).show();
|
||||
} else {
|
||||
Snackbar.make(coordinatorLayout, errorMessage, Snackbar.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -159,6 +237,7 @@ public class SendPrivateMessageActivity extends BaseActivity {
|
||||
@Override
|
||||
protected void onSaveInstanceState(@NonNull Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
outState.putParcelable(EXTRA_RECIPIENT_USER_INFO, mRecipientBasicUserInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -177,19 +256,49 @@ public class SendPrivateMessageActivity extends BaseActivity {
|
||||
applyAppBarLayoutAndCollapsingToolbarLayoutAndToolbarTheme(appBarLayout, null, toolbar);
|
||||
int primaryTextColor = mCustomThemeWrapper.getPrimaryTextColor();
|
||||
usernameEditText.setTextColor(primaryTextColor);
|
||||
subjectEditText.setTextColor(primaryTextColor);
|
||||
messageEditText.setTextColor(primaryTextColor);
|
||||
int secondaryTextColor = mCustomThemeWrapper.getSecondaryTextColor();
|
||||
usernameEditText.setHintTextColor(secondaryTextColor);
|
||||
subjectEditText.setHintTextColor(secondaryTextColor);
|
||||
messageEditText.setHintTextColor(secondaryTextColor);
|
||||
int dividerColor = mCustomThemeWrapper.getDividerColor();
|
||||
divider1.setBackgroundColor(dividerColor);
|
||||
divider2.setBackgroundColor(dividerColor);
|
||||
if (typeface != null) {
|
||||
usernameEditText.setTypeface(typeface);
|
||||
subjectEditText.setTypeface(typeface);
|
||||
messageEditText.setTypeface(typeface);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void uploadImage() {
|
||||
Intent intent = new Intent();
|
||||
intent.setType("image/*");
|
||||
intent.setAction(Intent.ACTION_GET_CONTENT);
|
||||
startActivityForResult(Intent.createChooser(intent,
|
||||
getResources().getString(R.string.select_from_gallery)), PICK_IMAGE_REQUEST_CODE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void captureImage() {
|
||||
Intent pictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
|
||||
try {
|
||||
capturedImageUri = FileProvider.getUriForFile(this, "eu.toldi.infinityforlemmy.provider",
|
||||
File.createTempFile("captured_image", ".jpg", getExternalFilesDir(Environment.DIRECTORY_PICTURES)));
|
||||
pictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, capturedImageUri);
|
||||
startActivityForResult(pictureIntent, CAPTURE_IMAGE_REQUEST_CODE);
|
||||
} catch (IOException ex) {
|
||||
Toast.makeText(this, R.string.error_creating_temp_file, Toast.LENGTH_SHORT).show();
|
||||
} catch (ActivityNotFoundException e) {
|
||||
Toast.makeText(this, R.string.no_camera_available, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void insertImageUrl(UploadedImage uploadedImage) {
|
||||
int start = Math.max(messageEditText.getSelectionStart(), 0);
|
||||
int end = Math.max(messageEditText.getSelectionEnd(), 0);
|
||||
messageEditText.getText().replace(Math.min(start, end), Math.max(start, end),
|
||||
"",
|
||||
0, "![]()".length() + uploadedImage.imageName.length() + uploadedImage.imageUrl.length());
|
||||
}
|
||||
}
|
||||
@@ -73,7 +73,6 @@ import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
|
||||
import eu.toldi.infinityforlemmy.utils.Utils;
|
||||
import retrofit2.Retrofit;
|
||||
|
||||
;
|
||||
|
||||
public class SubscribedThingListingActivity extends BaseActivity implements ActivityToolbarInterface {
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ import android.content.SharedPreferences;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.util.Log;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.EditText;
|
||||
@@ -27,6 +28,7 @@ import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import javax.inject.Inject;
|
||||
@@ -46,14 +48,15 @@ import eu.toldi.infinityforlemmy.customviews.LinearLayoutManagerBugFixed;
|
||||
import eu.toldi.infinityforlemmy.events.PassPrivateMessageEvent;
|
||||
import eu.toldi.infinityforlemmy.events.PassPrivateMessageIndexEvent;
|
||||
import eu.toldi.infinityforlemmy.events.RepliedToPrivateMessageEvent;
|
||||
import eu.toldi.infinityforlemmy.message.Message;
|
||||
import eu.toldi.infinityforlemmy.message.ReadMessage;
|
||||
import eu.toldi.infinityforlemmy.message.ReplyMessage;
|
||||
import eu.toldi.infinityforlemmy.privatemessage.LemmyPrivateMessageAPI;
|
||||
import eu.toldi.infinityforlemmy.privatemessage.PrivateMessage;
|
||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
|
||||
import retrofit2.Retrofit;
|
||||
|
||||
public class ViewPrivateMessagesActivity extends BaseActivity implements ActivityToolbarInterface {
|
||||
|
||||
public static final String EXTRA_PRIVATE_MESSAGE = "EPM";
|
||||
public static final String EXTRA_PRIVATE_MESSAGE_INDEX = "EPM";
|
||||
public static final String EXTRA_MESSAGE_POSITION = "EMP";
|
||||
private static final String USER_AVATAR_STATE = "UAS";
|
||||
@@ -91,14 +94,19 @@ public class ViewPrivateMessagesActivity extends BaseActivity implements Activit
|
||||
CustomThemeWrapper mCustomThemeWrapper;
|
||||
@Inject
|
||||
Executor mExecutor;
|
||||
|
||||
@Inject
|
||||
LemmyPrivateMessageAPI mLemmyPrivateMessageAPI;
|
||||
private LinearLayoutManagerBugFixed mLinearLayoutManager;
|
||||
private PrivateMessagesDetailRecyclerViewAdapter mAdapter;
|
||||
@State
|
||||
Message privateMessage;
|
||||
PrivateMessage privateMessage;
|
||||
@State
|
||||
Message replyTo;
|
||||
PrivateMessage replyTo;
|
||||
private String mAccessToken;
|
||||
private String mAccountName;
|
||||
|
||||
private String mAccountQualifiedName;
|
||||
private String mUserAvatar;
|
||||
private ArrayList<ProvideUserAvatarCallback> mProvideUserAvatarCallbacks;
|
||||
private boolean isLoadingUserAvatar = false;
|
||||
@@ -128,6 +136,11 @@ public class ViewPrivateMessagesActivity extends BaseActivity implements Activit
|
||||
addOnOffsetChangedListener(mAppBarLayout);
|
||||
}
|
||||
|
||||
Intent intent = getIntent();
|
||||
privateMessage = intent.getParcelableExtra(EXTRA_PRIVATE_MESSAGE);
|
||||
|
||||
Log.i("ViewPrivate", "privateMessage: " + privateMessage);
|
||||
|
||||
setSupportActionBar(mToolbar);
|
||||
setToolbarGoToTop(mToolbar);
|
||||
|
||||
@@ -135,6 +148,7 @@ public class ViewPrivateMessagesActivity extends BaseActivity implements Activit
|
||||
|
||||
mAccessToken = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN, null);
|
||||
mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_NAME, null);
|
||||
mAccountQualifiedName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_QUALIFIED_NAME, null);
|
||||
|
||||
if (savedInstanceState != null) {
|
||||
mUserAvatar = savedInstanceState.getString(USER_AVATAR_STATE);
|
||||
@@ -144,36 +158,37 @@ public class ViewPrivateMessagesActivity extends BaseActivity implements Activit
|
||||
bindView();
|
||||
}
|
||||
} else {
|
||||
if (privateMessage != null) {
|
||||
bindView();
|
||||
}
|
||||
EventBus.getDefault().post(new PassPrivateMessageIndexEvent(getIntent().getIntExtra(EXTRA_PRIVATE_MESSAGE_INDEX, -1)));
|
||||
}
|
||||
}
|
||||
|
||||
private void bindView() {
|
||||
if (privateMessage != null) {
|
||||
if (privateMessage.getAuthor().equals(mAccountName)) {
|
||||
setTitle(privateMessage.getDestination());
|
||||
if (privateMessage.getCreatorQualifiedName().equals(mAccountQualifiedName)) {
|
||||
setTitle(privateMessage.getRecipientName());
|
||||
mToolbar.setOnClickListener(view -> {
|
||||
if (privateMessage.isDestinationDeleted()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Intent intent = new Intent(this, ViewUserDetailActivity.class);
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, privateMessage.getDestination());
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, privateMessage.getRecipientName());
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_QUALIFIED_USER_NAME_KEY, privateMessage.getRecipientQualifiedName());
|
||||
startActivity(intent);
|
||||
});
|
||||
} else {
|
||||
setTitle(privateMessage.getAuthor());
|
||||
setTitle(privateMessage.getCreatorName());
|
||||
mToolbar.setOnClickListener(view -> {
|
||||
if (privateMessage.isAuthorDeleted()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Intent intent = new Intent(this, ViewUserDetailActivity.class);
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, privateMessage.getAuthor());
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, privateMessage.getCreatorName());
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_QUALIFIED_USER_NAME_KEY, privateMessage.getCreatorQualifiedName());
|
||||
startActivity(intent);
|
||||
});
|
||||
}
|
||||
}
|
||||
mAdapter = new PrivateMessagesDetailRecyclerViewAdapter(this, mSharedPreferences,
|
||||
getResources().getConfiguration().locale, privateMessage, mAccountName, mCustomThemeWrapper);
|
||||
getResources().getConfiguration().locale, privateMessage, mAccountQualifiedName, mCustomThemeWrapper);
|
||||
mLinearLayoutManager = new LinearLayoutManagerBugFixed(this);
|
||||
mLinearLayoutManager.setStackFromEnd(true);
|
||||
mRecyclerView.setLayoutManager(mLinearLayoutManager);
|
||||
@@ -184,45 +199,40 @@ public class ViewPrivateMessagesActivity extends BaseActivity implements Activit
|
||||
if (!mEditText.getText().toString().equals("")) {
|
||||
//Send Message
|
||||
if (privateMessage != null) {
|
||||
ArrayList<Message> replies = privateMessage.getReplies();
|
||||
List<PrivateMessage> replies = privateMessage.getReplies();
|
||||
if (replyTo == null) {
|
||||
replyTo = privateMessage;
|
||||
}
|
||||
isSendingMessage = true;
|
||||
mSendImageView.setColorFilter(mSecondaryTextColor, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
ReplyMessage.replyMessage(mEditText.getText().toString(), replyTo.getFullname(),
|
||||
getResources().getConfiguration().locale, mOauthRetrofit, mAccessToken,
|
||||
new ReplyMessage.ReplyMessageListener() {
|
||||
|
||||
mLemmyPrivateMessageAPI.sendPrivateMessage(mAccessToken, replyTo.getCreatorId(), mEditText.getText().toString(), new LemmyPrivateMessageAPI.PrivateMessageSentListener() {
|
||||
|
||||
@Override
|
||||
public void replyMessageSuccess(Message message) {
|
||||
public void onPrivateMessageSentSuccess(@NonNull PrivateMessage privateMessage) {
|
||||
if (mAdapter != null) {
|
||||
mAdapter.addReply(message);
|
||||
mAdapter.addReply(privateMessage);
|
||||
}
|
||||
goToBottom();
|
||||
mEditText.setText("");
|
||||
mSendImageView.setColorFilter(mSendMessageIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
isSendingMessage = false;
|
||||
EventBus.getDefault().post(new RepliedToPrivateMessageEvent(message, getIntent().getIntExtra(EXTRA_MESSAGE_POSITION, -1)));
|
||||
EventBus.getDefault().post(new RepliedToPrivateMessageEvent(privateMessage, getIntent().getIntExtra(EXTRA_MESSAGE_POSITION, -1)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void replyMessageFailed(String errorMessage) {
|
||||
if (errorMessage != null && !errorMessage.equals("")) {
|
||||
Snackbar.make(mCoordinatorLayout, errorMessage, Snackbar.LENGTH_LONG).show();
|
||||
} else {
|
||||
public void onPrivateMessageSentError() {
|
||||
Snackbar.make(mCoordinatorLayout, R.string.reply_message_failed, Snackbar.LENGTH_LONG).show();
|
||||
}
|
||||
mSendImageView.setColorFilter(mSendMessageIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
isSendingMessage = false;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
StringBuilder fullnames = new StringBuilder();
|
||||
if (privateMessage.isNew()) {
|
||||
fullnames.append(privateMessage.getFullname()).append(",");
|
||||
}
|
||||
|
||||
if (replies != null && !replies.isEmpty()) {
|
||||
for (Message m : replies) {
|
||||
if (m.isNew()) {
|
||||
for (PrivateMessage m : replies) {
|
||||
if (!m.getRead()) {
|
||||
fullnames.append(m).append(",");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,12 +3,14 @@ package eu.toldi.infinityforlemmy.activities;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.text.Editable;
|
||||
import android.text.TextWatcher;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.Menu;
|
||||
@@ -18,6 +20,7 @@ import android.view.ViewTreeObserver;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import android.view.inputmethod.EditorInfo;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
@@ -36,6 +39,7 @@ import androidx.viewpager2.widget.ViewPager2;
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.RequestManager;
|
||||
import com.bumptech.glide.request.RequestOptions;
|
||||
import com.evernote.android.state.State;
|
||||
import com.google.android.material.appbar.AppBarLayout;
|
||||
import com.google.android.material.appbar.CollapsingToolbarLayout;
|
||||
import com.google.android.material.appbar.MaterialToolbar;
|
||||
@@ -82,6 +86,8 @@ import eu.toldi.infinityforlemmy.bottomsheetfragments.RandomBottomSheetFragment;
|
||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.SortTimeBottomSheetFragment;
|
||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.SortTypeBottomSheetFragment;
|
||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.UrlMenuBottomSheetFragment;
|
||||
import eu.toldi.infinityforlemmy.community.BlockCommunity;
|
||||
import eu.toldi.infinityforlemmy.community.CommunityStats;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||
import eu.toldi.infinityforlemmy.customviews.NavigationWrapper;
|
||||
import eu.toldi.infinityforlemmy.customviews.slidr.Slidr;
|
||||
@@ -162,12 +168,23 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
|
||||
TextView communityFullNameTextView;
|
||||
@BindView(R.id.subscriber_count_text_view_view_subreddit_detail_activity)
|
||||
TextView nSubscribersTextView;
|
||||
@BindView(R.id.online_subscriber_count_text_view_view_subreddit_detail_activity)
|
||||
TextView nOnlineSubscribersTextView;
|
||||
@BindView(R.id.since_text_view_view_subreddit_detail_activity)
|
||||
TextView sinceTextView;
|
||||
@BindView(R.id.creation_time_text_view_view_subreddit_detail_activity)
|
||||
TextView creationTimeTextView;
|
||||
@BindView(R.id.active_user_count_text_view_view_subreddit_detail_activity)
|
||||
TextView nActiveUsersTextView;
|
||||
@BindView(R.id.post_count_text_view_view_subreddit_detail_activity)
|
||||
TextView nPostsTextView;
|
||||
@BindView(R.id.comment_count_text_view_view_subreddit_detail_activity)
|
||||
TextView nCommentsTextView;
|
||||
|
||||
@BindView(R.id.subscriber_count_image_view_view_subreddit_detail_activity)
|
||||
ImageView nSubscribersImageView;
|
||||
@BindView(R.id.active_user_count_image_view_view_subreddit_detail_activity)
|
||||
ImageView nActiveUsersImageView;
|
||||
@BindView(R.id.post_count_image_view_view_subreddit_detail_activity)
|
||||
ImageView nPostsImageView;
|
||||
@BindView(R.id.comment_count_image_view_view_subreddit_detail_activity)
|
||||
ImageView nCommentsImageView;
|
||||
|
||||
|
||||
@BindView(R.id.description_text_view_view_subreddit_detail_activity)
|
||||
TextView descriptionTextView;
|
||||
@Inject
|
||||
@@ -210,6 +227,11 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
|
||||
private String communityName;
|
||||
|
||||
private int communityId;
|
||||
|
||||
@State
|
||||
SubredditData communityData;
|
||||
@State
|
||||
CommunityStats mCommunityStats;
|
||||
private String description;
|
||||
|
||||
private String qualifiedName;
|
||||
@@ -360,19 +382,33 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
|
||||
mMessageFullname = savedInstanceState.getInt(MESSAGE_FULLNAME_STATE);
|
||||
mNewAccountName = savedInstanceState.getString(NEW_ACCOUNT_NAME_STATE);
|
||||
|
||||
if (mFetchSubredditInfoSuccess) {
|
||||
nOnlineSubscribersTextView.setText(getString(R.string.online_subscribers_number_detail, mNCurrentOnlineSubscribers));
|
||||
}
|
||||
}
|
||||
|
||||
checkNewAccountAndBindView();
|
||||
|
||||
fetchSubredditData();
|
||||
if (communityName != null) {
|
||||
if (communityData != null) {
|
||||
setupVisibleElements();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStart() {
|
||||
super.onStart();
|
||||
Log.e("ViewSubredditDetail", "onStart");
|
||||
if (communityData != null) {
|
||||
setupVisibleElements();
|
||||
} else {
|
||||
fetchSubredditData();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
super.onStop();
|
||||
mFetchSubredditInfoSuccess = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onKeyDown(int keyCode, KeyEvent event) {
|
||||
if (sectionsPagerAdapter != null) {
|
||||
@@ -414,9 +450,13 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
|
||||
subscribeSubredditChip.setTextColor(mCustomThemeWrapper.getChipTextColor());
|
||||
int primaryTextColor = mCustomThemeWrapper.getPrimaryTextColor();
|
||||
nSubscribersTextView.setTextColor(primaryTextColor);
|
||||
nOnlineSubscribersTextView.setTextColor(primaryTextColor);
|
||||
sinceTextView.setTextColor(primaryTextColor);
|
||||
creationTimeTextView.setTextColor(primaryTextColor);
|
||||
nActiveUsersTextView.setTextColor(primaryTextColor);
|
||||
nPostsTextView.setTextColor(primaryTextColor);
|
||||
nCommentsTextView.setTextColor(primaryTextColor);
|
||||
nSubscribersImageView.setColorFilter(mCustomThemeWrapper.getPrimaryTextColor(), PorterDuff.Mode.SRC_IN);
|
||||
nActiveUsersImageView.setColorFilter(mCustomThemeWrapper.getPrimaryTextColor(), PorterDuff.Mode.SRC_IN);
|
||||
nPostsImageView.setColorFilter(mCustomThemeWrapper.getPrimaryTextColor(), PorterDuff.Mode.SRC_IN);
|
||||
nCommentsImageView.setColorFilter(mCustomThemeWrapper.getPrimaryTextColor(), PorterDuff.Mode.SRC_IN);
|
||||
descriptionTextView.setTextColor(primaryTextColor);
|
||||
navigationWrapper.applyCustomTheme(mCustomThemeWrapper.getBottomAppBarIconColor(), mCustomThemeWrapper.getBottomAppBarBackgroundColor());
|
||||
applyTabLayoutTheme(tabLayout);
|
||||
@@ -425,9 +465,9 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
|
||||
subredditNameTextView.setTypeface(typeface);
|
||||
subscribeSubredditChip.setTypeface(typeface);
|
||||
nSubscribersTextView.setTypeface(typeface);
|
||||
nOnlineSubscribersTextView.setTypeface(typeface);
|
||||
sinceTextView.setTypeface(typeface);
|
||||
creationTimeTextView.setTypeface(typeface);
|
||||
nActiveUsersTextView.setTypeface(typeface);
|
||||
nPostsTextView.setTypeface(typeface);
|
||||
nCommentsTextView.setTypeface(typeface);
|
||||
descriptionTextView.setTypeface(typeface);
|
||||
}
|
||||
unsubscribedColor = mCustomThemeWrapper.getUnsubscribed();
|
||||
@@ -551,7 +591,19 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
|
||||
communityFullNameTextView.setText(qualifiedName);
|
||||
String nSubscribers = getString(R.string.subscribers_number_detail, subredditData.getNSubscribers());
|
||||
nSubscribersTextView.setText(nSubscribers);
|
||||
creationTimeTextView.setText(subredditData.getCreatedUTC());
|
||||
|
||||
if (mCommunityStats != null) {
|
||||
nActiveUsersTextView.setText(getString(R.string.active_users_number_detail, mCommunityStats.getActiveUsers()));
|
||||
nPostsTextView.setText(getString(R.string.post_count_detail, mCommunityStats.getPosts()));
|
||||
nCommentsTextView.setText(getString(R.string.comment_count_detail, mCommunityStats.getComments()));
|
||||
} else {
|
||||
nActiveUsersTextView.setVisibility(View.GONE);
|
||||
nPostsTextView.setVisibility(View.GONE);
|
||||
nCommentsTextView.setVisibility(View.GONE);
|
||||
nActiveUsersImageView.setVisibility(View.GONE);
|
||||
nPostsImageView.setVisibility(View.GONE);
|
||||
nCommentsImageView.setVisibility(View.GONE);
|
||||
}
|
||||
description = subredditData.getDescription();
|
||||
|
||||
|
||||
@@ -690,14 +742,15 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
|
||||
qualifiedName = LemmyUtils.actorID2FullName(communityData.getActorId());
|
||||
if (communityName == null) {
|
||||
communityName = communityData.getTitle();
|
||||
|
||||
setupVisibleElements();
|
||||
}
|
||||
mCommunityStats = communityData.getCommunityStats();
|
||||
setupVisibleElements();
|
||||
communityId = communityData.getId();
|
||||
ViewSubredditDetailActivity.this.communityData = communityData;
|
||||
setupSubscribeChip();
|
||||
|
||||
mNCurrentOnlineSubscribers = nCurrentOnlineSubscribers;
|
||||
nOnlineSubscribersTextView.setText(getString(R.string.online_subscribers_number_detail, nCurrentOnlineSubscribers));
|
||||
|
||||
InsertSubredditData.insertSubredditData(mExecutor, new Handler(), mRedditDataRoomDatabase,
|
||||
communityData, () -> mFetchSubredditInfoSuccess = true);
|
||||
}
|
||||
@@ -730,6 +783,7 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
|
||||
case SharedPreferencesUtils.OTHER_ACTIVITIES_BOTTOM_APP_BAR_OPTION_PROFILE: {
|
||||
Intent intent = new Intent(this, ViewUserDetailActivity.class);
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, mAccountName);
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_QUALIFIED_USER_NAME_KEY, mAccountQualifiedName);
|
||||
startActivity(intent);
|
||||
break;
|
||||
}
|
||||
@@ -1123,6 +1177,11 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.view_subreddit_detail_activity, menu);
|
||||
if (communityData != null && communityData.isBlocked()) {
|
||||
menu.findItem(R.id.block_community_view_subreddit_detail_activity).setVisible(false);
|
||||
} else {
|
||||
menu.findItem(R.id.unblock_community_view_subreddit_detail_activity).setVisible(false);
|
||||
}
|
||||
applyMenuItemTheme(menu);
|
||||
return true;
|
||||
}
|
||||
@@ -1151,22 +1210,6 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
|
||||
PostLayoutBottomSheetFragment postLayoutBottomSheetFragment = new PostLayoutBottomSheetFragment();
|
||||
postLayoutBottomSheetFragment.show(getSupportFragmentManager(), postLayoutBottomSheetFragment.getTag());
|
||||
return true;
|
||||
} else if (itemId == R.id.action_select_user_flair_view_subreddit_detail_activity) {
|
||||
if (mAccessToken == null) {
|
||||
Toast.makeText(this, R.string.login_first, Toast.LENGTH_SHORT).show();
|
||||
return true;
|
||||
}
|
||||
Intent selectUserFlairIntent = new Intent(this, SelectUserFlairActivity.class);
|
||||
selectUserFlairIntent.putExtra(SelectUserFlairActivity.EXTRA_SUBREDDIT_NAME, communityName);
|
||||
startActivity(selectUserFlairIntent);
|
||||
return true;
|
||||
} else if (itemId == R.id.action_add_to_multireddit_view_subreddit_detail_activity) {
|
||||
if (mAccessToken == null) {
|
||||
Toast.makeText(this, R.string.login_first, Toast.LENGTH_SHORT).show();
|
||||
return true;
|
||||
}
|
||||
Intent intent = new Intent(this, MultiredditSelectionActivity.class);
|
||||
startActivityForResult(intent, ADD_TO_MULTIREDDIT_REQUEST_CODE);
|
||||
} else if (itemId == R.id.action_add_to_post_filter_view_subreddit_detail_activity) {
|
||||
Intent intent = new Intent(this, PostFilterPreferenceActivity.class);
|
||||
intent.putExtra(PostFilterPreferenceActivity.EXTRA_SUBREDDIT_NAME, communityName);
|
||||
@@ -1176,23 +1219,59 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
|
||||
Intent shareIntent = new Intent(Intent.ACTION_SEND);
|
||||
shareIntent.setType("text/plain");
|
||||
String baseURL = mRetrofit.getBaseURL().endsWith("/") ? mRetrofit.getBaseURL() : mRetrofit.getBaseURL() + "/";
|
||||
shareIntent.putExtra(Intent.EXTRA_TEXT, baseURL + "/" + qualifiedName);
|
||||
shareIntent.putExtra(Intent.EXTRA_TEXT, baseURL + "c/" + qualifiedName);
|
||||
if (shareIntent.resolveActivity(getPackageManager()) != null) {
|
||||
startActivity(Intent.createChooser(shareIntent, getString(R.string.share)));
|
||||
} else {
|
||||
Toast.makeText(this, R.string.no_app, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
return true;
|
||||
} else if (itemId == R.id.action_go_to_wiki_view_subreddit_detail_activity) {
|
||||
Intent wikiIntent = new Intent(this, WikiActivity.class);
|
||||
wikiIntent.putExtra(WikiActivity.EXTRA_SUBREDDIT_NAME, communityName);
|
||||
wikiIntent.putExtra(WikiActivity.EXTRA_WIKI_PATH, "index");
|
||||
startActivity(wikiIntent);
|
||||
return true;
|
||||
} else if (itemId == R.id.action_contact_mods_view_subreddit_detail_activity) {
|
||||
Intent intent = new Intent(this, SendPrivateMessageActivity.class);
|
||||
intent.putExtra(SendPrivateMessageActivity.EXTRA_RECIPIENT_USERNAME, "r/" + communityName);
|
||||
startActivity(intent);
|
||||
/* Intent intent = new Intent(this, SendPrivateMessageActivity.class);
|
||||
intent.putExtra(SendPrivateMessageActivity.EXTRA_RECIPIENT_USERNAME, "r/" + communityName);*/
|
||||
//startActivity(intent);
|
||||
return true;
|
||||
} else if (itemId == R.id.block_community_view_subreddit_detail_activity) {
|
||||
if (mAccessToken == null) {
|
||||
Toast.makeText(this, R.string.login_first, Toast.LENGTH_SHORT).show();
|
||||
return true;
|
||||
}
|
||||
new MaterialAlertDialogBuilder(this, R.style.MaterialAlertDialogTheme)
|
||||
.setTitle(R.string.block_community)
|
||||
.setMessage(R.string.are_you_sure)
|
||||
.setPositiveButton(R.string.yes, (dialogInterface, i)
|
||||
-> BlockCommunity.INSTANCE.blockCommunity(mRetrofit.getRetrofit(), communityId, mAccessToken, new BlockCommunity.BlockCommunityListener() {
|
||||
@Override
|
||||
public void onBlockCommunitySuccess() {
|
||||
communityData.setBlocked(true);
|
||||
Toast.makeText(ViewSubredditDetailActivity.this, R.string.block_community_success, Toast.LENGTH_SHORT).show();
|
||||
ViewSubredditDetailActivity.this.invalidateOptionsMenu();
|
||||
sectionsPagerAdapter.refresh(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockCommunityError() {
|
||||
Toast.makeText(ViewSubredditDetailActivity.this, R.string.block_community_failed, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}))
|
||||
.setNegativeButton(R.string.no, null)
|
||||
.show();
|
||||
return true;
|
||||
} else if (itemId == R.id.unblock_community_view_subreddit_detail_activity) {
|
||||
BlockCommunity.INSTANCE.unBlockCommunity(mRetrofit.getRetrofit(), communityId, mAccessToken, new BlockCommunity.BlockCommunityListener() {
|
||||
@Override
|
||||
public void onBlockCommunitySuccess() {
|
||||
communityData.setBlocked(false);
|
||||
Toast.makeText(ViewSubredditDetailActivity.this, R.string.unblock_community_success, Toast.LENGTH_SHORT).show();
|
||||
ViewSubredditDetailActivity.this.invalidateOptionsMenu();
|
||||
sectionsPagerAdapter.refresh(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockCommunityError() {
|
||||
Toast.makeText(ViewSubredditDetailActivity.this, R.string.unblock_community_failed, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -1285,27 +1364,27 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
|
||||
break;
|
||||
case PostTypeBottomSheetFragment.TYPE_LINK:
|
||||
intent = new Intent(this, PostLinkActivity.class);
|
||||
intent.putExtra(PostLinkActivity.EXTRA_SUBREDDIT_NAME, communityName);
|
||||
intent.putExtra(PostLinkActivity.EXTRA_SUBREDDIT_NAME, qualifiedName);
|
||||
startActivity(intent);
|
||||
break;
|
||||
case PostTypeBottomSheetFragment.TYPE_IMAGE:
|
||||
intent = new Intent(this, PostImageActivity.class);
|
||||
intent.putExtra(PostImageActivity.EXTRA_SUBREDDIT_NAME, communityName);
|
||||
intent.putExtra(PostImageActivity.EXTRA_SUBREDDIT_NAME, qualifiedName);
|
||||
startActivity(intent);
|
||||
break;
|
||||
case PostTypeBottomSheetFragment.TYPE_VIDEO:
|
||||
intent = new Intent(this, PostVideoActivity.class);
|
||||
intent.putExtra(PostVideoActivity.EXTRA_SUBREDDIT_NAME, communityName);
|
||||
intent.putExtra(PostVideoActivity.EXTRA_SUBREDDIT_NAME, qualifiedName);
|
||||
startActivity(intent);
|
||||
break;
|
||||
case PostTypeBottomSheetFragment.TYPE_GALLERY:
|
||||
intent = new Intent(this, PostGalleryActivity.class);
|
||||
intent.putExtra(PostGalleryActivity.EXTRA_SUBREDDIT_NAME, communityName);
|
||||
intent.putExtra(PostGalleryActivity.EXTRA_SUBREDDIT_NAME, qualifiedName);
|
||||
startActivity(intent);
|
||||
break;
|
||||
case PostTypeBottomSheetFragment.TYPE_POLL:
|
||||
intent = new Intent(this, PostPollActivity.class);
|
||||
intent.putExtra(PostPollActivity.EXTRA_SUBREDDIT_NAME, communityName);
|
||||
intent.putExtra(PostPollActivity.EXTRA_SUBREDDIT_NAME, qualifiedName);
|
||||
startActivity(intent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Build;
|
||||
@@ -20,7 +21,9 @@ import android.view.ViewTreeObserver;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import android.view.inputmethod.EditorInfo;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
@@ -52,6 +55,7 @@ import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
@@ -71,11 +75,14 @@ import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
import eu.toldi.infinityforlemmy.RetrofitHolder;
|
||||
import eu.toldi.infinityforlemmy.SortType;
|
||||
import eu.toldi.infinityforlemmy.SortTypeSelectionCallback;
|
||||
import eu.toldi.infinityforlemmy.account.FetchBlockedThings;
|
||||
import eu.toldi.infinityforlemmy.adapters.SubredditAutocompleteRecyclerViewAdapter;
|
||||
import eu.toldi.infinityforlemmy.apis.RedditAPI;
|
||||
import eu.toldi.infinityforlemmy.asynctasks.AddSubredditOrUserToMultiReddit;
|
||||
import eu.toldi.infinityforlemmy.asynctasks.CheckIsFollowingUser;
|
||||
import eu.toldi.infinityforlemmy.asynctasks.SwitchAccount;
|
||||
import eu.toldi.infinityforlemmy.blockedcommunity.BlockedCommunityData;
|
||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserData;
|
||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.CopyTextBottomSheetFragment;
|
||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.FABMoreOptionsBottomSheetFragment;
|
||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.PostLayoutBottomSheetFragment;
|
||||
@@ -101,11 +108,13 @@ import eu.toldi.infinityforlemmy.post.PostPagingSource;
|
||||
import eu.toldi.infinityforlemmy.readpost.InsertReadPost;
|
||||
import eu.toldi.infinityforlemmy.subreddit.ParseSubredditData;
|
||||
import eu.toldi.infinityforlemmy.subreddit.SubredditData;
|
||||
import eu.toldi.infinityforlemmy.user.BasicUserInfo;
|
||||
import eu.toldi.infinityforlemmy.user.BlockUser;
|
||||
import eu.toldi.infinityforlemmy.user.FetchUserData;
|
||||
import eu.toldi.infinityforlemmy.user.UserDao;
|
||||
import eu.toldi.infinityforlemmy.user.UserData;
|
||||
import eu.toldi.infinityforlemmy.user.UserFollowing;
|
||||
import eu.toldi.infinityforlemmy.user.UserStats;
|
||||
import eu.toldi.infinityforlemmy.user.UserViewModel;
|
||||
import eu.toldi.infinityforlemmy.utils.APIUtils;
|
||||
import eu.toldi.infinityforlemmy.utils.LemmyUtils;
|
||||
@@ -141,6 +150,7 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
private static final String FETCH_USER_INFO_STATE = "FSIS";
|
||||
private static final String MESSAGE_FULLNAME_STATE = "MFS";
|
||||
private static final String NEW_ACCOUNT_NAME_STATE = "NANS";
|
||||
private static final String NEW_ACCOUNT_QUALIFIED_NAME_STATE = "NAQNS";
|
||||
|
||||
@BindView(R.id.coordinator_layout_view_user_detail_activity)
|
||||
CoordinatorLayout coordinatorLayout;
|
||||
@@ -165,11 +175,32 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
|
||||
@BindView(R.id.user_qualified_name_text_view_view_user_detail_activity)
|
||||
TextView qualifiedNameTextView;
|
||||
|
||||
@BindView(R.id.loading_user_progress_indicator_view_user_detail_activity)
|
||||
ProgressBar progressBar;
|
||||
@BindView(R.id.subscribe_user_chip_view_user_detail_activity)
|
||||
Chip subscribeUserChip;
|
||||
@BindView(R.id.karma_text_view_view_user_detail_activity)
|
||||
TextView karmaTextView;
|
||||
@BindView(R.id.cakeday_text_view_view_user_detail_activity)
|
||||
|
||||
@BindView(R.id.post_count_text_view_view_user_detail_activity)
|
||||
TextView postCountTextView;
|
||||
|
||||
@BindView(R.id.comment_count_text_view_view_user_detail_activity)
|
||||
TextView commentCountTextView;
|
||||
|
||||
@BindView(R.id.upvote_count_post_text_view_view_user_detail_activity)
|
||||
TextView upvoteCountPostTextView;
|
||||
|
||||
@BindView(R.id.upvote_count_comment_text_view_view_user_detail_activity)
|
||||
TextView upvoteCountCommentTextView;
|
||||
|
||||
@BindView(R.id.posts_count_icon_image_view_view_user_detail_activity)
|
||||
ImageView postsCountIconImageView;
|
||||
@BindView(R.id.comments_count_icon_image_view_view_user_detail_activity)
|
||||
ImageView commentsCountIconImageView;
|
||||
@BindView(R.id.account_created_cake_icon_image_view_view_user_detail_activity)
|
||||
ImageView accountCreatedCakeIconImageView;
|
||||
|
||||
@BindView(R.id.cake_day_text_view_view_user_detail_activity)
|
||||
TextView cakedayTextView;
|
||||
@BindView(R.id.description_text_view_view_user_detail_activity)
|
||||
TextView descriptionTextView;
|
||||
@@ -216,6 +247,7 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
private String mAccountName;
|
||||
private String mAccountQualifiedName;
|
||||
private String username;
|
||||
|
||||
private String qualifiedName;
|
||||
private String description;
|
||||
private boolean subscriptionReady = false;
|
||||
@@ -238,6 +270,8 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
|
||||
private UserData mUserData;
|
||||
|
||||
private boolean isBlocked;
|
||||
|
||||
//private MaterialAlertDialogBuilder nsfwWarningBuilder;
|
||||
|
||||
@Override
|
||||
@@ -288,6 +322,7 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
mFetchUserInfoSuccess = savedInstanceState.getBoolean(FETCH_USER_INFO_STATE);
|
||||
mMessageId = savedInstanceState.getInt(MESSAGE_FULLNAME_STATE);
|
||||
mNewAccountName = savedInstanceState.getString(NEW_ACCOUNT_NAME_STATE);
|
||||
qualifiedName = savedInstanceState.getString("qualified_name");
|
||||
}
|
||||
|
||||
checkNewAccountAndInitializeViewPager();
|
||||
@@ -299,9 +334,26 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStart() {
|
||||
super.onStart();
|
||||
if (mUserData != null) {
|
||||
setupVisibleElements();
|
||||
} else {
|
||||
fetchUserInfo();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
super.onStop();
|
||||
mFetchUserInfoSuccess = false;
|
||||
}
|
||||
|
||||
private void setupVisibleElements() {
|
||||
Resources resources = getResources();
|
||||
String title = username;
|
||||
progressBar.setVisibility(View.GONE);
|
||||
userNameTextView.setText(title);
|
||||
qualifiedNameTextView.setText(qualifiedName);
|
||||
toolbar.setTitle(title);
|
||||
@@ -559,8 +611,15 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
getSupportActionBar().setTitle(userFullName);
|
||||
}
|
||||
String karma = "";//getString(R.string.karma_info_user_detail, userData.getTotalKarma(), userData.getLinkKarma(), userData.getCommentKarma());
|
||||
karmaTextView.setText(karma);
|
||||
cakedayTextView.setText(getString(R.string.cakeday_info, userData.getCakeday()));
|
||||
|
||||
cakedayTextView.setText((String) userData.getCakeday());
|
||||
UserStats userStats = mUserData.getStats();
|
||||
if (userStats != null) {
|
||||
postCountTextView.setText(String.valueOf(userStats.getPostCount()));
|
||||
commentCountTextView.setText(String.valueOf(userStats.getCommentCount()));
|
||||
upvoteCountPostTextView.setText(String.valueOf(userStats.getPostScore()));
|
||||
upvoteCountCommentTextView.setText(String.valueOf(userStats.getCommentScore()));
|
||||
}
|
||||
|
||||
if (userData.getDescription() == null || userData.getDescription().equals("")) {
|
||||
descriptionTextView.setVisibility(View.GONE);
|
||||
@@ -628,7 +687,13 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
unsubscribedColor = mCustomThemeWrapper.getUnsubscribed();
|
||||
subscribedColor = mCustomThemeWrapper.getSubscribed();
|
||||
userNameTextView.setTextColor(mCustomThemeWrapper.getUsername());
|
||||
karmaTextView.setTextColor(mCustomThemeWrapper.getPrimaryTextColor());
|
||||
postCountTextView.setTextColor(mCustomThemeWrapper.getPrimaryTextColor());
|
||||
upvoteCountPostTextView.setTextColor(mCustomThemeWrapper.getPrimaryTextColor());
|
||||
commentCountTextView.setTextColor(mCustomThemeWrapper.getPrimaryTextColor());
|
||||
upvoteCountCommentTextView.setTextColor(mCustomThemeWrapper.getPrimaryTextColor());
|
||||
postsCountIconImageView.setColorFilter(mCustomThemeWrapper.getPrimaryTextColor(), PorterDuff.Mode.SRC_IN);
|
||||
commentsCountIconImageView.setColorFilter(mCustomThemeWrapper.getPrimaryTextColor(), PorterDuff.Mode.SRC_IN);
|
||||
accountCreatedCakeIconImageView.setColorFilter(mCustomThemeWrapper.getPrimaryTextColor(), PorterDuff.Mode.SRC_IN);
|
||||
cakedayTextView.setTextColor(mCustomThemeWrapper.getPrimaryTextColor());
|
||||
navigationWrapper.applyCustomTheme(mCustomThemeWrapper.getBottomAppBarIconColor(), mCustomThemeWrapper.getBottomAppBarBackgroundColor());
|
||||
applyFABTheme(navigationWrapper.floatingActionButton, mSharedPreferences.getBoolean(SharedPreferencesUtils.USE_CIRCULAR_FAB, false));
|
||||
@@ -637,7 +702,10 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
applyTabLayoutTheme(tabLayout);
|
||||
if (typeface != null) {
|
||||
userNameTextView.setTypeface(typeface);
|
||||
karmaTextView.setTypeface(typeface);
|
||||
postCountTextView.setTypeface(typeface);
|
||||
upvoteCountPostTextView.setTypeface(typeface);
|
||||
commentCountTextView.setTypeface(typeface);
|
||||
upvoteCountCommentTextView.setTypeface(typeface);
|
||||
cakedayTextView.setTypeface(typeface);
|
||||
subscribeUserChip.setTypeface(typeface);
|
||||
descriptionTextView.setTypeface(typeface);
|
||||
@@ -929,6 +997,7 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
case SharedPreferencesUtils.OTHER_ACTIVITIES_BOTTOM_APP_BAR_OPTION_PROFILE: {
|
||||
Intent intent = new Intent(this, ViewUserDetailActivity.class);
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, mAccountName);
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_QUALIFIED_USER_NAME_KEY,mAccountQualifiedName);
|
||||
startActivity(intent);
|
||||
break;
|
||||
}
|
||||
@@ -1083,8 +1152,27 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
@Override
|
||||
public void onFetchUserDataSuccess(UserData userData, int inboxCount) {
|
||||
mUserData = userData;
|
||||
username = userData.getName();
|
||||
username = userData.getDisplayName();
|
||||
setupVisibleElements();
|
||||
FetchBlockedThings.fetchBlockedThings(mRetrofit.getRetrofit(), mAccessToken, mAccountQualifiedName, new FetchBlockedThings.FetchBlockedThingsListener() {
|
||||
|
||||
@Override
|
||||
public void onFetchBlockedThingsSuccess(List<BlockedUserData> blockedUsers, List<BlockedCommunityData> blockedCommunities) {
|
||||
for (BlockedUserData blockedUserData : blockedUsers) {
|
||||
if (blockedUserData.getQualifiedName().equals(qualifiedName)) {
|
||||
isBlocked = true;
|
||||
invalidateOptionsMenu();
|
||||
return;
|
||||
}
|
||||
}
|
||||
isBlocked = false;
|
||||
invalidateOptionsMenu();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFetchBlockedThingsFailure() {
|
||||
}
|
||||
});
|
||||
new ViewUserDetailActivity.InsertUserDataAsyncTask(mRedditDataRoomDatabase.userDao(), userData,
|
||||
() -> mFetchUserInfoSuccess = true).execute();
|
||||
}
|
||||
@@ -1127,6 +1215,12 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
menu.findItem(R.id.action_block_user_view_user_detail_activity).setVisible(false);
|
||||
} else {
|
||||
menu.findItem(R.id.action_edit_profile_view_user_detail_activity).setVisible(false);
|
||||
if (isBlocked) {
|
||||
menu.findItem(R.id.action_block_user_view_user_detail_activity).setVisible(false);
|
||||
menu.findItem(R.id.action_unblock_user_view_user_detail_activity).setVisible(true);
|
||||
} else {
|
||||
menu.findItem(R.id.action_unblock_user_view_user_detail_activity).setVisible(false);
|
||||
}
|
||||
}
|
||||
applyMenuItemTheme(menu);
|
||||
return true;
|
||||
@@ -1161,7 +1255,7 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
Intent shareIntent = new Intent(Intent.ACTION_SEND);
|
||||
shareIntent.setType("text/plain");
|
||||
String baseURL = mRetrofit.getBaseURL().endsWith("/") ? mRetrofit.getBaseURL() : mRetrofit.getBaseURL() + "/";
|
||||
shareIntent.putExtra(Intent.EXTRA_TEXT, baseURL + qualifiedName);
|
||||
shareIntent.putExtra(Intent.EXTRA_TEXT, baseURL + "u/" + qualifiedName);
|
||||
if (shareIntent.resolveActivity(getPackageManager()) != null) {
|
||||
startActivity(Intent.createChooser(shareIntent, getString(R.string.share)));
|
||||
} else {
|
||||
@@ -1175,16 +1269,9 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
}
|
||||
|
||||
Intent pmIntent = new Intent(this, SendPrivateMessageActivity.class);
|
||||
pmIntent.putExtra(SendPrivateMessageActivity.EXTRA_RECIPIENT_USERNAME, username);
|
||||
pmIntent.putExtra(SendPrivateMessageActivity.EXTRA_RECIPIENT_USER_INFO, new BasicUserInfo(mUserData.getId(), username, qualifiedName, mUserData.getAvatar(), mUserData.getDisplayName()));
|
||||
startActivity(pmIntent);
|
||||
return true;
|
||||
} else if (itemId == R.id.action_add_to_multireddit_view_user_detail_activity) {
|
||||
if (mAccessToken == null) {
|
||||
Toast.makeText(this, R.string.login_first, Toast.LENGTH_SHORT).show();
|
||||
return true;
|
||||
}
|
||||
Intent intent = new Intent(this, MultiredditSelectionActivity.class);
|
||||
startActivityForResult(intent, ADD_TO_MULTIREDDIT_REQUEST_CODE);
|
||||
} else if (itemId == R.id.action_add_to_post_filter_view_user_detail_activity) {
|
||||
Intent intent = new Intent(this, PostFilterPreferenceActivity.class);
|
||||
intent.putExtra(PostFilterPreferenceActivity.EXTRA_USER_NAME, username);
|
||||
@@ -1205,10 +1292,13 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
.setTitle(R.string.block_user)
|
||||
.setMessage(R.string.are_you_sure)
|
||||
.setPositiveButton(R.string.yes, (dialogInterface, i)
|
||||
-> BlockUser.blockUser(mOauthRetrofit, mAccessToken, username, new BlockUser.BlockUserListener() {
|
||||
-> BlockUser.blockUser(mRetrofit.getRetrofit(), mAccessToken, mUserData.getId(), true, new BlockUser.BlockUserListener() {
|
||||
@Override
|
||||
public void success() {
|
||||
Toast.makeText(ViewUserDetailActivity.this, R.string.block_user_success, Toast.LENGTH_SHORT).show();
|
||||
isBlocked = true;
|
||||
sectionsPagerAdapter.refresh();
|
||||
invalidateOptionsMenu();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1222,6 +1312,25 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
} else if (itemId == R.id.action_edit_profile_view_user_detail_activity) {
|
||||
startActivity(new Intent(this, EditProfileActivity.class));
|
||||
return true;
|
||||
} else if (itemId == R.id.action_unblock_user_view_user_detail_activity) {
|
||||
if (mAccessToken == null) {
|
||||
Toast.makeText(this, R.string.login_first, Toast.LENGTH_SHORT).show();
|
||||
return true;
|
||||
}
|
||||
BlockUser.blockUser(mRetrofit.getRetrofit(), mAccessToken, mUserData.getId(), false, new BlockUser.BlockUserListener() {
|
||||
@Override
|
||||
public void success() {
|
||||
isBlocked = false;
|
||||
Toast.makeText(ViewUserDetailActivity.this, R.string.unblock_user_success, Toast.LENGTH_SHORT).show();
|
||||
sectionsPagerAdapter.refresh();
|
||||
invalidateOptionsMenu();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void failed() {
|
||||
Toast.makeText(ViewUserDetailActivity.this, R.string.unblock_user_failed, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -1270,6 +1379,8 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
|
||||
outState.putBoolean(FETCH_USER_INFO_STATE, mFetchUserInfoSuccess);
|
||||
outState.putInt(MESSAGE_FULLNAME_STATE, mMessageId);
|
||||
outState.putString(NEW_ACCOUNT_NAME_STATE, mNewAccountName);
|
||||
outState.putString(NEW_ACCOUNT_QUALIFIED_NAME_STATE, mAccountQualifiedName);
|
||||
outState.putString("qualified_name", qualifiedName);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,377 @@
|
||||
package eu.toldi.infinityforlemmy.adapters;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.RequestManager;
|
||||
import com.bumptech.glide.request.RequestOptions;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import eu.toldi.infinityforlemmy.R;
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
import eu.toldi.infinityforlemmy.activities.BaseActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.ViewSubredditDetailActivity;
|
||||
import eu.toldi.infinityforlemmy.blockedcommunity.BlockedCommunityData;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
|
||||
import me.zhanghai.android.fastscroll.PopupTextProvider;
|
||||
import pl.droidsonroids.gif.GifImageView;
|
||||
import retrofit2.Retrofit;
|
||||
|
||||
public class BlockedCommunitiesRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements PopupTextProvider {
|
||||
private static final int VIEW_TYPE_FAVORITE_SUBREDDIT_DIVIDER = 0;
|
||||
private static final int VIEW_TYPE_FAVORITE_SUBREDDIT = 1;
|
||||
private static final int VIEW_TYPE_SUBREDDIT_DIVIDER = 2;
|
||||
private static final int VIEW_TYPE_SUBREDDIT = 3;
|
||||
|
||||
private BaseActivity mActivity;
|
||||
private Executor mExecutor;
|
||||
private Retrofit mOauthRetrofit;
|
||||
private RedditDataRoomDatabase mRedditDataRoomDatabase;
|
||||
private List<BlockedCommunityData> mBlockedCommunityData;
|
||||
private List<BlockedCommunityData> mFavoriteBlockedCommunityData;
|
||||
private RequestManager glide;
|
||||
private ItemClickListener itemClickListener;
|
||||
|
||||
private String accessToken;
|
||||
private String username;
|
||||
private String userIconUrl;
|
||||
private boolean hasClearSelectionRow;
|
||||
|
||||
private int primaryTextColor;
|
||||
private int secondaryTextColor;
|
||||
|
||||
public BlockedCommunitiesRecyclerViewAdapter(BaseActivity activity, Executor executor, Retrofit oauthRetrofit,
|
||||
RedditDataRoomDatabase redditDataRoomDatabase,
|
||||
CustomThemeWrapper customThemeWrapper,
|
||||
String accessToken) {
|
||||
mActivity = activity;
|
||||
mExecutor = executor;
|
||||
glide = Glide.with(activity);
|
||||
mOauthRetrofit = oauthRetrofit;
|
||||
mRedditDataRoomDatabase = redditDataRoomDatabase;
|
||||
this.accessToken = accessToken;
|
||||
primaryTextColor = customThemeWrapper.getPrimaryTextColor();
|
||||
secondaryTextColor = customThemeWrapper.getSecondaryTextColor();
|
||||
}
|
||||
|
||||
public BlockedCommunitiesRecyclerViewAdapter(BaseActivity activity, Executor executor, Retrofit oauthRetrofit,
|
||||
RedditDataRoomDatabase redditDataRoomDatabase,
|
||||
CustomThemeWrapper customThemeWrapper,
|
||||
String accessToken, boolean hasClearSelectionRow,
|
||||
ItemClickListener itemClickListener) {
|
||||
this(activity, executor, oauthRetrofit, redditDataRoomDatabase, customThemeWrapper, accessToken);
|
||||
this.hasClearSelectionRow = hasClearSelectionRow;
|
||||
this.itemClickListener = itemClickListener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int position) {
|
||||
if (mFavoriteBlockedCommunityData != null && mFavoriteBlockedCommunityData.size() > 0) {
|
||||
if (itemClickListener != null && !hasClearSelectionRow) {
|
||||
if (position == 0) {
|
||||
return VIEW_TYPE_SUBREDDIT;
|
||||
} else if (position == 1) {
|
||||
return VIEW_TYPE_FAVORITE_SUBREDDIT_DIVIDER;
|
||||
} else if (position == mFavoriteBlockedCommunityData.size() + 2) {
|
||||
return VIEW_TYPE_SUBREDDIT_DIVIDER;
|
||||
} else if (position <= mFavoriteBlockedCommunityData.size() + 1) {
|
||||
return VIEW_TYPE_FAVORITE_SUBREDDIT;
|
||||
} else {
|
||||
return VIEW_TYPE_SUBREDDIT;
|
||||
}
|
||||
} else if (hasClearSelectionRow) {
|
||||
if (position == 0) {
|
||||
return VIEW_TYPE_SUBREDDIT;
|
||||
} else if (position == 1) {
|
||||
return VIEW_TYPE_SUBREDDIT;
|
||||
} else if (position == 2) {
|
||||
return VIEW_TYPE_FAVORITE_SUBREDDIT_DIVIDER;
|
||||
} else if (position == mFavoriteBlockedCommunityData.size() + 3) {
|
||||
return VIEW_TYPE_SUBREDDIT_DIVIDER;
|
||||
} else if (position <= mFavoriteBlockedCommunityData.size() + 2) {
|
||||
return VIEW_TYPE_FAVORITE_SUBREDDIT;
|
||||
} else {
|
||||
return VIEW_TYPE_SUBREDDIT;
|
||||
}
|
||||
} else {
|
||||
if (position == 0) {
|
||||
return VIEW_TYPE_FAVORITE_SUBREDDIT_DIVIDER;
|
||||
} else if (position == mFavoriteBlockedCommunityData.size() + 1) {
|
||||
return VIEW_TYPE_SUBREDDIT_DIVIDER;
|
||||
} else if (position <= mFavoriteBlockedCommunityData.size()) {
|
||||
return VIEW_TYPE_FAVORITE_SUBREDDIT;
|
||||
} else {
|
||||
return VIEW_TYPE_SUBREDDIT;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return VIEW_TYPE_SUBREDDIT;
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
|
||||
switch (i) {
|
||||
case VIEW_TYPE_FAVORITE_SUBREDDIT_DIVIDER:
|
||||
return new FavoriteSubredditsDividerViewHolder(LayoutInflater.from(viewGroup.getContext())
|
||||
.inflate(R.layout.item_favorite_thing_divider, viewGroup, false));
|
||||
case VIEW_TYPE_FAVORITE_SUBREDDIT:
|
||||
return new FavoriteSubredditViewHolder(LayoutInflater.from(viewGroup.getContext())
|
||||
.inflate(R.layout.item_subscribed_thing, viewGroup, false));
|
||||
case VIEW_TYPE_SUBREDDIT_DIVIDER:
|
||||
return new AllSubredditsDividerViewHolder(LayoutInflater.from(viewGroup.getContext())
|
||||
.inflate(R.layout.item_favorite_thing_divider, viewGroup, false));
|
||||
default:
|
||||
return new SubredditViewHolder(LayoutInflater.from(viewGroup.getContext())
|
||||
.inflate(R.layout.item_subscribed_thing, viewGroup, false));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, int i) {
|
||||
if (viewHolder instanceof SubredditViewHolder) {
|
||||
String name;
|
||||
String fullname = "";
|
||||
String iconUrl;
|
||||
|
||||
if (hasClearSelectionRow && viewHolder.getBindingAdapterPosition() == 0) {
|
||||
((SubredditViewHolder) viewHolder).subredditNameTextView.setText(R.string.all_communities);
|
||||
viewHolder.itemView.setOnClickListener(view -> itemClickListener.onClick(null));
|
||||
return;
|
||||
} else {
|
||||
int offset = hasClearSelectionRow ? 1 : 0;
|
||||
BlockedCommunityData communityData = mBlockedCommunityData.get(viewHolder.getBindingAdapterPosition() - offset);
|
||||
name = mBlockedCommunityData.get(viewHolder.getBindingAdapterPosition() - offset).getName();
|
||||
fullname = mBlockedCommunityData.get(viewHolder.getBindingAdapterPosition() - offset).getQualified_name();
|
||||
iconUrl = mBlockedCommunityData.get(viewHolder.getBindingAdapterPosition() - offset).getIconUrl();
|
||||
|
||||
if (itemClickListener != null) {
|
||||
viewHolder.itemView.setOnClickListener(view -> itemClickListener.onClick(communityData));
|
||||
}
|
||||
}
|
||||
|
||||
if (itemClickListener == null) {
|
||||
String finalFullname = fullname;
|
||||
viewHolder.itemView.setOnClickListener(view -> {
|
||||
Intent intent = new Intent(mActivity, ViewSubredditDetailActivity.class);
|
||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, name);
|
||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_COMMUNITY_FULL_NAME_KEY,
|
||||
finalFullname);
|
||||
mActivity.startActivity(intent);
|
||||
});
|
||||
}
|
||||
|
||||
if (iconUrl != null && !iconUrl.equals("")) {
|
||||
glide.load(iconUrl)
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
|
||||
.error(glide.load(R.drawable.subreddit_default_icon)
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))))
|
||||
.into(((SubredditViewHolder) viewHolder).iconGifImageView);
|
||||
} else {
|
||||
glide.load(R.drawable.subreddit_default_icon)
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
|
||||
.into(((SubredditViewHolder) viewHolder).iconGifImageView);
|
||||
}
|
||||
((SubredditViewHolder) viewHolder).subredditNameTextView.setText(name);
|
||||
} else if (viewHolder instanceof FavoriteSubredditViewHolder) {
|
||||
int offset;
|
||||
if (itemClickListener != null) {
|
||||
if (hasClearSelectionRow) {
|
||||
offset = 3;
|
||||
} else {
|
||||
offset = 2;
|
||||
}
|
||||
} else {
|
||||
offset = 1;
|
||||
}
|
||||
BlockedCommunityData communityData = mFavoriteBlockedCommunityData.get(viewHolder.getBindingAdapterPosition() - offset);
|
||||
String name = mFavoriteBlockedCommunityData.get(viewHolder.getBindingAdapterPosition() - offset).getName();
|
||||
String iconUrl = mFavoriteBlockedCommunityData.get(viewHolder.getBindingAdapterPosition() - offset).getIconUrl();
|
||||
|
||||
if (itemClickListener != null) {
|
||||
viewHolder.itemView.setOnClickListener(view -> itemClickListener.onClick(communityData));
|
||||
} else {
|
||||
viewHolder.itemView.setOnClickListener(view -> {
|
||||
Intent intent = new Intent(mActivity, ViewSubredditDetailActivity.class);
|
||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, name);
|
||||
mActivity.startActivity(intent);
|
||||
});
|
||||
}
|
||||
|
||||
if (iconUrl != null && !iconUrl.equals("")) {
|
||||
glide.load(iconUrl)
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
|
||||
.error(glide.load(R.drawable.subreddit_default_icon)
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))))
|
||||
.into(((FavoriteSubredditViewHolder) viewHolder).iconGifImageView);
|
||||
} else {
|
||||
glide.load(R.drawable.subreddit_default_icon)
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
|
||||
.into(((FavoriteSubredditViewHolder) viewHolder).iconGifImageView);
|
||||
}
|
||||
((FavoriteSubredditViewHolder) viewHolder).subredditNameTextView.setText(name);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
if (mBlockedCommunityData != null) {
|
||||
|
||||
if (itemClickListener != null) {
|
||||
return mBlockedCommunityData.size() > 0 ? mBlockedCommunityData.size() + ((hasClearSelectionRow) ? 1 : 0) : 0;
|
||||
}
|
||||
|
||||
return mBlockedCommunityData.size();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
|
||||
if (holder instanceof SubredditViewHolder) {
|
||||
glide.clear(((SubredditViewHolder) holder).iconGifImageView);
|
||||
} else if (holder instanceof FavoriteSubredditViewHolder) {
|
||||
glide.clear(((FavoriteSubredditViewHolder) holder).iconGifImageView);
|
||||
}
|
||||
}
|
||||
|
||||
public void setSubscribedSubreddits(List<BlockedCommunityData> subscribedSubreddits) {
|
||||
mBlockedCommunityData = subscribedSubreddits;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public void setFavoriteSubscribedSubreddits(List<BlockedCommunityData> favoriteBlockedCommunityData) {
|
||||
mFavoriteBlockedCommunityData = favoriteBlockedCommunityData;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public void addUser(String username, String userIconUrl) {
|
||||
this.username = username;
|
||||
this.userIconUrl = userIconUrl;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String getPopupText(int position) {
|
||||
switch (getItemViewType(position)) {
|
||||
case VIEW_TYPE_SUBREDDIT:
|
||||
if (hasClearSelectionRow && position == 0) {
|
||||
return "";
|
||||
} else if (itemClickListener != null && !hasClearSelectionRow && position == 0) {
|
||||
return "";
|
||||
} else if (hasClearSelectionRow && position == 1) {
|
||||
return "";
|
||||
} else {
|
||||
int offset;
|
||||
if (itemClickListener != null) {
|
||||
if (hasClearSelectionRow) {
|
||||
offset = (mFavoriteBlockedCommunityData != null && mFavoriteBlockedCommunityData.size() > 0) ?
|
||||
mFavoriteBlockedCommunityData.size() + 4 : 0;
|
||||
} else {
|
||||
offset = (mFavoriteBlockedCommunityData != null && mFavoriteBlockedCommunityData.size() > 0) ?
|
||||
mFavoriteBlockedCommunityData.size() + 3 : 0;
|
||||
}
|
||||
} else {
|
||||
offset = (mFavoriteBlockedCommunityData != null && mFavoriteBlockedCommunityData.size() > 0) ?
|
||||
mFavoriteBlockedCommunityData.size() + 2 : 0;
|
||||
}
|
||||
|
||||
return mBlockedCommunityData.get(position - offset).getName().substring(0, 1).toUpperCase();
|
||||
}
|
||||
case VIEW_TYPE_FAVORITE_SUBREDDIT:
|
||||
int offset;
|
||||
if (itemClickListener != null) {
|
||||
if (hasClearSelectionRow) {
|
||||
offset = 3;
|
||||
} else {
|
||||
offset = 2;
|
||||
}
|
||||
} else {
|
||||
offset = 1;
|
||||
}
|
||||
return mFavoriteBlockedCommunityData.get(position - offset).getName().substring(0, 1).toUpperCase();
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
public interface ItemClickListener {
|
||||
void onClick(BlockedCommunityData subredditData);
|
||||
}
|
||||
|
||||
class SubredditViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.thing_icon_gif_image_view_item_subscribed_thing)
|
||||
GifImageView iconGifImageView;
|
||||
@BindView(R.id.thing_name_text_view_item_subscribed_thing)
|
||||
TextView subredditNameTextView;
|
||||
|
||||
SubredditViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
if (mActivity.typeface != null) {
|
||||
subredditNameTextView.setTypeface(mActivity.typeface);
|
||||
}
|
||||
subredditNameTextView.setTextColor(primaryTextColor);
|
||||
}
|
||||
}
|
||||
|
||||
class FavoriteSubredditViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.thing_icon_gif_image_view_item_subscribed_thing)
|
||||
GifImageView iconGifImageView;
|
||||
@BindView(R.id.thing_name_text_view_item_subscribed_thing)
|
||||
TextView subredditNameTextView;
|
||||
|
||||
FavoriteSubredditViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
if (mActivity.typeface != null) {
|
||||
subredditNameTextView.setTypeface(mActivity.typeface);
|
||||
}
|
||||
subredditNameTextView.setTextColor(primaryTextColor);
|
||||
}
|
||||
}
|
||||
|
||||
class FavoriteSubredditsDividerViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.divider_text_view_item_favorite_thing_divider)
|
||||
TextView dividerTextView;
|
||||
|
||||
FavoriteSubredditsDividerViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
if (mActivity.typeface != null) {
|
||||
dividerTextView.setTypeface(mActivity.typeface);
|
||||
}
|
||||
dividerTextView.setText(R.string.favorites);
|
||||
dividerTextView.setTextColor(secondaryTextColor);
|
||||
}
|
||||
}
|
||||
|
||||
class AllSubredditsDividerViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.divider_text_view_item_favorite_thing_divider)
|
||||
TextView dividerTextView;
|
||||
|
||||
AllSubredditsDividerViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
if (mActivity.typeface != null) {
|
||||
dividerTextView.setTypeface(mActivity.typeface);
|
||||
}
|
||||
dividerTextView.setText(R.string.all);
|
||||
dividerTextView.setTextColor(secondaryTextColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,216 @@
|
||||
package eu.toldi.infinityforlemmy.adapters;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.RequestManager;
|
||||
import com.bumptech.glide.request.RequestOptions;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import eu.toldi.infinityforlemmy.R;
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
import eu.toldi.infinityforlemmy.activities.BaseActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.ViewUserDetailActivity;
|
||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserData;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
|
||||
import me.zhanghai.android.fastscroll.PopupTextProvider;
|
||||
import pl.droidsonroids.gif.GifImageView;
|
||||
import retrofit2.Retrofit;
|
||||
|
||||
public class BlockedUsersRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements PopupTextProvider {
|
||||
private static final int VIEW_TYPE_FAVORITE_USER_DIVIDER = 0;
|
||||
private static final int VIEW_TYPE_FAVORITE_USER = 1;
|
||||
private static final int VIEW_TYPE_USER_DIVIDER = 2;
|
||||
private static final int VIEW_TYPE_USER = 3;
|
||||
|
||||
private List<BlockedUserData> mBlockedUserData;
|
||||
private List<BlockedUserData> mFavoriteBlockedUserData;
|
||||
private BaseActivity mActivity;
|
||||
private Executor mExecutor;
|
||||
private Retrofit mOauthRetrofit;
|
||||
private RedditDataRoomDatabase mRedditDataRoomDatabase;
|
||||
private String mAccessToken;
|
||||
private RequestManager glide;
|
||||
private int mPrimaryTextColor;
|
||||
private int mSecondaryTextColor;
|
||||
|
||||
public BlockedUsersRecyclerViewAdapter(BaseActivity activity, Executor executor, Retrofit oauthRetrofit,
|
||||
RedditDataRoomDatabase redditDataRoomDatabase,
|
||||
CustomThemeWrapper customThemeWrapper,
|
||||
String accessToken) {
|
||||
mActivity = activity;
|
||||
mExecutor = executor;
|
||||
mOauthRetrofit = oauthRetrofit;
|
||||
mRedditDataRoomDatabase = redditDataRoomDatabase;
|
||||
mAccessToken = accessToken;
|
||||
glide = Glide.with(activity);
|
||||
mPrimaryTextColor = customThemeWrapper.getPrimaryTextColor();
|
||||
mSecondaryTextColor = customThemeWrapper.getSecondaryTextColor();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int position) {
|
||||
if (mFavoriteBlockedUserData != null && mFavoriteBlockedUserData.size() > 0) {
|
||||
if (position == 0) {
|
||||
return VIEW_TYPE_FAVORITE_USER_DIVIDER;
|
||||
} else if (position == mFavoriteBlockedUserData.size() + 1) {
|
||||
return VIEW_TYPE_USER_DIVIDER;
|
||||
} else if (position <= mFavoriteBlockedUserData.size()) {
|
||||
return VIEW_TYPE_FAVORITE_USER;
|
||||
} else {
|
||||
return VIEW_TYPE_USER;
|
||||
}
|
||||
} else {
|
||||
return VIEW_TYPE_USER;
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
|
||||
switch (i) {
|
||||
case VIEW_TYPE_FAVORITE_USER_DIVIDER:
|
||||
return new FavoriteUsersDividerViewHolder(LayoutInflater.from(viewGroup.getContext())
|
||||
.inflate(R.layout.item_favorite_thing_divider, viewGroup, false));
|
||||
case VIEW_TYPE_USER_DIVIDER:
|
||||
return new AllUsersDividerViewHolder(LayoutInflater.from(viewGroup.getContext())
|
||||
.inflate(R.layout.item_favorite_thing_divider, viewGroup, false));
|
||||
default:
|
||||
return new UserViewHolder(LayoutInflater.from(viewGroup.getContext())
|
||||
.inflate(R.layout.item_subscribed_thing, viewGroup, false));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, int i) {
|
||||
if (viewHolder instanceof UserViewHolder) {
|
||||
int offset = 0;
|
||||
|
||||
if (!mBlockedUserData.get(viewHolder.getBindingAdapterPosition() - offset).getAvatar().equals("")) {
|
||||
glide.load(mBlockedUserData.get(viewHolder.getBindingAdapterPosition() - offset).getAvatar())
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
|
||||
.error(glide.load(R.drawable.subreddit_default_icon)
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))))
|
||||
.into(((UserViewHolder) viewHolder).iconGifImageView);
|
||||
} else {
|
||||
glide.load(R.drawable.subreddit_default_icon)
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
|
||||
.into(((UserViewHolder) viewHolder).iconGifImageView);
|
||||
}
|
||||
((UserViewHolder) viewHolder).userNameTextView.setText(mBlockedUserData.get(viewHolder.getBindingAdapterPosition() - offset).getName());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
if (mBlockedUserData != null && mBlockedUserData.size() > 0) {
|
||||
return mBlockedUserData.size();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
|
||||
if (holder instanceof UserViewHolder) {
|
||||
glide.clear(((UserViewHolder) holder).iconGifImageView);
|
||||
}
|
||||
}
|
||||
|
||||
public void setSubscribedUsers(List<BlockedUserData> subscribedUsers) {
|
||||
mBlockedUserData = subscribedUsers;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public void setFavoriteSubscribedUsers(List<BlockedUserData> favoriteSubscribedUsers) {
|
||||
mFavoriteBlockedUserData = favoriteSubscribedUsers;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String getPopupText(int position) {
|
||||
switch (getItemViewType(position)) {
|
||||
case VIEW_TYPE_USER:
|
||||
int offset = (mFavoriteBlockedUserData != null && mFavoriteBlockedUserData.size() > 0) ?
|
||||
mFavoriteBlockedUserData.size() + 2 : 0;
|
||||
return mBlockedUserData.get(position - offset).getName().substring(0, 1).toUpperCase();
|
||||
case VIEW_TYPE_FAVORITE_USER:
|
||||
return mFavoriteBlockedUserData.get(position - 1).getName().substring(0, 1).toUpperCase();
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class UserViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.thing_icon_gif_image_view_item_subscribed_thing)
|
||||
GifImageView iconGifImageView;
|
||||
@BindView(R.id.thing_name_text_view_item_subscribed_thing)
|
||||
TextView userNameTextView;
|
||||
|
||||
UserViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
if (mActivity.typeface != null) {
|
||||
userNameTextView.setTypeface(mActivity.typeface);
|
||||
}
|
||||
userNameTextView.setTextColor(mPrimaryTextColor);
|
||||
|
||||
itemView.setOnClickListener(view -> {
|
||||
int offset = (mFavoriteBlockedUserData != null && mFavoriteBlockedUserData.size() > 0) ?
|
||||
mFavoriteBlockedUserData.size() + 2 : 0;
|
||||
int position = getBindingAdapterPosition() - offset;
|
||||
if (position >= 0 && mBlockedUserData.size() > position) {
|
||||
Intent intent = new Intent(mActivity, ViewUserDetailActivity.class);
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, mBlockedUserData.get(position).getName());
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_QUALIFIED_USER_NAME_KEY, mBlockedUserData.get(position).getQualifiedName());
|
||||
mActivity.startActivity(intent);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
class FavoriteUsersDividerViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.divider_text_view_item_favorite_thing_divider)
|
||||
TextView dividerTextView;
|
||||
|
||||
FavoriteUsersDividerViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
if (mActivity.typeface != null) {
|
||||
dividerTextView.setTypeface(mActivity.typeface);
|
||||
}
|
||||
dividerTextView.setText(R.string.favorites);
|
||||
dividerTextView.setTextColor(mSecondaryTextColor);
|
||||
}
|
||||
}
|
||||
|
||||
class AllUsersDividerViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.divider_text_view_item_favorite_thing_divider)
|
||||
TextView dividerTextView;
|
||||
|
||||
AllUsersDividerViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
if (mActivity.typeface != null) {
|
||||
dividerTextView.setTypeface(mActivity.typeface);
|
||||
}
|
||||
dividerTextView.setText(R.string.all);
|
||||
dividerTextView.setTextColor(mSecondaryTextColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,7 @@ import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.text.Spanned;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
@@ -98,7 +99,8 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
private Retrofit mOauthRetrofit;
|
||||
private Markwon mCommentMarkwon;
|
||||
private String mAccessToken;
|
||||
private String mAccountName;
|
||||
private String mAccountQualifiedName;
|
||||
|
||||
private Post mPost;
|
||||
private ArrayList<Comment> mVisibleComments;
|
||||
|
||||
@@ -124,6 +126,8 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
private boolean mShowAuthorAvatar;
|
||||
private boolean mAlwaysShowChildCommentCount;
|
||||
private boolean mHideTheNumberOfVotes;
|
||||
private boolean mSeperateUpandDownvote;
|
||||
private boolean mHideDownvotes;
|
||||
private int mDepthThreshold;
|
||||
private CommentRecyclerViewAdapterCallback mCommentRecyclerViewAdapterCallback;
|
||||
private boolean isInitiallyLoading;
|
||||
@@ -166,6 +170,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
Post post, Locale locale, Integer singleCommentId,
|
||||
boolean isSingleCommentThreadMode,
|
||||
SharedPreferences sharedPreferences,
|
||||
SharedPreferences currentAccountSharedPreferences,
|
||||
CommentRecyclerViewAdapterCallback commentRecyclerViewAdapterCallback) {
|
||||
mActivity = activity;
|
||||
mFragment = fragment;
|
||||
@@ -213,7 +218,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
miscPlugin, mCommentTextColor, commentSpoilerBackgroundColor, onLinkLongClickListener);
|
||||
recycledViewPool = new RecyclerView.RecycledViewPool();
|
||||
mAccessToken = accessToken;
|
||||
mAccountName = accountName;
|
||||
mAccountQualifiedName = accountName;
|
||||
mPost = post;
|
||||
mVisibleComments = new ArrayList<>();
|
||||
loadedComments = new HashSet<>();
|
||||
@@ -237,6 +242,8 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
mShowAuthorAvatar = sharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_AUTHOR_AVATAR, false);
|
||||
mAlwaysShowChildCommentCount = sharedPreferences.getBoolean(SharedPreferencesUtils.ALWAYS_SHOW_CHILD_COMMENT_COUNT, false);
|
||||
mHideTheNumberOfVotes = sharedPreferences.getBoolean(SharedPreferencesUtils.HIDE_THE_NUMBER_OF_VOTES_IN_COMMENTS, false);
|
||||
mHideDownvotes = !currentAccountSharedPreferences.getBoolean(SharedPreferencesUtils.CAN_DOWNVOTE, true);
|
||||
mSeperateUpandDownvote = sharedPreferences.getBoolean(SharedPreferencesUtils.COMMENT_SEPARATE_UP_AND_DOWN_VOTES, true) && !mHideDownvotes;
|
||||
mDepthThreshold = sharedPreferences.getInt(SharedPreferencesUtils.SHOW_FEWER_TOOLBAR_OPTIONS_THRESHOLD, 5);
|
||||
|
||||
mCommentRecyclerViewAdapterCallback = commentRecyclerViewAdapterCallback;
|
||||
@@ -383,7 +390,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
Drawable moderatorDrawable = Utils.getTintedDrawable(mActivity, R.drawable.ic_verified_user_14dp, mModeratorColor);
|
||||
((CommentViewHolder) holder).authorTextView.setCompoundDrawablesWithIntrinsicBounds(
|
||||
moderatorDrawable, null, null, null);
|
||||
} else if (comment.getAuthor().equals(mAccountName)) {
|
||||
} else if (comment.getAuthorQualifiedName().equals(mAccountQualifiedName)) {
|
||||
((CommentViewHolder) holder).authorTextView.setTextColor(mCurrentUserColor);
|
||||
Drawable currentUserDrawable = Utils.getTintedDrawable(mActivity, R.drawable.ic_current_user_14dp, mCurrentUserColor);
|
||||
((CommentViewHolder) holder).authorTextView.setCompoundDrawablesWithIntrinsicBounds(
|
||||
@@ -434,6 +441,10 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
((CommentViewHolder) holder).mMarkwonAdapter.setMarkdown(mCommentMarkwon, comment.getCommentMarkdown());
|
||||
// noinspection NotifyDataSetChanged
|
||||
((CommentViewHolder) holder).mMarkwonAdapter.notifyDataSetChanged();
|
||||
if (mHideDownvotes) {
|
||||
((CommentViewHolder) holder).downvoteButton.setVisibility(View.GONE);
|
||||
((CommentViewHolder) holder).downvoteTextView.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
if (!mHideTheNumberOfVotes) {
|
||||
String commentText = "";
|
||||
@@ -445,7 +456,21 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
comment.getScore() + comment.getVoteType()));
|
||||
|
||||
if (mSeperateUpandDownvote) {
|
||||
int upvotes = (comment.getVoteType() == 1) ? comment.getUpvotes() + 1 : comment.getUpvotes();
|
||||
int downvotes = (comment.getVoteType() == -1) ? comment.getDownvotes() + 1 : comment.getDownvotes();
|
||||
((CommentViewHolder) holder).downvoteTextView.setVisibility(View.VISIBLE);
|
||||
((CommentViewHolder) holder).scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, upvotes));
|
||||
((CommentViewHolder) holder).downvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, downvotes));
|
||||
((CommentViewHolder) holder).scoreTextView.setGravity(Gravity.START);
|
||||
((CommentViewHolder) holder).scoreTextView.getLayoutParams().width = (int) (32 * mActivity.getResources().getDisplayMetrics().density);
|
||||
|
||||
((CommentViewHolder) holder).scoreTextView.setPadding(0, 0, 6, 0);
|
||||
((CommentViewHolder) holder).downvoteButton.setPadding(24, 0, 12, 0);
|
||||
((CommentViewHolder) holder).upvoteButton.setPadding(24, 0, 12, 0);
|
||||
} else {
|
||||
((CommentViewHolder) holder).scoreTextView.setText(commentText);
|
||||
}
|
||||
((CommentViewHolder) holder).topScoreTextView.setText(topScoreText);
|
||||
} else {
|
||||
((CommentViewHolder) holder).scoreTextView.setText(mActivity.getString(R.string.vote));
|
||||
@@ -485,13 +510,21 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
.setColorFilter(mUpvotedColor, PorterDuff.Mode.SRC_IN);
|
||||
((CommentViewHolder) holder).scoreTextView.setTextColor(mUpvotedColor);
|
||||
((CommentViewHolder) holder).topScoreTextView.setTextColor(mUpvotedColor);
|
||||
((CommentViewHolder) holder).downvoteTextView.setTextColor(mCommentIconAndInfoColor);
|
||||
break;
|
||||
case Comment.VOTE_TYPE_DOWNVOTE:
|
||||
((CommentViewHolder) holder).downvoteButton
|
||||
.setColorFilter(mDownvotedColor, PorterDuff.Mode.SRC_IN);
|
||||
if(mSeperateUpandDownvote) {
|
||||
((CommentViewHolder) holder).downvoteTextView.setTextColor(mDownvotedColor);
|
||||
((CommentViewHolder) holder).scoreTextView.setTextColor(mCommentIconAndInfoColor);
|
||||
} else {
|
||||
((CommentViewHolder) holder).scoreTextView.setTextColor(mDownvotedColor);
|
||||
}
|
||||
((CommentViewHolder) holder).topScoreTextView.setTextColor(mDownvotedColor);
|
||||
break;
|
||||
default:
|
||||
((CommentViewHolder) holder).downvoteTextView.setTextColor(mCommentIconAndInfoColor);
|
||||
}
|
||||
|
||||
if (mPost.isArchived()) {
|
||||
@@ -1190,6 +1223,9 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
ImageView upvoteButton;
|
||||
@BindView(R.id.score_text_view_item_post_comment)
|
||||
TextView scoreTextView;
|
||||
|
||||
@BindView(R.id.downvote_text_view_item_post_comment)
|
||||
TextView downvoteTextView;
|
||||
@BindView(R.id.down_vote_button_item_post_comment)
|
||||
ImageView downvoteButton;
|
||||
@BindView(R.id.placeholder_item_post_comment)
|
||||
@@ -1221,6 +1257,8 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
constraintSet.clear(scoreTextView.getId(), ConstraintSet.END);
|
||||
constraintSet.clear(downvoteButton.getId(), ConstraintSet.START);
|
||||
constraintSet.clear(downvoteButton.getId(), ConstraintSet.END);
|
||||
constraintSet.clear(downvoteTextView.getId(), ConstraintSet.START);
|
||||
constraintSet.clear(downvoteTextView.getId(), ConstraintSet.END);
|
||||
constraintSet.clear(expandButton.getId(), ConstraintSet.START);
|
||||
constraintSet.clear(expandButton.getId(), ConstraintSet.END);
|
||||
constraintSet.clear(saveButton.getId(), ConstraintSet.START);
|
||||
@@ -1233,8 +1271,15 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
constraintSet.connect(upvoteButton.getId(), ConstraintSet.START, placeholder.getId(), ConstraintSet.END);
|
||||
constraintSet.connect(scoreTextView.getId(), ConstraintSet.END, downvoteButton.getId(), ConstraintSet.START);
|
||||
constraintSet.connect(scoreTextView.getId(), ConstraintSet.START, upvoteButton.getId(), ConstraintSet.END);
|
||||
if (!mSeperateUpandDownvote) {
|
||||
constraintSet.connect(downvoteButton.getId(), ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END);
|
||||
constraintSet.connect(downvoteButton.getId(), ConstraintSet.START, scoreTextView.getId(), ConstraintSet.END);
|
||||
} else {
|
||||
constraintSet.connect(downvoteButton.getId(), ConstraintSet.END, downvoteTextView.getId(), ConstraintSet.START);
|
||||
constraintSet.connect(downvoteButton.getId(), ConstraintSet.START, scoreTextView.getId(), ConstraintSet.END);
|
||||
constraintSet.connect(downvoteTextView.getId(), ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END);
|
||||
constraintSet.connect(downvoteTextView.getId(), ConstraintSet.START, downvoteButton.getId(), ConstraintSet.END);
|
||||
}
|
||||
constraintSet.connect(placeholder.getId(), ConstraintSet.END, upvoteButton.getId(), ConstraintSet.START);
|
||||
constraintSet.connect(placeholder.getId(), ConstraintSet.START, moreButton.getId(), ConstraintSet.END);
|
||||
constraintSet.connect(moreButton.getId(), ConstraintSet.START, expandButton.getId(), ConstraintSet.END);
|
||||
@@ -1267,6 +1312,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
editedTextView.setTypeface(mActivity.typeface);
|
||||
awardsTextView.setTypeface(mActivity.typeface);
|
||||
scoreTextView.setTypeface(mActivity.typeface);
|
||||
downvoteTextView.setTypeface(mActivity.typeface);
|
||||
expandButton.setTypeface(mActivity.typeface);
|
||||
}
|
||||
|
||||
@@ -1298,11 +1344,13 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
commentTimeTextView.setTextColor(mSecondaryTextColor);
|
||||
authorFlairTextView.setTextColor(mAuthorFlairTextColor);
|
||||
topScoreTextView.setTextColor(mSecondaryTextColor);
|
||||
downvoteTextView.setTextColor(mSecondaryTextColor);
|
||||
editedTextView.setTextColor(mSecondaryTextColor);
|
||||
awardsTextView.setTextColor(mSecondaryTextColor);
|
||||
commentDivider.setBackgroundColor(mDividerColor);
|
||||
upvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
|
||||
scoreTextView.setTextColor(mCommentIconAndInfoColor);
|
||||
downvoteTextView.setTextColor(mCommentIconAndInfoColor);
|
||||
downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
|
||||
moreButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
|
||||
expandButton.setTextColor(mCommentIconAndInfoColor);
|
||||
@@ -1326,7 +1374,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
Comment comment = getCurrentComment(this);
|
||||
if (comment != null) {
|
||||
Bundle bundle = new Bundle();
|
||||
if (!mPost.isArchived() && !mPost.isLocked() && comment.getAuthor().equals(mAccountName)) {
|
||||
if (!mPost.isArchived() && !mPost.isLocked() && comment.getAuthorQualifiedName().equals(mAccountQualifiedName)) {
|
||||
bundle.putBoolean(CommentMoreBottomSheetFragment.EXTRA_EDIT_AND_DELETE_AVAILABLE, true);
|
||||
}
|
||||
bundle.putString(CommentMoreBottomSheetFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
|
||||
@@ -1409,12 +1457,22 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
newVoteType = Integer.parseInt(APIUtils.DIR_UNVOTE);
|
||||
upvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
|
||||
scoreTextView.setTextColor(mCommentIconAndInfoColor);
|
||||
downvoteTextView.setTextColor(mCommentIconAndInfoColor);
|
||||
topScoreTextView.setTextColor(mSecondaryTextColor);
|
||||
}
|
||||
|
||||
if (!mHideTheNumberOfVotes) {
|
||||
if(mSeperateUpandDownvote){
|
||||
int upvoteCount = (comment.getVoteType() == 1) ? comment.getUpvotes() + 1 : comment.getUpvotes();
|
||||
int downvoteCount = (comment.getVoteType() == -1) ? comment.getDownvotes() + 1 : comment.getDownvotes();
|
||||
scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
upvoteCount));
|
||||
downvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
downvoteCount));
|
||||
}else {
|
||||
scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
comment.getScore() + comment.getVoteType()));
|
||||
}
|
||||
topScoreTextView.setText(mActivity.getString(R.string.top_score,
|
||||
Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
comment.getScore() + comment.getVoteType())));
|
||||
@@ -1430,6 +1488,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
upvoteButton.setColorFilter(mUpvotedColor, PorterDuff.Mode.SRC_IN);
|
||||
scoreTextView.setTextColor(mUpvotedColor);
|
||||
topScoreTextView.setTextColor(mUpvotedColor);
|
||||
downvoteTextView.setTextColor(mCommentIconAndInfoColor);
|
||||
}
|
||||
} else {
|
||||
comment.setVoteType(Comment.VOTE_TYPE_NO_VOTE);
|
||||
@@ -1437,14 +1496,24 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
upvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
|
||||
scoreTextView.setTextColor(mCommentIconAndInfoColor);
|
||||
topScoreTextView.setTextColor(mSecondaryTextColor);
|
||||
downvoteTextView.setTextColor(mCommentIconAndInfoColor);
|
||||
}
|
||||
}
|
||||
|
||||
if (currentPosition == position) {
|
||||
downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
|
||||
if (!mHideTheNumberOfVotes) {
|
||||
if(mSeperateUpandDownvote){
|
||||
int upvoteCount = (comment.getVoteType() == 1) ? comment.getUpvotes() + 1 : comment.getUpvotes();
|
||||
scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
upvoteCount));
|
||||
int downvoteCount = (comment.getVoteType() == -1) ? comment.getDownvotes() + 1 : comment.getDownvotes();
|
||||
downvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
downvoteCount));
|
||||
} else {
|
||||
scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
comment.getScore() + comment.getVoteType()));
|
||||
}
|
||||
topScoreTextView.setText(mActivity.getString(R.string.top_score,
|
||||
Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
comment.getScore() + comment.getVoteType())));
|
||||
@@ -1482,20 +1551,34 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
comment.setVoteType(Comment.VOTE_TYPE_DOWNVOTE);
|
||||
newVoteType = Integer.parseInt(APIUtils.DIR_DOWNVOTE);
|
||||
downvoteButton.setColorFilter(mDownvotedColor, PorterDuff.Mode.SRC_IN);
|
||||
if(mSeperateUpandDownvote){
|
||||
downvoteTextView.setTextColor(mDownvotedColor);
|
||||
scoreTextView.setTextColor(mCommentIconAndInfoColor);
|
||||
}else {
|
||||
scoreTextView.setTextColor(mDownvotedColor);
|
||||
}
|
||||
topScoreTextView.setTextColor(mDownvotedColor);
|
||||
} else {
|
||||
//Downvoted before
|
||||
comment.setVoteType(Comment.VOTE_TYPE_NO_VOTE);
|
||||
newVoteType = Integer.parseInt(APIUtils.DIR_UNVOTE);
|
||||
downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
|
||||
downvoteTextView.setTextColor(mCommentIconAndInfoColor);
|
||||
scoreTextView.setTextColor(mCommentIconAndInfoColor);
|
||||
topScoreTextView.setTextColor(mSecondaryTextColor);
|
||||
}
|
||||
|
||||
if (!mHideTheNumberOfVotes) {
|
||||
if(mSeperateUpandDownvote){
|
||||
int downvotes = (comment.getVoteType() == -1) ? comment.getDownvotes() +1 : comment.getDownvotes();
|
||||
int upvotes = (comment.getVoteType() == 1) ? comment.getUpvotes() +1 : comment.getUpvotes();
|
||||
scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
upvotes));
|
||||
downvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, downvotes));
|
||||
} else {
|
||||
scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
comment.getScore() + comment.getVoteType()));
|
||||
}
|
||||
topScoreTextView.setText(mActivity.getString(R.string.top_score,
|
||||
Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
comment.getScore() + comment.getVoteType())));
|
||||
@@ -1510,7 +1593,11 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
comment.setVoteType(Comment.VOTE_TYPE_DOWNVOTE);
|
||||
if (currentPosition == position) {
|
||||
downvoteButton.setColorFilter(mDownvotedColor, PorterDuff.Mode.SRC_IN);
|
||||
if(mSeperateUpandDownvote){
|
||||
downvoteTextView.setTextColor(mDownvotedColor);
|
||||
}else {
|
||||
scoreTextView.setTextColor(mDownvotedColor);
|
||||
}
|
||||
topScoreTextView.setTextColor(mDownvotedColor);
|
||||
}
|
||||
} else {
|
||||
@@ -1518,6 +1605,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
if (currentPosition == position) {
|
||||
downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
|
||||
scoreTextView.setTextColor(mCommentIconAndInfoColor);
|
||||
downvoteTextView.setTextColor(mCommentIconAndInfoColor);
|
||||
topScoreTextView.setTextColor(mSecondaryTextColor);
|
||||
}
|
||||
}
|
||||
@@ -1525,8 +1613,17 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||
if (currentPosition == position) {
|
||||
upvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
|
||||
if (!mHideTheNumberOfVotes) {
|
||||
if(mSeperateUpandDownvote){
|
||||
int downvotes = (comment.getVoteType() == -1) ? comment.getDownvotes() +1 : comment.getDownvotes();
|
||||
int upvotes = (comment.getVoteType() == 1) ? comment.getUpvotes() +1 : comment.getUpvotes();
|
||||
downvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, downvotes));
|
||||
scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
upvotes));
|
||||
} else {
|
||||
scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
comment.getScore() + comment.getVoteType()));
|
||||
}
|
||||
|
||||
topScoreTextView.setText(mActivity.getString(R.string.top_score,
|
||||
Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
comment.getScore() + comment.getVoteType())));
|
||||
|
||||
@@ -554,9 +554,6 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
|
||||
.into(((PostBaseViewHolder) holder).iconGifImageView);
|
||||
}
|
||||
|
||||
if (holder.getBindingAdapterPosition() >= 0) {
|
||||
post.setSubredditIconUrl(iconUrl);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else if (!post.getSubredditIconUrl().equals("")) {
|
||||
@@ -641,9 +638,12 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
|
||||
break;
|
||||
}
|
||||
|
||||
if (mPostType == PostPagingSource.TYPE_SUBREDDIT && !mDisplaySubredditName && post.isStickied()) {
|
||||
if (mPostType == PostPagingSource.TYPE_SUBREDDIT && !mDisplaySubredditName && post.isFeaturedInCommunity() || post.isFeaturedOnInstance()) {
|
||||
((PostBaseViewHolder) holder).stickiedPostImageView.setVisibility(View.VISIBLE);
|
||||
mGlide.load(R.drawable.ic_thumbtack_24dp).into(((PostBaseViewHolder) holder).stickiedPostImageView);
|
||||
if (post.isFeaturedOnInstance()) {
|
||||
((PostBaseViewHolder) holder).stickiedPostImageView.setColorFilter(mModeratorColor, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
}
|
||||
}
|
||||
|
||||
if (post.isArchived()) {
|
||||
@@ -1079,9 +1079,6 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
|
||||
.into(((PostCompactBaseViewHolder) holder).iconGifImageView);
|
||||
}
|
||||
|
||||
if (holder.getBindingAdapterPosition() >= 0) {
|
||||
post.setSubredditIconUrl(iconUrl);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else if (!post.getSubredditIconUrl().equals("")) {
|
||||
@@ -1210,7 +1207,7 @@ public class HistoryPostRecyclerViewAdapter extends PagingDataAdapter<Post, Recy
|
||||
}
|
||||
}
|
||||
|
||||
if (mPostType == PostPagingSource.TYPE_SUBREDDIT && !mDisplaySubredditName && post.isStickied()) {
|
||||
if (mPostType == PostPagingSource.TYPE_SUBREDDIT && !mDisplaySubredditName && post.isFeaturedInCommunity()) {
|
||||
((PostCompactBaseViewHolder) holder).stickiedPostImageView.setVisibility(View.VISIBLE);
|
||||
mGlide.load(R.drawable.ic_thumbtack_24dp).into(((PostCompactBaseViewHolder) holder).stickiedPostImageView);
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.text.Spanned;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
@@ -56,6 +57,7 @@ import com.libRG.CustomTextView;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Locale;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.inject.Provider;
|
||||
|
||||
@@ -98,7 +100,6 @@ import eu.toldi.infinityforlemmy.markdown.MarkdownUtils;
|
||||
import eu.toldi.infinityforlemmy.post.Post;
|
||||
import eu.toldi.infinityforlemmy.post.PostPagingSource;
|
||||
import eu.toldi.infinityforlemmy.utils.APIUtils;
|
||||
import eu.toldi.infinityforlemmy.utils.LemmyUtils;
|
||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
|
||||
import eu.toldi.infinityforlemmy.utils.Utils;
|
||||
import eu.toldi.infinityforlemmy.videoautoplay.CacheManager;
|
||||
@@ -171,9 +172,14 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
private boolean mHideUpvoteRatio;
|
||||
private boolean mHideTheNumberOfAwards;
|
||||
private boolean mHideSubredditAndUserPrefix;
|
||||
|
||||
private boolean mShowDisplayNames;
|
||||
private boolean mHideTheNumberOfVotes;
|
||||
|
||||
private boolean mSeperateUpvoteAndDownvote;
|
||||
private boolean mHideTheNumberOfComments;
|
||||
private boolean mSeparatePostAndComments;
|
||||
private boolean mHideDownvotes;
|
||||
private boolean mLegacyAutoplayVideoControllerUI;
|
||||
private boolean mEasierToWatchInFullScreen;
|
||||
private PostDetailRecyclerViewAdapterCallback mPostDetailRecyclerViewAdapterCallback;
|
||||
@@ -341,7 +347,10 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
mHideUpvoteRatio = postDetailsSharedPreferences.getBoolean(SharedPreferencesUtils.HIDE_UPVOTE_RATIO, false);
|
||||
mHideTheNumberOfAwards = postDetailsSharedPreferences.getBoolean(SharedPreferencesUtils.HIDE_THE_NUMBER_OF_AWARDS, false);
|
||||
mHideSubredditAndUserPrefix = postDetailsSharedPreferences.getBoolean(SharedPreferencesUtils.HIDE_SUBREDDIT_AND_USER_PREFIX, false);
|
||||
mShowDisplayNames = postDetailsSharedPreferences.getBoolean(SharedPreferencesUtils.POST_DETAIL_DISPLAY_NAME_INSTEAD_OF_USERNAME, true);
|
||||
mHideTheNumberOfVotes = postDetailsSharedPreferences.getBoolean(SharedPreferencesUtils.HIDE_THE_NUMBER_OF_VOTES, false);
|
||||
mHideDownvotes = !currentAccountSharedPreferences.getBoolean(SharedPreferencesUtils.CAN_DOWNVOTE, true);
|
||||
mSeperateUpvoteAndDownvote = postDetailsSharedPreferences.getBoolean(SharedPreferencesUtils.POST_DETAIL_SEPARATE_UP_AND_DOWN_VOTES, true) && !mHideDownvotes;
|
||||
mHideTheNumberOfComments = postDetailsSharedPreferences.getBoolean(SharedPreferencesUtils.HIDE_THE_NUMBER_OF_COMMENTS, false);
|
||||
|
||||
mPostDetailRecyclerViewAdapterCallback = postDetailRecyclerViewAdapterCallback;
|
||||
@@ -522,8 +531,6 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))))
|
||||
.into(((PostDetailBaseViewHolder) holder).mIconGifImageView);
|
||||
}
|
||||
|
||||
mPost.setSubredditIconUrl(iconImageUrl);
|
||||
});
|
||||
} else if (!mPost.getSubredditIconUrl().equals("")) {
|
||||
mGlide.load(mPost.getSubredditIconUrl())
|
||||
@@ -544,16 +551,23 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
//Upvote
|
||||
((PostDetailBaseViewHolder) holder).mUpvoteButton.setColorFilter(mUpvotedColor, PorterDuff.Mode.SRC_IN);
|
||||
((PostDetailBaseViewHolder) holder).mScoreTextView.setTextColor(mUpvotedColor);
|
||||
((PostDetailBaseViewHolder) holder).mDownvoteTextView.setTextColor(mPostIconAndInfoColor);
|
||||
break;
|
||||
case -1:
|
||||
//Downvote
|
||||
((PostDetailBaseViewHolder) holder).mDownvoteButton.setColorFilter(mDownvotedColor, PorterDuff.Mode.SRC_IN);
|
||||
if(mSeperateUpvoteAndDownvote){
|
||||
((PostDetailBaseViewHolder) holder).mDownvoteTextView.setTextColor(mDownvotedColor);
|
||||
} else {
|
||||
((PostDetailBaseViewHolder) holder).mScoreTextView.setTextColor(mDownvotedColor);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
case 0:
|
||||
((PostDetailBaseViewHolder) holder).mUpvoteButton.setColorFilter(mPostIconAndInfoColor, PorterDuff.Mode.SRC_IN);
|
||||
((PostDetailBaseViewHolder) holder).mDownvoteButton.setColorFilter(mPostIconAndInfoColor, PorterDuff.Mode.SRC_IN);
|
||||
((PostDetailBaseViewHolder) holder).mScoreTextView.setTextColor(mPostIconAndInfoColor);
|
||||
((PostDetailBaseViewHolder) holder).mDownvoteTextView.setTextColor(mPostIconAndInfoColor);
|
||||
}
|
||||
|
||||
if (mPost.isArchived()) {
|
||||
@@ -567,15 +581,20 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
((PostDetailBaseViewHolder) holder).mCrosspostImageView.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
if (!mHideSubredditAndUserPrefix) {
|
||||
((PostDetailBaseViewHolder) holder).mSubredditTextView.setText(mPost.getSubredditNamePrefixed());
|
||||
((PostDetailBaseViewHolder) holder).mUserTextView.setText(mPost.getAuthorNamePrefixed());
|
||||
((PostDetailBaseViewHolder) holder).mUserTextView.setText((mShowDisplayNames) ? mPost.getAuthor() : mPost.getAuthorInfo().getUsername());
|
||||
((PostDetailBaseViewHolder) holder).mSubredditTextView.setText((mShowDisplayNames) ? mPost.getSubredditName() : mPost.getCommunityInfo().getName());
|
||||
if (mHideSubredditAndUserPrefix) {
|
||||
((PostDetailBaseViewHolder) holder).mUserTextView.setText((mShowDisplayNames) ? mPost.getAuthor() : mPost.getAuthorInfo().getUsername());
|
||||
} else {
|
||||
((PostDetailBaseViewHolder) holder).mSubredditTextView.setText(mPost.getSubredditName());
|
||||
((PostDetailBaseViewHolder) holder).mUserTextView.setText(mPost.getAuthor());
|
||||
((PostDetailBaseViewHolder) holder).mSubredditTextView.setText((mShowDisplayNames) ? mPost.getSubredditName() : mPost.getCommunityInfo().getName());
|
||||
((PostDetailBaseViewHolder) holder).mCommunityInstanceTextView.setText('@' + mPost.getSubredditNamePrefixed().split(Pattern.quote("@"))[1]);
|
||||
|
||||
((PostDetailBaseViewHolder) holder).mUserInstanceTextView.setText('@' + mPost.getAuthorNamePrefixed().split(Pattern.quote("@"))[1]);
|
||||
((PostDetailBaseViewHolder) holder).mCommunityInstanceTextView.setTextColor(CustomThemeWrapper.darkenColor(mSubredditColor, 0.7f));
|
||||
((PostDetailBaseViewHolder) holder).mUserInstanceTextView.setTextColor(CustomThemeWrapper.darkenColor(mPost.isModerator() || mPost.isAdmin() ? mModeratorColor : mUsernameColor, 0.7f));
|
||||
}
|
||||
|
||||
if (mPost.isModerator()) {
|
||||
if (mPost.isModerator() || mPost.isAdmin()) {
|
||||
((PostDetailBaseViewHolder) holder).mUserTextView.setTextColor(mModeratorColor);
|
||||
Drawable moderatorDrawable = Utils.getTintedDrawable(mActivity, R.drawable.ic_verified_user_14dp, mModeratorColor);
|
||||
((PostDetailBaseViewHolder) holder).mUserTextView.setCompoundDrawablesWithIntrinsicBounds(
|
||||
@@ -611,7 +630,24 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
}
|
||||
|
||||
if (!mHideTheNumberOfVotes) {
|
||||
if(mSeperateUpvoteAndDownvote){
|
||||
int upvotes = (mPost.getVoteType() == 1) ? mPost.getUpvotes()+1 : mPost.getUpvotes();
|
||||
int downvotes = (mPost.getVoteType() == -1) ? mPost.getDownvotes() +1 : Math.max(mPost.getDownvotes(),0);
|
||||
((PostDetailBaseViewHolder) holder).mScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, upvotes));
|
||||
((PostDetailBaseViewHolder) holder).mDownvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, downvotes));
|
||||
|
||||
((PostDetailBaseViewHolder) holder).mDownvoteTextView.setVisibility(View.VISIBLE);
|
||||
|
||||
((PostDetailBaseViewHolder) holder).mDownvoteTextView.setGravity(Gravity.START);
|
||||
((PostDetailBaseViewHolder) holder).mScoreTextView.setGravity(Gravity.START);
|
||||
((PostDetailBaseViewHolder) holder).mScoreTextView.getLayoutParams().width = (int) (32 * mActivity.getResources().getDisplayMetrics().density);
|
||||
|
||||
((PostDetailBaseViewHolder) holder).mScoreTextView.setPadding(0, 0, 6, 0);
|
||||
((PostDetailBaseViewHolder) holder).mDownvoteTextView.setPadding(0, 0, 12, 0);
|
||||
((PostDetailBaseViewHolder) holder).mUpvoteButton.setPadding(24, 0, 12, 0);
|
||||
} else {
|
||||
((PostDetailBaseViewHolder) holder).mScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, mPost.getScore() + mPost.getVoteType()));
|
||||
}
|
||||
} else {
|
||||
((PostDetailBaseViewHolder) holder).mScoreTextView.setText(mActivity.getString(R.string.vote));
|
||||
}
|
||||
@@ -1146,7 +1182,9 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
public class PostDetailBaseViewHolder extends RecyclerView.ViewHolder {
|
||||
AspectRatioGifImageView mIconGifImageView;
|
||||
TextView mSubredditTextView;
|
||||
TextView mCommunityInstanceTextView;
|
||||
TextView mUserTextView;
|
||||
TextView mUserInstanceTextView;
|
||||
TextView mAuthorFlairTextView;
|
||||
TextView mPostTimeTextView;
|
||||
TextView mTitleTextView;
|
||||
@@ -1163,6 +1201,7 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
ConstraintLayout mBottomConstraintLayout;
|
||||
ImageView mUpvoteButton;
|
||||
TextView mScoreTextView;
|
||||
TextView mDownvoteTextView;
|
||||
ImageView mDownvoteButton;
|
||||
TextView commentsCountTextView;
|
||||
ImageView mSaveButton;
|
||||
@@ -1174,7 +1213,9 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
|
||||
void setBaseView(AspectRatioGifImageView mIconGifImageView,
|
||||
TextView mSubredditTextView,
|
||||
TextView mCommunityInstanceTextView,
|
||||
TextView mUserTextView,
|
||||
TextView mUserInstanceTextView,
|
||||
TextView mAuthorFlairTextView,
|
||||
TextView mPostTimeTextView,
|
||||
TextView mTitleTextView,
|
||||
@@ -1191,13 +1232,16 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
ConstraintLayout mBottomConstraintLayout,
|
||||
ImageView mUpvoteButton,
|
||||
TextView mScoreTextView,
|
||||
TextView mDownvoteTextView,
|
||||
ImageView mDownvoteButton,
|
||||
TextView commentsCountTextView,
|
||||
ImageView mSaveButton,
|
||||
ImageView mShareButton) {
|
||||
this.mIconGifImageView = mIconGifImageView;
|
||||
this.mSubredditTextView = mSubredditTextView;
|
||||
this.mCommunityInstanceTextView = mCommunityInstanceTextView;
|
||||
this.mUserTextView = mUserTextView;
|
||||
this.mUserInstanceTextView = mUserInstanceTextView;
|
||||
this.mAuthorFlairTextView = mAuthorFlairTextView;
|
||||
this.mPostTimeTextView = mPostTimeTextView;
|
||||
this.mTitleTextView = mTitleTextView;
|
||||
@@ -1214,6 +1258,7 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
this.mBottomConstraintLayout = mBottomConstraintLayout;
|
||||
this.mUpvoteButton = mUpvoteButton;
|
||||
this.mScoreTextView = mScoreTextView;
|
||||
this.mDownvoteTextView = mDownvoteTextView;
|
||||
this.mDownvoteButton = mDownvoteButton;
|
||||
this.commentsCountTextView = commentsCountTextView;
|
||||
this.mSaveButton = mSaveButton;
|
||||
@@ -1225,16 +1270,18 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
|
||||
mIconGifImageView.setOnClickListener(view -> mSubredditTextView.performClick());
|
||||
|
||||
mSubredditTextView.setOnClickListener(view -> {
|
||||
View.OnClickListener communityClickListener = view -> {
|
||||
Intent intent;
|
||||
intent = new Intent(mActivity, ViewSubredditDetailActivity.class);
|
||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY,
|
||||
mPost.getSubredditName());
|
||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_COMMUNITY_FULL_NAME_KEY, mPost.getSubredditNamePrefixed());
|
||||
mActivity.startActivity(intent);
|
||||
});
|
||||
};
|
||||
mSubredditTextView.setOnClickListener(communityClickListener);
|
||||
mCommunityInstanceTextView.setOnClickListener(communityClickListener);
|
||||
|
||||
mUserTextView.setOnClickListener(view -> {
|
||||
View.OnClickListener onUserClick = view -> {
|
||||
if (mPost.isAuthorDeleted()) {
|
||||
return;
|
||||
}
|
||||
@@ -1242,7 +1289,9 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, mPost.getAuthor());
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_QUALIFIED_USER_NAME_KEY, mPost.getAuthorNamePrefixed());
|
||||
mActivity.startActivity(intent);
|
||||
});
|
||||
};
|
||||
mUserTextView.setOnClickListener(onUserClick);
|
||||
mUserInstanceTextView.setOnClickListener(onUserClick);
|
||||
|
||||
mAuthorFlairTextView.setOnClickListener(view -> mUserTextView.performClick());
|
||||
|
||||
@@ -1306,6 +1355,7 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
int newVoteType;
|
||||
|
||||
mDownvoteButton.setColorFilter(mPostIconAndInfoColor, PorterDuff.Mode.SRC_IN);
|
||||
mDownvoteTextView.setTextColor(mPostIconAndInfoColor);
|
||||
|
||||
if (previousVoteType != 1) {
|
||||
//Not upvoted before
|
||||
@@ -1322,9 +1372,16 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
}
|
||||
|
||||
if (!mHideTheNumberOfVotes) {
|
||||
if(mSeperateUpvoteAndDownvote){
|
||||
int upvotes = (mPost.getVoteType() == 1) ? mPost.getUpvotes() + 1 : mPost.getUpvotes();
|
||||
int downvotes = (mPost.getVoteType() == -1) ? mPost.getDownvotes() + 1 : Math.max(mPost.getDownvotes(),0);;
|
||||
mScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, upvotes));
|
||||
mDownvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, downvotes));
|
||||
} else {
|
||||
mScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
mPost.getScore() + mPost.getVoteType()));
|
||||
}
|
||||
}
|
||||
|
||||
mPostDetailRecyclerViewAdapterCallback.updatePost(mPost);
|
||||
|
||||
@@ -1343,9 +1400,16 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
|
||||
mDownvoteButton.setColorFilter(mPostIconAndInfoColor, PorterDuff.Mode.SRC_IN);
|
||||
if (!mHideTheNumberOfVotes) {
|
||||
if(mSeperateUpvoteAndDownvote){
|
||||
int upvotes = (mPost.getVoteType() == 1) ? mPost.getUpvotes() + 1 : mPost.getUpvotes();
|
||||
int downvotes = (mPost.getVoteType() == -1) ? mPost.getDownvotes() + 1 : Math.max(mPost.getDownvotes(),0);;
|
||||
mScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, upvotes));
|
||||
mDownvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, downvotes));
|
||||
} else {
|
||||
mScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
mPost.getScore() + mPost.getVoteType()));
|
||||
}
|
||||
}
|
||||
|
||||
mPostDetailRecyclerViewAdapterCallback.updatePost(mPost);
|
||||
}
|
||||
@@ -1355,9 +1419,16 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
Toast.makeText(mActivity, R.string.vote_failed, Toast.LENGTH_SHORT).show();
|
||||
mPost.setVoteType(previousVoteType);
|
||||
if (!mHideTheNumberOfVotes) {
|
||||
if(mSeperateUpvoteAndDownvote){
|
||||
int upvotes = (previousVoteType == 1) ? mPost.getUpvotes() + 1 : mPost.getUpvotes();
|
||||
int downvotes = (previousVoteType == -1) ? mPost.getDownvotes() - 1 : Math.max(mPost.getDownvotes(),0);;
|
||||
mScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, upvotes));
|
||||
mDownvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, downvotes));
|
||||
} else {
|
||||
mScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
mPost.getScore() + previousVoteType));
|
||||
}
|
||||
}
|
||||
mUpvoteButton.setColorFilter(previousUpvoteButtonColorFilter);
|
||||
mDownvoteButton.setColorFilter(previousDownvoteButtonColorFilter);
|
||||
mScoreTextView.setTextColor(previousScoreTextViewColor);
|
||||
@@ -1386,25 +1457,37 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
int newVoteType;
|
||||
|
||||
mUpvoteButton.setColorFilter(mPostIconAndInfoColor, PorterDuff.Mode.SRC_IN);
|
||||
|
||||
mScoreTextView.setTextColor(mPostIconAndInfoColor);
|
||||
if (previousVoteType != -1) {
|
||||
//Not upvoted before
|
||||
mPost.setVoteType(-1);
|
||||
newVoteType = Integer.parseInt(APIUtils.DIR_DOWNVOTE);
|
||||
mDownvoteButton.setColorFilter(mDownvotedColor, PorterDuff.Mode.SRC_IN);
|
||||
if(mSeperateUpvoteAndDownvote){
|
||||
mDownvoteTextView.setTextColor(mDownvotedColor);
|
||||
} else {
|
||||
mScoreTextView.setTextColor(mDownvotedColor);
|
||||
}
|
||||
} else {
|
||||
//Upvoted before
|
||||
mPost.setVoteType(0);
|
||||
newVoteType = Integer.parseInt(APIUtils.DIR_UNVOTE);
|
||||
mDownvoteButton.setColorFilter(mPostIconAndInfoColor, PorterDuff.Mode.SRC_IN);
|
||||
mScoreTextView.setTextColor(mPostIconAndInfoColor);
|
||||
mDownvoteTextView.setTextColor(mPostIconAndInfoColor);
|
||||
}
|
||||
|
||||
if (!mHideTheNumberOfVotes) {
|
||||
if(mSeperateUpvoteAndDownvote){
|
||||
int upvotes = (mPost.getVoteType() == 1) ? mPost.getUpvotes() + 1 : mPost.getUpvotes();
|
||||
int downvotes = (mPost.getVoteType() == -1) ? mPost.getDownvotes() + 1 : Math.max(mPost.getDownvotes(),0);;
|
||||
mScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, upvotes));
|
||||
mDownvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, downvotes));
|
||||
} else {
|
||||
mScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
mPost.getScore() + mPost.getVoteType()));
|
||||
}
|
||||
}
|
||||
|
||||
mPostDetailRecyclerViewAdapterCallback.updatePost(mPost);
|
||||
|
||||
@@ -1414,18 +1497,30 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
if (newVoteType == Integer.parseInt(APIUtils.DIR_DOWNVOTE)) {
|
||||
mPost.setVoteType(-1);
|
||||
mDownvoteButton.setColorFilter(mDownvotedColor, PorterDuff.Mode.SRC_IN);
|
||||
if(mSeperateUpvoteAndDownvote) {
|
||||
mDownvoteTextView.setTextColor(mDownvotedColor);
|
||||
} else {
|
||||
mScoreTextView.setTextColor(mDownvotedColor);
|
||||
}
|
||||
} else {
|
||||
mPost.setVoteType(0);
|
||||
mDownvoteButton.setColorFilter(mPostIconAndInfoColor, PorterDuff.Mode.SRC_IN);
|
||||
mScoreTextView.setTextColor(mPostIconAndInfoColor);
|
||||
mDownvoteTextView.setTextColor(mPostIconAndInfoColor);
|
||||
}
|
||||
|
||||
mUpvoteButton.setColorFilter(mPostIconAndInfoColor, PorterDuff.Mode.SRC_IN);
|
||||
if (!mHideTheNumberOfVotes) {
|
||||
if(mSeperateUpvoteAndDownvote){
|
||||
int upvotes = (mPost.getVoteType() == 1) ? mPost.getUpvotes() + 1 : mPost.getUpvotes();
|
||||
int downvotes = (mPost.getVoteType() == -1) ? mPost.getDownvotes() + 1 : Math.max(mPost.getDownvotes(),0);;
|
||||
mScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, upvotes));
|
||||
mDownvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, downvotes));
|
||||
} else {
|
||||
mScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
mPost.getScore() + mPost.getVoteType()));
|
||||
}
|
||||
}
|
||||
|
||||
mPostDetailRecyclerViewAdapterCallback.updatePost(mPost);
|
||||
}
|
||||
@@ -1435,9 +1530,16 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
Toast.makeText(mActivity, R.string.vote_failed, Toast.LENGTH_SHORT).show();
|
||||
mPost.setVoteType(previousVoteType);
|
||||
if (!mHideTheNumberOfVotes) {
|
||||
if(mSeperateUpvoteAndDownvote) {
|
||||
int upvotes = (previousVoteType == 1) ? mPost.getUpvotes() + 1 : mPost.getUpvotes();
|
||||
int downvotes = (previousVoteType == -1) ? mPost.getDownvotes() + 1 : Math.max(mPost.getDownvotes(),0);
|
||||
mScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, upvotes));
|
||||
mDownvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, downvotes));
|
||||
} else {
|
||||
mScoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
|
||||
mPost.getScore() + previousVoteType));
|
||||
}
|
||||
}
|
||||
mUpvoteButton.setColorFilter(previousUpvoteButtonColorFilter);
|
||||
mDownvoteButton.setColorFilter(previousDownvoteButtonColorFilter);
|
||||
mScoreTextView.setTextColor(previousScoreTextViewColor);
|
||||
@@ -1485,7 +1587,7 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
SavePost savePost = new SavePost();
|
||||
if (mPost.isSaved()) {
|
||||
mSaveButton.setImageResource(R.drawable.ic_bookmark_border_grey_24dp);
|
||||
savePost.unsaveThing(mOauthRetrofit, mAccessToken, mPost.getId(),
|
||||
savePost.unsaveThing(mRetrofit, mAccessToken, mPost.getId(),
|
||||
new SaveThing.SaveThingListener() {
|
||||
@Override
|
||||
public void success() {
|
||||
@@ -1559,11 +1661,18 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
constraintSet.clear(mUpvoteButton.getId(), ConstraintSet.START);
|
||||
constraintSet.clear(mScoreTextView.getId(), ConstraintSet.START);
|
||||
constraintSet.clear(mDownvoteButton.getId(), ConstraintSet.START);
|
||||
constraintSet.clear(mDownvoteTextView.getId(), ConstraintSet.START);
|
||||
constraintSet.clear(mSaveButton.getId(), ConstraintSet.END);
|
||||
constraintSet.clear(mShareButton.getId(), ConstraintSet.END);
|
||||
constraintSet.connect(mUpvoteButton.getId(), ConstraintSet.END, mScoreTextView.getId(), ConstraintSet.START);
|
||||
constraintSet.connect(mScoreTextView.getId(), ConstraintSet.END, mDownvoteButton.getId(), ConstraintSet.START);
|
||||
if (!mSeperateUpvoteAndDownvote) {
|
||||
constraintSet.connect(mDownvoteButton.getId(), ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END);
|
||||
} else {
|
||||
constraintSet.connect(mDownvoteButton.getId(), ConstraintSet.END, mDownvoteTextView.getId(), ConstraintSet.START);
|
||||
constraintSet.connect(mDownvoteTextView.getId(), ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END);
|
||||
}
|
||||
|
||||
constraintSet.connect(commentsCountTextView.getId(), ConstraintSet.START, mSaveButton.getId(), ConstraintSet.END);
|
||||
constraintSet.connect(commentsCountTextView.getId(), ConstraintSet.END, mUpvoteButton.getId(), ConstraintSet.START);
|
||||
constraintSet.connect(mSaveButton.getId(), ConstraintSet.START, mShareButton.getId(), ConstraintSet.END);
|
||||
@@ -1631,8 +1740,14 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
AspectRatioGifImageView mIconGifImageView;
|
||||
@BindView(R.id.subreddit_text_view_item_post_detail_video_autoplay)
|
||||
TextView mSubredditTextView;
|
||||
|
||||
@BindView(R.id.community_instance_text_view_item_post_detail_video_autoplay)
|
||||
TextView mCommunityInstanceTextView;
|
||||
@BindView(R.id.user_text_view_item_post_detail_video_autoplay)
|
||||
TextView mUserTextView;
|
||||
@BindView(R.id.user_instance_text_view_item_post_detail_video_autoplay)
|
||||
TextView mUserInstanceTextView;
|
||||
|
||||
@BindView(R.id.author_flair_text_view_item_post_detail_video_autoplay)
|
||||
TextView mAuthorFlairTextView;
|
||||
@BindView(R.id.post_time_text_view_item_post_detail_video_autoplay)
|
||||
@@ -1683,6 +1798,9 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
ImageView mUpvoteButton;
|
||||
@BindView(R.id.score_text_view_item_post_detail_video_autoplay)
|
||||
TextView mScoreTextView;
|
||||
|
||||
@BindView(R.id.downvote_text_view_item_post_detail_video_autoplay)
|
||||
TextView mDownvoteTextView;
|
||||
@BindView(R.id.minus_button_item_post_detail_video_autoplay)
|
||||
ImageView mDownvoteButton;
|
||||
@BindView(R.id.comments_count_item_post_detail_video_autoplay)
|
||||
@@ -1704,7 +1822,9 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
ButterKnife.bind(this, itemView);
|
||||
setBaseView(mIconGifImageView,
|
||||
mSubredditTextView,
|
||||
mCommunityInstanceTextView,
|
||||
mUserTextView,
|
||||
mUserInstanceTextView,
|
||||
mAuthorFlairTextView,
|
||||
mPostTimeTextView,
|
||||
mTitleTextView,
|
||||
@@ -1721,6 +1841,7 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
mBottomConstraintLayout,
|
||||
mUpvoteButton,
|
||||
mScoreTextView,
|
||||
mDownvoteTextView,
|
||||
mDownvoteButton,
|
||||
commentsCountTextView,
|
||||
mSaveButton,
|
||||
@@ -1938,8 +2059,12 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
AspectRatioGifImageView mIconGifImageView;
|
||||
@BindView(R.id.subreddit_text_view_item_post_detail_video_and_gif_preview)
|
||||
TextView mSubredditTextView;
|
||||
@BindView(R.id.community_instance_text_view_item_post_detail_video_and_gif_preview)
|
||||
TextView mCommunityInstanceTextView;
|
||||
@BindView(R.id.user_text_view_item_post_detail_video_and_gif_preview)
|
||||
TextView mUserTextView;
|
||||
@BindView(R.id.user_instance_text_view_item_post_detail_video_and_gif_preview)
|
||||
TextView mUserInstanceTextView;
|
||||
@BindView(R.id.author_flair_text_view_item_post_detail_video_and_gif_preview)
|
||||
TextView mAuthorFlairTextView;
|
||||
@BindView(R.id.post_time_text_view_item_post_detail_video_and_gif_preview)
|
||||
@@ -1982,6 +2107,9 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
ImageView mUpvoteButton;
|
||||
@BindView(R.id.score_text_view_item_post_detail_video_and_gif_preview)
|
||||
TextView mScoreTextView;
|
||||
|
||||
@BindView(R.id.downvote_text_view_item_post_detail_video_and_gif_preview)
|
||||
TextView mDownvoteTextView;
|
||||
@BindView(R.id.minus_button_item_post_detail_video_and_gif_preview)
|
||||
ImageView mDownvoteButton;
|
||||
@BindView(R.id.comments_count_item_post_detail_video_and_gif_preview)
|
||||
@@ -1996,7 +2124,9 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
ButterKnife.bind(this, itemView);
|
||||
setBaseView(mIconGifImageView,
|
||||
mSubredditTextView,
|
||||
mCommunityInstanceTextView,
|
||||
mUserTextView,
|
||||
mUserInstanceTextView,
|
||||
mAuthorFlairTextView,
|
||||
mPostTimeTextView,
|
||||
mTitleTextView,
|
||||
@@ -2013,6 +2143,7 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
mBottomConstraintLayout,
|
||||
mUpvoteButton,
|
||||
mScoreTextView,
|
||||
mDownvoteTextView,
|
||||
mDownvoteButton,
|
||||
commentsCountTextView,
|
||||
mSaveButton,
|
||||
@@ -2067,8 +2198,12 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
AspectRatioGifImageView mIconGifImageView;
|
||||
@BindView(R.id.subreddit_text_view_item_post_detail_image_and_gif_autoplay)
|
||||
TextView mSubredditTextView;
|
||||
@BindView(R.id.community_instance_text_view_item_post_detail_image_and_gif_autoplay)
|
||||
TextView mCommunityInstanceTextView;
|
||||
@BindView(R.id.user_text_view_item_post_detail_image_and_gif_autoplay)
|
||||
TextView mUserTextView;
|
||||
@BindView(R.id.user_instance_text_view_item_post_detail_image_and_gif_autoplay)
|
||||
TextView mUserInstanceTextView;
|
||||
@BindView(R.id.author_flair_text_view_item_post_detail_image_and_gif_autoplay)
|
||||
TextView mAuthorFlairTextView;
|
||||
@BindView(R.id.post_time_text_view_item_post_detail_image_and_gif_autoplay)
|
||||
@@ -2111,6 +2246,9 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
ImageView mUpvoteButton;
|
||||
@BindView(R.id.score_text_view_item_post_detail_image_and_gif_autoplay)
|
||||
TextView mScoreTextView;
|
||||
|
||||
@BindView(R.id.downvote_text_view_item_post_detail_image_and_gif_autoplay)
|
||||
TextView mDownvoteTextView;
|
||||
@BindView(R.id.minus_button_item_post_detail_image_and_gif_autoplay)
|
||||
ImageView mDownvoteButton;
|
||||
@BindView(R.id.comments_count_item_post_detail_image_and_gif_autoplay)
|
||||
@@ -2125,7 +2263,9 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
ButterKnife.bind(this, itemView);
|
||||
setBaseView(mIconGifImageView,
|
||||
mSubredditTextView,
|
||||
mCommunityInstanceTextView,
|
||||
mUserTextView,
|
||||
mUserInstanceTextView,
|
||||
mAuthorFlairTextView,
|
||||
mPostTimeTextView,
|
||||
mTitleTextView,
|
||||
@@ -2142,6 +2282,7 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
mBottomConstraintLayout,
|
||||
mUpvoteButton,
|
||||
mScoreTextView,
|
||||
mDownvoteTextView,
|
||||
mDownvoteButton,
|
||||
commentsCountTextView,
|
||||
mSaveButton,
|
||||
@@ -2180,8 +2321,12 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
AspectRatioGifImageView mIconGifImageView;
|
||||
@BindView(R.id.subreddit_text_view_item_post_detail_link)
|
||||
TextView mSubredditTextView;
|
||||
@BindView(R.id.community_instance_text_view_item_post_detail_link)
|
||||
TextView mCommunityInstanceTextView;
|
||||
@BindView(R.id.user_text_view_item_post_detail_link)
|
||||
TextView mUserTextView;
|
||||
@BindView(R.id.user_instance_text_view_item_post_detail_link)
|
||||
TextView mUserInstanceTextView;
|
||||
@BindView(R.id.author_flair_text_view_item_post_detail_link)
|
||||
TextView mAuthorFlairTextView;
|
||||
@BindView(R.id.post_time_text_view_item_post_detail_link)
|
||||
@@ -2226,6 +2371,9 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
ImageView mUpvoteButton;
|
||||
@BindView(R.id.score_text_view_item_post_detail_link)
|
||||
TextView mScoreTextView;
|
||||
|
||||
@BindView(R.id.downvote_text_view_item_post_detail_link)
|
||||
TextView mDownvoteTextView;
|
||||
@BindView(R.id.minus_button_item_post_detail_link)
|
||||
ImageView mDownvoteButton;
|
||||
@BindView(R.id.comments_count_item_post_detail_link)
|
||||
@@ -2240,7 +2388,9 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
ButterKnife.bind(this, itemView);
|
||||
setBaseView(mIconGifImageView,
|
||||
mSubredditTextView,
|
||||
mCommunityInstanceTextView,
|
||||
mUserTextView,
|
||||
mUserInstanceTextView,
|
||||
mAuthorFlairTextView,
|
||||
mPostTimeTextView,
|
||||
mTitleTextView,
|
||||
@@ -2257,6 +2407,7 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
mBottomConstraintLayout,
|
||||
mUpvoteButton,
|
||||
mScoreTextView,
|
||||
mDownvoteTextView,
|
||||
mDownvoteButton,
|
||||
commentsCountTextView,
|
||||
mSaveButton,
|
||||
@@ -2284,8 +2435,12 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
AspectRatioGifImageView mIconGifImageView;
|
||||
@BindView(R.id.subreddit_text_view_item_post_detail_no_preview_link)
|
||||
TextView mSubredditTextView;
|
||||
@BindView(R.id.community_instance_text_view_item_post_detail_no_preview_link)
|
||||
TextView mCommunityInstanceTextView;
|
||||
@BindView(R.id.user_text_view_item_post_detail_no_preview_link)
|
||||
TextView mUserTextView;
|
||||
@BindView(R.id.user_instance_text_view_item_post_detail_no_preview_link)
|
||||
TextView mUserInstanceTextView;
|
||||
@BindView(R.id.author_flair_text_view_item_post_detail_no_preview_link)
|
||||
TextView mAuthorFlairTextView;
|
||||
@BindView(R.id.post_time_text_view_item_post_detail_no_preview_link)
|
||||
@@ -2322,6 +2477,9 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
ImageView mUpvoteButton;
|
||||
@BindView(R.id.score_text_view_item_post_detail_no_preview_link)
|
||||
TextView mScoreTextView;
|
||||
@BindView(R.id.downvote_text_view_item_post_detail_no_preview_link)
|
||||
TextView mDownvoteTextView;
|
||||
|
||||
@BindView(R.id.minus_button_item_post_detail_no_preview_link)
|
||||
ImageView mDownvoteButton;
|
||||
@BindView(R.id.comments_count_item_post_detail_no_preview_link)
|
||||
@@ -2336,7 +2494,9 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
ButterKnife.bind(this, itemView);
|
||||
setBaseView(mIconGifImageView,
|
||||
mSubredditTextView,
|
||||
mCommunityInstanceTextView,
|
||||
mUserTextView,
|
||||
mUserInstanceTextView,
|
||||
mAuthorFlairTextView,
|
||||
mPostTimeTextView,
|
||||
mTitleTextView,
|
||||
@@ -2353,6 +2513,7 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
mBottomConstraintLayout,
|
||||
mUpvoteButton,
|
||||
mScoreTextView,
|
||||
mDownvoteTextView,
|
||||
mDownvoteButton,
|
||||
commentsCountTextView,
|
||||
mSaveButton,
|
||||
@@ -2425,8 +2586,12 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
AspectRatioGifImageView mIconGifImageView;
|
||||
@BindView(R.id.subreddit_text_view_item_post_detail_gallery)
|
||||
TextView mSubredditTextView;
|
||||
@BindView(R.id.community_instance_text_view_item_post_detail_gallery)
|
||||
TextView mCommunityInstanceTextView;
|
||||
@BindView(R.id.user_text_view_item_post_detail_gallery)
|
||||
TextView mUserTextView;
|
||||
@BindView(R.id.user_instance_text_view_item_post_detail_gallery)
|
||||
TextView mUserInstanceTextView;
|
||||
@BindView(R.id.author_flair_text_view_item_post_detail_gallery)
|
||||
TextView mAuthorFlairTextView;
|
||||
@BindView(R.id.post_time_text_view_item_post_detail_gallery)
|
||||
@@ -2467,6 +2632,8 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
ImageView mUpvoteButton;
|
||||
@BindView(R.id.score_text_view_item_post_detail_gallery)
|
||||
TextView mScoreTextView;
|
||||
@BindView(R.id.downvote_text_view_item_post_detail_gallery)
|
||||
TextView mDownvoteTextView;
|
||||
@BindView(R.id.minus_button_item_post_detail_gallery)
|
||||
ImageView mDownvoteButton;
|
||||
@BindView(R.id.comments_count_item_post_detail_gallery)
|
||||
@@ -2482,7 +2649,9 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
ButterKnife.bind(this, itemView);
|
||||
setBaseView(mIconGifImageView,
|
||||
mSubredditTextView,
|
||||
mCommunityInstanceTextView,
|
||||
mUserTextView,
|
||||
mUserInstanceTextView,
|
||||
mAuthorFlairTextView,
|
||||
mPostTimeTextView,
|
||||
mTitleTextView,
|
||||
@@ -2499,6 +2668,7 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
mBottomConstraintLayout,
|
||||
mUpvoteButton,
|
||||
mScoreTextView,
|
||||
mDownvoteTextView,
|
||||
mDownvoteButton,
|
||||
commentsCountTextView,
|
||||
mSaveButton,
|
||||
@@ -2620,8 +2790,12 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
AspectRatioGifImageView mIconGifImageView;
|
||||
@BindView(R.id.subreddit_text_view_item_post_detail_text)
|
||||
TextView mSubredditTextView;
|
||||
@BindView(R.id.community_instance_text_view_item_post_detail_text)
|
||||
TextView mCommunityInstanceTextView;
|
||||
@BindView(R.id.user_text_view_item_post_detail_text)
|
||||
TextView mUserTextView;
|
||||
@BindView(R.id.user_instance_text_view_item_post_detail_text)
|
||||
TextView mUserInstanceTextView;
|
||||
@BindView(R.id.author_flair_text_view_item_post_detail_text)
|
||||
TextView mAuthorFlairTextView;
|
||||
@BindView(R.id.post_time_text_view_item_post_detail_text)
|
||||
@@ -2654,6 +2828,9 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
ImageView mUpvoteButton;
|
||||
@BindView(R.id.score_text_view_item_post_detail_text)
|
||||
TextView mScoreTextView;
|
||||
|
||||
@BindView(R.id.downvote_text_view_item_post_detail_text)
|
||||
TextView mDownvoteTextView;
|
||||
@BindView(R.id.minus_button_item_post_detail_text)
|
||||
ImageView mDownvoteButton;
|
||||
@BindView(R.id.comments_count_item_post_detail_text)
|
||||
@@ -2668,7 +2845,9 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
ButterKnife.bind(this, itemView);
|
||||
setBaseView(mIconGifImageView,
|
||||
mSubredditTextView,
|
||||
mCommunityInstanceTextView,
|
||||
mUserTextView,
|
||||
mUserInstanceTextView,
|
||||
mAuthorFlairTextView,
|
||||
mPostTimeTextView,
|
||||
mTitleTextView,
|
||||
@@ -2685,6 +2864,7 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
|
||||
mBottomConstraintLayout,
|
||||
mUpvoteButton,
|
||||
mScoreTextView,
|
||||
mDownvoteTextView,
|
||||
mDownvoteButton,
|
||||
commentsCountTextView,
|
||||
mSaveButton,
|
||||
|
||||
@@ -11,6 +11,7 @@ import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
@@ -60,6 +61,7 @@ import org.greenrobot.eventbus.EventBus;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Locale;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.inject.Provider;
|
||||
|
||||
@@ -225,7 +227,12 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
private boolean mHidePostFlair;
|
||||
private boolean mHideTheNumberOfAwards;
|
||||
private boolean mHideSubredditAndUserPrefix;
|
||||
private boolean mShowDisplayNames;
|
||||
private boolean mHideTheNumberOfVotes;
|
||||
|
||||
private boolean mSeparateUpandDownVotes;
|
||||
|
||||
private boolean mHideDownvotes;
|
||||
private boolean mHideTheNumberOfComments;
|
||||
private boolean mLegacyAutoplayVideoControllerUI;
|
||||
private boolean mFixedHeightPreviewInCard;
|
||||
@@ -307,7 +314,10 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
mHidePostFlair = sharedPreferences.getBoolean(SharedPreferencesUtils.HIDE_POST_FLAIR, false);
|
||||
mHideTheNumberOfAwards = sharedPreferences.getBoolean(SharedPreferencesUtils.HIDE_THE_NUMBER_OF_AWARDS, false);
|
||||
mHideSubredditAndUserPrefix = sharedPreferences.getBoolean(SharedPreferencesUtils.HIDE_SUBREDDIT_AND_USER_PREFIX, false);
|
||||
mShowDisplayNames = sharedPreferences.getBoolean(SharedPreferencesUtils.POST_DISPLAY_NAME_INSTEAD_OF_USERNAME, true);
|
||||
mHideTheNumberOfVotes = sharedPreferences.getBoolean(SharedPreferencesUtils.HIDE_THE_NUMBER_OF_VOTES, false);
|
||||
mHideDownvotes = !currentAccountSharedPreferences.getBoolean(SharedPreferencesUtils.CAN_DOWNVOTE, true);
|
||||
mSeparateUpandDownVotes = sharedPreferences.getBoolean(SharedPreferencesUtils.POST_SEPARATE_UP_AND_DOWN_VOTES, true) && !mHideDownvotes;
|
||||
mHideTheNumberOfComments = sharedPreferences.getBoolean(SharedPreferencesUtils.HIDE_THE_NUMBER_OF_COMMENTS, false);
|
||||
mLegacyAutoplayVideoControllerUI = sharedPreferences.getBoolean(SharedPreferencesUtils.LEGACY_AUTOPLAY_VIDEO_CONTROLLER_UI, false);
|
||||
mFixedHeightPreviewInCard = sharedPreferences.getBoolean(SharedPreferencesUtils.FIXED_HEIGHT_PREVIEW_IN_CARD, false);
|
||||
@@ -528,16 +538,17 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
}
|
||||
String authorPrefixed = post.getAuthorNamePrefixed();
|
||||
|
||||
if (mHideSubredditAndUserPrefix) {
|
||||
((PostBaseViewHolder) holder).subredditTextView.setText(post.getSubredditName());
|
||||
((PostBaseViewHolder) holder).userTextView.setText(post.getAuthor());
|
||||
} else {
|
||||
((PostBaseViewHolder) holder).subredditTextView.setText(post.getSubredditNamePrefixed());
|
||||
((PostBaseViewHolder) holder).userTextView.setText(authorPrefixed);
|
||||
((PostBaseViewHolder) holder).userTextView.setText((mShowDisplayNames) ? post.getAuthor() : post.getAuthorInfo().getUsername());
|
||||
((PostBaseViewHolder) holder).subredditTextView.setText((mShowDisplayNames) ? post.getSubredditName() : post.getCommunityInfo().getName());
|
||||
if (!mHideSubredditAndUserPrefix) {
|
||||
((PostBaseViewHolder) holder).communityInstanceTextView.setText('@' + post.getSubredditNamePrefixed().split(Pattern.quote("@"))[1]);
|
||||
((PostBaseViewHolder) holder).userInstanceTextView.setText('@' + post.getAuthorNamePrefixed().split(Pattern.quote("@"))[1]);
|
||||
((PostBaseViewHolder) holder).communityInstanceTextView.setTextColor(CustomThemeWrapper.darkenColor(mSubredditColor, 0.7f));
|
||||
((PostBaseViewHolder) holder).userInstanceTextView.setTextColor(CustomThemeWrapper.darkenColor(post.isModerator() || post.isAdmin() ? mModeratorColor : mUsernameColor, 0.7f));
|
||||
}
|
||||
|
||||
((PostBaseViewHolder) holder).userTextView.setTextColor(
|
||||
post.isModerator() ? mModeratorColor : mUsernameColor);
|
||||
post.isModerator() || post.isAdmin() ? mModeratorColor : mUsernameColor);
|
||||
|
||||
if (mDisplaySubredditName) {
|
||||
if (authorPrefixed.equals(post.getSubredditNamePrefixed())) {
|
||||
@@ -587,10 +598,6 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))))
|
||||
.into(((PostBaseViewHolder) holder).iconGifImageView);
|
||||
}
|
||||
|
||||
if (holder.getBindingAdapterPosition() >= 0) {
|
||||
post.setSubredditIconUrl(iconUrl);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else if (!post.getSubredditIconUrl().equals("")) {
|
||||
@@ -649,7 +656,22 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
|
||||
((PostBaseViewHolder) holder).titleTextView.setText(post.getTitle());
|
||||
if (!mHideTheNumberOfVotes) {
|
||||
if( mSeparateUpandDownVotes ) {
|
||||
((PostBaseViewHolder) holder).downvoteTextView.setVisibility(View.VISIBLE);
|
||||
int downVotes = (post.getVoteType() == -1) ? post.getDownvotes()+1 : post.getDownvotes();
|
||||
int upVotes = (post.getVoteType() == 1) ? post.getUpvotes()+1 : post.getUpvotes();
|
||||
((PostBaseViewHolder) holder).downvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,downVotes));
|
||||
((PostBaseViewHolder) holder).scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, upVotes));
|
||||
((PostBaseViewHolder) holder).downvoteTextView.setGravity(Gravity.START);
|
||||
((PostBaseViewHolder) holder).scoreTextView.setGravity(Gravity.START);
|
||||
((PostBaseViewHolder) holder).scoreTextView.getLayoutParams().width = (int) (32 * mActivity.getResources().getDisplayMetrics().density);
|
||||
|
||||
((PostBaseViewHolder) holder).scoreTextView.setPadding(0, 0, 6, 0);
|
||||
((PostBaseViewHolder) holder).downvoteButton.setPadding(24, 0, 12, 0);
|
||||
((PostBaseViewHolder) holder).upvoteButton.setPadding(24, 0, 12, 0);
|
||||
} else {
|
||||
((PostBaseViewHolder) holder).scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + post.getVoteType()));
|
||||
}
|
||||
} else {
|
||||
((PostBaseViewHolder) holder).scoreTextView.setText(mActivity.getString(R.string.vote));
|
||||
}
|
||||
@@ -671,13 +693,22 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
case -1:
|
||||
//Downvoted
|
||||
((PostBaseViewHolder) holder).downvoteButton.setColorFilter(mDownvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
if(mSeparateUpandDownVotes){
|
||||
((PostBaseViewHolder) holder).downvoteTextView.setTextColor(mDownvotedColor);
|
||||
} else {
|
||||
((PostBaseViewHolder) holder).scoreTextView.setTextColor(mDownvotedColor);
|
||||
}
|
||||
break;
|
||||
case 0:
|
||||
((PostBaseViewHolder) holder).downvoteTextView.setTextColor(mPostIconAndInfoColor);
|
||||
}
|
||||
|
||||
if (mPostType == PostPagingSource.TYPE_SUBREDDIT && !mDisplaySubredditName && post.isStickied()) {
|
||||
if (mPostType == PostPagingSource.TYPE_SUBREDDIT && !mDisplaySubredditName && post.isFeaturedInCommunity() || post.isFeaturedOnInstance()) {
|
||||
((PostBaseViewHolder) holder).stickiedPostImageView.setVisibility(View.VISIBLE);
|
||||
mGlide.load(R.drawable.ic_thumbtack_24dp).into(((PostBaseViewHolder) holder).stickiedPostImageView);
|
||||
if (post.isFeaturedOnInstance()) {
|
||||
((PostBaseViewHolder) holder).stickiedPostImageView.setColorFilter(mModeratorColor, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
}
|
||||
}
|
||||
|
||||
if (post.isArchived()) {
|
||||
@@ -1155,9 +1186,6 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
.into(((PostCompactBaseViewHolder) holder).iconGifImageView);
|
||||
}
|
||||
|
||||
if (holder.getBindingAdapterPosition() >= 0) {
|
||||
post.setSubredditIconUrl(iconUrl);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else if (!post.getSubredditIconUrl().equals("")) {
|
||||
@@ -1174,10 +1202,10 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
}
|
||||
|
||||
((PostCompactBaseViewHolder) holder).nameTextView.setTextColor(mSubredditColor);
|
||||
if (mHideSubredditAndUserPrefix) {
|
||||
((PostCompactBaseViewHolder) holder).nameTextView.setText(post.getSubredditName());
|
||||
} else {
|
||||
((PostCompactBaseViewHolder) holder).nameTextView.setText(post.getSubredditNamePrefixed());
|
||||
((PostCompactBaseViewHolder) holder).nameTextView.setText((mShowDisplayNames) ? post.getSubredditName() : post.getCommunityInfo().getName());
|
||||
if (!mHideSubredditAndUserPrefix) {
|
||||
((PostCompactBaseViewHolder) holder).instanceTextView.setText('@' + post.getSubredditNamePrefixed().split(Pattern.quote("@"))[1]);
|
||||
((PostCompactBaseViewHolder) holder).instanceTextView.setTextColor(CustomThemeWrapper.darkenColor(mSubredditColor, 0.7f));
|
||||
}
|
||||
} else {
|
||||
if (post.getAuthorIconUrl() == null) {
|
||||
@@ -1214,7 +1242,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
}
|
||||
|
||||
((PostCompactBaseViewHolder) holder).nameTextView.setTextColor(
|
||||
post.isModerator() ? mModeratorColor : mUsernameColor);
|
||||
post.isModerator() || post.isAdmin() ? mModeratorColor : mUsernameColor);
|
||||
|
||||
if (mHideSubredditAndUserPrefix) {
|
||||
((PostCompactBaseViewHolder) holder).nameTextView.setText(post.getAuthor());
|
||||
@@ -1248,7 +1276,24 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
|
||||
((PostCompactBaseViewHolder) holder).titleTextView.setText(title);
|
||||
if (!mHideTheNumberOfVotes) {
|
||||
if(mSeparateUpandDownVotes){
|
||||
int upvotes = (post.getVoteType() == 1) ? post.getUpvotes()+1 : post.getUpvotes();
|
||||
int downvotes = (post.getVoteType() == -1) ? post.getDownvotes()+1 : post.getDownvotes();
|
||||
((PostCompactBaseViewHolder) holder).scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, upvotes));
|
||||
((PostCompactBaseViewHolder) holder).downvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, downvotes));
|
||||
|
||||
((PostCompactBaseViewHolder) holder).downvoteTextView.setVisibility(View.VISIBLE);
|
||||
|
||||
((PostCompactBaseViewHolder) holder).downvoteTextView.setGravity(Gravity.START);
|
||||
((PostCompactBaseViewHolder) holder).scoreTextView.setGravity(Gravity.START);
|
||||
((PostCompactBaseViewHolder) holder).scoreTextView.getLayoutParams().width = (int) (32 * mActivity.getResources().getDisplayMetrics().density);
|
||||
|
||||
((PostCompactBaseViewHolder) holder).scoreTextView.setPadding(0, 0, 6, 0);
|
||||
((PostCompactBaseViewHolder) holder).downvoteButton.setPadding(24, 0, 12, 0);
|
||||
((PostCompactBaseViewHolder) holder).upvoteButton.setPadding(24, 0, 12, 0);
|
||||
} else {
|
||||
((PostCompactBaseViewHolder) holder).scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + post.getVoteType()));
|
||||
}
|
||||
} else {
|
||||
((PostCompactBaseViewHolder) holder).scoreTextView.setText(mActivity.getString(R.string.vote));
|
||||
}
|
||||
@@ -1270,7 +1315,11 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
case -1:
|
||||
//Downvoted
|
||||
((PostCompactBaseViewHolder) holder).downvoteButton.setColorFilter(mDownvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
if(mSeparateUpandDownVotes){
|
||||
((PostCompactBaseViewHolder) holder).downvoteTextView.setTextColor(mDownvotedColor);
|
||||
} else {
|
||||
((PostCompactBaseViewHolder) holder).scoreTextView.setTextColor(mDownvotedColor);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1287,7 +1336,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
}
|
||||
}
|
||||
|
||||
if (mPostType == PostPagingSource.TYPE_SUBREDDIT && !mDisplaySubredditName && post.isStickied()) {
|
||||
if (mPostType == PostPagingSource.TYPE_SUBREDDIT && !mDisplaySubredditName && post.isFeaturedInCommunity()) {
|
||||
((PostCompactBaseViewHolder) holder).stickiedPostImageView.setVisibility(View.VISIBLE);
|
||||
mGlide.load(R.drawable.ic_thumbtack_24dp).into(((PostCompactBaseViewHolder) holder).stickiedPostImageView);
|
||||
}
|
||||
@@ -2297,7 +2346,10 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
public class PostBaseViewHolder extends RecyclerView.ViewHolder {
|
||||
AspectRatioGifImageView iconGifImageView;
|
||||
TextView subredditTextView;
|
||||
|
||||
TextView communityInstanceTextView;
|
||||
TextView userTextView;
|
||||
TextView userInstanceTextView;
|
||||
ImageView stickiedPostImageView;
|
||||
TextView postTimeTextView;
|
||||
TextView titleTextView;
|
||||
@@ -2312,6 +2364,8 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
ConstraintLayout bottomConstraintLayout;
|
||||
ImageView upvoteButton;
|
||||
TextView scoreTextView;
|
||||
|
||||
TextView downvoteTextView;
|
||||
ImageView downvoteButton;
|
||||
TextView commentsCountTextView;
|
||||
ImageView saveButton;
|
||||
@@ -2328,7 +2382,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
|
||||
void setBaseView(AspectRatioGifImageView iconGifImageView,
|
||||
TextView subredditTextView,
|
||||
TextView communityInstanceTextView,
|
||||
TextView userTextView,
|
||||
TextView userInstanceTextView,
|
||||
ImageView stickiedPostImageView,
|
||||
TextView postTimeTextView,
|
||||
TextView titleTextView,
|
||||
@@ -2343,13 +2399,16 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
ConstraintLayout bottomConstraintLayout,
|
||||
ImageView upvoteButton,
|
||||
TextView scoreTextView,
|
||||
TextView downvoteTextView,
|
||||
ImageView downvoteButton,
|
||||
TextView commentsCountTextView,
|
||||
ImageView saveButton,
|
||||
ImageView shareButton) {
|
||||
this.iconGifImageView = iconGifImageView;
|
||||
this.subredditTextView = subredditTextView;
|
||||
this.communityInstanceTextView = communityInstanceTextView;
|
||||
this.userTextView = userTextView;
|
||||
this.userInstanceTextView = userInstanceTextView;
|
||||
this.stickiedPostImageView = stickiedPostImageView;
|
||||
this.postTimeTextView = postTimeTextView;
|
||||
this.titleTextView = titleTextView;
|
||||
@@ -2364,13 +2423,14 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
this.bottomConstraintLayout = bottomConstraintLayout;
|
||||
this.upvoteButton = upvoteButton;
|
||||
this.scoreTextView = scoreTextView;
|
||||
this.downvoteTextView = downvoteTextView;
|
||||
this.downvoteButton = downvoteButton;
|
||||
this.commentsCountTextView = commentsCountTextView;
|
||||
this.saveButton = saveButton;
|
||||
this.shareButton = shareButton;
|
||||
|
||||
scoreTextView.setOnClickListener(null);
|
||||
if(!mCurrentAccountSharedPreferences.getBoolean(SharedPreferencesUtils.CAN_DOWNVOTE,true)){
|
||||
if (mHideDownvotes) {
|
||||
downvoteButton.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
@@ -2380,11 +2440,17 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
constraintSet.clear(upvoteButton.getId(), ConstraintSet.START);
|
||||
constraintSet.clear(scoreTextView.getId(), ConstraintSet.START);
|
||||
constraintSet.clear(downvoteButton.getId(), ConstraintSet.START);
|
||||
constraintSet.clear(downvoteTextView.getId(), ConstraintSet.START);
|
||||
constraintSet.clear(saveButton.getId(), ConstraintSet.END);
|
||||
constraintSet.clear(shareButton.getId(), ConstraintSet.END);
|
||||
constraintSet.connect(upvoteButton.getId(), ConstraintSet.END, scoreTextView.getId(), ConstraintSet.START);
|
||||
constraintSet.connect(scoreTextView.getId(), ConstraintSet.END, downvoteButton.getId(), ConstraintSet.START);
|
||||
if (!mSeparateUpandDownVotes) {
|
||||
constraintSet.connect(downvoteButton.getId(), ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END);
|
||||
} else {
|
||||
constraintSet.connect(downvoteButton.getId(), ConstraintSet.END, downvoteTextView.getId(), ConstraintSet.START);
|
||||
constraintSet.connect(downvoteTextView.getId(), ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END);
|
||||
}
|
||||
constraintSet.connect(commentsCountTextView.getId(), ConstraintSet.START, saveButton.getId(), ConstraintSet.END);
|
||||
constraintSet.connect(commentsCountTextView.getId(), ConstraintSet.END, upvoteButton.getId(), ConstraintSet.START);
|
||||
constraintSet.connect(saveButton.getId(), ConstraintSet.START, shareButton.getId(), ConstraintSet.END);
|
||||
@@ -2471,7 +2537,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
return false;
|
||||
});
|
||||
|
||||
userTextView.setOnClickListener(view -> {
|
||||
View.OnClickListener onClickListener = view -> {
|
||||
if (!canStartActivity) {
|
||||
return;
|
||||
}
|
||||
@@ -2488,10 +2554,12 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, post.getAuthor());
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_QUALIFIED_USER_NAME_KEY, post.getAuthorNamePrefixed());
|
||||
mActivity.startActivity(intent);
|
||||
});
|
||||
};
|
||||
userTextView.setOnClickListener(onClickListener);
|
||||
userInstanceTextView.setOnClickListener(onClickListener);
|
||||
|
||||
if (mDisplaySubredditName) {
|
||||
subredditTextView.setOnClickListener(view -> {
|
||||
|
||||
View.OnClickListener onClickListener1 = view -> {
|
||||
int position = getBindingAdapterPosition();
|
||||
if (position < 0) {
|
||||
return;
|
||||
@@ -2508,29 +2576,13 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
mActivity.startActivity(intent);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
};
|
||||
communityInstanceTextView.setOnClickListener(onClickListener1);
|
||||
if (mDisplaySubredditName) {
|
||||
subredditTextView.setOnClickListener(onClickListener1);
|
||||
iconGifImageView.setOnClickListener(view -> subredditTextView.performClick());
|
||||
} else {
|
||||
subredditTextView.setOnClickListener(view -> {
|
||||
int position = getBindingAdapterPosition();
|
||||
if (position < 0) {
|
||||
return;
|
||||
}
|
||||
Post post = getItem(position);
|
||||
if (post != null) {
|
||||
if (canStartActivity) {
|
||||
canStartActivity = false;
|
||||
Intent intent = new Intent(mActivity, ViewSubredditDetailActivity.class);
|
||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY,
|
||||
post.getSubredditName());
|
||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_COMMUNITY_FULL_NAME_KEY,
|
||||
post.getSubredditNamePrefixed());
|
||||
mActivity.startActivity(intent);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
subredditTextView.setOnClickListener(onClickListener1);
|
||||
iconGifImageView.setOnClickListener(view -> userTextView.performClick());
|
||||
}
|
||||
|
||||
@@ -2586,6 +2638,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
int newVoteType;
|
||||
|
||||
downvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
downvoteTextView.setTextColor(mPostIconAndInfoColor);
|
||||
|
||||
if (previousVoteType != 1) {
|
||||
//Not upvoted before
|
||||
@@ -2603,8 +2656,15 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
}
|
||||
|
||||
if (!mHideTheNumberOfVotes) {
|
||||
if(mSeparateUpandDownVotes){
|
||||
int upvotes = (post.getVoteType() == 1) ? post.getUpvotes() + 1 : post.getUpvotes();
|
||||
int downvotes = (post.getVoteType() == -1) ? post.getDownvotes() + 1 : post.getDownvotes();
|
||||
scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, upvotes));
|
||||
downvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, downvotes));
|
||||
} else {
|
||||
scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + post.getVoteType()));
|
||||
}
|
||||
}
|
||||
|
||||
VoteThing.votePost(mActivity, retrofit, mAccessToken, new VoteThing.VoteThingListener() {
|
||||
@Override
|
||||
@@ -2627,9 +2687,16 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
if (currentPosition == position) {
|
||||
downvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
if (!mHideTheNumberOfVotes) {
|
||||
if (mSeparateUpandDownVotes) {
|
||||
int upvotes = (post.getVoteType() == 1) ? post.getUpvotes() + 1 : post.getUpvotes();
|
||||
int downvotes = (post.getVoteType() == -1) ? post.getDownvotes() + 1 : post.getDownvotes();
|
||||
scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, upvotes));
|
||||
downvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, downvotes));
|
||||
} else {
|
||||
scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + post.getVoteType()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EventBus.getDefault().post(new PostUpdateEventToPostDetailFragment(post));
|
||||
}
|
||||
@@ -2689,18 +2756,31 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
newVoteType = Integer.parseInt(APIUtils.DIR_DOWNVOTE);
|
||||
downvoteButton
|
||||
.setColorFilter(mDownvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
if(mSeparateUpandDownVotes) {
|
||||
scoreTextView.setTextColor(mPostIconAndInfoColor);
|
||||
downvoteTextView.setTextColor(mDownvotedColor);
|
||||
}else {
|
||||
scoreTextView.setTextColor(mDownvotedColor);
|
||||
}
|
||||
} else {
|
||||
//Downvoted before
|
||||
post.setVoteType(0);
|
||||
newVoteType = Integer.parseInt(APIUtils.DIR_UNVOTE);
|
||||
downvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
scoreTextView.setTextColor(mPostIconAndInfoColor);
|
||||
downvoteTextView.setTextColor(mPostIconAndInfoColor);
|
||||
}
|
||||
|
||||
if (!mHideTheNumberOfVotes) {
|
||||
if(mSeparateUpandDownVotes){
|
||||
int upvotes = (post.getVoteType() == 1) ? post.getUpvotes() + 1 : post.getUpvotes();
|
||||
int downvotes = (post.getVoteType() == -1) ? post.getDownvotes() + 1 : post.getDownvotes();
|
||||
scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, upvotes));
|
||||
downvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, downvotes));
|
||||
}else {
|
||||
scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + post.getVoteType()));
|
||||
}
|
||||
}
|
||||
|
||||
VoteThing.votePost(mActivity, retrofit, mAccessToken, new VoteThing.VoteThingListener() {
|
||||
@Override
|
||||
@@ -2710,12 +2790,17 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
post.setVoteType(-1);
|
||||
if (currentPosition == position) {
|
||||
downvoteButton.setColorFilter(mDownvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
if(mSeparateUpandDownVotes){
|
||||
downvoteTextView.setTextColor(mDownvotedColor);
|
||||
}else {
|
||||
scoreTextView.setTextColor(mDownvotedColor);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
post.setVoteType(0);
|
||||
if (currentPosition == position) {
|
||||
downvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
downvoteTextView.setTextColor(mPostIconAndInfoColor);
|
||||
scoreTextView.setTextColor(mPostIconAndInfoColor);
|
||||
}
|
||||
}
|
||||
@@ -2723,9 +2808,16 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
if (currentPosition == position) {
|
||||
upvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
if (!mHideTheNumberOfVotes) {
|
||||
if(mSeparateUpandDownVotes){
|
||||
int upvotes = (post.getVoteType() == 1) ? post.getUpvotes() + 1 : post.getUpvotes();
|
||||
int downvotes = (post.getVoteType() == -1) ? post.getDownvotes() + 1 : post.getDownvotes();
|
||||
scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, upvotes));
|
||||
downvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, downvotes));
|
||||
} else {
|
||||
scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + post.getVoteType()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EventBus.getDefault().post(new PostUpdateEventToPostDetailFragment(post));
|
||||
}
|
||||
@@ -2840,7 +2932,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
|
||||
void setBaseView(AspectRatioGifImageView iconGifImageView,
|
||||
TextView subredditTextView,
|
||||
TextView communityInstanceTextView,
|
||||
TextView userTextView,
|
||||
TextView userInstanceTextView,
|
||||
ImageView stickiedPostImageView,
|
||||
TextView postTimeTextView,
|
||||
TextView titleTextView,
|
||||
@@ -2855,16 +2949,17 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
ConstraintLayout bottomConstraintLayout,
|
||||
ImageView upvoteButton,
|
||||
TextView scoreTextView,
|
||||
TextView downvoteTextView,
|
||||
ImageView downvoteButton,
|
||||
TextView commentsCountTextView,
|
||||
ImageView saveButton,
|
||||
ImageView shareButton, boolean itemViewIsNotCardView) {
|
||||
this.itemViewIsNotCardView = itemViewIsNotCardView;
|
||||
|
||||
setBaseView(iconGifImageView, subredditTextView, userTextView, stickiedPostImageView, postTimeTextView,
|
||||
setBaseView(iconGifImageView, subredditTextView, communityInstanceTextView, userTextView, userInstanceTextView, stickiedPostImageView, postTimeTextView,
|
||||
titleTextView, typeTextView, archivedImageView, lockedImageView, crosspostImageView,
|
||||
nsfwTextView, spoilerTextView, flairTextView, awardsTextView, bottomConstraintLayout,
|
||||
upvoteButton, scoreTextView, downvoteButton, commentsCountTextView, saveButton, shareButton);
|
||||
upvoteButton, scoreTextView, downvoteTextView, downvoteButton, commentsCountTextView, saveButton, shareButton);
|
||||
}
|
||||
|
||||
void markPostRead(Post post, boolean changePostItemColor) {
|
||||
@@ -2894,8 +2989,13 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
AspectRatioGifImageView iconGifImageView;
|
||||
@BindView(R.id.subreddit_name_text_view_item_post_video_type_autoplay)
|
||||
TextView subredditTextView;
|
||||
@BindView(R.id.community_instance_text_view_item_post_video_type_autoplay)
|
||||
TextView communityInstanceTextView;
|
||||
|
||||
@BindView(R.id.user_text_view_item_post_video_type_autoplay)
|
||||
TextView userTextView;
|
||||
@BindView(R.id.user_instance_text_view_item_post_video_type_autoplay)
|
||||
TextView userInstanceTextView;
|
||||
@BindView(R.id.stickied_post_image_view_item_post_video_type_autoplay)
|
||||
ImageView stickiedPostImageView;
|
||||
@BindView(R.id.post_time_text_view_item_post_video_type_autoplay)
|
||||
@@ -2942,6 +3042,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
ImageView upvoteButton;
|
||||
@BindView(R.id.score_text_view_item_post_video_type_autoplay)
|
||||
TextView scoreTextView;
|
||||
|
||||
@BindView(R.id.downvote_text_view_item_post_video_type_autoplay)
|
||||
TextView downvoteTextView;
|
||||
@BindView(R.id.minus_button_item_post_video_type_autoplay)
|
||||
ImageView downvoteButton;
|
||||
@BindView(R.id.comments_count_item_post_video_type_autoplay)
|
||||
@@ -2966,7 +3069,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
setBaseView(
|
||||
iconGifImageView,
|
||||
subredditTextView,
|
||||
communityInstanceTextView,
|
||||
userTextView,
|
||||
userInstanceTextView,
|
||||
stickiedPostImageView,
|
||||
postTimeTextView,
|
||||
titleTextView,
|
||||
@@ -2981,6 +3086,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
bottomConstraintLayout,
|
||||
upvoteButton,
|
||||
scoreTextView,
|
||||
downvoteTextView,
|
||||
downvoteButton,
|
||||
commentsCountTextView,
|
||||
saveButton,
|
||||
@@ -3213,8 +3319,14 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
AspectRatioGifImageView iconGifImageView;
|
||||
@BindView(R.id.subreddit_name_text_view_item_post_with_preview)
|
||||
TextView subredditTextView;
|
||||
|
||||
@BindView(R.id.community_instance_text_view_item_post_with_preview)
|
||||
TextView communityInstanceTextView;
|
||||
@BindView(R.id.user_text_view_item_post_with_preview)
|
||||
TextView userTextView;
|
||||
|
||||
@BindView(R.id.user_instance_text_view_item_post_with_preview)
|
||||
TextView userInstanceTextView;
|
||||
@BindView(R.id.stickied_post_image_view_item_post_with_preview)
|
||||
ImageView stickiedPostImageView;
|
||||
@BindView(R.id.post_time_text_view_item_post_with_preview)
|
||||
@@ -3257,6 +3369,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
ImageView upvoteButton;
|
||||
@BindView(R.id.score_text_view_item_post_with_preview)
|
||||
TextView scoreTextView;
|
||||
@BindView(R.id.downvote_text_view_item_post_with_preview)
|
||||
TextView downvoteTextView;
|
||||
|
||||
@BindView(R.id.minus_button_item_post_with_preview)
|
||||
ImageView downvoteButton;
|
||||
@BindView(R.id.comments_count_item_post_with_preview)
|
||||
@@ -3273,7 +3388,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
setBaseView(
|
||||
iconGifImageView,
|
||||
subredditTextView,
|
||||
communityInstanceTextView,
|
||||
userTextView,
|
||||
userInstanceTextView,
|
||||
stickiedPostImageView,
|
||||
postTimeTextView,
|
||||
titleTextView,
|
||||
@@ -3288,6 +3405,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
bottomConstraintLayout,
|
||||
upvoteButton,
|
||||
scoreTextView,
|
||||
downvoteTextView,
|
||||
downvoteButton,
|
||||
commentsCountTextView,
|
||||
saveButton,
|
||||
@@ -3357,7 +3475,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
PostBaseGalleryTypeViewHolder(View rootView,
|
||||
AspectRatioGifImageView iconGifImageView,
|
||||
TextView subredditTextView,
|
||||
TextView communityInstanceTextView,
|
||||
TextView userTextView,
|
||||
TextView userInstanceTextView,
|
||||
ImageView stickiedPostImageView,
|
||||
TextView postTimeTextView,
|
||||
TextView titleTextView,
|
||||
@@ -3376,6 +3496,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
ConstraintLayout bottomConstraintLayout,
|
||||
ImageView upvoteButton,
|
||||
TextView scoreTextView,
|
||||
TextView downvoteTextView,
|
||||
ImageView downvoteButton,
|
||||
TextView commentsCountTextView,
|
||||
ImageView saveButton,
|
||||
@@ -3385,7 +3506,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
setBaseView(
|
||||
iconGifImageView,
|
||||
subredditTextView,
|
||||
communityInstanceTextView,
|
||||
userTextView,
|
||||
userInstanceTextView,
|
||||
stickiedPostImageView,
|
||||
postTimeTextView,
|
||||
titleTextView,
|
||||
@@ -3400,6 +3523,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
bottomConstraintLayout,
|
||||
upvoteButton,
|
||||
scoreTextView,
|
||||
downvoteTextView,
|
||||
downvoteButton,
|
||||
commentsCountTextView,
|
||||
saveButton,
|
||||
@@ -3535,7 +3659,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
super(binding.getRoot(),
|
||||
binding.iconGifImageViewItemPostGalleryType,
|
||||
binding.subredditNameTextViewItemPostGalleryType,
|
||||
binding.communityInstanceTextViewItemPostGalleryType,
|
||||
binding.userTextViewItemPostGalleryType,
|
||||
binding.userInstanceTextViewItemPostGalleryType,
|
||||
binding.stickiedPostImageViewItemPostGalleryType,
|
||||
binding.postTimeTextViewItemPostGalleryType,
|
||||
binding.titleTextViewItemPostGalleryType,
|
||||
@@ -3554,6 +3680,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
binding.bottomConstraintLayoutItemPostGalleryType,
|
||||
binding.upvoteButtonItemPostGalleryType,
|
||||
binding.scoreTextViewItemPostGalleryType,
|
||||
binding.downvoteTextViewItemPostGalleryType,
|
||||
binding.downvoteButtonItemPostGalleryType,
|
||||
binding.commentsCountTextViewItemPostGalleryType,
|
||||
binding.saveButtonItemPostGalleryType,
|
||||
@@ -3567,8 +3694,15 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
AspectRatioGifImageView iconGifImageView;
|
||||
@BindView(R.id.subreddit_name_text_view_item_post_text_type)
|
||||
TextView subredditTextView;
|
||||
|
||||
@BindView(R.id.community_instance_text_view_item_post_text_type)
|
||||
TextView communityInstanceTextView;
|
||||
|
||||
@BindView(R.id.user_text_view_item_post_text_type)
|
||||
TextView userTextView;
|
||||
|
||||
@BindView(R.id.user_instance_text_view_item_post_text_type)
|
||||
TextView userInstanceTextView;
|
||||
@BindView(R.id.stickied_post_image_view_item_post_text_type)
|
||||
ImageView stickiedPostImageView;
|
||||
@BindView(R.id.post_time_text_view_item_post_text_type)
|
||||
@@ -3599,6 +3733,10 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
ImageView upvoteButton;
|
||||
@BindView(R.id.score_text_view_item_post_text_type)
|
||||
TextView scoreTextView;
|
||||
|
||||
@BindView(R.id.downvote_text_view_item_post_text_type)
|
||||
TextView downvoteTextView;
|
||||
|
||||
@BindView(R.id.minus_button_item_post_text_type)
|
||||
ImageView downvoteButton;
|
||||
@BindView(R.id.comments_count_item_post_text_type)
|
||||
@@ -3614,7 +3752,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
setBaseView(
|
||||
iconGifImageView,
|
||||
subredditTextView,
|
||||
communityInstanceTextView,
|
||||
userTextView,
|
||||
userInstanceTextView,
|
||||
stickiedPostImageView,
|
||||
postTimeTextView,
|
||||
titleTextView,
|
||||
@@ -3629,6 +3769,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
bottomConstraintLayout,
|
||||
upvoteButton,
|
||||
scoreTextView,
|
||||
downvoteTextView,
|
||||
downvoteButton,
|
||||
commentsCountTextView,
|
||||
saveButton,
|
||||
@@ -3644,6 +3785,8 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
public class PostCompactBaseViewHolder extends RecyclerView.ViewHolder {
|
||||
AspectRatioGifImageView iconGifImageView;
|
||||
TextView nameTextView;
|
||||
|
||||
TextView instanceTextView;
|
||||
ImageView stickiedPostImageView;
|
||||
TextView postTimeTextView;
|
||||
ConstraintLayout titleAndImageConstraintLayout;
|
||||
@@ -3667,6 +3810,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
ConstraintLayout bottomConstraintLayout;
|
||||
ImageView upvoteButton;
|
||||
TextView scoreTextView;
|
||||
TextView downvoteTextView;
|
||||
ImageView downvoteButton;
|
||||
TextView commentsCountTextView;
|
||||
ImageView saveButton;
|
||||
@@ -3682,7 +3826,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
}
|
||||
|
||||
void setBaseView(AspectRatioGifImageView iconGifImageView,
|
||||
TextView nameTextView, ImageView stickiedPostImageView,
|
||||
TextView nameTextView, TextView instanceTextView, ImageView stickiedPostImageView,
|
||||
TextView postTimeTextView, ConstraintLayout titleAndImageConstraintLayout,
|
||||
TextView titleTextView, CustomTextView typeTextView,
|
||||
ImageView archivedImageView, ImageView lockedImageView,
|
||||
@@ -3694,11 +3838,12 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
FrameLayout noPreviewLinkImageFrameLayout,
|
||||
ImageView noPreviewLinkImageView, Barrier imageBarrier,
|
||||
ConstraintLayout bottomConstraintLayout, ImageView upvoteButton,
|
||||
TextView scoreTextView, ImageView downvoteButton,
|
||||
TextView scoreTextView, TextView downvoteTextView, ImageView downvoteButton,
|
||||
TextView commentsCountTextView, ImageView saveButton,
|
||||
ImageView shareButton, View divider) {
|
||||
this.iconGifImageView = iconGifImageView;
|
||||
this.nameTextView = nameTextView;
|
||||
this.instanceTextView = instanceTextView;
|
||||
this.stickiedPostImageView = stickiedPostImageView;
|
||||
this.postTimeTextView = postTimeTextView;
|
||||
this.titleAndImageConstraintLayout = titleAndImageConstraintLayout;
|
||||
@@ -3722,6 +3867,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
this.bottomConstraintLayout = bottomConstraintLayout;
|
||||
this.upvoteButton = upvoteButton;
|
||||
this.scoreTextView = scoreTextView;
|
||||
this.downvoteTextView = downvoteTextView;
|
||||
this.downvoteButton = downvoteButton;
|
||||
this.commentsCountTextView = commentsCountTextView;
|
||||
this.saveButton = saveButton;
|
||||
@@ -3855,7 +4001,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
return false;
|
||||
});
|
||||
|
||||
nameTextView.setOnClickListener(view -> {
|
||||
View.OnClickListener onClickListener = view -> {
|
||||
int position = getBindingAdapterPosition();
|
||||
if (position < 0) {
|
||||
return;
|
||||
@@ -3877,7 +4023,10 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
mActivity.startActivity(intent);
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
nameTextView.setOnClickListener(onClickListener);
|
||||
instanceTextView.setOnClickListener(onClickListener);
|
||||
|
||||
|
||||
iconGifImageView.setOnClickListener(view -> nameTextView.performClick());
|
||||
|
||||
@@ -4052,18 +4201,28 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
newVoteType = Integer.parseInt(APIUtils.DIR_DOWNVOTE);
|
||||
downvoteButton
|
||||
.setColorFilter(mDownvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
if(mSeparateUpandDownVotes){
|
||||
downvoteTextView.setTextColor(mDownvotedColor);
|
||||
}else {
|
||||
scoreTextView.setTextColor(mDownvotedColor);
|
||||
}
|
||||
} else {
|
||||
//Downvoted before
|
||||
post.setVoteType(0);
|
||||
newVoteType = Integer.parseInt(APIUtils.DIR_UNVOTE);
|
||||
downvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
scoreTextView.setTextColor(mPostIconAndInfoColor);
|
||||
downvoteTextView.setTextColor(mPostIconAndInfoColor);
|
||||
}
|
||||
|
||||
if (!mHideTheNumberOfVotes) {
|
||||
if(mSeparateUpandDownVotes) {
|
||||
int downvotes = (post.getVoteType() == -1) ? post.getDownvotes() +1 : post.getDownvotes();
|
||||
downvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, downvotes));
|
||||
} else {
|
||||
scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + post.getVoteType()));
|
||||
}
|
||||
}
|
||||
|
||||
VoteThing.votePost(mActivity, retrofit, mAccessToken, new VoteThing.VoteThingListener() {
|
||||
@Override
|
||||
@@ -4073,23 +4232,33 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
post.setVoteType(-1);
|
||||
if (currentPosition == position) {
|
||||
downvoteButton.setColorFilter(mDownvotedColor, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
if(mSeparateUpandDownVotes) {
|
||||
downvoteTextView.setTextColor(mDownvotedColor);
|
||||
} else {
|
||||
scoreTextView.setTextColor(mDownvotedColor);
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
post.setVoteType(0);
|
||||
if (currentPosition == position) {
|
||||
downvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
scoreTextView.setTextColor(mPostIconAndInfoColor);
|
||||
downvoteTextView.setTextColor(mPostIconAndInfoColor);
|
||||
}
|
||||
}
|
||||
|
||||
if (currentPosition == position) {
|
||||
upvoteButton.setColorFilter(mPostIconAndInfoColor, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
if (!mHideTheNumberOfVotes) {
|
||||
if(mSeparateUpandDownVotes) {
|
||||
int downvotes = (post.getVoteType() == -1) ? post.getDownvotes() +1 : post.getDownvotes();
|
||||
downvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, downvotes));
|
||||
} else {
|
||||
scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, post.getScore() + post.getVoteType()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EventBus.getDefault().post(new PostUpdateEventToPostDetailFragment(post));
|
||||
}
|
||||
@@ -4237,6 +4406,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
AspectRatioGifImageView iconGifImageView;
|
||||
@BindView(R.id.name_text_view_item_post_compact)
|
||||
TextView nameTextView;
|
||||
|
||||
@BindView(R.id.instance_name_text_view_item_post_compact)
|
||||
TextView instanceTextView;
|
||||
@BindView(R.id.stickied_post_image_view_item_post_compact)
|
||||
ImageView stickiedPostImageView;
|
||||
@BindView(R.id.post_time_text_view_item_post_compact)
|
||||
@@ -4283,6 +4455,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
ImageView upvoteButton;
|
||||
@BindView(R.id.score_text_view_item_post_compact)
|
||||
TextView scoreTextView;
|
||||
|
||||
@BindView(R.id.downvote_text_view_item_post_compact)
|
||||
TextView downvoteTextView;
|
||||
@BindView(R.id.minus_button_item_post_compact)
|
||||
ImageView downvoteButton;
|
||||
@BindView(R.id.comments_count_item_post_compact)
|
||||
@@ -4298,12 +4473,12 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
|
||||
setBaseView(iconGifImageView, nameTextView, stickiedPostImageView, postTimeTextView,
|
||||
setBaseView(iconGifImageView, nameTextView, instanceTextView, stickiedPostImageView, postTimeTextView,
|
||||
titleAndImageConstraintLayout, titleTextView, typeTextView, archivedImageView,
|
||||
lockedImageView, crosspostImageView, nsfwTextView, spoilerTextView,
|
||||
flairTextView, awardsTextView, linkTextView, relativeLayout, progressBar, imageView,
|
||||
playButtonImageView, noPreviewLinkImageFrameLayout, noPreviewLinkImageView,
|
||||
imageBarrier, bottomConstraintLayout, upvoteButton, scoreTextView, downvoteButton,
|
||||
imageBarrier, bottomConstraintLayout, upvoteButton, scoreTextView, downvoteTextView, downvoteButton,
|
||||
commentsCountTextView, saveButton, shareButton, divider);
|
||||
}
|
||||
}
|
||||
@@ -4313,6 +4488,8 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
AspectRatioGifImageView iconGifImageView;
|
||||
@BindView(R.id.name_text_view_item_post_compact_right_thumbnail)
|
||||
TextView nameTextView;
|
||||
@BindView(R.id.instance_name_text_view_item_post_compact_right_thumbnail)
|
||||
TextView instanceTextView;
|
||||
@BindView(R.id.stickied_post_image_view_item_post_compact_right_thumbnail)
|
||||
ImageView stickiedPostImageView;
|
||||
@BindView(R.id.post_time_text_view_item_post_compact_right_thumbnail)
|
||||
@@ -4359,6 +4536,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
ImageView upvoteButton;
|
||||
@BindView(R.id.score_text_view_item_post_compact_right_thumbnail)
|
||||
TextView scoreTextView;
|
||||
|
||||
@BindView(R.id.downvote_text_view_item_post_compact_right_thumbnail)
|
||||
TextView downvoteTextView;
|
||||
@BindView(R.id.minus_button_item_post_compact_right_thumbnail)
|
||||
ImageView downvoteButton;
|
||||
@BindView(R.id.comments_count_item_post_compact_right_thumbnail)
|
||||
@@ -4374,12 +4554,12 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
|
||||
setBaseView(iconGifImageView, nameTextView, stickiedPostImageView, postTimeTextView,
|
||||
setBaseView(iconGifImageView, nameTextView, instanceTextView, stickiedPostImageView, postTimeTextView,
|
||||
titleAndImageConstraintLayout, titleTextView, typeTextView, archivedImageView,
|
||||
lockedImageView, crosspostImageView, nsfwTextView, spoilerTextView,
|
||||
flairTextView, awardsTextView, linkTextView, relativeLayout, progressBar, imageView,
|
||||
playButtonImageView, noPreviewLinkImageFrameLayout, noPreviewLinkImageView,
|
||||
imageBarrier, bottomConstraintLayout, upvoteButton, scoreTextView, downvoteButton,
|
||||
imageBarrier, bottomConstraintLayout, upvoteButton, scoreTextView, downvoteTextView, downvoteButton,
|
||||
commentsCountTextView, saveButton, shareButton, divider);
|
||||
}
|
||||
}
|
||||
@@ -4699,8 +4879,12 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
AspectRatioGifImageView iconGifImageView;
|
||||
@BindView(R.id.subreddit_name_text_view_item_post_card_2_video_autoplay)
|
||||
TextView subredditTextView;
|
||||
@BindView(R.id.community_instance_text_view_item_post_card_2_video_autoplay)
|
||||
TextView communityInstanceTextView;
|
||||
@BindView(R.id.user_text_view_item_post_card_2_video_autoplay)
|
||||
TextView userTextView;
|
||||
@BindView(R.id.user_instance_text_view_item_post_card_2_video_autoplay)
|
||||
TextView userInstanceTextView;
|
||||
@BindView(R.id.stickied_post_image_view_item_post_card_2_video_autoplay)
|
||||
ImageView stickiedPostImageView;
|
||||
@BindView(R.id.post_time_text_view_item_post_card_2_video_autoplay)
|
||||
@@ -4747,6 +4931,10 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
ImageView upvoteButton;
|
||||
@BindView(R.id.score_text_view_item_post_card_2_video_autoplay)
|
||||
TextView scoreTextView;
|
||||
|
||||
@BindView(R.id.downvote_text_view_item_post_card_2_video_autoplay)
|
||||
TextView downvoteTextView;
|
||||
|
||||
@BindView(R.id.minus_button_item_post_card_2_video_autoplay)
|
||||
ImageView downvoteButton;
|
||||
@BindView(R.id.comments_count_item_post_card_2_video_autoplay)
|
||||
@@ -4773,7 +4961,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
setBaseView(
|
||||
iconGifImageView,
|
||||
subredditTextView,
|
||||
communityInstanceTextView,
|
||||
userTextView,
|
||||
userInstanceTextView,
|
||||
stickiedPostImageView,
|
||||
postTimeTextView,
|
||||
titleTextView,
|
||||
@@ -4788,6 +4978,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
bottomConstraintLayout,
|
||||
upvoteButton,
|
||||
scoreTextView,
|
||||
downvoteTextView,
|
||||
downvoteButton,
|
||||
commentsCountTextView,
|
||||
saveButton,
|
||||
@@ -5020,8 +5211,13 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
AspectRatioGifImageView iconGifImageView;
|
||||
@BindView(R.id.subreddit_name_text_view_item_post_card_2_with_preview)
|
||||
TextView subredditTextView;
|
||||
|
||||
@BindView(R.id.community_instance_text_view_item_post_card_2_with_preview)
|
||||
TextView communityInstanceTextView;
|
||||
@BindView(R.id.user_text_view_item_post_card_2_with_preview)
|
||||
TextView userTextView;
|
||||
@BindView(R.id.user_instance_text_view_item_post_card_2_with_preview)
|
||||
TextView userInstanceTextView;
|
||||
@BindView(R.id.stickied_post_image_view_item_post_card_2_with_preview)
|
||||
ImageView stickiedPostImageView;
|
||||
@BindView(R.id.post_time_text_view_item_post_card_2_with_preview)
|
||||
@@ -5062,6 +5258,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
ImageView upvoteButton;
|
||||
@BindView(R.id.score_text_view_item_post_card_2_with_preview)
|
||||
TextView scoreTextView;
|
||||
|
||||
@BindView(R.id.downvote_text_view_item_post_card_2_with_preview)
|
||||
TextView downvoteTextView;
|
||||
@BindView(R.id.minus_button_item_post_card_2_with_preview)
|
||||
ImageView downvoteButton;
|
||||
@BindView(R.id.comments_count_item_post_card_2_with_preview)
|
||||
@@ -5080,7 +5279,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
setBaseView(
|
||||
iconGifImageView,
|
||||
subredditTextView,
|
||||
communityInstanceTextView,
|
||||
userTextView,
|
||||
userInstanceTextView,
|
||||
stickiedPostImageView,
|
||||
postTimeTextView,
|
||||
titleTextView,
|
||||
@@ -5095,6 +5296,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
bottomConstraintLayout,
|
||||
upvoteButton,
|
||||
scoreTextView,
|
||||
downvoteTextView,
|
||||
downvoteButton,
|
||||
commentsCountTextView,
|
||||
saveButton,
|
||||
@@ -5160,7 +5362,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
super(binding.getRoot(),
|
||||
binding.iconGifImageViewItemPostCard2GalleryType,
|
||||
binding.subredditNameTextViewItemPostCard2GalleryType,
|
||||
binding.communityInstanceTextViewItemPostCard2GalleryType,
|
||||
binding.userTextViewItemPostCard2GalleryType,
|
||||
binding.userInstanceTextViewItemPostCard2GalleryType,
|
||||
binding.stickiedPostImageViewItemPostCard2GalleryType,
|
||||
binding.postTimeTextViewItemPostCard2GalleryType,
|
||||
binding.titleTextViewItemPostCard2GalleryType,
|
||||
@@ -5179,6 +5383,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
binding.bottomConstraintLayoutItemPostCard2GalleryType,
|
||||
binding.upvoteButtonItemPostCard2GalleryType,
|
||||
binding.scoreTextViewItemPostCard2GalleryType,
|
||||
binding.downvoteTextViewItemPostCard2GalleryType,
|
||||
binding.downvoteButtonItemPostCard2GalleryType,
|
||||
binding.commentsCountTextViewItemPostCard2GalleryType,
|
||||
binding.saveButtonItemPostCard2GalleryType,
|
||||
@@ -5194,8 +5399,13 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
AspectRatioGifImageView iconGifImageView;
|
||||
@BindView(R.id.subreddit_name_text_view_item_post_card_2_text)
|
||||
TextView subredditTextView;
|
||||
|
||||
@BindView(R.id.community_instance_text_view_item_post_card_2_text)
|
||||
TextView communityInstanceTextView;
|
||||
@BindView(R.id.user_text_view_item_post_card_2_text)
|
||||
TextView userTextView;
|
||||
@BindView(R.id.user_instance_text_view_item_post_card_2_text)
|
||||
TextView userInstanceTextView;
|
||||
@BindView(R.id.stickied_post_image_view_item_post_card_2_text)
|
||||
ImageView stickiedPostImageView;
|
||||
@BindView(R.id.post_time_text_view_item_post_card_2_text)
|
||||
@@ -5226,6 +5436,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
ImageView upvoteButton;
|
||||
@BindView(R.id.score_text_view_item_post_card_2_text)
|
||||
TextView scoreTextView;
|
||||
|
||||
@BindView(R.id.downvote_text_view_item_post_card_2_text)
|
||||
TextView downvoteTextView;
|
||||
@BindView(R.id.minus_button_item_post_card_2_text)
|
||||
ImageView downvoteButton;
|
||||
@BindView(R.id.comments_count_item_post_card_2_text)
|
||||
@@ -5243,7 +5456,9 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
setBaseView(
|
||||
iconGifImageView,
|
||||
subredditTextView,
|
||||
communityInstanceTextView,
|
||||
userTextView,
|
||||
userInstanceTextView,
|
||||
stickiedPostImageView,
|
||||
postTimeTextView,
|
||||
titleTextView,
|
||||
@@ -5258,6 +5473,7 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
|
||||
bottomConstraintLayout,
|
||||
upvoteButton,
|
||||
scoreTextView,
|
||||
downvoteTextView,
|
||||
downvoteButton,
|
||||
commentsCountTextView,
|
||||
saveButton,
|
||||
|
||||
@@ -0,0 +1,343 @@
|
||||
package eu.toldi.infinityforlemmy.adapters;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.net.Uri;
|
||||
import android.text.method.LinkMovementMethod;
|
||||
import android.text.util.Linkify;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.paging.PagedListAdapter;
|
||||
import androidx.recyclerview.widget.DiffUtil;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import eu.toldi.infinityforlemmy.NetworkState;
|
||||
import eu.toldi.infinityforlemmy.R;
|
||||
import eu.toldi.infinityforlemmy.activities.BaseActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.LinkResolverActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.ViewPrivateMessagesActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.ViewUserDetailActivity;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||
import eu.toldi.infinityforlemmy.markdown.RedditHeadingPlugin;
|
||||
import eu.toldi.infinityforlemmy.markdown.SpoilerAwareMovementMethod;
|
||||
import eu.toldi.infinityforlemmy.markdown.SpoilerParserPlugin;
|
||||
import eu.toldi.infinityforlemmy.markdown.SuperscriptPlugin;
|
||||
import eu.toldi.infinityforlemmy.privatemessage.LemmyPrivateMessageAPI;
|
||||
import eu.toldi.infinityforlemmy.privatemessage.PrivateMessage;
|
||||
import io.noties.markwon.AbstractMarkwonPlugin;
|
||||
import io.noties.markwon.Markwon;
|
||||
import io.noties.markwon.MarkwonConfiguration;
|
||||
import io.noties.markwon.core.MarkwonTheme;
|
||||
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
|
||||
import io.noties.markwon.image.glide.GlideImagesPlugin;
|
||||
import io.noties.markwon.inlineparser.HtmlInlineProcessor;
|
||||
import io.noties.markwon.inlineparser.MarkwonInlineParserPlugin;
|
||||
import io.noties.markwon.linkify.LinkifyPlugin;
|
||||
import io.noties.markwon.movement.MovementMethodPlugin;
|
||||
import retrofit2.Retrofit;
|
||||
|
||||
public class PrivateMessageRecycleViewAdapter extends PagedListAdapter<PrivateMessage, RecyclerView.ViewHolder> {
|
||||
private static final int VIEW_TYPE_DATA = 0;
|
||||
private static final int VIEW_TYPE_ERROR = 1;
|
||||
private static final int VIEW_TYPE_LOADING = 2;
|
||||
private static final DiffUtil.ItemCallback<PrivateMessage> DIFF_CALLBACK = new DiffUtil.ItemCallback<>() {
|
||||
@Override
|
||||
public boolean areItemsTheSame(@NonNull PrivateMessage message, @NonNull PrivateMessage t1) {
|
||||
return message.getId() == t1.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean areContentsTheSame(@NonNull PrivateMessage message, @NonNull PrivateMessage t1) {
|
||||
return message.getContent().equals(t1.getContent());
|
||||
}
|
||||
};
|
||||
private BaseActivity mActivity;
|
||||
private Retrofit retrofit;
|
||||
private Markwon mMarkwon;
|
||||
private String mAccessToken;
|
||||
|
||||
private final LemmyPrivateMessageAPI lemmyPrivateMessageAPI;
|
||||
private int mMessageType;
|
||||
private NetworkState networkState;
|
||||
private RetryLoadingMoreCallback mRetryLoadingMoreCallback;
|
||||
private int mColorAccent;
|
||||
private int mMessageBackgroundColor;
|
||||
private int mUsernameColor;
|
||||
private int mPrimaryTextColor;
|
||||
private int mSecondaryTextColor;
|
||||
private int mUnreadMessageBackgroundColor;
|
||||
private int mColorPrimaryLightTheme;
|
||||
private int mButtonTextColor;
|
||||
private boolean markAllMessagesAsRead = false;
|
||||
|
||||
public PrivateMessageRecycleViewAdapter(BaseActivity activity, Retrofit oauthRetrofit,
|
||||
CustomThemeWrapper customThemeWrapper,
|
||||
String accessToken,
|
||||
LemmyPrivateMessageAPI lemmyPrivateMessageAPI, RetryLoadingMoreCallback retryLoadingMoreCallback) {
|
||||
super(DIFF_CALLBACK);
|
||||
mActivity = activity;
|
||||
retrofit = oauthRetrofit;
|
||||
this.lemmyPrivateMessageAPI = lemmyPrivateMessageAPI;
|
||||
mRetryLoadingMoreCallback = retryLoadingMoreCallback;
|
||||
|
||||
mColorAccent = customThemeWrapper.getColorAccent();
|
||||
mMessageBackgroundColor = customThemeWrapper.getCardViewBackgroundColor();
|
||||
mUsernameColor = customThemeWrapper.getUsername();
|
||||
mPrimaryTextColor = customThemeWrapper.getPrimaryTextColor();
|
||||
mSecondaryTextColor = customThemeWrapper.getSecondaryTextColor();
|
||||
int spoilerBackgroundColor = mSecondaryTextColor | 0xFF000000;
|
||||
mUnreadMessageBackgroundColor = customThemeWrapper.getUnreadMessageBackgroundColor();
|
||||
mColorPrimaryLightTheme = customThemeWrapper.getColorPrimaryLightTheme();
|
||||
mButtonTextColor = customThemeWrapper.getButtonTextColor();
|
||||
|
||||
// todo:https://github.com/Docile-Alligator/Infinity-For-Reddit/issues/1027
|
||||
// add tables support and replace with MarkdownUtils#commonPostMarkwonBuilder
|
||||
mMarkwon = Markwon.builder(mActivity)
|
||||
.usePlugin(MarkwonInlineParserPlugin.create(plugin -> {
|
||||
plugin.excludeInlineProcessor(HtmlInlineProcessor.class);
|
||||
}))
|
||||
.usePlugin(new AbstractMarkwonPlugin() {
|
||||
@Override
|
||||
public void configureConfiguration(@NonNull MarkwonConfiguration.Builder builder) {
|
||||
builder.linkResolver((view, link) -> {
|
||||
Intent intent = new Intent(mActivity, LinkResolverActivity.class);
|
||||
Uri uri = Uri.parse(link);
|
||||
intent.setData(uri);
|
||||
mActivity.startActivity(intent);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
|
||||
builder.linkColor(customThemeWrapper.getLinkColor());
|
||||
}
|
||||
})
|
||||
.usePlugin(SuperscriptPlugin.create())
|
||||
.usePlugin(SpoilerParserPlugin.create(mSecondaryTextColor, spoilerBackgroundColor))
|
||||
.usePlugin(RedditHeadingPlugin.create())
|
||||
.usePlugin(StrikethroughPlugin.create())
|
||||
.usePlugin(MovementMethodPlugin.create(new SpoilerAwareMovementMethod()))
|
||||
.usePlugin(LinkifyPlugin.create(Linkify.WEB_URLS))
|
||||
.usePlugin(GlideImagesPlugin.create(mActivity))
|
||||
.build();
|
||||
mAccessToken = accessToken;
|
||||
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
if (viewType == VIEW_TYPE_DATA) {
|
||||
return new DataViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_message, parent, false));
|
||||
} else if (viewType == VIEW_TYPE_ERROR) {
|
||||
return new ErrorViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_footer_error, parent, false));
|
||||
} else {
|
||||
return new LoadingViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_footer_loading, parent, false));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
||||
if (holder instanceof DataViewHolder) {
|
||||
PrivateMessage message = getItem(holder.getBindingAdapterPosition());
|
||||
if (message != null) {
|
||||
|
||||
if (!message.getRead()) {
|
||||
if (markAllMessagesAsRead) {
|
||||
message.setRead(true);
|
||||
} else {
|
||||
holder.itemView.setBackgroundColor(
|
||||
mUnreadMessageBackgroundColor);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
((DataViewHolder) holder).titleTextView.setVisibility(View.GONE);
|
||||
|
||||
|
||||
((DataViewHolder) holder).authorTextView.setText(message.getCreatorQualifiedName());
|
||||
String subject = message.getRecipientQualifiedName();
|
||||
((DataViewHolder) holder).subjectTextView.setText(subject);
|
||||
mMarkwon.setMarkdown(((DataViewHolder) holder).contentCustomMarkwonView, message.getContent());
|
||||
|
||||
holder.itemView.setOnClickListener(view -> {
|
||||
|
||||
Intent intent = new Intent(mActivity, ViewPrivateMessagesActivity.class);
|
||||
intent.putExtra(ViewPrivateMessagesActivity.EXTRA_PRIVATE_MESSAGE, message);
|
||||
mActivity.startActivity(intent);
|
||||
|
||||
|
||||
if (message.getRead()) {
|
||||
holder.itemView.setBackgroundColor(mMessageBackgroundColor);
|
||||
|
||||
|
||||
lemmyPrivateMessageAPI.markPrivateMessageAsRead(mAccessToken, message.getId(), new LemmyPrivateMessageAPI.PrivateMessageMarkedAsReadListener() {
|
||||
|
||||
@Override
|
||||
public void onPrivateMessageMarkedAsReadError() {
|
||||
message.setRead(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPrivateMessageMarkedAsReadSuccess() {
|
||||
message.setRead(true);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
((DataViewHolder) holder).authorTextView.setOnClickListener(view -> {
|
||||
|
||||
Intent intent = new Intent(mActivity, ViewUserDetailActivity.class);
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, message.getCreatorName());
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_QUALIFIED_USER_NAME_KEY, message.getCreatorQualifiedName());
|
||||
mActivity.startActivity(intent);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int position) {
|
||||
// Reached at the end
|
||||
if (hasExtraRow() && position == getItemCount() - 1) {
|
||||
if (networkState.getStatus() == NetworkState.Status.LOADING) {
|
||||
return VIEW_TYPE_LOADING;
|
||||
} else {
|
||||
return VIEW_TYPE_ERROR;
|
||||
}
|
||||
} else {
|
||||
return VIEW_TYPE_DATA;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
if (hasExtraRow()) {
|
||||
return super.getItemCount() + 1;
|
||||
}
|
||||
return super.getItemCount();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
|
||||
super.onViewRecycled(holder);
|
||||
if (holder instanceof DataViewHolder) {
|
||||
((DataViewHolder) holder).itemView.setBackgroundColor(mMessageBackgroundColor);
|
||||
((DataViewHolder) holder).titleTextView.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean hasExtraRow() {
|
||||
return networkState != null && networkState.getStatus() != NetworkState.Status.SUCCESS;
|
||||
}
|
||||
|
||||
public void setNetworkState(NetworkState newNetworkState) {
|
||||
NetworkState previousState = this.networkState;
|
||||
boolean previousExtraRow = hasExtraRow();
|
||||
this.networkState = newNetworkState;
|
||||
boolean newExtraRow = hasExtraRow();
|
||||
if (previousExtraRow != newExtraRow) {
|
||||
if (previousExtraRow) {
|
||||
notifyItemRemoved(super.getItemCount());
|
||||
} else {
|
||||
notifyItemInserted(super.getItemCount());
|
||||
}
|
||||
} else if (newExtraRow && !previousState.equals(newNetworkState)) {
|
||||
notifyItemChanged(getItemCount() - 1);
|
||||
}
|
||||
}
|
||||
|
||||
public void updateMessageReply(PrivateMessage newReply, int position) {
|
||||
if (position >= 0 && position < super.getItemCount()) {
|
||||
PrivateMessage message = getItem(position);
|
||||
if (message != null) {
|
||||
notifyItemChanged(position);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setMarkAllMessagesAsRead(boolean markAllMessagesAsRead) {
|
||||
this.markAllMessagesAsRead = markAllMessagesAsRead;
|
||||
}
|
||||
|
||||
public interface RetryLoadingMoreCallback {
|
||||
void retryLoadingMore();
|
||||
}
|
||||
|
||||
class DataViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.author_text_view_item_message)
|
||||
TextView authorTextView;
|
||||
@BindView(R.id.subject_text_view_item_message)
|
||||
TextView subjectTextView;
|
||||
@BindView(R.id.title_text_view_item_message)
|
||||
TextView titleTextView;
|
||||
@BindView(R.id.content_custom_markwon_view_item_message)
|
||||
TextView contentCustomMarkwonView;
|
||||
|
||||
DataViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
if (mActivity.typeface != null) {
|
||||
authorTextView.setTypeface(mActivity.typeface);
|
||||
subjectTextView.setTypeface(mActivity.typeface);
|
||||
titleTextView.setTypeface(mActivity.titleTypeface);
|
||||
contentCustomMarkwonView.setTypeface(mActivity.contentTypeface);
|
||||
}
|
||||
itemView.setBackgroundColor(mMessageBackgroundColor);
|
||||
authorTextView.setTextColor(mUsernameColor);
|
||||
subjectTextView.setTextColor(mPrimaryTextColor);
|
||||
titleTextView.setTextColor(mPrimaryTextColor);
|
||||
contentCustomMarkwonView.setTextColor(mSecondaryTextColor);
|
||||
|
||||
contentCustomMarkwonView.setMovementMethod(LinkMovementMethod.getInstance());
|
||||
|
||||
contentCustomMarkwonView.setOnClickListener(view -> {
|
||||
if (contentCustomMarkwonView.getSelectionStart() == -1 && contentCustomMarkwonView.getSelectionEnd() == -1) {
|
||||
itemView.performClick();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
class ErrorViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.error_text_view_item_footer_error)
|
||||
TextView errorTextView;
|
||||
@BindView(R.id.retry_button_item_footer_error)
|
||||
Button retryButton;
|
||||
|
||||
ErrorViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
if (mActivity.typeface != null) {
|
||||
errorTextView.setTypeface(mActivity.typeface);
|
||||
retryButton.setTypeface(mActivity.typeface);
|
||||
}
|
||||
errorTextView.setText(R.string.load_comments_failed);
|
||||
errorTextView.setTextColor(mSecondaryTextColor);
|
||||
retryButton.setOnClickListener(view -> mRetryLoadingMoreCallback.retryLoadingMore());
|
||||
retryButton.setBackgroundTintList(ColorStateList.valueOf(mColorPrimaryLightTheme));
|
||||
retryButton.setTextColor(mButtonTextColor);
|
||||
}
|
||||
}
|
||||
|
||||
class LoadingViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.progress_bar_item_footer_loading)
|
||||
ProgressBar progressBar;
|
||||
|
||||
LoadingViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
progressBar.setIndeterminateTintList(ColorStateList.valueOf(mColorAccent));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,34 +27,35 @@ import java.util.Locale;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import io.noties.markwon.AbstractMarkwonPlugin;
|
||||
import io.noties.markwon.Markwon;
|
||||
import io.noties.markwon.MarkwonConfiguration;
|
||||
import io.noties.markwon.core.MarkwonTheme;
|
||||
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
|
||||
import io.noties.markwon.inlineparser.BangInlineProcessor;
|
||||
import io.noties.markwon.inlineparser.HtmlInlineProcessor;
|
||||
import io.noties.markwon.inlineparser.MarkwonInlineParserPlugin;
|
||||
import io.noties.markwon.linkify.LinkifyPlugin;
|
||||
import io.noties.markwon.movement.MovementMethodPlugin;
|
||||
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
|
||||
import eu.toldi.infinityforlemmy.R;
|
||||
import eu.toldi.infinityforlemmy.activities.LinkResolverActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.ViewPrivateMessagesActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.ViewUserDetailActivity;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||
import eu.toldi.infinityforlemmy.markdown.ClickableGlideImagesPlugin;
|
||||
import eu.toldi.infinityforlemmy.markdown.RedditHeadingPlugin;
|
||||
import eu.toldi.infinityforlemmy.markdown.SpoilerAwareMovementMethod;
|
||||
import eu.toldi.infinityforlemmy.markdown.SpoilerParserPlugin;
|
||||
import eu.toldi.infinityforlemmy.markdown.SuperscriptPlugin;
|
||||
import eu.toldi.infinityforlemmy.message.Message;
|
||||
import eu.toldi.infinityforlemmy.privatemessage.PrivateMessage;
|
||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
|
||||
import eu.toldi.infinityforlemmy.utils.Utils;
|
||||
import io.noties.markwon.AbstractMarkwonPlugin;
|
||||
import io.noties.markwon.Markwon;
|
||||
import io.noties.markwon.MarkwonConfiguration;
|
||||
import io.noties.markwon.core.MarkwonTheme;
|
||||
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
|
||||
import io.noties.markwon.image.glide.GlideImagesPlugin;
|
||||
import io.noties.markwon.inlineparser.HtmlInlineProcessor;
|
||||
import io.noties.markwon.inlineparser.MarkwonInlineParserPlugin;
|
||||
import io.noties.markwon.linkify.LinkifyPlugin;
|
||||
import io.noties.markwon.movement.MovementMethodPlugin;
|
||||
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
|
||||
|
||||
public class PrivateMessagesDetailRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||
private static final int VIEW_TYPE_MESSAGE_SENT = 0;
|
||||
private static final int VIEW_TYPE_MESSAGE_RECEIVED = 1;
|
||||
private Message mMessage;
|
||||
private PrivateMessage mMessage;
|
||||
private ViewPrivateMessagesActivity mViewPrivateMessagesActivity;
|
||||
private RequestManager mGlide;
|
||||
private Locale mLocale;
|
||||
@@ -70,7 +71,7 @@ public class PrivateMessagesDetailRecyclerViewAdapter extends RecyclerView.Adapt
|
||||
|
||||
public PrivateMessagesDetailRecyclerViewAdapter(ViewPrivateMessagesActivity viewPrivateMessagesActivity,
|
||||
SharedPreferences sharedPreferences, Locale locale,
|
||||
Message message, String accountName,
|
||||
PrivateMessage message, String accountName,
|
||||
CustomThemeWrapper customThemeWrapper) {
|
||||
mMessage = message;
|
||||
mViewPrivateMessagesActivity = viewPrivateMessagesActivity;
|
||||
@@ -83,7 +84,6 @@ public class PrivateMessagesDetailRecyclerViewAdapter extends RecyclerView.Adapt
|
||||
mMarkwon = Markwon.builder(viewPrivateMessagesActivity)
|
||||
.usePlugin(MarkwonInlineParserPlugin.create(plugin -> {
|
||||
plugin.excludeInlineProcessor(HtmlInlineProcessor.class);
|
||||
plugin.excludeInlineProcessor(BangInlineProcessor.class);
|
||||
}))
|
||||
.usePlugin(new AbstractMarkwonPlugin() {
|
||||
@Override
|
||||
@@ -108,6 +108,8 @@ public class PrivateMessagesDetailRecyclerViewAdapter extends RecyclerView.Adapt
|
||||
builder.linkColor(customThemeWrapper.getLinkColor());
|
||||
}
|
||||
})
|
||||
.usePlugin(GlideImagesPlugin.create(viewPrivateMessagesActivity))
|
||||
.usePlugin(ClickableGlideImagesPlugin.create(viewPrivateMessagesActivity))
|
||||
.usePlugin(SuperscriptPlugin.create())
|
||||
.usePlugin(StrikethroughPlugin.create())
|
||||
.usePlugin(SpoilerParserPlugin.create(commentColor, commentColor | 0xFF000000))
|
||||
@@ -127,9 +129,9 @@ public class PrivateMessagesDetailRecyclerViewAdapter extends RecyclerView.Adapt
|
||||
@Override
|
||||
public int getItemViewType(int position) {
|
||||
if (position == 0) {
|
||||
return mMessage.getAuthor().equals(mAccountName) ? VIEW_TYPE_MESSAGE_SENT : VIEW_TYPE_MESSAGE_RECEIVED;
|
||||
return mMessage.getCreatorQualifiedName().equals(mAccountName) ? VIEW_TYPE_MESSAGE_SENT : VIEW_TYPE_MESSAGE_RECEIVED;
|
||||
} else {
|
||||
return mMessage.getReplies().get(position - 1).getAuthor().equals(mAccountName) ? VIEW_TYPE_MESSAGE_SENT : VIEW_TYPE_MESSAGE_RECEIVED;
|
||||
return mMessage.getReplies().get(position - 1).getCreatorQualifiedName().equals(mAccountName) ? VIEW_TYPE_MESSAGE_SENT : VIEW_TYPE_MESSAGE_RECEIVED;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -145,7 +147,7 @@ public class PrivateMessagesDetailRecyclerViewAdapter extends RecyclerView.Adapt
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
||||
Message message;
|
||||
PrivateMessage message;
|
||||
if (holder.getBindingAdapterPosition() == 0) {
|
||||
message = mMessage;
|
||||
} else {
|
||||
@@ -153,12 +155,12 @@ public class PrivateMessagesDetailRecyclerViewAdapter extends RecyclerView.Adapt
|
||||
}
|
||||
if (message != null) {
|
||||
if (holder instanceof MessageViewHolder) {
|
||||
mMarkwon.setMarkdown(((MessageViewHolder) holder).messageTextView, message.getBody());
|
||||
mMarkwon.setMarkdown(((MessageViewHolder) holder).messageTextView, message.getContent());
|
||||
|
||||
if (mShowElapsedTime) {
|
||||
((MessageViewHolder) holder).timeTextView.setText(Utils.getElapsedTime(mViewPrivateMessagesActivity, message.getTimeUTC()));
|
||||
((MessageViewHolder) holder).timeTextView.setText(Utils.getElapsedTime(mViewPrivateMessagesActivity, message.getPublished()));
|
||||
} else {
|
||||
((MessageViewHolder) holder).timeTextView.setText(Utils.getFormattedTime(mLocale, message.getTimeUTC(), mTimeFormatPattern));
|
||||
((MessageViewHolder) holder).timeTextView.setText(Utils.getFormattedTime(mLocale, message.getPublished(), mTimeFormatPattern));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,7 +168,14 @@ public class PrivateMessagesDetailRecyclerViewAdapter extends RecyclerView.Adapt
|
||||
((SentMessageViewHolder) holder).messageTextView.setBackground(Utils.getTintedDrawable(mViewPrivateMessagesActivity,
|
||||
R.drawable.private_message_ballon, mSentMessageBackgroundColor));
|
||||
} else if (holder instanceof ReceivedMessageViewHolder) {
|
||||
mViewPrivateMessagesActivity.fetchUserAvatar(message.getAuthor(), userAvatarUrl -> {
|
||||
if (!message.getCreatorAvatar().equals("")) {
|
||||
mGlide.load(message.getCreatorAvatar())
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
|
||||
.error(mGlide.load(R.drawable.subreddit_default_icon)
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))))
|
||||
.into(((ReceivedMessageViewHolder) holder).userAvatarImageView);
|
||||
} else {
|
||||
mViewPrivateMessagesActivity.fetchUserAvatar(message.getCreatorQualifiedName(), userAvatarUrl -> {
|
||||
if (userAvatarUrl == null || userAvatarUrl.equals("")) {
|
||||
mGlide.load(R.drawable.subreddit_default_icon)
|
||||
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
|
||||
@@ -179,13 +188,13 @@ public class PrivateMessagesDetailRecyclerViewAdapter extends RecyclerView.Adapt
|
||||
.into(((ReceivedMessageViewHolder) holder).userAvatarImageView);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
((ReceivedMessageViewHolder) holder).userAvatarImageView.setOnClickListener(view -> {
|
||||
if (message.isAuthorDeleted()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Intent intent = new Intent(mViewPrivateMessagesActivity, ViewUserDetailActivity.class);
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, message.getAuthor());
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, message.getCreatorName());
|
||||
intent.putExtra(ViewUserDetailActivity.EXTRA_QUALIFIED_USER_NAME_KEY, message.getCreatorQualifiedName());
|
||||
mViewPrivateMessagesActivity.startActivity(intent);
|
||||
});
|
||||
|
||||
@@ -207,12 +216,12 @@ public class PrivateMessagesDetailRecyclerViewAdapter extends RecyclerView.Adapt
|
||||
}
|
||||
}
|
||||
|
||||
public void setMessage(Message message) {
|
||||
public void setMessage(PrivateMessage message) {
|
||||
mMessage = message;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public void addReply(Message reply) {
|
||||
public void addReply(PrivateMessage reply) {
|
||||
int currentSize = getItemCount();
|
||||
|
||||
if (mMessage != null) {
|
||||
@@ -273,7 +282,7 @@ public class PrivateMessagesDetailRecyclerViewAdapter extends RecyclerView.Adapt
|
||||
copyImageView.setColorFilter(mSecondaryTextColor, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
|
||||
copyImageView.setOnClickListener(view -> {
|
||||
Message message;
|
||||
PrivateMessage message;
|
||||
if (getBindingAdapterPosition() == 0) {
|
||||
message = mMessage;
|
||||
} else {
|
||||
@@ -282,7 +291,7 @@ public class PrivateMessagesDetailRecyclerViewAdapter extends RecyclerView.Adapt
|
||||
if (message != null) {
|
||||
ClipboardManager clipboard = (ClipboardManager) mViewPrivateMessagesActivity.getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
if (clipboard != null) {
|
||||
ClipData clip = ClipData.newPlainText("simple text", message.getBody());
|
||||
ClipData clip = ClipData.newPlainText("simple text", message.getContent());
|
||||
clipboard.setPrimaryClip(clip);
|
||||
if (android.os.Build.VERSION.SDK_INT < 33) {
|
||||
Toast.makeText(mViewPrivateMessagesActivity, R.string.copy_success, Toast.LENGTH_SHORT).show();
|
||||
|
||||
@@ -148,7 +148,7 @@ public class UserListingRecyclerViewAdapter extends PagedListAdapter<UserData, R
|
||||
|
||||
@Override
|
||||
public void isNotSubscribed() {
|
||||
((DataViewHolder) holder).subscribeButton.setVisibility(View.VISIBLE);
|
||||
|
||||
((DataViewHolder) holder).subscribeButton.setOnClickListener(view -> {
|
||||
UserFollowing.followUser(oauthRetrofit, retrofit,
|
||||
accessToken, userData.getName(), accountName, redditDataRoomDatabase,
|
||||
|
||||
@@ -25,7 +25,7 @@ public class AccountSectionRecyclerViewAdapter extends RecyclerView.Adapter<Recy
|
||||
private static final int VIEW_TYPE_MENU_GROUP_TITLE = 1;
|
||||
private static final int VIEW_TYPE_MENU_ITEM = 2;
|
||||
private static final int ACCOUNT_SECTION_ITEMS = 4;
|
||||
private static final int ANONYMOUS_ACCOUNT_SECTION_ITEMS = 2;
|
||||
private static final int ANONYMOUS_ACCOUNT_SECTION_ITEMS = 1;
|
||||
|
||||
private BaseActivity baseActivity;
|
||||
private int inboxCount;
|
||||
|
||||
@@ -39,6 +39,7 @@ public class HeaderSectionRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
|
||||
private Resources resources;
|
||||
private RequestManager glide;
|
||||
private String accountName;
|
||||
private String accountQualifiedName;
|
||||
private String profileImageUrl;
|
||||
private String bannerImageUrl;
|
||||
private int karma;
|
||||
@@ -50,7 +51,7 @@ public class HeaderSectionRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
|
||||
private boolean hideKarma;
|
||||
|
||||
public HeaderSectionRecyclerViewAdapter(BaseActivity baseActivity, CustomThemeWrapper customThemeWrapper,
|
||||
RequestManager glide, String accountName,
|
||||
RequestManager glide, String accountName, String accountQualifiedName,
|
||||
SharedPreferences sharedPreferences,
|
||||
SharedPreferences navigationDrawerSharedPreferences,
|
||||
SharedPreferences securitySharedPreferences,
|
||||
@@ -62,6 +63,7 @@ public class HeaderSectionRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
|
||||
this.accountName = accountName;
|
||||
isLoggedIn = accountName != null;
|
||||
this.pageToggle = pageToggle;
|
||||
this.accountQualifiedName = accountQualifiedName;
|
||||
requireAuthToAccountSection = securitySharedPreferences.getBoolean(SharedPreferencesUtils.REQUIRE_AUTHENTICATION_TO_GO_TO_ACCOUNT_SECTION_IN_NAVIGATION_DRAWER, false);
|
||||
showAvatarOnTheRightInTheNavigationDrawer = sharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_AVATAR_ON_THE_RIGHT, false);
|
||||
showAvatarOnTheRightInTheNavigationDrawer = navigationDrawerSharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_AVATAR_ON_THE_RIGHT, false);
|
||||
@@ -86,15 +88,11 @@ public class HeaderSectionRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
|
||||
}
|
||||
((NavHeaderViewHolder) holder).profileImageView.setLayoutParams(params);
|
||||
if (isLoggedIn) {
|
||||
if (hideKarma) {
|
||||
int karmaTextHeight = ((NavHeaderViewHolder) holder).karmaTextView.getHeight();
|
||||
((NavHeaderViewHolder) holder).karmaTextView.setVisibility(View.GONE);
|
||||
((NavHeaderViewHolder) holder).accountNameTextView.setTranslationY(karmaTextHeight / 2);
|
||||
} else {
|
||||
|
||||
((NavHeaderViewHolder) holder).karmaTextView.setVisibility(View.VISIBLE);
|
||||
((NavHeaderViewHolder) holder).karmaTextView.setText(baseActivity.getString(R.string.karma_info, karma));
|
||||
((NavHeaderViewHolder) holder).karmaTextView.setText(accountQualifiedName);
|
||||
((NavHeaderViewHolder) holder).accountNameTextView.setTranslationY(0);
|
||||
}
|
||||
|
||||
((NavHeaderViewHolder) holder).accountNameTextView.setText(accountName);
|
||||
if (profileImageUrl != null && !profileImageUrl.equals("")) {
|
||||
glide.load(profileImageUrl)
|
||||
|
||||
@@ -18,13 +18,13 @@ import eu.toldi.infinityforlemmy.activities.BaseActivity;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
|
||||
|
||||
public class RedditSectionRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||
public class LemmySectionRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||
|
||||
private static final int VIEW_TYPE_MENU_GROUP_TITLE = 1;
|
||||
private static final int VIEW_TYPE_MENU_ITEM = 2;
|
||||
private static final int REDDIT_SECTION_ITEMS = 1;
|
||||
private static final int LEMMY_SECTION_ITEMS = 2;
|
||||
|
||||
private static final int REDDIT_SECTION_ANONYMOUS_ITEMS = 2;
|
||||
private static final int LEMMY_SECTION_ANONYMOUS_ITEMS = 1;
|
||||
private final boolean isLoggedIn;
|
||||
|
||||
private BaseActivity baseActivity;
|
||||
@@ -34,7 +34,7 @@ public class RedditSectionRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
|
||||
private boolean collapseRedditSection;
|
||||
private NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener itemClickListener;
|
||||
|
||||
public RedditSectionRecyclerViewAdapter(BaseActivity baseActivity, CustomThemeWrapper customThemeWrapper,
|
||||
public LemmySectionRecyclerViewAdapter(BaseActivity baseActivity, CustomThemeWrapper customThemeWrapper,
|
||||
SharedPreferences navigationDrawerSharedPreferences,
|
||||
NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener itemClickListener, boolean isLoggedIn) {
|
||||
this.baseActivity = baseActivity;
|
||||
@@ -76,10 +76,10 @@ public class RedditSectionRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
|
||||
holder.itemView.setOnClickListener(view -> {
|
||||
if (collapseRedditSection) {
|
||||
collapseRedditSection = !collapseRedditSection;
|
||||
notifyItemRangeInserted(holder.getBindingAdapterPosition() + 1, REDDIT_SECTION_ITEMS);
|
||||
notifyItemRangeInserted(holder.getBindingAdapterPosition() + 1, isLoggedIn ? LEMMY_SECTION_ITEMS : LEMMY_SECTION_ANONYMOUS_ITEMS);
|
||||
} else {
|
||||
collapseRedditSection = !collapseRedditSection;
|
||||
notifyItemRangeRemoved(holder.getBindingAdapterPosition() + 1, REDDIT_SECTION_ITEMS);
|
||||
notifyItemRangeRemoved(holder.getBindingAdapterPosition() + 1, isLoggedIn ? LEMMY_SECTION_ITEMS : LEMMY_SECTION_ANONYMOUS_ITEMS);
|
||||
}
|
||||
notifyItemChanged(holder.getBindingAdapterPosition());
|
||||
});
|
||||
@@ -89,12 +89,13 @@ public class RedditSectionRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
|
||||
|
||||
switch (position) {
|
||||
case 1:
|
||||
stringId = R.string.trending;
|
||||
drawableId = R.drawable.ic_trending_24dp;
|
||||
stringId = R.string.instance_info;
|
||||
drawableId = R.drawable.ic_baseline_info_24;
|
||||
break;
|
||||
case 2:
|
||||
stringId = R.string.anonymous_account_instance;
|
||||
drawableId = R.drawable.ic_account_circle_24dp;
|
||||
stringId = R.string.blocks;
|
||||
drawableId = R.drawable.ic_outline_lock_24dp;
|
||||
break;
|
||||
}
|
||||
|
||||
((MenuItemViewHolder) holder).menuTextView.setText(stringId);
|
||||
@@ -106,7 +107,7 @@ public class RedditSectionRecyclerViewAdapter extends RecyclerView.Adapter<Recyc
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return !collapseRedditSection ? (isLoggedIn ? REDDIT_SECTION_ITEMS + 1 : REDDIT_SECTION_ANONYMOUS_ITEMS + 1) : 1;
|
||||
return !collapseRedditSection ? (isLoggedIn ? LEMMY_SECTION_ITEMS + 1 : LEMMY_SECTION_ANONYMOUS_ITEMS + 1) : 1;
|
||||
}
|
||||
|
||||
class MenuGroupTitleViewHolder extends RecyclerView.ViewHolder {
|
||||
@@ -21,6 +21,7 @@ public class NavigationDrawerRecyclerViewMergedAdapter {
|
||||
private FavoriteSubscribedSubredditsSectionRecyclerViewAdapter favoriteSubscribedSubredditsSectionRecyclerViewAdapter;
|
||||
private SubscribedSubredditsRecyclerViewAdapter subscribedSubredditsRecyclerViewAdapter;
|
||||
private AccountManagementSectionRecyclerViewAdapter accountManagementSectionRecyclerViewAdapter;
|
||||
private LemmySectionRecyclerViewAdapter lemmySectionRecyclerViewAdapter;
|
||||
private ConcatAdapter mainPageConcatAdapter;
|
||||
|
||||
public NavigationDrawerRecyclerViewMergedAdapter(BaseActivity baseActivity, SharedPreferences sharedPreferences,
|
||||
@@ -28,12 +29,12 @@ public class NavigationDrawerRecyclerViewMergedAdapter {
|
||||
SharedPreferences navigationDrawerSharedPreferences,
|
||||
SharedPreferences securitySharedPreferences,
|
||||
CustomThemeWrapper customThemeWrapper,
|
||||
String accountName,
|
||||
String accountName, String accountQualifiedName,
|
||||
ItemClickListener itemClickListener) {
|
||||
RequestManager glide = Glide.with(baseActivity);
|
||||
|
||||
headerSectionRecyclerViewAdapter = new HeaderSectionRecyclerViewAdapter(baseActivity, customThemeWrapper,
|
||||
glide, accountName, sharedPreferences, navigationDrawerSharedPreferences, securitySharedPreferences,
|
||||
glide, accountName, accountQualifiedName, sharedPreferences, navigationDrawerSharedPreferences, securitySharedPreferences,
|
||||
new HeaderSectionRecyclerViewAdapter.PageToggle() {
|
||||
@Override
|
||||
public void openAccountSection() {
|
||||
@@ -55,10 +56,13 @@ public class NavigationDrawerRecyclerViewMergedAdapter {
|
||||
customThemeWrapper, navigationDrawerSharedPreferences, itemClickListener);
|
||||
accountManagementSectionRecyclerViewAdapter = new AccountManagementSectionRecyclerViewAdapter(baseActivity,
|
||||
customThemeWrapper, glide, accountName != null, itemClickListener);
|
||||
lemmySectionRecyclerViewAdapter = new LemmySectionRecyclerViewAdapter(baseActivity, customThemeWrapper,
|
||||
navigationDrawerSharedPreferences, itemClickListener, accountName != null);
|
||||
|
||||
mainPageConcatAdapter = new ConcatAdapter(
|
||||
headerSectionRecyclerViewAdapter,
|
||||
accountSectionRecyclerViewAdapter,
|
||||
lemmySectionRecyclerViewAdapter,
|
||||
preferenceSectionRecyclerViewAdapter,
|
||||
favoriteSubscribedSubredditsSectionRecyclerViewAdapter,
|
||||
subscribedSubredditsRecyclerViewAdapter);
|
||||
@@ -70,6 +74,7 @@ public class NavigationDrawerRecyclerViewMergedAdapter {
|
||||
|
||||
private void openAccountSection() {
|
||||
mainPageConcatAdapter.removeAdapter(accountSectionRecyclerViewAdapter);
|
||||
mainPageConcatAdapter.removeAdapter(lemmySectionRecyclerViewAdapter);
|
||||
mainPageConcatAdapter.removeAdapter(preferenceSectionRecyclerViewAdapter);
|
||||
mainPageConcatAdapter.removeAdapter(favoriteSubscribedSubredditsSectionRecyclerViewAdapter);
|
||||
mainPageConcatAdapter.removeAdapter(subscribedSubredditsRecyclerViewAdapter);
|
||||
@@ -81,6 +86,7 @@ public class NavigationDrawerRecyclerViewMergedAdapter {
|
||||
mainPageConcatAdapter.removeAdapter(accountManagementSectionRecyclerViewAdapter);
|
||||
|
||||
mainPageConcatAdapter.addAdapter(accountSectionRecyclerViewAdapter);
|
||||
mainPageConcatAdapter.addAdapter(lemmySectionRecyclerViewAdapter);
|
||||
mainPageConcatAdapter.addAdapter(preferenceSectionRecyclerViewAdapter);
|
||||
mainPageConcatAdapter.addAdapter(favoriteSubscribedSubredditsSectionRecyclerViewAdapter);
|
||||
mainPageConcatAdapter.addAdapter(subscribedSubredditsRecyclerViewAdapter);
|
||||
|
||||
@@ -6,6 +6,7 @@ import com.google.common.util.concurrent.ListenableFuture;
|
||||
|
||||
import eu.toldi.infinityforlemmy.dto.AccountLoginDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.AuthDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.BlockCommunityDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.CommentDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.CommentVoteDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.DeleteCommentDTO;
|
||||
@@ -14,12 +15,19 @@ import eu.toldi.infinityforlemmy.dto.EditCommentDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.EditPostDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.FollowCommunityDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.PostVoteDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.PrivateMessageDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.PrivateMessageReadDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.PrivateMessageReportDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.PrivateMessageUpdateDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.ReadCommentDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.ReadMessageDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.ReadPostDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.ReportCommentDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.ReportPostDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.SaveCommentDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.SavePostDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.SubmitPostDTO;
|
||||
import eu.toldi.infinityforlemmy.dto.UserBlockDTO;
|
||||
import eu.toldi.infinityforlemmy.message.MessageCount;
|
||||
import okhttp3.MultipartBody;
|
||||
import retrofit2.Call;
|
||||
@@ -42,6 +50,10 @@ public interface LemmyAPI {
|
||||
@GET("api/v3/user")
|
||||
Call<String> userInfo(@Query("username") String username, @Query("auth") String access_token);
|
||||
|
||||
@Headers("Content-Type: application/json")
|
||||
@POST("api/v3/user/block")
|
||||
Call<String> userBlock(@Body UserBlockDTO params);
|
||||
|
||||
@GET("api/v3/user/mention")
|
||||
Call<String> userMentions(@Query("sort") String sort, @Query("page") Integer page, @Query("limit") Integer limit, @Query("unread_only") boolean unread_only, @Query("auth") String access_token);
|
||||
|
||||
@@ -76,6 +88,10 @@ public interface LemmyAPI {
|
||||
@POST("api/v3/post")
|
||||
Call<String> postCreate(@Body SubmitPostDTO params);
|
||||
|
||||
@Headers("Content-Type: application/json")
|
||||
@POST("api/v3/post/report")
|
||||
Call<String> postReport(@Body ReportPostDTO params);
|
||||
|
||||
@Headers("Content-Type: application/json")
|
||||
@PUT("api/v3/post")
|
||||
Call<String> postUpdate(@Body EditPostDTO params);
|
||||
@@ -132,10 +148,18 @@ public interface LemmyAPI {
|
||||
@POST("api/v3/comment/like")
|
||||
Call<String> commentLike(@Body CommentVoteDTO params);
|
||||
|
||||
@Headers("Content-Type: application/json")
|
||||
@POST("api/v3/comment/report")
|
||||
Call<String> commentReport(@Body ReportCommentDTO params);
|
||||
|
||||
@Headers("Content-Type: application/json")
|
||||
@POST("api/v3/community/follow")
|
||||
Call<String> communityFollow(@Body FollowCommunityDTO params);
|
||||
|
||||
@Headers("Content-Type: application/json")
|
||||
@POST("api/v3/community/block")
|
||||
Call<String> communityBlock(@Body BlockCommunityDTO params);
|
||||
|
||||
@Headers("Content-Type: application/json")
|
||||
@PUT("api/v3/post/save")
|
||||
Call<String> postSave(@Body SavePostDTO params);
|
||||
@@ -226,4 +250,37 @@ public interface LemmyAPI {
|
||||
Call<String> getSiteInfo(
|
||||
@Query("auth") String auth
|
||||
);
|
||||
|
||||
@GET("api/v3/private_message/list")
|
||||
Call<String> privateMessagesList(
|
||||
@Query("page") Integer page,
|
||||
@Query("limit") Integer limit,
|
||||
@Query("unread_only") Boolean unread_only,
|
||||
@NonNull @Query("auth") String auth
|
||||
);
|
||||
|
||||
@POST("api/v3/private_message")
|
||||
Call<String> privateMessageSend(
|
||||
@Body PrivateMessageDTO params
|
||||
);
|
||||
|
||||
@PUT("api/v3/private_message")
|
||||
Call<String> privateMessageEdit(
|
||||
@Body PrivateMessageUpdateDTO params
|
||||
);
|
||||
|
||||
@POST("api/v3/private_message/delete")
|
||||
Call<String> privateMessageDelete(
|
||||
@Body PrivateMessageUpdateDTO params
|
||||
);
|
||||
|
||||
@POST("api/v3/private_message/mark_as_read")
|
||||
Call<String> privateMessageMarkAsRead(
|
||||
@Body PrivateMessageReadDTO params
|
||||
);
|
||||
|
||||
@POST("api/v3/private_message/report")
|
||||
Call<String> privateMessageReport(
|
||||
@Body PrivateMessageReportDTO params
|
||||
);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,130 @@
|
||||
package eu.toldi.infinityforlemmy.asynctasks;
|
||||
|
||||
import android.os.Handler;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
import eu.toldi.infinityforlemmy.blockedcommunity.BlockedCommunityDao;
|
||||
import eu.toldi.infinityforlemmy.blockedcommunity.BlockedCommunityData;
|
||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserDao;
|
||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserData;
|
||||
|
||||
|
||||
public class InsertBlockedThings {
|
||||
|
||||
public static void insertBlockedThings(Executor executor, Handler handler,
|
||||
RedditDataRoomDatabase redditDataRoomDatabase, @Nullable String accountName,
|
||||
List<BlockedCommunityData> blockedCommunityDataList,
|
||||
List<BlockedUserData> blockedUserDataDataList,
|
||||
|
||||
InsertBlockedThingListener insertSubscribedThingListener) {
|
||||
executor.execute(() -> {
|
||||
if (accountName != null && redditDataRoomDatabase.accountDao().getAccountData(accountName) == null) {
|
||||
handler.post(insertSubscribedThingListener::insertSuccess);
|
||||
return;
|
||||
}
|
||||
|
||||
BlockedUserDao blockedUserDao = redditDataRoomDatabase.blockedUserDao();
|
||||
BlockedCommunityDao blockedCommunityDao = redditDataRoomDatabase.blockedCommunityDao();
|
||||
|
||||
|
||||
if (blockedCommunityDataList != null) {
|
||||
List<BlockedCommunityData> existingBlockedCommunityDaoList =
|
||||
blockedCommunityDao.getAllBlockedCommunitiesList(accountName);
|
||||
Collections.sort(blockedCommunityDataList, (subscribedSubredditData, t1) -> subscribedSubredditData.getName().compareToIgnoreCase(t1.getName()));
|
||||
List<String> unsubscribedSubreddits = new ArrayList<>();
|
||||
compareTwoSubscribedSubredditList(blockedCommunityDataList, existingBlockedCommunityDaoList,
|
||||
unsubscribedSubreddits);
|
||||
|
||||
for (String unsubscribed : unsubscribedSubreddits) {
|
||||
blockedCommunityDao.deleteBlockedCommunity(unsubscribed, accountName);
|
||||
}
|
||||
|
||||
for (BlockedCommunityData s : blockedCommunityDataList) {
|
||||
blockedCommunityDao.insert(s);
|
||||
}
|
||||
}
|
||||
|
||||
if (blockedUserDataDataList != null) {
|
||||
List<BlockedUserData> existingBlockedUserDataList =
|
||||
blockedUserDao.getAllBlockedUsersList(accountName);
|
||||
Collections.sort(blockedUserDataDataList, (subscribedUserData, t1) -> subscribedUserData.getName().compareToIgnoreCase(t1.getName()));
|
||||
List<String> unsubscribedUsers = new ArrayList<>();
|
||||
compareTwoSubscribedUserList(blockedUserDataDataList, existingBlockedUserDataList,
|
||||
unsubscribedUsers);
|
||||
|
||||
for (String unsubscribed : unsubscribedUsers) {
|
||||
blockedUserDao.deleteBlockedUser(unsubscribed, accountName);
|
||||
}
|
||||
|
||||
for (BlockedUserData s : blockedUserDataDataList) {
|
||||
blockedUserDao.insert(s);
|
||||
}
|
||||
}
|
||||
|
||||
handler.post(insertSubscribedThingListener::insertSuccess);
|
||||
});
|
||||
}
|
||||
|
||||
private static void compareTwoSubscribedSubredditList(List<BlockedCommunityData> newSubscribedSubreddits,
|
||||
List<BlockedCommunityData> oldSubscribedSubreddits,
|
||||
List<String> unsubscribedSubredditNames) {
|
||||
int newIndex = 0;
|
||||
for (int oldIndex = 0; oldIndex < oldSubscribedSubreddits.size(); oldIndex++) {
|
||||
if (newIndex >= newSubscribedSubreddits.size()) {
|
||||
for (; oldIndex < oldSubscribedSubreddits.size(); oldIndex++) {
|
||||
unsubscribedSubredditNames.add(oldSubscribedSubreddits.get(oldIndex).getQualified_name());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
BlockedCommunityData old = oldSubscribedSubreddits.get(oldIndex);
|
||||
for (; newIndex < newSubscribedSubreddits.size(); newIndex++) {
|
||||
if (newSubscribedSubreddits.get(newIndex).getQualified_name().compareToIgnoreCase(old.getQualified_name()) == 0) {
|
||||
newIndex++;
|
||||
break;
|
||||
}
|
||||
if (newSubscribedSubreddits.get(newIndex).getQualified_name().compareToIgnoreCase(old.getQualified_name()) > 0) {
|
||||
unsubscribedSubredditNames.add(old.getQualified_name());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void compareTwoSubscribedUserList(List<BlockedUserData> newSubscribedUsers,
|
||||
List<BlockedUserData> oldSubscribedUsers,
|
||||
List<String> unsubscribedUserNames) {
|
||||
int newIndex = 0;
|
||||
for (int oldIndex = 0; oldIndex < oldSubscribedUsers.size(); oldIndex++) {
|
||||
if (newIndex >= newSubscribedUsers.size()) {
|
||||
for (; oldIndex < oldSubscribedUsers.size(); oldIndex++) {
|
||||
unsubscribedUserNames.add(oldSubscribedUsers.get(oldIndex).getQualifiedName());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
BlockedUserData old = oldSubscribedUsers.get(oldIndex);
|
||||
for (; newIndex < newSubscribedUsers.size(); newIndex++) {
|
||||
if (newSubscribedUsers.get(newIndex).getName().compareToIgnoreCase(old.getName()) == 0) {
|
||||
newIndex++;
|
||||
break;
|
||||
}
|
||||
if (newSubscribedUsers.get(newIndex).getName().compareToIgnoreCase(old.getName()) > 0) {
|
||||
unsubscribedUserNames.add(old.getQualifiedName());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public interface InsertBlockedThingListener {
|
||||
void insertSuccess();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package eu.toldi.infinityforlemmy.blockedcommunity;
|
||||
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.room.Dao;
|
||||
import androidx.room.Insert;
|
||||
import androidx.room.OnConflictStrategy;
|
||||
import androidx.room.Query;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Dao
|
||||
public interface BlockedCommunityDao {
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
void insert(BlockedCommunityData communityData);
|
||||
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
void insertAll(List<BlockedCommunityData> blockedCommunityDataList);
|
||||
|
||||
@Query("SELECT * FROM blocked_communities WHERE account_name = :accountName AND name LIKE '%' || :searchQuery || '%' COLLATE NOCASE ORDER BY name COLLATE NOCASE ASC")
|
||||
LiveData<List<BlockedCommunityData>> getAllBlockedCommunitiesWithSearchQuery(String accountName, String searchQuery);
|
||||
|
||||
@Query("SELECT * FROM blocked_communities WHERE account_name = :accountName COLLATE NOCASE ORDER BY name COLLATE NOCASE ASC")
|
||||
List<BlockedCommunityData> getAllBlockedCommunitiesList(String accountName);
|
||||
|
||||
@Query("SELECT * FROM blocked_communities WHERE name = :name COLLATE NOCASE AND account_name = :accountName COLLATE NOCASE LIMIT 1")
|
||||
BlockedCommunityData getBlockedCommunity(String name, String accountName);
|
||||
|
||||
@Query("DELETE FROM blocked_communities WHERE qualified_name = :name COLLATE NOCASE AND account_name = :accountName COLLATE NOCASE")
|
||||
void deleteBlockedCommunity(String name, String accountName);
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
package eu.toldi.infinityforlemmy.blockedcommunity;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.room.ColumnInfo;
|
||||
import androidx.room.Entity;
|
||||
|
||||
import eu.toldi.infinityforlemmy.subreddit.SubredditData;
|
||||
import eu.toldi.infinityforlemmy.utils.LemmyUtils;
|
||||
|
||||
@Entity(tableName = "blocked_communities", primaryKeys = {"id", "account_name"})
|
||||
public class BlockedCommunityData {
|
||||
|
||||
@ColumnInfo(name = "id")
|
||||
private final int id;
|
||||
|
||||
@ColumnInfo(name = "name")
|
||||
private String name;
|
||||
|
||||
@ColumnInfo(name = "qualified_name")
|
||||
private String qualified_name;
|
||||
@ColumnInfo(name = "icon")
|
||||
private String iconUrl;
|
||||
|
||||
@NonNull
|
||||
@ColumnInfo(name = "account_name")
|
||||
private String accountName;
|
||||
|
||||
public BlockedCommunityData(int id, String name, String qualified_name, String iconUrl, @NonNull String accountName) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.qualified_name = qualified_name;
|
||||
this.iconUrl = iconUrl;
|
||||
this.accountName = accountName;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getQualified_name() {
|
||||
return qualified_name;
|
||||
}
|
||||
|
||||
public String getIconUrl() {
|
||||
return iconUrl;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public String getAccountName() {
|
||||
return accountName;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public void setQualified_name(String qualified_name) {
|
||||
this.qualified_name = qualified_name;
|
||||
}
|
||||
|
||||
public void setIconUrl(String iconUrl) {
|
||||
this.iconUrl = iconUrl;
|
||||
}
|
||||
|
||||
public void setAccountName(@NonNull String accountName) {
|
||||
this.accountName = accountName;
|
||||
}
|
||||
|
||||
public BlockedCommunityData(SubredditData subredditData, @NonNull String accountName) {
|
||||
this.id = subredditData.getId();
|
||||
this.name = subredditData.getName();
|
||||
this.qualified_name = LemmyUtils.actorID2FullName(subredditData.getActorId());
|
||||
this.iconUrl = subredditData.getIconUrl();
|
||||
this.accountName = accountName;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package eu.toldi.infinityforlemmy.blockedcommunity;
|
||||
|
||||
import android.os.AsyncTask;
|
||||
|
||||
import androidx.lifecycle.LiveData;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
|
||||
public class BlockedCommunityRepository {
|
||||
private BlockedCommunityDao blockedCommunityDao;
|
||||
private String mAccountName;
|
||||
|
||||
BlockedCommunityRepository(RedditDataRoomDatabase redditDataRoomDatabase, String accountName) {
|
||||
mAccountName = accountName;
|
||||
blockedCommunityDao = redditDataRoomDatabase.blockedCommunityDao();
|
||||
}
|
||||
|
||||
LiveData<List<BlockedCommunityData>> getAllSubscribedSubredditsWithSearchQuery(String searchQuery) {
|
||||
return blockedCommunityDao.getAllBlockedCommunitiesWithSearchQuery(mAccountName, searchQuery);
|
||||
}
|
||||
|
||||
public void insert(BlockedCommunityData subscribedSubredditData) {
|
||||
new insertAsyncTask(blockedCommunityDao).execute(subscribedSubredditData);
|
||||
}
|
||||
|
||||
private static class insertAsyncTask extends AsyncTask<BlockedCommunityData, Void, Void> {
|
||||
|
||||
private BlockedCommunityDao mAsyncTaskDao;
|
||||
|
||||
insertAsyncTask(BlockedCommunityDao dao) {
|
||||
mAsyncTaskDao = dao;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Void doInBackground(final BlockedCommunityData... params) {
|
||||
mAsyncTaskDao.insert(params[0]);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package eu.toldi.infinityforlemmy.blockedcommunity;
|
||||
|
||||
import android.app.Application;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.AndroidViewModel;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
import androidx.lifecycle.Transformations;
|
||||
import androidx.lifecycle.ViewModel;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
|
||||
public class BlockedCommunityViewModel extends AndroidViewModel {
|
||||
private BlockedCommunityRepository blockedCommunityRepository;
|
||||
private LiveData<List<BlockedCommunityData>> mAllBlockedCommunities;
|
||||
private MutableLiveData<String> searchQueryLiveData;
|
||||
|
||||
public BlockedCommunityViewModel(Application application, RedditDataRoomDatabase redditDataRoomDatabase, String accountName) {
|
||||
super(application);
|
||||
blockedCommunityRepository = new BlockedCommunityRepository(redditDataRoomDatabase, accountName);
|
||||
searchQueryLiveData = new MutableLiveData<>();
|
||||
searchQueryLiveData.postValue("");
|
||||
|
||||
mAllBlockedCommunities = Transformations.switchMap(searchQueryLiveData, searchQuery -> blockedCommunityRepository.getAllSubscribedSubredditsWithSearchQuery(searchQuery));
|
||||
}
|
||||
|
||||
public LiveData<List<BlockedCommunityData>> getAllBlockedCommunities() {
|
||||
return mAllBlockedCommunities;
|
||||
}
|
||||
|
||||
public void insert(BlockedCommunityData subscribedSubredditData) {
|
||||
blockedCommunityRepository.insert(subscribedSubredditData);
|
||||
}
|
||||
|
||||
public void setSearchQuery(String searchQuery) {
|
||||
searchQueryLiveData.postValue(searchQuery);
|
||||
}
|
||||
|
||||
public static class Factory extends ViewModelProvider.NewInstanceFactory {
|
||||
private Application mApplication;
|
||||
private RedditDataRoomDatabase mRedditDataRoomDatabase;
|
||||
private String mAccountName;
|
||||
|
||||
public Factory(Application application, RedditDataRoomDatabase redditDataRoomDatabase, String accountName) {
|
||||
this.mApplication = application;
|
||||
this.mRedditDataRoomDatabase = redditDataRoomDatabase;
|
||||
this.mAccountName = accountName;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
|
||||
return (T) new BlockedCommunityViewModel(mApplication, mRedditDataRoomDatabase, mAccountName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package eu.toldi.infinityforlemmy.blockeduser;
|
||||
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.room.Dao;
|
||||
import androidx.room.Insert;
|
||||
import androidx.room.OnConflictStrategy;
|
||||
import androidx.room.Query;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Dao
|
||||
public interface BlockedUserDao {
|
||||
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
void insert(BlockedUserData userData);
|
||||
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
void insertAll(List<BlockedUserData> blockedUserDataDataList);
|
||||
|
||||
@Query("SELECT * FROM blocked_users WHERE account_name = :accountName AND name LIKE '%' || :searchQuery || '%' COLLATE NOCASE ORDER BY name COLLATE NOCASE ASC")
|
||||
LiveData<List<BlockedUserData>> getAllBlockedUsersWithSearchQuery(String accountName, String searchQuery);
|
||||
|
||||
@Query("SELECT * FROM blocked_users WHERE account_name = :accountName COLLATE NOCASE ORDER BY name COLLATE NOCASE ASC")
|
||||
List<BlockedUserData> getAllBlockedUsersList(String accountName);
|
||||
|
||||
@Query("SELECT * FROM blocked_users WHERE name = :name COLLATE NOCASE AND account_name = :accountName COLLATE NOCASE LIMIT 1")
|
||||
BlockedUserData getBlockedUser(String name, String accountName);
|
||||
|
||||
@Query("DELETE FROM blocked_users WHERE qualified_name = :name COLLATE NOCASE AND account_name = :accountName COLLATE NOCASE")
|
||||
void deleteBlockedUser(String name, String accountName);
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
package eu.toldi.infinityforlemmy.blockeduser;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.room.ColumnInfo;
|
||||
import androidx.room.Entity;
|
||||
|
||||
import eu.toldi.infinityforlemmy.user.UserData;
|
||||
import eu.toldi.infinityforlemmy.utils.LemmyUtils;
|
||||
|
||||
@Entity(tableName = "blocked_users", primaryKeys = {"id", "account_name"})
|
||||
public class BlockedUserData {
|
||||
|
||||
@ColumnInfo(name = "id")
|
||||
private final int id;
|
||||
|
||||
@ColumnInfo(name = "name")
|
||||
private String name;
|
||||
|
||||
@ColumnInfo(name = "avatar")
|
||||
private String avatar;
|
||||
|
||||
@ColumnInfo(name = "qualified_name")
|
||||
private String qualifiedName;
|
||||
|
||||
@NonNull
|
||||
@ColumnInfo(name = "account_name")
|
||||
private String accountName;
|
||||
|
||||
public BlockedUserData(int id, String name, String avatar, String qualifiedName, String accountName) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.avatar = avatar;
|
||||
this.qualifiedName = qualifiedName;
|
||||
this.accountName = accountName;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getAvatar() {
|
||||
return avatar;
|
||||
}
|
||||
|
||||
public void setAvatar(String avatar) {
|
||||
this.avatar = avatar;
|
||||
}
|
||||
|
||||
public String getQualifiedName() {
|
||||
return qualifiedName;
|
||||
}
|
||||
|
||||
public void setQualifiedName(String qualifiedName) {
|
||||
this.qualifiedName = qualifiedName;
|
||||
}
|
||||
|
||||
public String getAccountName() {
|
||||
return accountName;
|
||||
}
|
||||
|
||||
public void setAccountName(String accountName) {
|
||||
this.accountName = accountName;
|
||||
}
|
||||
|
||||
public BlockedUserData(UserData userData, @NonNull String accountName) {
|
||||
this.id = userData.getId();
|
||||
this.name = userData.getName();
|
||||
this.avatar = userData.getAvatar();
|
||||
this.qualifiedName = LemmyUtils.actorID2FullName(userData.getActorId());
|
||||
this.accountName = accountName;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package eu.toldi.infinityforlemmy.blockeduser;
|
||||
|
||||
import android.os.AsyncTask;
|
||||
|
||||
import androidx.lifecycle.LiveData;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
|
||||
public class BlockedUserRepository {
|
||||
|
||||
private BlockedUserDao mBlockedUserDao;
|
||||
private String mAccountName;
|
||||
|
||||
BlockedUserRepository(RedditDataRoomDatabase redditDataRoomDatabase, String accountName) {
|
||||
mBlockedUserDao = redditDataRoomDatabase.blockedUserDao();
|
||||
mAccountName = accountName;
|
||||
}
|
||||
|
||||
LiveData<List<BlockedUserData>> getAllBlockedUsersWithSearchQuery(String searchQuery) {
|
||||
return mBlockedUserDao.getAllBlockedUsersWithSearchQuery(mAccountName, searchQuery);
|
||||
}
|
||||
|
||||
LiveData<List<BlockedUserData>> getAllFavoriteSubscribedUsersWithSearchQuery(String searchQuery) {
|
||||
return mBlockedUserDao.getAllBlockedUsersWithSearchQuery(mAccountName, searchQuery);
|
||||
}
|
||||
|
||||
public void insert(BlockedUserData BlockedUserData) {
|
||||
new BlockedUserRepository.insertAsyncTask(mBlockedUserDao).execute(BlockedUserData);
|
||||
}
|
||||
|
||||
private static class insertAsyncTask extends AsyncTask<BlockedUserData, Void, Void> {
|
||||
|
||||
private BlockedUserDao mAsyncTaskDao;
|
||||
|
||||
insertAsyncTask(BlockedUserDao dao) {
|
||||
mAsyncTaskDao = dao;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Void doInBackground(final BlockedUserData... params) {
|
||||
mAsyncTaskDao.insert(params[0]);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
package eu.toldi.infinityforlemmy.blockeduser;
|
||||
|
||||
import android.app.Application;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.AndroidViewModel;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
import androidx.lifecycle.Transformations;
|
||||
import androidx.lifecycle.ViewModel;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
|
||||
public class BlockedUserViewModel extends AndroidViewModel {
|
||||
private BlockedUserRepository blockedUserRepository;
|
||||
private LiveData<List<BlockedUserData>> mAllSubscribedUsers;
|
||||
private MutableLiveData<String> searchQueryLiveData;
|
||||
|
||||
public BlockedUserViewModel(Application application, RedditDataRoomDatabase redditDataRoomDatabase, String accountName) {
|
||||
super(application);
|
||||
blockedUserRepository = new BlockedUserRepository(redditDataRoomDatabase, accountName);
|
||||
searchQueryLiveData = new MutableLiveData<>();
|
||||
searchQueryLiveData.postValue("");
|
||||
|
||||
mAllSubscribedUsers = Transformations.switchMap(searchQueryLiveData, searchQuery -> blockedUserRepository.getAllFavoriteSubscribedUsersWithSearchQuery(searchQuery));
|
||||
}
|
||||
|
||||
public LiveData<List<BlockedUserData>> getAllSubscribedUsers() {
|
||||
return mAllSubscribedUsers;
|
||||
}
|
||||
|
||||
|
||||
public void insert(BlockedUserData BlockedUserData) {
|
||||
blockedUserRepository.insert(BlockedUserData);
|
||||
}
|
||||
|
||||
public void setSearchQuery(String searchQuery) {
|
||||
searchQueryLiveData.postValue(searchQuery);
|
||||
}
|
||||
|
||||
public static class Factory extends ViewModelProvider.NewInstanceFactory {
|
||||
private Application mApplication;
|
||||
private RedditDataRoomDatabase mRedditDataRoomDatabase;
|
||||
private String mAccountName;
|
||||
|
||||
public Factory(Application application, RedditDataRoomDatabase redditDataRoomDatabase, String accountName) {
|
||||
mApplication = application;
|
||||
mRedditDataRoomDatabase = redditDataRoomDatabase;
|
||||
mAccountName = accountName;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
|
||||
return (T) new BlockedUserViewModel(mApplication, mRedditDataRoomDatabase, mAccountName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -10,24 +10,32 @@ import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import eu.toldi.infinityforlemmy.Infinity;
|
||||
import eu.toldi.infinityforlemmy.R;
|
||||
import eu.toldi.infinityforlemmy.activities.BaseActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.CommentActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.EditCommentActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.GiveAwardActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.ReportActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.ViewPostDetailActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.ViewUserDetailActivity;
|
||||
import eu.toldi.infinityforlemmy.comment.Comment;
|
||||
import eu.toldi.infinityforlemmy.comment.LemmyCommentAPI;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||
import eu.toldi.infinityforlemmy.customviews.LandscapeExpandedRoundedBottomSheetDialogFragment;
|
||||
import eu.toldi.infinityforlemmy.utils.Utils;
|
||||
|
||||
@@ -57,6 +65,13 @@ public class CommentMoreBottomSheetFragment extends LandscapeExpandedRoundedBott
|
||||
TextView copyTextView;
|
||||
@BindView(R.id.report_view_comment_more_bottom_sheet_fragment)
|
||||
TextView reportTextView;
|
||||
|
||||
@Inject
|
||||
LemmyCommentAPI lemmyCommentAPI;
|
||||
|
||||
@Inject
|
||||
CustomThemeWrapper mCustomThemeWrapper;
|
||||
|
||||
private BaseActivity activity;
|
||||
|
||||
public CommentMoreBottomSheetFragment() {
|
||||
@@ -66,6 +81,7 @@ public class CommentMoreBottomSheetFragment extends LandscapeExpandedRoundedBott
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
((Infinity) activity.getApplication()).getAppComponent().inject(this);
|
||||
View rootView = inflater.inflate(R.layout.fragment_comment_more_bottom_sheet, container, false);
|
||||
ButterKnife.bind(this, rootView);
|
||||
|
||||
@@ -177,11 +193,44 @@ public class CommentMoreBottomSheetFragment extends LandscapeExpandedRoundedBott
|
||||
});
|
||||
|
||||
reportTextView.setOnClickListener(view -> {
|
||||
/*Intent intent = new Intent(activity, ReportActivity.class);
|
||||
intent.putExtra(ReportActivity.EXTRA_SUBREDDIT_NAME, comment.getCommunityName());
|
||||
intent.putExtra(ReportActivity.EXTRA_THING_FULLNAME, comment.getFullName());
|
||||
activity.startActivity(intent);*/
|
||||
Toast.makeText(activity, R.string.not_implemented, Toast.LENGTH_SHORT).show();
|
||||
if (accessToken == null) {
|
||||
Toast.makeText(activity, R.string.login_first, Toast.LENGTH_SHORT).show();
|
||||
dismiss();
|
||||
return;
|
||||
}
|
||||
LayoutInflater dialog_inflater = LayoutInflater.from(activity);
|
||||
View dialog_view = dialog_inflater.inflate(R.layout.dialog_report, null);
|
||||
EditText reasonEditText = dialog_view.findViewById(R.id.reasonEditText);
|
||||
|
||||
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(activity)
|
||||
.setTitle(R.string.report_post)
|
||||
.setView(dialog_view)
|
||||
.setNegativeButton(R.string.cancel, (dialogInterface, i) -> dialogInterface.dismiss())
|
||||
.setPositiveButton(R.string.send_report, (dialogInterface, i) -> {
|
||||
String reason = reasonEditText.getText().toString();
|
||||
if (reason.isEmpty()) {
|
||||
Toast.makeText(activity, "A report reason must be provided", Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
lemmyCommentAPI.reportComment(comment.getId(), reason, accessToken, new LemmyCommentAPI.ReportCommentCallback() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
Toast.makeText(activity, R.string.report_successful, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure() {
|
||||
Toast.makeText(activity, R.string.report_failed, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
});
|
||||
AlertDialog dialog = builder.create();
|
||||
dialog.show();
|
||||
|
||||
Button positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
|
||||
Button negativeButton = dialog.getButton(AlertDialog.BUTTON_NEGATIVE);
|
||||
positiveButton.setTextColor(mCustomThemeWrapper.getSecondaryTextColor());
|
||||
negativeButton.setTextColor(mCustomThemeWrapper.getSecondaryTextColor());
|
||||
dismiss();
|
||||
});
|
||||
|
||||
|
||||
@@ -41,7 +41,8 @@ public class Comment implements Parcelable {
|
||||
|
||||
private String communityQualifiedName;
|
||||
private Integer parentId;
|
||||
private int score;
|
||||
private int downvotes;
|
||||
private int upvotes;
|
||||
private int voteType;
|
||||
private boolean isSubmitter;
|
||||
private String distinguished;
|
||||
@@ -67,7 +68,7 @@ public class Comment implements Parcelable {
|
||||
|
||||
public Comment(int id, int postId, String fullName, String author, String authorQualifiedName, String linkAuthor,
|
||||
long commentTimeMillis, String commentMarkdown, String commentRawText,
|
||||
String linkId, String communityName, String communityQualifiedName, Integer parentId, int score,
|
||||
String linkId, String communityName, String communityQualifiedName, Integer parentId, int downvotes,int upvotes,
|
||||
int voteType, boolean isSubmitter, String distinguished, String permalink,
|
||||
int depth, boolean collapsed, boolean hasReply, boolean saved, boolean deleted, long edited, String[] path) {
|
||||
this.id = id;
|
||||
@@ -83,7 +84,8 @@ public class Comment implements Parcelable {
|
||||
this.communityName = communityName;
|
||||
this.communityQualifiedName = communityQualifiedName;
|
||||
this.parentId = parentId;
|
||||
this.score = score;
|
||||
this.downvotes = downvotes;
|
||||
this.upvotes = upvotes;
|
||||
this.voteType = voteType;
|
||||
this.isSubmitter = isSubmitter;
|
||||
this.distinguished = distinguished;
|
||||
@@ -132,7 +134,8 @@ public class Comment implements Parcelable {
|
||||
communityName = in.readString();
|
||||
communityQualifiedName = in.readString();
|
||||
parentId = in.readInt();
|
||||
score = in.readInt();
|
||||
downvotes = in.readInt();
|
||||
upvotes = in.readInt();
|
||||
voteType = in.readInt();
|
||||
isSubmitter = in.readByte() != 0;
|
||||
distinguished = in.readString();
|
||||
@@ -228,11 +231,23 @@ public class Comment implements Parcelable {
|
||||
}
|
||||
|
||||
public int getScore() {
|
||||
return score;
|
||||
return upvotes-downvotes;
|
||||
}
|
||||
|
||||
public void setScore(int score) {
|
||||
this.score = score;
|
||||
public int getDownvotes() {
|
||||
return downvotes;
|
||||
}
|
||||
|
||||
public void setDownvotes(int downvotes) {
|
||||
this.downvotes = downvotes;
|
||||
}
|
||||
|
||||
public int getUpvotes() {
|
||||
return upvotes;
|
||||
}
|
||||
|
||||
public void setUpvotes(int upvotes) {
|
||||
this.upvotes = upvotes;
|
||||
}
|
||||
|
||||
public boolean isSubmitter() {
|
||||
@@ -432,7 +447,8 @@ public class Comment implements Parcelable {
|
||||
parcel.writeString(communityName);
|
||||
parcel.writeString(communityQualifiedName);
|
||||
parcel.writeInt(parentId == null ? 0 : parentId);
|
||||
parcel.writeInt(score);
|
||||
parcel.writeInt(downvotes);
|
||||
parcel.writeInt(upvotes);
|
||||
parcel.writeInt(voteType);
|
||||
parcel.writeByte((byte) (isSubmitter ? 1 : 0));
|
||||
parcel.writeString(distinguished);
|
||||
|
||||
@@ -316,10 +316,16 @@ public class ParseComment {
|
||||
String communityName = communityObj.getString("name");
|
||||
String communityQualifiedName = LemmyUtils.actorID2FullName(communityObj.getString("actor_id"));
|
||||
|
||||
int score = countsObj.getInt("score");
|
||||
int upvotes = countsObj.getInt("upvotes");
|
||||
int downvotes = countsObj.getInt("downvotes");
|
||||
int voteType = (jsonObject.isNull("my_vote")) ? 0 : jsonObject.getInt("my_vote");
|
||||
if (voteType != 0)
|
||||
score -= 1;
|
||||
if (voteType != 0) {
|
||||
if(voteType == 1) {
|
||||
upvotes--;
|
||||
} else {
|
||||
downvotes--;
|
||||
}
|
||||
}
|
||||
boolean isSubmitter = creatorObj.getInt("id") == postObj.getInt("creator_id");
|
||||
String distinguished = commentObj.getString("distinguished");
|
||||
String permalink = commentObj.getString("ap_id");
|
||||
@@ -337,7 +343,7 @@ public class ParseComment {
|
||||
|
||||
Comment comment = new Comment(id, postID, fullName, author, authorQualifiedName, linkAuthor, commentTimeMillis,
|
||||
commentMarkdown, commentRawText, linkId, communityName, communityQualifiedName, parentId,
|
||||
score, voteType, isSubmitter, distinguished, permalink, depth, collapsed, hasReply, saved, deleted, edited, path);
|
||||
downvotes,upvotes, voteType, isSubmitter, distinguished, permalink, depth, collapsed, hasReply, saved, deleted, edited, path);
|
||||
int child_count = countsObj.getInt("child_count");
|
||||
comment.setChildCount(child_count);
|
||||
comment.setAuthorIconUrl(authorAvatar);
|
||||
|
||||
@@ -54,22 +54,22 @@ public class CustomThemeWrapper {
|
||||
|
||||
public int getColorPrimary() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.COLOR_PRIMARY,
|
||||
getDefaultColor("#0336FF", "#242424", "#000000"));
|
||||
getDefaultColor("#0336FF", "#393A59", "#000000"));
|
||||
}
|
||||
|
||||
public int getColorPrimaryDark() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.COLOR_PRIMARY_DARK,
|
||||
getDefaultColor("#002BF0", "#121212", "#000000"));
|
||||
getDefaultColor("#002BF0", "#393A59", "#000000"));
|
||||
}
|
||||
|
||||
public int getColorAccent() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.COLOR_ACCENT,
|
||||
getDefaultColor("#FF1868", "#FF1868", "#FF1868"));
|
||||
getDefaultColor("#FF1868", "#F8F8F2", "#FF1868"));
|
||||
}
|
||||
|
||||
public int getColorPrimaryLightTheme() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.COLOR_PRIMARY_LIGHT_THEME,
|
||||
getDefaultColor("#0336FF", "#0336FF", "#0336FF"));
|
||||
getDefaultColor("#0336FF", "#393A59", "#0336FF"));
|
||||
}
|
||||
|
||||
public int getPrimaryTextColor() {
|
||||
@@ -94,12 +94,12 @@ public class CustomThemeWrapper {
|
||||
|
||||
public int getReadPostTitleColor() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.READ_POST_TITLE_COLOR,
|
||||
getDefaultColor("#9D9D9D", "#979797", "#979797"));
|
||||
getDefaultColor("#9D9D9D", "#9D9D9D", "#979797"));
|
||||
}
|
||||
|
||||
public int getReadPostContentColor() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.READ_POST_CONTENT_COLOR,
|
||||
getDefaultColor("#9D9D9D", "#979797", "#979797"));
|
||||
getDefaultColor("#9D9D9D", "#9D9D9D", "#979797"));
|
||||
}
|
||||
|
||||
public int getCommentColor() {
|
||||
@@ -114,27 +114,27 @@ public class CustomThemeWrapper {
|
||||
|
||||
public int getBackgroundColor() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.BACKGROUND_COLOR,
|
||||
getDefaultColor("#FFFFFF", "#121212", "#000000"));
|
||||
getDefaultColor("#FFFFFF", "#282A36", "#000000"));
|
||||
}
|
||||
|
||||
public int getCardViewBackgroundColor() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.CARD_VIEW_BACKGROUND_COLOR,
|
||||
getDefaultColor("#FFFFFF", "#242424", "#000000"));
|
||||
getDefaultColor("#FFFFFF", "#393A59", "#000000"));
|
||||
}
|
||||
|
||||
public int getReadPostCardViewBackgroundColor() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.READ_POST_CARD_VIEW_BACKGROUND_COLOR,
|
||||
getDefaultColor("#F5F5F5", "#101010", "#000000"));
|
||||
getDefaultColor("#F5F5F5", "#1C1F3D", "#000000"));
|
||||
}
|
||||
|
||||
public int getCommentBackgroundColor() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.COMMENT_BACKGROUND_COLOR,
|
||||
getDefaultColor("#FFFFFF", "#242424", "#000000"));
|
||||
getDefaultColor("#FFFFFF", "#393A59", "#000000"));
|
||||
}
|
||||
|
||||
public int getBottomAppBarBackgroundColor() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.BOTTOM_APP_BAR_BACKGROUND_COLOR,
|
||||
getDefaultColor("#FFFFFF", "#121212", "#000000"));
|
||||
getDefaultColor("#FFFFFF", "#393A59", "#000000"));
|
||||
}
|
||||
|
||||
public int getPrimaryIconColor() {
|
||||
@@ -169,22 +169,22 @@ public class CustomThemeWrapper {
|
||||
|
||||
public int getCircularProgressBarBackground() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.CIRCULAR_PROGRESS_BAR_BACKGROUND,
|
||||
getDefaultColor("#FFFFFF", "#242424", "#000000"));
|
||||
getDefaultColor("#FFFFFF", "#393A59", "#000000"));
|
||||
}
|
||||
|
||||
public int getMediaIndicatorIconColor() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.MEDIA_INDICATOR_ICON_COLOR,
|
||||
getDefaultColor("#FFFFFF", "#000000", "#000000"));
|
||||
getDefaultColor("#FFFFFF", "#FFFFFF", "#000000"));
|
||||
}
|
||||
|
||||
public int getMediaIndicatorBackgroundColor() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.MEDIA_INDICATOR_BACKGROUND_COLOR,
|
||||
getDefaultColor("#000000", "#FFFFFF", "#FFFFFF"));
|
||||
getDefaultColor("#000000", "#000000", "#FFFFFF"));
|
||||
}
|
||||
|
||||
public int getTabLayoutWithExpandedCollapsingToolbarTabBackground() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.TAB_LAYOUT_WITH_EXPANDED_COLLAPSING_TOOLBAR_TAB_BACKGROUND,
|
||||
getDefaultColor("#FFFFFF", "#242424", "#000000"));
|
||||
getDefaultColor("#FFFFFF", "#393A59", "#000000"));
|
||||
}
|
||||
|
||||
public int getTabLayoutWithExpandedCollapsingToolbarTextColor() {
|
||||
@@ -199,7 +199,7 @@ public class CustomThemeWrapper {
|
||||
|
||||
public int getTabLayoutWithCollapsedCollapsingToolbarTabBackground() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.TAB_LAYOUT_WITH_COLLAPSED_COLLAPSING_TOOLBAR_TAB_BACKGROUND,
|
||||
getDefaultColor("#0336FF", "#242424", "#000000"));
|
||||
getDefaultColor("#0336FF", "#393A59", "#000000"));
|
||||
}
|
||||
|
||||
public int getTabLayoutWithCollapsedCollapsingToolbarTextColor() {
|
||||
@@ -214,7 +214,7 @@ public class CustomThemeWrapper {
|
||||
|
||||
public int getUpvoted() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.UPVOTED,
|
||||
getDefaultColor("#FF1868", "#FF1868", "#FF1868"));
|
||||
getDefaultColor("#FF1868", "#FF008C", "#FF1868"));
|
||||
}
|
||||
|
||||
public int getDownvoted() {
|
||||
@@ -294,12 +294,12 @@ public class CustomThemeWrapper {
|
||||
|
||||
public int getStickiedPostIconTint() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.STICKIED_POST_ICON_TINT,
|
||||
getDefaultColor("#002BF0", "#0336FF", "#0336FF"));
|
||||
getDefaultColor("#002BF0", "#02ABEE", "#0336FF"));
|
||||
}
|
||||
|
||||
public int getNoPreviewPostTypeIconTint() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.NO_PREVIEW_POST_TYPE_ICON_TINT,
|
||||
getDefaultColor("#808080", "#808080", "#808080"));
|
||||
getDefaultColor("#808080", "#FFFFFF", "#808080"));
|
||||
}
|
||||
|
||||
public int getSubscribed() {
|
||||
@@ -309,7 +309,7 @@ public class CustomThemeWrapper {
|
||||
|
||||
public int getUnsubscribed() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.UNSUBSCRIBED,
|
||||
getDefaultColor("#002BF0", "#0336FF", "#0336FF"));
|
||||
getDefaultColor("#002BF0", "#002BF0", "#0336FF"));
|
||||
}
|
||||
|
||||
public int getUsername() {
|
||||
@@ -319,7 +319,7 @@ public class CustomThemeWrapper {
|
||||
|
||||
public int getSubreddit() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.SUBREDDIT,
|
||||
getDefaultColor("#FF1868", "#FF1868", "#FF1868"));
|
||||
getDefaultColor("#FF1868", "#FF4B9C", "#FF1868"));
|
||||
}
|
||||
|
||||
public int getAuthorFlairTextColor() {
|
||||
@@ -344,12 +344,12 @@ public class CustomThemeWrapper {
|
||||
|
||||
public int getSingleCommentThreadBackgroundColor() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.SINGLE_COMMENT_THREAD_BACKGROUND_COLOR,
|
||||
getDefaultColor("#B3E5F9", "#123E77", "#123E77"));
|
||||
getDefaultColor("#B3E5F9", "#5F5B85", "#123E77"));
|
||||
}
|
||||
|
||||
public int getUnreadMessageBackgroundColor() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.UNREAD_MESSAGE_BACKGROUND_COLOR,
|
||||
getDefaultColor("#B3E5F9", "#123E77", "#123E77"));
|
||||
getDefaultColor("#B3E5F9", "#5F5B85", "#123E77"));
|
||||
}
|
||||
|
||||
public int getDividerColor() {
|
||||
@@ -359,52 +359,52 @@ public class CustomThemeWrapper {
|
||||
|
||||
public int getNoPreviewPostTypeBackgroundColor() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.NO_PREVIEW_POST_TYPE_BACKGROUND_COLOR,
|
||||
getDefaultColor("#E0E0E0", "#424242", "#424242"));
|
||||
getDefaultColor("#E0E0E0", "#6272A4", "#424242"));
|
||||
}
|
||||
|
||||
public int getVoteAndReplyUnavailableButtonColor() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.VOTE_AND_REPLY_UNAVAILABLE_BUTTON_COLOR,
|
||||
getDefaultColor("#F0F0F0", "#3C3C3C", "#3C3C3C"));
|
||||
getDefaultColor("#F0F0F0", "#777C82", "#3C3C3C"));
|
||||
}
|
||||
|
||||
public int getCommentVerticalBarColor1() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.COMMENT_VERTICAL_BAR_COLOR_1,
|
||||
getDefaultColor("#0336FF", "#0336FF", "#0336FF"));
|
||||
getDefaultColor("#0336FF", "#8BE9FD", "#0336FF"));
|
||||
}
|
||||
|
||||
public int getCommentVerticalBarColor2() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.COMMENT_VERTICAL_BAR_COLOR_2,
|
||||
getDefaultColor("#EE02BE", "#C300B3", "#C300B3"));
|
||||
getDefaultColor("#EE02BE", "#50FA7B", "#C300B3"));
|
||||
}
|
||||
|
||||
public int getCommentVerticalBarColor3() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.COMMENT_VERTICAL_BAR_COLOR_3,
|
||||
getDefaultColor("#02DFEE", "#00B8DA", "#00B8DA"));
|
||||
getDefaultColor("#02DFEE", "#FFB86C", "#00B8DA"));
|
||||
}
|
||||
|
||||
public int getCommentVerticalBarColor4() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.COMMENT_VERTICAL_BAR_COLOR_4,
|
||||
getDefaultColor("#EED502", "#EDCA00", "#EDCA00"));
|
||||
getDefaultColor("#EED502", "#FF79C6", "#EDCA00"));
|
||||
}
|
||||
|
||||
public int getCommentVerticalBarColor5() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.COMMENT_VERTICAL_BAR_COLOR_5,
|
||||
getDefaultColor("#EE0220", "#EE0219", "#EE0219"));
|
||||
getDefaultColor("#EE0220", "#BD93F9", "#EE0219"));
|
||||
}
|
||||
|
||||
public int getCommentVerticalBarColor6() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.COMMENT_VERTICAL_BAR_COLOR_6,
|
||||
getDefaultColor("#02EE6E", "#00B925", "#00B925"));
|
||||
getDefaultColor("#02EE6E", "#FF5555", "#00B925"));
|
||||
}
|
||||
|
||||
public int getCommentVerticalBarColor7() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.COMMENT_VERTICAL_BAR_COLOR_7,
|
||||
getDefaultColor("#EE4602", "#EE4602", "#EE4602"));
|
||||
getDefaultColor("#EE4602", "#F1FA8C", "#EE4602"));
|
||||
}
|
||||
|
||||
public int getFABIconColor() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.FAB_ICON_COLOR,
|
||||
getDefaultColor("#FFFFFF", "#FFFFFF", "#FFFFFF"));
|
||||
getDefaultColor("#FFFFFF", "#000000", "#FFFFFF"));
|
||||
}
|
||||
|
||||
public int getChipTextColor() {
|
||||
@@ -449,12 +449,12 @@ public class CustomThemeWrapper {
|
||||
|
||||
public int getAwardedCommentBackgroundColor() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.AWARDED_COMMENT_BACKGROUND_COLOR,
|
||||
getDefaultColor("#FFFFFF", "#242424", "#000000"));
|
||||
getDefaultColor("#FFFFFF", "#393A59", "#000000"));
|
||||
}
|
||||
|
||||
public int getNavBarColor() {
|
||||
return getThemeSharedPreferences().getInt(CustomThemeSharedPreferencesUtils.NAV_BAR_COLOR,
|
||||
getDefaultColor("#FFFFFF", "#121212", "#000000"));
|
||||
getDefaultColor("#FFFFFF", "#393A59", "#000000"));
|
||||
}
|
||||
|
||||
public boolean isLightStatusBar() {
|
||||
@@ -1536,4 +1536,17 @@ public class CustomThemeWrapper {
|
||||
|
||||
return customTheme;
|
||||
}
|
||||
|
||||
public static int darkenColor(int color, float factor) {
|
||||
int a = Color.alpha(color);
|
||||
int r = Math.round(Color.red(color) * factor);
|
||||
int g = Math.round(Color.green(color) * factor);
|
||||
int b = Math.round(Color.blue(color) * factor);
|
||||
|
||||
return Color.argb(a,
|
||||
Math.min(r, 255),
|
||||
Math.min(g, 255),
|
||||
Math.min(b, 255));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
package eu.toldi.infinityforlemmy.events;
|
||||
|
||||
import eu.toldi.infinityforlemmy.message.Message;
|
||||
import eu.toldi.infinityforlemmy.privatemessage.PrivateMessage;
|
||||
|
||||
public class RepliedToPrivateMessageEvent {
|
||||
public Message newReply;
|
||||
public PrivateMessage newReply;
|
||||
public int messagePosition;
|
||||
|
||||
public RepliedToPrivateMessageEvent(Message newReply, int messagePosition) {
|
||||
public RepliedToPrivateMessageEvent(PrivateMessage newReply, int messagePosition) {
|
||||
this.newReply = newReply;
|
||||
this.messagePosition = messagePosition;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,202 @@
|
||||
package eu.toldi.infinityforlemmy.fragments;
|
||||
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.Resources;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.RequestManager;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import eu.toldi.infinityforlemmy.FragmentCommunicator;
|
||||
import eu.toldi.infinityforlemmy.Infinity;
|
||||
import eu.toldi.infinityforlemmy.R;
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
import eu.toldi.infinityforlemmy.activities.BaseActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.SubscribedThingListingActivity;
|
||||
import eu.toldi.infinityforlemmy.adapters.BlockedCommunitiesRecyclerViewAdapter;
|
||||
import eu.toldi.infinityforlemmy.blockedcommunity.BlockedCommunityViewModel;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||
import eu.toldi.infinityforlemmy.customviews.LinearLayoutManagerBugFixed;
|
||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
|
||||
import me.zhanghai.android.fastscroll.FastScrollerBuilder;
|
||||
import retrofit2.Retrofit;
|
||||
|
||||
|
||||
/**
|
||||
* A simple {@link Fragment} subclass.
|
||||
*/
|
||||
public class BlockedCommunitiesListingFragment extends Fragment implements FragmentCommunicator {
|
||||
|
||||
public static final String EXTRA_ACCOUNT_NAME = "EAN";
|
||||
public static final String EXTRA_ACCESS_TOKEN = "EAT";
|
||||
public static final String EXTRA_ACCOUNT_PROFILE_IMAGE_URL = "EAPIU";
|
||||
public static final String EXTRA_IS_SUBREDDIT_SELECTION = "EISS";
|
||||
public static final String EXTRA_EXTRA_CLEAR_SELECTION = "EECS";
|
||||
public static final String EXTRA_ACCOUNT_QUALIFIED_NAME = "EAQN";
|
||||
|
||||
@BindView(R.id.swipe_refresh_layout_subscribed_subreddits_listing_fragment)
|
||||
SwipeRefreshLayout mSwipeRefreshLayout;
|
||||
@BindView(R.id.recycler_view_subscribed_subreddits_listing_fragment)
|
||||
RecyclerView mRecyclerView;
|
||||
@BindView(R.id.no_subscriptions_linear_layout_subreddits_listing_fragment)
|
||||
LinearLayout mLinearLayout;
|
||||
@BindView(R.id.no_subscriptions_image_view_subreddits_listing_fragment)
|
||||
ImageView mImageView;
|
||||
@BindView(R.id.error_text_view_subscribed_subreddits_listing_fragment)
|
||||
TextView mErrorTextView;
|
||||
@Inject
|
||||
@Named("oauth")
|
||||
Retrofit mOauthRetrofit;
|
||||
@Inject
|
||||
@Named("default")
|
||||
SharedPreferences mSharedPreferences;
|
||||
@Inject
|
||||
RedditDataRoomDatabase mRedditDataRoomDatabase;
|
||||
@Inject
|
||||
CustomThemeWrapper mCustomThemeWrapper;
|
||||
@Inject
|
||||
Executor mExecutor;
|
||||
public BlockedCommunityViewModel mSubscribedSubredditViewModel;
|
||||
private BaseActivity mActivity;
|
||||
private RequestManager mGlide;
|
||||
private LinearLayoutManagerBugFixed mLinearLayoutManager;
|
||||
|
||||
public BlockedCommunitiesListingFragment() {
|
||||
// Required empty public constructor
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
View rootView = inflater.inflate(R.layout.fragment_subscribed_subreddits_listing, container, false);
|
||||
|
||||
ButterKnife.bind(this, rootView);
|
||||
|
||||
((Infinity) mActivity.getApplication()).getAppComponent().inject(this);
|
||||
|
||||
applyTheme();
|
||||
|
||||
if ((mActivity instanceof BaseActivity && ((BaseActivity) mActivity).isImmersiveInterface())) {
|
||||
mRecyclerView.setPadding(0, 0, 0, ((BaseActivity) mActivity).getNavBarHeight());
|
||||
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
|
||||
&& mSharedPreferences.getBoolean(SharedPreferencesUtils.IMMERSIVE_INTERFACE_KEY, true)) {
|
||||
Resources resources = getResources();
|
||||
int navBarResourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
|
||||
if (navBarResourceId > 0) {
|
||||
mRecyclerView.setPadding(0, 0, 0, resources.getDimensionPixelSize(navBarResourceId));
|
||||
}
|
||||
}
|
||||
|
||||
String accountName = getArguments().getString(EXTRA_ACCOUNT_NAME, "-");
|
||||
String accountQualifiedName = getArguments().getString(EXTRA_ACCOUNT_QUALIFIED_NAME, "-");
|
||||
String accessToken = getArguments().getString(EXTRA_ACCESS_TOKEN);
|
||||
|
||||
if (accessToken == null) {
|
||||
mSwipeRefreshLayout.setEnabled(false);
|
||||
}
|
||||
|
||||
mGlide = Glide.with(this);
|
||||
|
||||
mLinearLayoutManager = new LinearLayoutManagerBugFixed(mActivity);
|
||||
mRecyclerView.setLayoutManager(mLinearLayoutManager);
|
||||
|
||||
BlockedCommunitiesRecyclerViewAdapter adapter = new BlockedCommunitiesRecyclerViewAdapter(mActivity, mExecutor, mOauthRetrofit, mRedditDataRoomDatabase,
|
||||
mCustomThemeWrapper, accessToken);
|
||||
|
||||
|
||||
mRecyclerView.setAdapter(adapter);
|
||||
new FastScrollerBuilder(mRecyclerView).useMd2Style().build();
|
||||
|
||||
mSubscribedSubredditViewModel = new ViewModelProvider(this,
|
||||
new BlockedCommunityViewModel.Factory(mActivity.getApplication(), mRedditDataRoomDatabase, accountQualifiedName))
|
||||
.get(BlockedCommunityViewModel.class);
|
||||
mSubscribedSubredditViewModel.getAllBlockedCommunities().observe(getViewLifecycleOwner(), subscribedSubredditData -> {
|
||||
mSwipeRefreshLayout.setRefreshing(false);
|
||||
if (subscribedSubredditData == null || subscribedSubredditData.size() == 0) {
|
||||
mRecyclerView.setVisibility(View.GONE);
|
||||
mLinearLayout.setVisibility(View.VISIBLE);
|
||||
mGlide.load(R.drawable.error_image).into(mImageView);
|
||||
} else {
|
||||
mLinearLayout.setVisibility(View.GONE);
|
||||
mRecyclerView.setVisibility(View.VISIBLE);
|
||||
mGlide.clear(mImageView);
|
||||
}
|
||||
|
||||
if (accessToken != null) {
|
||||
adapter.addUser(accountName, getArguments().getString(EXTRA_ACCOUNT_PROFILE_IMAGE_URL));
|
||||
}
|
||||
adapter.setSubscribedSubreddits(subscribedSubredditData);
|
||||
});
|
||||
|
||||
/* mSubscribedSubredditViewModel.getAllFavoriteSubscribedSubreddits().observe(getViewLifecycleOwner(), favoriteSubscribedSubredditData -> {
|
||||
mSwipeRefreshLayout.setRefreshing(false);
|
||||
if (favoriteSubscribedSubredditData != null && favoriteSubscribedSubredditData.size() > 0) {
|
||||
mLinearLayout.setVisibility(View.GONE);
|
||||
mRecyclerView.setVisibility(View.VISIBLE);
|
||||
mGlide.clear(mImageView);
|
||||
}
|
||||
|
||||
adapter.setFavoriteSubscribedSubreddits(favoriteSubscribedSubredditData);
|
||||
});*/
|
||||
|
||||
return rootView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(@NonNull Context context) {
|
||||
super.onAttach(context);
|
||||
mActivity = (BaseActivity) context;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stopRefreshProgressbar() {
|
||||
mSwipeRefreshLayout.setRefreshing(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyTheme() {
|
||||
if (mActivity instanceof SubscribedThingListingActivity) {
|
||||
mSwipeRefreshLayout.setOnRefreshListener(() -> ((SubscribedThingListingActivity) mActivity).loadSubscriptions(true));
|
||||
mSwipeRefreshLayout.setProgressBackgroundColorSchemeColor(mCustomThemeWrapper.getCircularProgressBarBackground());
|
||||
mSwipeRefreshLayout.setColorSchemeColors(mCustomThemeWrapper.getColorAccent());
|
||||
} else {
|
||||
mSwipeRefreshLayout.setEnabled(false);
|
||||
}
|
||||
mErrorTextView.setTextColor(mCustomThemeWrapper.getSecondaryTextColor());
|
||||
if (mActivity.typeface != null) {
|
||||
mErrorTextView.setTypeface(mActivity.contentTypeface);
|
||||
}
|
||||
}
|
||||
|
||||
public void goBackToTop() {
|
||||
if (mLinearLayoutManager != null) {
|
||||
mLinearLayoutManager.scrollToPositionWithOffset(0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
public void changeSearchQuery(String searchQuery) {
|
||||
mSubscribedSubredditViewModel.setSearchQuery(searchQuery);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,172 @@
|
||||
package eu.toldi.infinityforlemmy.fragments;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.Resources;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.RequestManager;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import eu.toldi.infinityforlemmy.FragmentCommunicator;
|
||||
import eu.toldi.infinityforlemmy.Infinity;
|
||||
import eu.toldi.infinityforlemmy.R;
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
import eu.toldi.infinityforlemmy.activities.BaseActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.BlockedThingListingActivity;
|
||||
import eu.toldi.infinityforlemmy.adapters.BlockedUsersRecyclerViewAdapter;
|
||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserViewModel;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||
import eu.toldi.infinityforlemmy.customviews.LinearLayoutManagerBugFixed;
|
||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
|
||||
import me.zhanghai.android.fastscroll.FastScrollerBuilder;
|
||||
import retrofit2.Retrofit;
|
||||
|
||||
public class BlockedUsersListingFragment extends Fragment implements FragmentCommunicator {
|
||||
public static final String EXTRA_ACCOUNT_NAME = "EAN";
|
||||
public static final String EXTRA_ACCESS_TOKEN = "EAT";
|
||||
|
||||
@BindView(R.id.swipe_refresh_layout_followed_users_listing_fragment)
|
||||
SwipeRefreshLayout mSwipeRefreshLayout;
|
||||
@BindView(R.id.recycler_view_followed_users_listing_fragment)
|
||||
RecyclerView mRecyclerView;
|
||||
@BindView(R.id.no_subscriptions_linear_layout_followed_users_listing_fragment)
|
||||
LinearLayout mLinearLayout;
|
||||
@BindView(R.id.no_subscriptions_image_view_followed_users_listing_fragment)
|
||||
ImageView mImageView;
|
||||
@BindView(R.id.error_text_view_followed_users_listing_fragment)
|
||||
TextView mErrorTextView;
|
||||
@Inject
|
||||
@Named("oauth")
|
||||
Retrofit mOauthRetrofit;
|
||||
@Inject
|
||||
@Named("default")
|
||||
SharedPreferences mSharedPreferences;
|
||||
@Inject
|
||||
RedditDataRoomDatabase mRedditDataRoomDatabase;
|
||||
@Inject
|
||||
CustomThemeWrapper mCustomThemeWrapper;
|
||||
@Inject
|
||||
Executor mExecutor;
|
||||
BlockedUserViewModel blockedUserViewModel;
|
||||
private BaseActivity mActivity;
|
||||
private RequestManager mGlide;
|
||||
private LinearLayoutManagerBugFixed mLinearLayoutManager;
|
||||
|
||||
public BlockedUsersListingFragment() {
|
||||
// Required empty public constructor
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
View rootView = inflater.inflate(R.layout.fragment_followed_users_listing, container, false);
|
||||
|
||||
ButterKnife.bind(this, rootView);
|
||||
|
||||
((Infinity) mActivity.getApplication()).getAppComponent().inject(this);
|
||||
|
||||
applyTheme();
|
||||
|
||||
Resources resources = getResources();
|
||||
|
||||
if ((mActivity instanceof BaseActivity && ((BaseActivity) mActivity).isImmersiveInterface())) {
|
||||
mRecyclerView.setPadding(0, 0, 0, ((BaseActivity) mActivity).getNavBarHeight());
|
||||
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
|
||||
&& mSharedPreferences.getBoolean(SharedPreferencesUtils.IMMERSIVE_INTERFACE_KEY, true)) {
|
||||
int navBarResourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
|
||||
if (navBarResourceId > 0) {
|
||||
mRecyclerView.setPadding(0, 0, 0, resources.getDimensionPixelSize(navBarResourceId));
|
||||
}
|
||||
}
|
||||
|
||||
mGlide = Glide.with(this);
|
||||
|
||||
String accessToken = getArguments().getString(EXTRA_ACCESS_TOKEN);
|
||||
if (accessToken == null) {
|
||||
mSwipeRefreshLayout.setEnabled(false);
|
||||
}
|
||||
mLinearLayoutManager = new LinearLayoutManagerBugFixed(mActivity);
|
||||
mRecyclerView.setLayoutManager(mLinearLayoutManager);
|
||||
BlockedUsersRecyclerViewAdapter adapter = new BlockedUsersRecyclerViewAdapter(mActivity,
|
||||
mExecutor, mOauthRetrofit, mRedditDataRoomDatabase, mCustomThemeWrapper, accessToken);
|
||||
mRecyclerView.setAdapter(adapter);
|
||||
new FastScrollerBuilder(mRecyclerView).useMd2Style().build();
|
||||
|
||||
blockedUserViewModel = new ViewModelProvider(this,
|
||||
new BlockedUserViewModel.Factory(mActivity.getApplication(), mRedditDataRoomDatabase, getArguments().getString(EXTRA_ACCOUNT_NAME)))
|
||||
.get(BlockedUserViewModel.class);
|
||||
|
||||
blockedUserViewModel.getAllSubscribedUsers().observe(getViewLifecycleOwner(), subscribedUserData -> {
|
||||
mSwipeRefreshLayout.setRefreshing(false);
|
||||
if (subscribedUserData == null || subscribedUserData.size() == 0) {
|
||||
mRecyclerView.setVisibility(View.GONE);
|
||||
mLinearLayout.setVisibility(View.VISIBLE);
|
||||
mGlide.load(R.drawable.error_image).into(mImageView);
|
||||
} else {
|
||||
mLinearLayout.setVisibility(View.GONE);
|
||||
mRecyclerView.setVisibility(View.VISIBLE);
|
||||
mGlide.clear(mImageView);
|
||||
}
|
||||
adapter.setSubscribedUsers(subscribedUserData);
|
||||
});
|
||||
|
||||
return rootView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(@NonNull Context context) {
|
||||
super.onAttach(context);
|
||||
mActivity = (BaseActivity) context;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stopRefreshProgressbar() {
|
||||
mSwipeRefreshLayout.setRefreshing(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyTheme() {
|
||||
if (mActivity instanceof BlockedThingListingActivity) {
|
||||
mSwipeRefreshLayout.setOnRefreshListener(() -> ((BlockedThingListingActivity) mActivity).loadBlocks(true));
|
||||
mSwipeRefreshLayout.setProgressBackgroundColorSchemeColor(mCustomThemeWrapper.getCircularProgressBarBackground());
|
||||
mSwipeRefreshLayout.setColorSchemeColors(mCustomThemeWrapper.getColorAccent());
|
||||
} else {
|
||||
mSwipeRefreshLayout.setEnabled(false);
|
||||
}
|
||||
mErrorTextView.setTextColor(mCustomThemeWrapper.getSecondaryTextColor());
|
||||
if (mActivity.typeface != null) {
|
||||
mErrorTextView.setTypeface(mActivity.typeface);
|
||||
}
|
||||
}
|
||||
|
||||
public void goBackToTop() {
|
||||
if (mLinearLayoutManager != null) {
|
||||
mLinearLayoutManager.scrollToPositionWithOffset(0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
public void changeSearchQuery(String searchQuery) {
|
||||
blockedUserViewModel.setSearchQuery(searchQuery);
|
||||
}
|
||||
}
|
||||
@@ -1033,7 +1033,8 @@ public class HistoryPostFragment extends Fragment implements FragmentCommunicato
|
||||
if (post != null && post.getFullName().equals(event.post.getFullName())) {
|
||||
post.setTitle(event.post.getTitle());
|
||||
post.setVoteType(event.post.getVoteType());
|
||||
post.setScore(event.post.getScore());
|
||||
post.setDownvotes(event.post.getDownvotes());
|
||||
post.setUpvotes(event.post.getUpvotes());
|
||||
post.setNComments(event.post.getNComments());
|
||||
post.setNSFW(event.post.isNSFW());
|
||||
post.setHidden(event.post.isHidden());
|
||||
|
||||
@@ -137,7 +137,6 @@ import eu.toldi.infinityforlemmy.post.PostPagingSource;
|
||||
import eu.toldi.infinityforlemmy.post.PostViewModel;
|
||||
import eu.toldi.infinityforlemmy.postfilter.PostFilter;
|
||||
import eu.toldi.infinityforlemmy.postfilter.PostFilterUsage;
|
||||
import eu.toldi.infinityforlemmy.utils.LemmyUtils;
|
||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
|
||||
import eu.toldi.infinityforlemmy.utils.Utils;
|
||||
import eu.toldi.infinityforlemmy.videoautoplay.ExoCreator;
|
||||
@@ -530,7 +529,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
|
||||
|
||||
sort = mSortTypeSharedPreferences.getString(SharedPreferencesUtils.SORT_TYPE_SUBREDDIT_POST_BASE + subredditName,
|
||||
mSharedPreferences.getString(SharedPreferencesUtils.SUBREDDIT_DEFAULT_SORT_TYPE, SortType.Type.HOT.name()));
|
||||
if (sort.equals(sort.equals(SortType.Type.TOP.name()))) {
|
||||
if (sort.equalsIgnoreCase(SortType.Type.TOP.value)) {
|
||||
sortTime = mSortTypeSharedPreferences.getString(SharedPreferencesUtils.SORT_TIME_SUBREDDIT_POST_BASE + subredditName,
|
||||
mSharedPreferences.getString(SharedPreferencesUtils.SUBREDDIT_DEFAULT_SORT_TIME, SortType.Time.ALL.name()));
|
||||
}
|
||||
@@ -538,7 +537,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
|
||||
postLayout = mPostLayoutSharedPreferences.getInt(SharedPreferencesUtils.POST_LAYOUT_SUBREDDIT_POST_BASE + subredditName, defaultPostLayout);
|
||||
|
||||
if (sortTime != null) {
|
||||
sortType = new SortType(SortType.Type.valueOf(sort), SortType.Time.valueOf(sortTime));
|
||||
sortType = new SortType(SortType.Type.fromValue(sortTime));
|
||||
} else {
|
||||
sortType = new SortType(SortType.Type.valueOf(sort));
|
||||
}
|
||||
@@ -670,10 +669,10 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
|
||||
|
||||
String sort = mSortTypeSharedPreferences.getString(SharedPreferencesUtils.SORT_TYPE_USER_POST_BASE + username,
|
||||
mSharedPreferences.getString(SharedPreferencesUtils.USER_DEFAULT_SORT_TYPE, SortType.Type.NEW.name()));
|
||||
if (sort.equals(SortType.Type.TOP.name())) {
|
||||
if (sort.equalsIgnoreCase(SortType.Type.TOP.value)) {
|
||||
String sortTime = mSortTypeSharedPreferences.getString(SharedPreferencesUtils.SORT_TIME_USER_POST_BASE + username,
|
||||
mSharedPreferences.getString(SharedPreferencesUtils.USER_DEFAULT_SORT_TIME, SortType.Time.ALL.name()));
|
||||
sortType = new SortType(SortType.Type.valueOf(sort), SortType.Time.valueOf(sortTime));
|
||||
sortType = new SortType(SortType.Type.fromValue(sortTime));
|
||||
} else {
|
||||
sortType = new SortType(SortType.Type.valueOf(sort));
|
||||
}
|
||||
@@ -1781,7 +1780,8 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
|
||||
if (post != null && post.getFullName().equals(event.post.getFullName())) {
|
||||
post.setTitle(event.post.getTitle());
|
||||
post.setVoteType(event.post.getVoteType());
|
||||
post.setScore(event.post.getScore());
|
||||
post.setDownvotes(event.post.getDownvotes());
|
||||
post.setUpvotes(event.post.getUpvotes());
|
||||
post.setNComments(event.post.getNComments());
|
||||
post.setNSFW(event.post.isNSFW());
|
||||
post.setHidden(event.post.isHidden());
|
||||
|
||||
@@ -0,0 +1,243 @@
|
||||
package eu.toldi.infinityforlemmy.fragments;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.paging.PagedList;
|
||||
import androidx.recyclerview.widget.DividerItemDecoration;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.RequestManager;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import eu.toldi.infinityforlemmy.FragmentCommunicator;
|
||||
import eu.toldi.infinityforlemmy.Infinity;
|
||||
import eu.toldi.infinityforlemmy.NetworkState;
|
||||
import eu.toldi.infinityforlemmy.R;
|
||||
import eu.toldi.infinityforlemmy.RecyclerViewContentScrollingInterface;
|
||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
|
||||
import eu.toldi.infinityforlemmy.RetrofitHolder;
|
||||
import eu.toldi.infinityforlemmy.activities.BaseActivity;
|
||||
import eu.toldi.infinityforlemmy.adapters.PrivateMessageRecycleViewAdapter;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||
import eu.toldi.infinityforlemmy.customviews.LinearLayoutManagerBugFixed;
|
||||
import eu.toldi.infinityforlemmy.events.RepliedToPrivateMessageEvent;
|
||||
import eu.toldi.infinityforlemmy.privatemessage.LemmyPrivateMessageAPI;
|
||||
import eu.toldi.infinityforlemmy.privatemessage.PrivateMessage;
|
||||
import eu.toldi.infinityforlemmy.privatemessage.PrivateMessageViewModel;
|
||||
|
||||
public class PrivateMessageFragment extends Fragment implements FragmentCommunicator {
|
||||
|
||||
public static final String EXTRA_ACCESS_TOKEN = "EAT";
|
||||
public static final String EXTRA_MESSAGE_WHERE = "EMT";
|
||||
@BindView(R.id.swipe_refresh_layout_inbox_fragment)
|
||||
SwipeRefreshLayout mSwipeRefreshLayout;
|
||||
@BindView(R.id.recycler_view_inbox_fragment)
|
||||
RecyclerView mRecyclerView;
|
||||
@BindView(R.id.fetch_messages_info_linear_layout_inbox_fragment)
|
||||
LinearLayout mFetchMessageInfoLinearLayout;
|
||||
@BindView(R.id.fetch_messages_info_image_view_inbox_fragment)
|
||||
ImageView mFetchMessageInfoImageView;
|
||||
@BindView(R.id.fetch_messages_info_text_view_inbox_fragment)
|
||||
TextView mFetchMessageInfoTextView;
|
||||
PrivateMessageViewModel mMessageViewModel;
|
||||
@Inject
|
||||
@Named("no_oauth")
|
||||
RetrofitHolder mRetrofit;
|
||||
@Inject
|
||||
RedditDataRoomDatabase mRedditDataRoomDatabase;
|
||||
@Inject
|
||||
@Named("default")
|
||||
SharedPreferences mSharedPreferences;
|
||||
@Inject
|
||||
CustomThemeWrapper mCustomThemeWrapper;
|
||||
|
||||
@Inject
|
||||
LemmyPrivateMessageAPI mLemmyPrivateMessageAPI;
|
||||
private String mAccessToken;
|
||||
private PrivateMessageRecycleViewAdapter mAdapter;
|
||||
private RequestManager mGlide;
|
||||
private LinearLayoutManagerBugFixed mLinearLayoutManager;
|
||||
private BaseActivity mActivity;
|
||||
|
||||
public PrivateMessageFragment() {
|
||||
// Required empty public constructor
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState) {
|
||||
Log.i("PrivateMessageFragment", "onCreateView");
|
||||
View rootView = inflater.inflate(R.layout.fragment_inbox, container, false);
|
||||
|
||||
((Infinity) mActivity.getApplication()).getAppComponent().inject(this);
|
||||
|
||||
ButterKnife.bind(this, rootView);
|
||||
|
||||
EventBus.getDefault().register(this);
|
||||
|
||||
applyTheme();
|
||||
|
||||
Bundle arguments = getArguments();
|
||||
if (arguments == null) {
|
||||
return rootView;
|
||||
}
|
||||
mAccessToken = getArguments().getString(EXTRA_ACCESS_TOKEN);
|
||||
mGlide = Glide.with(this);
|
||||
|
||||
if (mActivity.isImmersiveInterface()) {
|
||||
mRecyclerView.setPadding(0, 0, 0, mActivity.getNavBarHeight());
|
||||
}
|
||||
|
||||
|
||||
mAdapter = new PrivateMessageRecycleViewAdapter(mActivity, mRetrofit.getRetrofit(), mCustomThemeWrapper, mAccessToken, mLemmyPrivateMessageAPI, () -> mMessageViewModel.refresh());
|
||||
mLinearLayoutManager = new LinearLayoutManagerBugFixed(mActivity);
|
||||
mRecyclerView.setLayoutManager(mLinearLayoutManager);
|
||||
mRecyclerView.setAdapter(mAdapter);
|
||||
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mActivity, mLinearLayoutManager.getOrientation());
|
||||
mRecyclerView.addItemDecoration(dividerItemDecoration);
|
||||
|
||||
if (mActivity instanceof RecyclerViewContentScrollingInterface) {
|
||||
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
|
||||
@Override
|
||||
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
|
||||
if (dy > 0) {
|
||||
((RecyclerViewContentScrollingInterface) mActivity).contentScrollDown();
|
||||
} else if (dy < 0) {
|
||||
((RecyclerViewContentScrollingInterface) mActivity).contentScrollUp();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
PrivateMessageViewModel.Factory factory = new PrivateMessageViewModel.Factory(mRetrofit.getRetrofit(),
|
||||
getResources().getConfiguration().locale, mAccessToken, mLemmyPrivateMessageAPI);
|
||||
mMessageViewModel = new ViewModelProvider(this, factory).get(PrivateMessageViewModel.class);
|
||||
mMessageViewModel.getPrivateMessages().observe(getViewLifecycleOwner(), messages -> mAdapter.submitList(messages));
|
||||
|
||||
|
||||
mMessageViewModel.getInitialLoadState().observe(getViewLifecycleOwner(), networkState -> {
|
||||
if (networkState.getStatus().equals(NetworkState.Status.SUCCESS)) {
|
||||
mSwipeRefreshLayout.setRefreshing(false);
|
||||
} else if (networkState.getStatus().equals(NetworkState.Status.FAILED)) {
|
||||
mSwipeRefreshLayout.setRefreshing(false);
|
||||
mFetchMessageInfoLinearLayout.setOnClickListener(view -> {
|
||||
mFetchMessageInfoLinearLayout.setVisibility(View.GONE);
|
||||
mMessageViewModel.refresh();
|
||||
mAdapter.setNetworkState(null);
|
||||
});
|
||||
showErrorView(R.string.load_messages_failed);
|
||||
} else {
|
||||
mSwipeRefreshLayout.setRefreshing(true);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
mSwipeRefreshLayout.setOnRefreshListener(this::onRefresh);
|
||||
|
||||
return rootView;
|
||||
}
|
||||
|
||||
private void showErrorView(int stringResId) {
|
||||
mSwipeRefreshLayout.setRefreshing(false);
|
||||
mFetchMessageInfoLinearLayout.setVisibility(View.VISIBLE);
|
||||
mFetchMessageInfoTextView.setText(stringResId);
|
||||
mGlide.load(R.drawable.error_image).into(mFetchMessageInfoImageView);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyTheme() {
|
||||
mSwipeRefreshLayout.setProgressBackgroundColorSchemeColor(mCustomThemeWrapper.getCircularProgressBarBackground());
|
||||
mSwipeRefreshLayout.setColorSchemeColors(mCustomThemeWrapper.getColorAccent());
|
||||
mFetchMessageInfoTextView.setTextColor(mCustomThemeWrapper.getSecondaryTextColor());
|
||||
if (mActivity.typeface != null) {
|
||||
mFetchMessageInfoTextView.setTypeface(mActivity.typeface);
|
||||
}
|
||||
}
|
||||
|
||||
public void goBackToTop() {
|
||||
if (mLinearLayoutManager != null) {
|
||||
mLinearLayoutManager.scrollToPositionWithOffset(0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
public void markAllMessagesRead() {
|
||||
if (mAdapter != null) {
|
||||
mAdapter.setMarkAllMessagesAsRead(true);
|
||||
|
||||
int previousPosition = -1;
|
||||
if (mLinearLayoutManager != null) {
|
||||
previousPosition = mLinearLayoutManager.findFirstVisibleItemPosition();
|
||||
}
|
||||
|
||||
RecyclerView.LayoutManager layoutManager = mRecyclerView.getLayoutManager();
|
||||
mRecyclerView.setAdapter(null);
|
||||
mRecyclerView.setLayoutManager(null);
|
||||
mRecyclerView.setAdapter(mAdapter);
|
||||
mRecyclerView.setLayoutManager(layoutManager);
|
||||
|
||||
if (previousPosition > 0) {
|
||||
mRecyclerView.scrollToPosition(previousPosition);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void onRefresh() {
|
||||
mMessageViewModel.refresh();
|
||||
mSwipeRefreshLayout.setRefreshing(false);
|
||||
}
|
||||
|
||||
public PrivateMessage getMessageByIndex(int index) {
|
||||
if (mMessageViewModel == null || index < 0) {
|
||||
return null;
|
||||
}
|
||||
PagedList<PrivateMessage> messages = mMessageViewModel.getPrivateMessages().getValue();
|
||||
if (messages == null) {
|
||||
return null;
|
||||
}
|
||||
if (index >= messages.size()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return messages.get(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
EventBus.getDefault().unregister(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(@NonNull Context context) {
|
||||
super.onAttach(context);
|
||||
mActivity = (BaseActivity) context;
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onRepliedToPrivateMessageEvent(RepliedToPrivateMessageEvent repliedToPrivateMessageEvent) {
|
||||
/* if (mAdapter != null && mWhere.equals(FetchMessage.WHERE_MESSAGES)) {
|
||||
mAdapter.updateMessageReply(repliedToPrivateMessageEvent.newReply, repliedToPrivateMessageEvent.messagePosition);
|
||||
}*/
|
||||
}
|
||||
}
|
||||
@@ -40,6 +40,7 @@ import eu.toldi.infinityforlemmy.markdown.MarkdownUtils;
|
||||
import eu.toldi.infinityforlemmy.subreddit.FetchSubredditData;
|
||||
import eu.toldi.infinityforlemmy.subreddit.SubredditData;
|
||||
import eu.toldi.infinityforlemmy.subreddit.SubredditViewModel;
|
||||
import eu.toldi.infinityforlemmy.utils.LemmyUtils;
|
||||
import io.noties.markwon.AbstractMarkwonPlugin;
|
||||
import io.noties.markwon.Markwon;
|
||||
import io.noties.markwon.MarkwonConfiguration;
|
||||
@@ -97,7 +98,7 @@ public class SidebarFragment extends Fragment {
|
||||
mAccessToken = getArguments().getString(EXTRA_ACCESS_TOKEN);
|
||||
subredditName = getArguments().getString(EXTRA_SUBREDDIT_NAME);
|
||||
communityQualifiedName = getArguments().getString(EXTRA_COMMUNITY_QUALIFIED_NAME);
|
||||
if (subredditName == null) {
|
||||
if (communityQualifiedName == null) {
|
||||
Toast.makeText(activity, R.string.error_getting_community_name, Toast.LENGTH_SHORT).show();
|
||||
return rootView;
|
||||
}
|
||||
@@ -166,7 +167,7 @@ public class SidebarFragment extends Fragment {
|
||||
});
|
||||
|
||||
mSubredditViewModel = new ViewModelProvider(activity,
|
||||
new SubredditViewModel.Factory(activity.getApplication(), mRedditDataRoomDatabase, communityQualifiedName))
|
||||
new SubredditViewModel.Factory(activity.getApplication(), mRedditDataRoomDatabase, LemmyUtils.qualifiedCommunityName2ActorId(communityQualifiedName)))
|
||||
.get(SubredditViewModel.class);
|
||||
mSubredditViewModel.getSubredditLiveData().observe(getViewLifecycleOwner(), subredditData -> {
|
||||
if (subredditData != null) {
|
||||
|
||||
@@ -61,6 +61,7 @@ public class SubredditListingFragment extends Fragment implements FragmentCommun
|
||||
public static final String EXTRA_IS_GETTING_SUBREDDIT_INFO = "EIGSI";
|
||||
public static final String EXTRA_ACCESS_TOKEN = "EAT";
|
||||
public static final String EXTRA_ACCOUNT_NAME = "EAN";
|
||||
public static final String EXTRA_ACCOUNT_QUALIFIED_NAME = "EAQN";
|
||||
public static final String EXTRA_IS_MULTI_SELECTION = "EIMS";
|
||||
|
||||
@BindView(R.id.coordinator_layout_subreddit_listing_fragment)
|
||||
@@ -135,13 +136,14 @@ public class SubredditListingFragment extends Fragment implements FragmentCommun
|
||||
boolean isGettingSubredditInfo = getArguments().getBoolean(EXTRA_IS_GETTING_SUBREDDIT_INFO);
|
||||
String accessToken = getArguments().getString(EXTRA_ACCESS_TOKEN);
|
||||
String accountName = getArguments().getString(EXTRA_ACCOUNT_NAME);
|
||||
String accountQualifiedName = getArguments().getString(EXTRA_ACCOUNT_QUALIFIED_NAME);
|
||||
|
||||
String sort = mSortTypeSharedPreferences.getString(SharedPreferencesUtils.SORT_TYPE_SEARCH_SUBREDDIT, SortType.Type.TOP_ALL.value);
|
||||
sortType = new SortType(SortType.Type.fromValue(sort));
|
||||
boolean nsfw = !mSharedPreferences.getBoolean(SharedPreferencesUtils.DISABLE_NSFW_FOREVER, false) && mNsfwAndSpoilerSharedPreferences.getBoolean((accountName == null ? "" : accountName) + SharedPreferencesUtils.NSFW_BASE, false);
|
||||
|
||||
mAdapter = new SubredditListingRecyclerViewAdapter(mActivity, mExecutor, mRetrofit.getRetrofit(), mRetrofit.getRetrofit(),
|
||||
mCustomThemeWrapper, accessToken, accountName,
|
||||
mCustomThemeWrapper, accessToken, accountQualifiedName,
|
||||
mRedditDataRoomDatabase, getArguments().getBoolean(EXTRA_IS_MULTI_SELECTION, false),
|
||||
new SubredditListingRecyclerViewAdapter.Callback() {
|
||||
@Override
|
||||
|
||||
@@ -24,6 +24,8 @@ import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
@@ -31,6 +33,7 @@ import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.content.res.AppCompatResources;
|
||||
import androidx.appcompat.view.menu.MenuItemImpl;
|
||||
import androidx.core.content.res.ResourcesCompat;
|
||||
@@ -79,7 +82,6 @@ import eu.toldi.infinityforlemmy.SortType;
|
||||
import eu.toldi.infinityforlemmy.activities.CommentActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.EditPostActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.PostFilterPreferenceActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.ReportActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.SubmitCrosspostActivity;
|
||||
import eu.toldi.infinityforlemmy.activities.ViewPostDetailActivity;
|
||||
import eu.toldi.infinityforlemmy.adapters.CommentsRecyclerViewAdapter;
|
||||
@@ -87,12 +89,12 @@ import eu.toldi.infinityforlemmy.adapters.PostDetailRecyclerViewAdapter;
|
||||
import eu.toldi.infinityforlemmy.apis.LemmyAPI;
|
||||
import eu.toldi.infinityforlemmy.apis.StreamableAPI;
|
||||
import eu.toldi.infinityforlemmy.asynctasks.LoadUserData;
|
||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.FlairBottomSheetFragment;
|
||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.PostCommentSortTypeBottomSheetFragment;
|
||||
import eu.toldi.infinityforlemmy.comment.Comment;
|
||||
import eu.toldi.infinityforlemmy.comment.FetchComment;
|
||||
import eu.toldi.infinityforlemmy.comment.FetchRemovedComment;
|
||||
import eu.toldi.infinityforlemmy.comment.FetchRemovedCommentReveddit;
|
||||
import eu.toldi.infinityforlemmy.community.BlockCommunity;
|
||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
|
||||
import eu.toldi.infinityforlemmy.customviews.CustomToroContainer;
|
||||
import eu.toldi.infinityforlemmy.customviews.LinearLayoutManagerBugFixed;
|
||||
@@ -107,11 +109,15 @@ import eu.toldi.infinityforlemmy.message.ReadMessage;
|
||||
import eu.toldi.infinityforlemmy.post.FetchPost;
|
||||
import eu.toldi.infinityforlemmy.post.FetchRemovedPost;
|
||||
import eu.toldi.infinityforlemmy.post.HidePost;
|
||||
import eu.toldi.infinityforlemmy.post.LemmyPostAPI;
|
||||
import eu.toldi.infinityforlemmy.post.MarkPostAsRead;
|
||||
import eu.toldi.infinityforlemmy.post.Post;
|
||||
import eu.toldi.infinityforlemmy.readpost.InsertReadPost;
|
||||
import eu.toldi.infinityforlemmy.subreddit.FetchSubredditData;
|
||||
import eu.toldi.infinityforlemmy.subreddit.SubredditData;
|
||||
import eu.toldi.infinityforlemmy.user.BlockUser;
|
||||
import eu.toldi.infinityforlemmy.user.FetchUserData;
|
||||
import eu.toldi.infinityforlemmy.user.UserData;
|
||||
import eu.toldi.infinityforlemmy.utils.APIUtils;
|
||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
|
||||
import eu.toldi.infinityforlemmy.utils.Utils;
|
||||
@@ -192,6 +198,8 @@ public class ViewPostDetailFragment extends Fragment implements FragmentCommunic
|
||||
Executor mExecutor;
|
||||
@Inject
|
||||
MarkPostAsRead markPostAsRead;
|
||||
@Inject
|
||||
LemmyPostAPI mLemmyPostAPI;
|
||||
@State
|
||||
Post mPost;
|
||||
@State
|
||||
@@ -221,6 +229,10 @@ public class ViewPostDetailFragment extends Fragment implements FragmentCommunic
|
||||
boolean mRespectSubredditRecommendedSortType;
|
||||
@State
|
||||
long viewPostDetailFragmentId;
|
||||
|
||||
@State
|
||||
boolean isCommunityBlocked;
|
||||
|
||||
private ViewPostDetailActivity activity;
|
||||
private RequestManager mGlide;
|
||||
private Locale mLocale;
|
||||
@@ -609,8 +621,8 @@ public class ViewPostDetailFragment extends Fragment implements FragmentCommunic
|
||||
mExoCreator, post -> EventBus.getDefault().post(new PostUpdateEventToPostList(mPost, postListPosition)));
|
||||
mCommentsAdapter = new CommentsRecyclerViewAdapter(activity,
|
||||
this, mCustomThemeWrapper, mExecutor, mRetrofit.getRetrofit(),
|
||||
mAccessToken, mAccountName, mPost, mLocale, mSingleCommentId
|
||||
, isSingleCommentThreadMode, mSharedPreferences,
|
||||
mAccessToken, mAccountQualifiedName, mPost, mLocale, mSingleCommentId
|
||||
, isSingleCommentThreadMode, mSharedPreferences, mCurrentAccountSharedPreferences,
|
||||
new CommentsRecyclerViewAdapter.CommentRecyclerViewAdapterCallback() {
|
||||
@Override
|
||||
public void retryFetchingComments() {
|
||||
@@ -785,6 +797,8 @@ public class ViewPostDetailFragment extends Fragment implements FragmentCommunic
|
||||
mGlide.clear(mFetchPostInfoImageView);
|
||||
if (children != null) {
|
||||
children.clear();
|
||||
pages_loaded = 0;
|
||||
mCommentsAdapter.clearLoadedComments();
|
||||
}
|
||||
this.sortType = sortType.getType();
|
||||
if (mSharedPreferences.getBoolean(SharedPreferencesUtils.SAVE_SORT_TYPE, true)) {
|
||||
@@ -1071,17 +1085,117 @@ public class ViewPostDetailFragment extends Fragment implements FragmentCommunic
|
||||
} else if (itemId == R.id.action_spoiler_view_post_detail_fragment) {
|
||||
return true;
|
||||
} else if (itemId == R.id.action_block_user_view_post_detail_fragment) {
|
||||
Toast.makeText(activity, R.string.not_implemented, Toast.LENGTH_SHORT).show();
|
||||
if (mAccessToken == null) {
|
||||
Toast.makeText(activity, R.string.login_first, Toast.LENGTH_SHORT).show();
|
||||
return true;
|
||||
}
|
||||
new MaterialAlertDialogBuilder(activity, R.style.MaterialAlertDialogTheme)
|
||||
.setTitle(R.string.block_user)
|
||||
.setMessage(R.string.are_you_sure)
|
||||
.setPositiveButton(R.string.yes, (dialogInterface, i)
|
||||
-> FetchUserData.fetchUserData(mRetrofit.getRetrofit(), mPost.getAuthorNamePrefixed(), new FetchUserData.FetchUserDataListener() {
|
||||
|
||||
@Override
|
||||
public void onFetchUserDataSuccess(UserData userData, int inboxCount) {
|
||||
BlockUser.blockUser(mRetrofit.getRetrofit(), mAccessToken, userData.getId(), true, new BlockUser.BlockUserListener() {
|
||||
|
||||
@Override
|
||||
public void success() {
|
||||
Toast.makeText(activity, R.string.block_user_success, Toast.LENGTH_SHORT).show();
|
||||
activity.finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void failed() {
|
||||
Toast.makeText(activity, R.string.block_user_failed, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFetchUserDataFailed() {
|
||||
Toast.makeText(activity, R.string.block_user_failed, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}))
|
||||
.setNegativeButton(R.string.no, null)
|
||||
.show();
|
||||
return true;
|
||||
} else if (itemId == R.id.action_block_community_view_post_detail_fragment) {
|
||||
Toast.makeText(activity, R.string.not_implemented, Toast.LENGTH_SHORT).show();
|
||||
if (mAccessToken == null) {
|
||||
Toast.makeText(activity, R.string.login_first, Toast.LENGTH_SHORT).show();
|
||||
return true;
|
||||
}
|
||||
new MaterialAlertDialogBuilder(activity, R.style.MaterialAlertDialogTheme)
|
||||
.setTitle(R.string.block_community)
|
||||
.setMessage(R.string.are_you_sure)
|
||||
.setPositiveButton(R.string.yes, (dialogInterface, i)
|
||||
-> FetchSubredditData.fetchSubredditData(mRetrofit.getRetrofit(), mPost.getSubredditNamePrefixed(), mAccessToken, new FetchSubredditData.FetchSubredditDataListener() {
|
||||
@Override
|
||||
public void onFetchSubredditDataSuccess(SubredditData subredditData, int nCurrentOnlineSubscribers) {
|
||||
BlockCommunity.INSTANCE.blockCommunity(mRetrofit.getRetrofit(), subredditData.getId(), mAccessToken, new BlockCommunity.BlockCommunityListener() {
|
||||
@Override
|
||||
public void onBlockCommunitySuccess() {
|
||||
Toast.makeText(activity, R.string.block_community_success, Toast.LENGTH_SHORT).show();
|
||||
activity.finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockCommunityError() {
|
||||
Toast.makeText(activity, R.string.block_community_failed, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFetchSubredditDataFail(boolean isQuarantined) {
|
||||
Toast.makeText(activity, R.string.block_community_failed, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}))
|
||||
.setNegativeButton(R.string.no, null)
|
||||
.show();
|
||||
return true;
|
||||
} else if (itemId == R.id.action_report_view_post_detail_fragment) {
|
||||
if (mAccessToken == null) {
|
||||
Toast.makeText(activity, R.string.login_first, Toast.LENGTH_SHORT).show();
|
||||
return true;
|
||||
}
|
||||
Toast.makeText(activity, R.string.not_implemented, Toast.LENGTH_SHORT).show();
|
||||
if (mAccessToken == null) {
|
||||
Toast.makeText(activity, R.string.login_first, Toast.LENGTH_SHORT).show();
|
||||
return true;
|
||||
}
|
||||
LayoutInflater inflater = LayoutInflater.from(activity);
|
||||
View view = inflater.inflate(R.layout.dialog_report, null);
|
||||
EditText reasonEditText = view.findViewById(R.id.reasonEditText);
|
||||
|
||||
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(activity)
|
||||
.setTitle(R.string.report_post)
|
||||
.setView(view)
|
||||
.setNegativeButton(R.string.cancel, (dialogInterface, i) -> dialogInterface.dismiss())
|
||||
.setPositiveButton(R.string.send_report, (dialogInterface, i) -> {
|
||||
String reason = reasonEditText.getText().toString();
|
||||
if (reason.isEmpty()) {
|
||||
Toast.makeText(activity, "A report reason must be provided", Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
mLemmyPostAPI.reportPost(mPost.getId(), reason, mAccessToken, new LemmyPostAPI.ReportPostCallback() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
Toast.makeText(activity, R.string.report_successful, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure() {
|
||||
Toast.makeText(activity, R.string.report_failed, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
});
|
||||
AlertDialog dialog = builder.create();
|
||||
dialog.show();
|
||||
|
||||
Button positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
|
||||
Button negativeButton = dialog.getButton(AlertDialog.BUTTON_NEGATIVE);
|
||||
positiveButton.setTextColor(mCustomThemeWrapper.getSecondaryTextColor());
|
||||
negativeButton.setTextColor(mCustomThemeWrapper.getSecondaryTextColor());
|
||||
return true;
|
||||
} else if (itemId == R.id.action_see_removed_view_post_detail_fragment) {
|
||||
showRemovedPost();
|
||||
@@ -1231,14 +1345,14 @@ public class ViewPostDetailFragment extends Fragment implements FragmentCommunic
|
||||
mPostDetailsSharedPreferences, mExoCreator,
|
||||
post1 -> EventBus.getDefault().post(new PostUpdateEventToPostList(mPost, postListPosition)));
|
||||
mSwipeRefreshLayout.setRefreshing(false);
|
||||
FetchComment.fetchComments(mExecutor, new Handler(), mRetrofit.getRetrofit(), mAccessToken, post.getId(), mSingleCommentId == 0 ? null : mSingleCommentParentId == 0 ? mSingleCommentId : mSingleCommentParentId, sortType, mExpandChildren, 1, new FetchComment.FetchCommentListener() {
|
||||
FetchComment.fetchComments(mExecutor, new Handler(), mRetrofit.getRetrofit(), mAccessToken, post.getId(), mSingleCommentId == null || mSingleCommentId == 0 ? null : mSingleCommentParentId == 0 ? mSingleCommentId : mSingleCommentParentId, sortType, mExpandChildren, 1, new FetchComment.FetchCommentListener() {
|
||||
@Override
|
||||
public void onFetchCommentSuccess(ArrayList<Comment> expandedComments, Integer parentId, ArrayList<Integer> children) {
|
||||
pages_loaded++;
|
||||
mCommentsAdapter = new CommentsRecyclerViewAdapter(activity,
|
||||
ViewPostDetailFragment.this, mCustomThemeWrapper, mExecutor,
|
||||
mRetrofit.getRetrofit(), mAccessToken, mAccountName, mPost, mLocale,
|
||||
mSingleCommentId, isSingleCommentThreadMode, mSharedPreferences,
|
||||
mRetrofit.getRetrofit(), mAccessToken, mAccountQualifiedName, mPost, mLocale,
|
||||
mSingleCommentId, isSingleCommentThreadMode, mSharedPreferences, mCurrentAccountSharedPreferences,
|
||||
new CommentsRecyclerViewAdapter.CommentRecyclerViewAdapterCallback() {
|
||||
@Override
|
||||
public void retryFetchingComments() {
|
||||
@@ -1350,7 +1464,7 @@ public class ViewPostDetailFragment extends Fragment implements FragmentCommunic
|
||||
}
|
||||
|
||||
|
||||
FetchComment.fetchComments(mExecutor, new Handler(), mRetrofit.getRetrofit(), mAccessToken, mPost.getId(), mSingleCommentId == 0 ? null : mSingleCommentParentId == 0 ? mSingleCommentId : mSingleCommentParentId, sortType, mExpandChildren, pages_loaded + 1,
|
||||
FetchComment.fetchComments(mExecutor, new Handler(), mRetrofit.getRetrofit(), mAccessToken, mPost.getId(), mSingleCommentId == null || mSingleCommentId == 0 ? null : mSingleCommentParentId == 0 ? mSingleCommentId : mSingleCommentParentId, sortType, mExpandChildren, pages_loaded + 1,
|
||||
new FetchComment.FetchCommentListener() {
|
||||
@Override
|
||||
public void onFetchCommentSuccess(ArrayList<Comment> expandedComments,
|
||||
@@ -1440,7 +1554,7 @@ public class ViewPostDetailFragment extends Fragment implements FragmentCommunic
|
||||
isLoadingMoreChildren = true;
|
||||
|
||||
FetchComment.fetchComments(mExecutor, new Handler(), mRetrofit.getRetrofit(), mAccessToken,
|
||||
mPost.getId(), mSingleCommentId == 0 ? null : mSingleCommentParentId == 0 ? mSingleCommentId : mSingleCommentParentId, sortType, mExpandChildren, pages_loaded + 1, new FetchComment.FetchCommentListener() {
|
||||
mPost.getId(), (mSingleCommentId == null || mSingleCommentId == 0) ? null : (mSingleCommentParentId == null || mSingleCommentParentId == 0 ? mSingleCommentId : mSingleCommentParentId), sortType, mExpandChildren, pages_loaded + 1, new FetchComment.FetchCommentListener() {
|
||||
@Override
|
||||
public void onFetchCommentSuccess(ArrayList<Comment> expandedComments, Integer parentId, ArrayList<Integer> children) {
|
||||
pages_loaded++;
|
||||
|
||||
@@ -52,6 +52,7 @@ public class MarkdownUtils {
|
||||
.usePlugin(LinkifyPlugin.create(Linkify.WEB_URLS))
|
||||
.usePlugin(TableEntryPlugin.create(context))
|
||||
.usePlugin(ClickableGlideImagesPlugin.create(context))
|
||||
.usePlugin(new MarkwonLemmyLinkPlugin())
|
||||
.build();
|
||||
}
|
||||
|
||||
@@ -71,6 +72,7 @@ public class MarkdownUtils {
|
||||
.usePlugin(LinkifyPlugin.create(Linkify.WEB_URLS))
|
||||
.usePlugin(TableEntryPlugin.create(context))
|
||||
.usePlugin(GlideImagesPlugin.create(context))
|
||||
.usePlugin(new MarkwonLemmyLinkPlugin())
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
@@ -33,8 +33,9 @@ import java.util.concurrent.Executor;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import eu.toldi.infinityforlemmy.markdown.MarkdownUtils;
|
||||
import eu.toldi.infinityforlemmy.community.BasicCommunityInfo;
|
||||
import eu.toldi.infinityforlemmy.postfilter.PostFilter;
|
||||
import eu.toldi.infinityforlemmy.user.BasicUserInfo;
|
||||
import eu.toldi.infinityforlemmy.utils.JSONUtils;
|
||||
import eu.toldi.infinityforlemmy.utils.LemmyUtils;
|
||||
import eu.toldi.infinityforlemmy.utils.Utils;
|
||||
@@ -175,9 +176,11 @@ public class ParsePost {
|
||||
}
|
||||
}
|
||||
|
||||
String title = post.getString("name");
|
||||
String title = post.getString("name").replace("&", "&");
|
||||
String permalink = post.getString("ap_id");
|
||||
int score = counts.getInt("score");
|
||||
int upvotes = counts.getInt("upvotes");
|
||||
int downvotes = counts.getInt("downvotes");
|
||||
int voteType = 0;
|
||||
int nComments = counts.getInt("comments");
|
||||
int upvoteRatio = 100 * counts.getInt("upvotes") / max(counts.getInt("upvotes") + counts.getInt("downvotes"), 1);
|
||||
@@ -185,27 +188,27 @@ public class ParsePost {
|
||||
boolean nsfw = post.getBoolean("nsfw");
|
||||
boolean locked = post.getBoolean("locked");
|
||||
boolean saved = data.getBoolean("saved");
|
||||
String distinguished = "";
|
||||
String distinguished = (creator.getBoolean("admin") ? "admin" : "");
|
||||
String suggestedSort = "";
|
||||
ArrayList <Post.Preview> previews = new ArrayList<>();
|
||||
if(!post.isNull("thumbnail_url")) {
|
||||
ArrayList<Post.Preview> previews = new ArrayList<>();
|
||||
if (!post.isNull("thumbnail_url")) {
|
||||
String thumbnail = post.getString("thumbnail_url");
|
||||
//int[] wh_array = getImageDimension(thumbnail);
|
||||
previews.add(new Post.Preview(thumbnail, 0, 0, "", ""));
|
||||
}
|
||||
BasicUserInfo authorInfo = new BasicUserInfo(creator.getInt("id"), author, authorFull, creator.optString("avatar", ""), creator.optString("display_name", author));
|
||||
BasicCommunityInfo communityInfo = new BasicCommunityInfo(community.getInt("id"), subredditName, subredditNamePrefixed, community.optString("icon", ""), community.optString("title", subredditName));
|
||||
|
||||
|
||||
return parseData(data, permalink, id, fullName, subredditName, subredditNamePrefixed,
|
||||
author,authorFull, postTimeMillis, title, previews,
|
||||
score, voteType, nComments, upvoteRatio, nsfw, locked, saved,
|
||||
return parseData(data, permalink, id, communityInfo,
|
||||
authorInfo, postTimeMillis, title, previews,
|
||||
downvotes, upvotes, voteType, nComments, upvoteRatio, nsfw, locked, saved,
|
||||
distinguished, suggestedSort);
|
||||
|
||||
}
|
||||
|
||||
private static Post parseData(JSONObject data, String permalink, int id, String fullName,
|
||||
String subredditName, String subredditNamePrefixed, String author, String authorFull,
|
||||
private static Post parseData(JSONObject data, String permalink, int id, BasicCommunityInfo communityInfo, BasicUserInfo author,
|
||||
long postTimeMillis, String title, ArrayList<Post.Preview> previews,
|
||||
int score, int voteType, int nComments, int upvoteRatio,
|
||||
int downvotes, int upvotes, int voteType, int nComments, int upvoteRatio,
|
||||
boolean nsfw, boolean locked,
|
||||
boolean saved,
|
||||
String distinguished, String suggestedSort) throws JSONException {
|
||||
@@ -224,8 +227,8 @@ public class ParsePost {
|
||||
if (!data.getJSONObject("post").isNull("body") && url.equals("")) {
|
||||
//Text post
|
||||
int postType = Post.TEXT_TYPE;
|
||||
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, authorFull,
|
||||
postTimeMillis, title, permalink, score,
|
||||
post = new Post(id, communityInfo, author,
|
||||
postTimeMillis, title, permalink, downvotes, upvotes,
|
||||
postType, voteType, nComments, upvoteRatio, nsfw,
|
||||
locked, saved, distinguished, suggestedSort);
|
||||
String body = data.getJSONObject("post").getString("body");
|
||||
@@ -237,8 +240,8 @@ public class ParsePost {
|
||||
//Image post
|
||||
int postType = Post.IMAGE_TYPE;
|
||||
|
||||
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, authorFull,
|
||||
postTimeMillis, title, url, permalink, score,
|
||||
post = new Post(id, communityInfo, author,
|
||||
postTimeMillis, title, url, permalink, downvotes, upvotes,
|
||||
postType, voteType, nComments, upvoteRatio, nsfw, locked, saved, distinguished, suggestedSort);
|
||||
|
||||
if (previews.isEmpty()) {
|
||||
@@ -250,7 +253,7 @@ public class ParsePost {
|
||||
//No preview video post
|
||||
int postType = Post.VIDEO_TYPE;
|
||||
|
||||
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, authorFull, postTimeMillis, title, permalink, score, postType, voteType,
|
||||
post = new Post(id, communityInfo, author, postTimeMillis, title, permalink, downvotes, upvotes, postType, voteType,
|
||||
nComments, upvoteRatio, nsfw, locked, saved, distinguished, suggestedSort);
|
||||
|
||||
post.setVideoUrl(url);
|
||||
@@ -258,8 +261,8 @@ public class ParsePost {
|
||||
} else if (!url.equals("")) {
|
||||
//No preview link post
|
||||
int postType = Post.NO_PREVIEW_LINK_TYPE;
|
||||
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, authorFull,
|
||||
postTimeMillis, title, url, permalink, score,
|
||||
post = new Post(id, communityInfo, author,
|
||||
postTimeMillis, title, url, permalink, downvotes, upvotes,
|
||||
postType, voteType, nComments, upvoteRatio, nsfw, locked, saved, distinguished, suggestedSort);
|
||||
if (data.isNull(JSONUtils.SELFTEXT_KEY)) {
|
||||
post.setSelfText("");
|
||||
@@ -292,8 +295,8 @@ public class ParsePost {
|
||||
}
|
||||
} else {
|
||||
int postType = Post.TEXT_TYPE;
|
||||
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, authorFull,
|
||||
postTimeMillis, title, permalink, score,
|
||||
post = new Post(id, communityInfo, author,
|
||||
postTimeMillis, title, permalink, downvotes, upvotes,
|
||||
postType, voteType, nComments, upvoteRatio, nsfw,
|
||||
locked, saved, distinguished, suggestedSort);
|
||||
String body = "";
|
||||
@@ -331,7 +334,7 @@ public class ParsePost {
|
||||
String videoUrl = Html.fromHtml(redditVideoObject.getString(JSONUtils.HLS_URL_KEY)).toString();
|
||||
String videoDownloadUrl = redditVideoObject.getString(JSONUtils.FALLBACK_URL_KEY);
|
||||
|
||||
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, authorFull, postTimeMillis, title, permalink, score, postType, voteType,
|
||||
post = new Post(id, communityInfo, author, postTimeMillis, title, permalink, downvotes, upvotes, postType, voteType,
|
||||
nComments, upvoteRatio, nsfw, locked, saved, distinguished, suggestedSort);
|
||||
|
||||
post.setPreviews(previews);
|
||||
@@ -342,8 +345,8 @@ public class ParsePost {
|
||||
//Image post
|
||||
int postType = Post.IMAGE_TYPE;
|
||||
|
||||
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author,
|
||||
authorFull, postTimeMillis, title, url, permalink, score,
|
||||
post = new Post(id, communityInfo, author,
|
||||
postTimeMillis, title, url, permalink, downvotes, upvotes,
|
||||
postType, voteType, nComments, upvoteRatio, nsfw, locked, saved,
|
||||
distinguished, suggestedSort);
|
||||
|
||||
@@ -354,15 +357,15 @@ public class ParsePost {
|
||||
} else if (path.endsWith(".gif")) {
|
||||
//Gif post
|
||||
int postType = Post.GIF_TYPE;
|
||||
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, authorFull,
|
||||
postTimeMillis, title, url, permalink, score,
|
||||
post = new Post(id, communityInfo, author,
|
||||
postTimeMillis, title, url, permalink, downvotes, upvotes,
|
||||
postType, voteType, nComments, upvoteRatio,
|
||||
nsfw, locked, saved,
|
||||
distinguished, suggestedSort);
|
||||
|
||||
post.setPreviews(previews);
|
||||
post.setVideoUrl(url);
|
||||
} else if (uri.getAuthority().contains("imgur.com") && (path.endsWith(".gifv") || path.endsWith(".mp4"))) {
|
||||
} else if (uri.getAuthority() != null && uri.getAuthority().contains("imgur.com") && (path.endsWith(".gifv") || path.endsWith(".mp4"))) {
|
||||
// Imgur gifv/mp4
|
||||
int postType = Post.VIDEO_TYPE;
|
||||
|
||||
@@ -370,8 +373,8 @@ public class ParsePost {
|
||||
url = url.substring(0, url.length() - 5) + ".mp4";
|
||||
}
|
||||
|
||||
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, authorFull,
|
||||
postTimeMillis, title, url, permalink, score,
|
||||
post = new Post(id, communityInfo, author,
|
||||
postTimeMillis, title, url, permalink, downvotes, upvotes,
|
||||
postType, voteType, nComments, upvoteRatio,
|
||||
nsfw, locked, saved,
|
||||
distinguished, suggestedSort);
|
||||
@@ -383,8 +386,8 @@ public class ParsePost {
|
||||
//Video post
|
||||
int postType = Post.VIDEO_TYPE;
|
||||
|
||||
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, authorFull,
|
||||
postTimeMillis, title, url, permalink, score,
|
||||
post = new Post(id, communityInfo, author,
|
||||
postTimeMillis, title, url, permalink, downvotes, upvotes,
|
||||
postType, voteType, nComments, upvoteRatio, nsfw, locked, saved,
|
||||
distinguished, suggestedSort);
|
||||
post.setPreviews(previews);
|
||||
@@ -394,8 +397,8 @@ public class ParsePost {
|
||||
//Link post
|
||||
int postType = Post.LINK_TYPE;
|
||||
|
||||
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, authorFull,
|
||||
postTimeMillis, title, url, permalink, score,
|
||||
post = new Post(id, communityInfo, author,
|
||||
postTimeMillis, title, url, permalink, downvotes, upvotes,
|
||||
postType, voteType, nComments, upvoteRatio, nsfw, locked, saved,
|
||||
distinguished, suggestedSort);
|
||||
if (data.isNull(JSONUtils.SELFTEXT_KEY)) {
|
||||
@@ -435,8 +438,8 @@ public class ParsePost {
|
||||
//Image post
|
||||
int postType = Post.IMAGE_TYPE;
|
||||
|
||||
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author,authorFull,
|
||||
postTimeMillis, title, url, permalink, score,
|
||||
post = new Post(id, communityInfo, author,
|
||||
postTimeMillis, title, url, permalink, downvotes, upvotes,
|
||||
postType, voteType, nComments, upvoteRatio, nsfw, locked, saved, distinguished, suggestedSort);
|
||||
|
||||
if (previews.isEmpty()) {
|
||||
@@ -447,8 +450,8 @@ public class ParsePost {
|
||||
//Video post
|
||||
int postType = Post.VIDEO_TYPE;
|
||||
|
||||
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author,authorFull,
|
||||
postTimeMillis, title, url, permalink, score,
|
||||
post = new Post(id, communityInfo, author,
|
||||
postTimeMillis, title, url, permalink, downvotes, upvotes,
|
||||
postType, voteType, nComments, upvoteRatio, nsfw, locked, saved, distinguished, suggestedSort);
|
||||
post.setPreviews(previews);
|
||||
post.setVideoUrl(url);
|
||||
@@ -457,8 +460,8 @@ public class ParsePost {
|
||||
//CP No Preview Link post
|
||||
int postType = Post.NO_PREVIEW_LINK_TYPE;
|
||||
|
||||
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author,authorFull,
|
||||
postTimeMillis, title, url, permalink, score,
|
||||
post = new Post(id, communityInfo, author,
|
||||
postTimeMillis, title, url, permalink, downvotes, upvotes,
|
||||
postType, voteType, nComments, upvoteRatio, nsfw, locked, saved, distinguished, suggestedSort);
|
||||
//Need attention
|
||||
if (data.isNull(JSONUtils.SELFTEXT_KEY)) {
|
||||
@@ -575,7 +578,7 @@ public class ParsePost {
|
||||
singleGalleryObject.getJSONObject(JSONUtils.S_KEY).getInt(JSONUtils.Y_KEY), galleryItemCaption, galleryItemCaptionUrl));
|
||||
}
|
||||
|
||||
Post.Gallery postGalleryItem = new Post.Gallery(mimeType, galleryItemUrl, "", subredditName + "-" + galleryId + "." + mimeType.substring(mimeType.lastIndexOf("/") + 1), galleryItemCaption, galleryItemCaptionUrl);
|
||||
Post.Gallery postGalleryItem = new Post.Gallery(mimeType, galleryItemUrl, "", communityInfo.getDisplayName() + "-" + galleryId + "." + mimeType.substring(mimeType.lastIndexOf("/") + 1), galleryItemCaption, galleryItemCaptionUrl);
|
||||
|
||||
// For issue #558
|
||||
// Construct a fallback image url
|
||||
@@ -653,7 +656,10 @@ public class ParsePost {
|
||||
}
|
||||
if (!data.isNull("my_vote")) {
|
||||
post.setVoteType(data.getInt("my_vote"));
|
||||
post.setScore(post.getScore() - 1);
|
||||
if(post.getVoteType() == 1)
|
||||
post.setUpvotes(post.getUpvotes() - 1);
|
||||
else if (post.getVoteType() == -1)
|
||||
post.setDownvotes(post.getDownvotes() - 1);
|
||||
}
|
||||
if (!data.getJSONObject("post").isNull("body")) {
|
||||
String body = data.getJSONObject("post").getString("body");
|
||||
@@ -661,9 +667,15 @@ public class ParsePost {
|
||||
post.setSelfTextPlain(body);
|
||||
post.setSelfTextPlainTrimmed(body.trim());
|
||||
}
|
||||
if (data.getJSONObject("post").getBoolean("featured_community")) {
|
||||
post.setFeaturedInCommunity(true);
|
||||
}
|
||||
|
||||
if (data.getJSONObject("post").getBoolean("featured_local")) {
|
||||
post.setFeaturedOnInstance(true);
|
||||
}
|
||||
|
||||
|
||||
post.setAuthorIconUrl(authorAvatar);
|
||||
post.setSubredditIconUrl(communityURL);
|
||||
return post;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,6 +8,9 @@ import androidx.annotation.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import eu.toldi.infinityforlemmy.community.BasicCommunityInfo;
|
||||
import eu.toldi.infinityforlemmy.user.BasicUserInfo;
|
||||
|
||||
/**
|
||||
* Created by alex on 3/1/18.
|
||||
*/
|
||||
@@ -33,13 +36,8 @@ public class Post implements Parcelable {
|
||||
}
|
||||
};
|
||||
private int id;
|
||||
private String fullName;
|
||||
private String subredditName;
|
||||
private String subredditNamePrefixed;
|
||||
private String subredditIconUrl;
|
||||
private String author;
|
||||
private String authorNamePrefixed;
|
||||
private String authorIconUrl;
|
||||
private BasicCommunityInfo communityInfo;
|
||||
private BasicUserInfo author;
|
||||
private String title;
|
||||
private String selfText;
|
||||
private String selfTextPlain;
|
||||
@@ -56,14 +54,19 @@ public class Post implements Parcelable {
|
||||
private boolean loadGfyOrStreamableVideoSuccess;
|
||||
private String permalink;
|
||||
private long postTimeMillis;
|
||||
private int score;
|
||||
|
||||
private int downvotes;
|
||||
|
||||
private int upvotes;
|
||||
private int postType;
|
||||
private int voteType;
|
||||
private int nComments;
|
||||
private int upvoteRatio;
|
||||
private boolean hidden;
|
||||
private boolean nsfw;
|
||||
private boolean stickied;
|
||||
private boolean featuredInCommunity;
|
||||
|
||||
private boolean featuredOnInstance;
|
||||
private boolean archived;
|
||||
private boolean locked;
|
||||
private boolean saved;
|
||||
@@ -75,29 +78,26 @@ public class Post implements Parcelable {
|
||||
private ArrayList<Preview> previews = new ArrayList<>();
|
||||
private ArrayList<Gallery> gallery = new ArrayList<>();
|
||||
|
||||
public Post(int id, String fullName, String subredditName, String subredditNamePrefixed,
|
||||
String author,String authorNamePrefixed, long postTimeMillis,
|
||||
String title, String permalink, int score, int postType, int voteType, int nComments,
|
||||
public Post(int id, BasicCommunityInfo communityInfo,
|
||||
BasicUserInfo userInfo, long postTimeMillis,
|
||||
String title, String permalink, int downvotes, int upvotes, int postType, int voteType, int nComments,
|
||||
int upvoteRatio,
|
||||
boolean nsfw, boolean locked, boolean saved,
|
||||
String distinguished, String suggestedSort) {
|
||||
this.id = id;
|
||||
this.fullName = fullName;
|
||||
this.subredditName = subredditName;
|
||||
this.subredditNamePrefixed = subredditNamePrefixed;
|
||||
this.author = author;
|
||||
this.authorNamePrefixed = authorNamePrefixed;
|
||||
this.communityInfo = communityInfo;
|
||||
this.author = userInfo;
|
||||
this.postTimeMillis = postTimeMillis;
|
||||
this.title = title;
|
||||
this.permalink = permalink;
|
||||
this.score = score;
|
||||
this.upvotes = upvotes;
|
||||
this.downvotes = downvotes;
|
||||
this.postType = postType;
|
||||
this.voteType = voteType;
|
||||
this.nComments = nComments;
|
||||
this.upvoteRatio = upvoteRatio;
|
||||
this.hidden = hidden;
|
||||
this.nsfw = nsfw;
|
||||
this.stickied = stickied;
|
||||
this.archived = archived;
|
||||
this.locked = locked;
|
||||
this.saved = saved;
|
||||
@@ -107,29 +107,26 @@ public class Post implements Parcelable {
|
||||
isRead = false;
|
||||
}
|
||||
|
||||
public Post(int id, String fullName, String subredditName, String subredditNamePrefixed,
|
||||
String author, String authorNamePrefixed, long postTimeMillis, String title,
|
||||
String url, String permalink, int score, int postType, int voteType, int nComments,
|
||||
public Post(int id, BasicCommunityInfo communityInfo,
|
||||
BasicUserInfo author, long postTimeMillis, String title,
|
||||
String url, String permalink, int downvotes, int upvotes, int postType, int voteType, int nComments,
|
||||
int upvoteRatio,
|
||||
boolean nsfw, boolean locked, boolean saved, String distinguished, String suggestedSort) {
|
||||
this.id = id;
|
||||
this.fullName = fullName;
|
||||
this.subredditName = subredditName;
|
||||
this.subredditNamePrefixed = subredditNamePrefixed;
|
||||
this.communityInfo = communityInfo;
|
||||
this.author = author;
|
||||
this.authorNamePrefixed = authorNamePrefixed;
|
||||
this.postTimeMillis = postTimeMillis;
|
||||
this.title = title;
|
||||
this.url = url;
|
||||
this.permalink = permalink;
|
||||
this.score = score;
|
||||
this.downvotes = downvotes;
|
||||
this.upvotes = upvotes;
|
||||
this.postType = postType;
|
||||
this.voteType = voteType;
|
||||
this.nComments = nComments;
|
||||
this.upvoteRatio = upvoteRatio;
|
||||
this.hidden = hidden;
|
||||
this.nsfw = nsfw;
|
||||
this.stickied = stickied;
|
||||
this.archived = archived;
|
||||
this.locked = locked;
|
||||
this.saved = saved;
|
||||
@@ -141,13 +138,8 @@ public class Post implements Parcelable {
|
||||
|
||||
protected Post(Parcel in) {
|
||||
id = in.readInt();
|
||||
fullName = in.readString();
|
||||
subredditName = in.readString();
|
||||
subredditNamePrefixed = in.readString();
|
||||
subredditIconUrl = in.readString();
|
||||
author = in.readString();
|
||||
authorNamePrefixed = in.readString();
|
||||
authorIconUrl = in.readString();
|
||||
communityInfo = in.readParcelable(BasicCommunityInfo.class.getClassLoader());
|
||||
author = in.readParcelable(BasicUserInfo.class.getClassLoader());
|
||||
postTimeMillis = in.readLong();
|
||||
title = in.readString();
|
||||
selfText = in.readString();
|
||||
@@ -164,14 +156,15 @@ public class Post implements Parcelable {
|
||||
isStreamable = in.readByte() != 0;
|
||||
loadGfyOrStreamableVideoSuccess = in.readByte() != 0;
|
||||
permalink = in.readString();
|
||||
score = in.readInt();
|
||||
downvotes = in.readInt();
|
||||
upvotes = in.readInt();
|
||||
postType = in.readInt();
|
||||
voteType = in.readInt();
|
||||
nComments = in.readInt();
|
||||
upvoteRatio = in.readInt();
|
||||
hidden = in.readByte() != 0;
|
||||
nsfw = in.readByte() != 0;
|
||||
stickied = in.readByte() != 0;
|
||||
featuredInCommunity = in.readByte() != 0;
|
||||
archived = in.readByte() != 0;
|
||||
locked = in.readByte() != 0;
|
||||
saved = in.readByte() != 0;
|
||||
@@ -189,27 +182,24 @@ public class Post implements Parcelable {
|
||||
}
|
||||
|
||||
public String getFullName() {
|
||||
return fullName;
|
||||
return communityInfo.getQualifiedName();
|
||||
}
|
||||
|
||||
public String getSubredditName() {
|
||||
return subredditName;
|
||||
return communityInfo.getDisplayName();
|
||||
}
|
||||
|
||||
public String getSubredditNamePrefixed() {
|
||||
return subredditNamePrefixed;
|
||||
return communityInfo.getQualifiedName();
|
||||
}
|
||||
|
||||
public String getSubredditIconUrl() {
|
||||
return subredditIconUrl;
|
||||
return communityInfo.getIcon();
|
||||
}
|
||||
|
||||
public void setSubredditIconUrl(String subredditIconUrl) {
|
||||
this.subredditIconUrl = subredditIconUrl;
|
||||
}
|
||||
|
||||
public String getAuthor() {
|
||||
return author;
|
||||
return author.getDisplayName();
|
||||
}
|
||||
|
||||
public boolean isAuthorDeleted() {
|
||||
@@ -217,20 +207,19 @@ public class Post implements Parcelable {
|
||||
}
|
||||
|
||||
public void setAuthor(String author) {
|
||||
this.author = author;
|
||||
this.authorNamePrefixed = "u/" + author;
|
||||
|
||||
}
|
||||
|
||||
public String getAuthorNamePrefixed() {
|
||||
return authorNamePrefixed;
|
||||
return author.getQualifiedName();
|
||||
}
|
||||
|
||||
public String getAuthorIconUrl() {
|
||||
return authorIconUrl;
|
||||
return (author.getAvatar() == null) ? "" : author.getAvatar();
|
||||
}
|
||||
|
||||
public void setAuthorIconUrl(String authorIconUrl) {
|
||||
this.authorIconUrl = authorIconUrl;
|
||||
|
||||
}
|
||||
|
||||
public long getPostTimeMillis() {
|
||||
@@ -269,6 +258,22 @@ public class Post implements Parcelable {
|
||||
this.selfTextPlainTrimmed = selfTextPlainTrimmed;
|
||||
}
|
||||
|
||||
public int getDownvotes() {
|
||||
return downvotes;
|
||||
}
|
||||
|
||||
public void setDownvotes(int downvotes) {
|
||||
this.downvotes = downvotes;
|
||||
}
|
||||
|
||||
public int getUpvotes() {
|
||||
return upvotes;
|
||||
}
|
||||
|
||||
public void setUpvotes(int upvotes) {
|
||||
this.upvotes = upvotes;
|
||||
}
|
||||
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
@@ -366,11 +371,7 @@ public class Post implements Parcelable {
|
||||
}
|
||||
|
||||
public int getScore() {
|
||||
return score;
|
||||
}
|
||||
|
||||
public void setScore(int score) {
|
||||
this.score = score;
|
||||
return upvotes- downvotes;
|
||||
}
|
||||
|
||||
public int getPostType() {
|
||||
@@ -426,8 +427,20 @@ public class Post implements Parcelable {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public boolean isStickied() {
|
||||
return stickied;
|
||||
public boolean isFeaturedInCommunity() {
|
||||
return featuredInCommunity;
|
||||
}
|
||||
|
||||
public void setFeaturedInCommunity(boolean featuredInCommunity) {
|
||||
this.featuredInCommunity = featuredInCommunity;
|
||||
}
|
||||
|
||||
public boolean isFeaturedOnInstance() {
|
||||
return featuredOnInstance;
|
||||
}
|
||||
|
||||
public void setFeaturedOnInstance(boolean featuredOnInstance) {
|
||||
this.featuredOnInstance = featuredOnInstance;
|
||||
}
|
||||
|
||||
public boolean isArchived() {
|
||||
@@ -482,16 +495,19 @@ public class Post implements Parcelable {
|
||||
this.gallery = gallery;
|
||||
}
|
||||
|
||||
public BasicCommunityInfo getCommunityInfo() {
|
||||
return communityInfo;
|
||||
}
|
||||
|
||||
public BasicUserInfo getAuthorInfo() {
|
||||
return author;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(Parcel parcel, int i) {
|
||||
parcel.writeInt(id);
|
||||
parcel.writeString(fullName);
|
||||
parcel.writeString(subredditName);
|
||||
parcel.writeString(subredditNamePrefixed);
|
||||
parcel.writeString(subredditIconUrl);
|
||||
parcel.writeString(author);
|
||||
parcel.writeString(authorNamePrefixed);
|
||||
parcel.writeString(authorIconUrl);
|
||||
parcel.writeParcelable(communityInfo, i);
|
||||
parcel.writeParcelable(author, i);
|
||||
parcel.writeLong(postTimeMillis);
|
||||
parcel.writeString(title);
|
||||
parcel.writeString(selfText);
|
||||
@@ -508,14 +524,15 @@ public class Post implements Parcelable {
|
||||
parcel.writeByte((byte) (isStreamable ? 1 : 0));
|
||||
parcel.writeByte((byte) (loadGfyOrStreamableVideoSuccess ? 1 : 0));
|
||||
parcel.writeString(permalink);
|
||||
parcel.writeInt(score);
|
||||
parcel.writeInt(downvotes);
|
||||
parcel.writeInt(upvotes);
|
||||
parcel.writeInt(postType);
|
||||
parcel.writeInt(voteType);
|
||||
parcel.writeInt(nComments);
|
||||
parcel.writeInt(upvoteRatio);
|
||||
parcel.writeByte((byte) (hidden ? 1 : 0));
|
||||
parcel.writeByte((byte) (nsfw ? 1 : 0));
|
||||
parcel.writeByte((byte) (stickied ? 1 : 0));
|
||||
parcel.writeByte((byte) (featuredInCommunity ? 1 : 0));
|
||||
parcel.writeByte((byte) (archived ? 1 : 0));
|
||||
parcel.writeByte((byte) (locked ? 1 : 0));
|
||||
parcel.writeByte((byte) (saved ? 1 : 0));
|
||||
|
||||
@@ -105,7 +105,7 @@ public class CrashReportsFragment extends Fragment {
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
return false;
|
||||
}
|
||||
Uri githubIssueUri = Uri.parse(String.format("https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy/issues/new?template=.gitea%2fissue_template%2fbug_report.md", model, appVersion, androidVersion, logs));
|
||||
Uri githubIssueUri = Uri.parse(String.format("https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy/issues/new?template=.gitea/issue_template/bug_report.md&body=%s", logs));
|
||||
intent.setData(githubIssueUri);
|
||||
startActivity(intent);
|
||||
return true;
|
||||
|
||||
@@ -224,7 +224,7 @@ public class CustomizeMainPageTabsFragment extends Fragment {
|
||||
showTabNamesSwitch.setOnCheckedChangeListener((compoundButton, b) -> mainActivityTabsSharedPreferences.edit().putBoolean((accountName == null ? "" : accountName) + SharedPreferencesUtils.MAIN_PAGE_SHOW_TAB_NAMES, b).apply());
|
||||
showTabNamesLinearLayout.setOnClickListener(view -> showTabNamesSwitch.performClick());
|
||||
|
||||
tab1CurrentTitle = mainActivityTabsSharedPreferences.getString((accountName == null ? "" : accountName) + SharedPreferencesUtils.MAIN_PAGE_TAB_1_TITLE, getString(R.string.home));
|
||||
tab1CurrentTitle = mainActivityTabsSharedPreferences.getString((accountName == null ? "" : accountName) + SharedPreferencesUtils.MAIN_PAGE_TAB_1_TITLE, getString(R.string.subscribed_feed));
|
||||
tab1CurrentPostType = mainActivityTabsSharedPreferences.getInt((accountName == null ? "" : accountName) + SharedPreferencesUtils.MAIN_PAGE_TAB_1_POST_TYPE, SharedPreferencesUtils.MAIN_PAGE_TAB_POST_TYPE_HOME);
|
||||
tab1CurrentName = mainActivityTabsSharedPreferences.getString((accountName == null ? "" : accountName) + SharedPreferencesUtils.MAIN_PAGE_TAB_1_NAME, "");
|
||||
tab1TypeSummaryTextView.setText(typeValues[tab1CurrentPostType]);
|
||||
|
||||
@@ -15,6 +15,7 @@ import java.util.Date;
|
||||
import java.util.Locale;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import eu.toldi.infinityforlemmy.community.CommunityStats;
|
||||
import eu.toldi.infinityforlemmy.utils.JSONUtils;
|
||||
|
||||
public class ParseSubredditData {
|
||||
@@ -27,14 +28,14 @@ public class ParseSubredditData {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static SubredditData parseSubredditData(JSONObject subredditDataJsonObject, boolean nsfw) throws JSONException {
|
||||
public static SubredditData parseSubredditData(JSONObject subredditDataJsonObject, boolean nsfw) throws JSONException {
|
||||
JSONObject community = subredditDataJsonObject.getJSONObject("community");
|
||||
boolean isNSFW = community.getBoolean("nsfw");
|
||||
if (!nsfw && isNSFW) {
|
||||
return null;
|
||||
}
|
||||
|
||||
String title = community.getString(JSONUtils.TITLE_KEY);
|
||||
String title = community.getString(JSONUtils.TITLE_KEY).replace("&", "&");
|
||||
String bannerImageUrl = "";
|
||||
if (!community.isNull("banner")) {
|
||||
bannerImageUrl = community.getString("banner");
|
||||
@@ -69,9 +70,18 @@ public class ParseSubredditData {
|
||||
boolean hidden = community.getBoolean("hidden");
|
||||
boolean postingRestrictedToMods = community.getBoolean("posting_restricted_to_mods");
|
||||
int instanceId = community.getInt("instance_id");
|
||||
int subscribers = subredditDataJsonObject.getJSONObject("counts").getInt("subscribers");
|
||||
int subscribers = (subredditDataJsonObject.has("counts")) ? subredditDataJsonObject.getJSONObject("counts").getInt("subscribers") : 0;
|
||||
boolean blocked = (subredditDataJsonObject.has("blocked")) ? subredditDataJsonObject.getBoolean("blocked") : true;
|
||||
CommunityStats stats = null;
|
||||
if (subredditDataJsonObject.has("counts")) {
|
||||
JSONObject counts = subredditDataJsonObject.getJSONObject("counts");
|
||||
int activeUserCount = counts.getInt("users_active_month");
|
||||
int postCount = counts.getInt("posts");
|
||||
int commentCount = counts.getInt("comments");
|
||||
stats = new CommunityStats(subscribers, activeUserCount, postCount, commentCount);
|
||||
}
|
||||
|
||||
return new SubredditData(id,name,title,description,removed,published,updated,deleted,isNSFW,actorId,local,iconUrl,bannerImageUrl,hidden,postingRestrictedToMods,instanceId,subscribers);
|
||||
return new SubredditData(id, name, title, description, removed, published, updated, deleted, isNSFW, actorId, local, iconUrl, bannerImageUrl, hidden, postingRestrictedToMods, instanceId, subscribers, blocked, stats);
|
||||
}
|
||||
|
||||
interface ParseSubredditDataListener {
|
||||
|
||||
@@ -1,13 +1,18 @@
|
||||
package eu.toldi.infinityforlemmy.subreddit;
|
||||
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.room.ColumnInfo;
|
||||
import androidx.room.Entity;
|
||||
import androidx.room.Ignore;
|
||||
import androidx.room.PrimaryKey;
|
||||
|
||||
import eu.toldi.infinityforlemmy.community.CommunityStats;
|
||||
|
||||
@Entity(tableName = "subreddits")
|
||||
public class SubredditData {
|
||||
public class SubredditData implements Parcelable {
|
||||
@PrimaryKey
|
||||
@NonNull
|
||||
@ColumnInfo(name = "id")
|
||||
@@ -61,10 +66,80 @@ public class SubredditData {
|
||||
@ColumnInfo(name = "subscribers")
|
||||
private int subscribers;
|
||||
|
||||
@ColumnInfo(name = "blocked")
|
||||
private boolean blocked;
|
||||
|
||||
|
||||
@Ignore
|
||||
private boolean isSelected;
|
||||
|
||||
@Ignore
|
||||
private CommunityStats communityStats;
|
||||
|
||||
protected SubredditData(Parcel in) {
|
||||
id = in.readInt();
|
||||
name = in.readString();
|
||||
title = in.readString();
|
||||
description = in.readString();
|
||||
removed = in.readByte() != 0;
|
||||
published = in.readString();
|
||||
updated = in.readString();
|
||||
deleted = in.readByte() != 0;
|
||||
nsfw = in.readByte() != 0;
|
||||
actorId = in.readString();
|
||||
local = in.readByte() != 0;
|
||||
icon = in.readString();
|
||||
banner = in.readString();
|
||||
hidden = in.readByte() != 0;
|
||||
postingRestrictedToMods = in.readByte() != 0;
|
||||
instanceId = in.readInt();
|
||||
subscribers = in.readInt();
|
||||
blocked = in.readByte() != 0;
|
||||
isSelected = in.readByte() != 0;
|
||||
communityStats = in.readParcelable(CommunityStats.class.getClassLoader());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(Parcel dest, int flags) {
|
||||
dest.writeInt(id);
|
||||
dest.writeString(name);
|
||||
dest.writeString(title);
|
||||
dest.writeString(description);
|
||||
dest.writeByte((byte) (removed ? 1 : 0));
|
||||
dest.writeString(published);
|
||||
dest.writeString(updated);
|
||||
dest.writeByte((byte) (deleted ? 1 : 0));
|
||||
dest.writeByte((byte) (nsfw ? 1 : 0));
|
||||
dest.writeString(actorId);
|
||||
dest.writeByte((byte) (local ? 1 : 0));
|
||||
dest.writeString(icon);
|
||||
dest.writeString(banner);
|
||||
dest.writeByte((byte) (hidden ? 1 : 0));
|
||||
dest.writeByte((byte) (postingRestrictedToMods ? 1 : 0));
|
||||
dest.writeInt(instanceId);
|
||||
dest.writeInt(subscribers);
|
||||
dest.writeByte((byte) (blocked ? 1 : 0));
|
||||
dest.writeByte((byte) (isSelected ? 1 : 0));
|
||||
dest.writeParcelable(communityStats, flags);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static final Creator<SubredditData> CREATOR = new Creator<SubredditData>() {
|
||||
@Override
|
||||
public SubredditData createFromParcel(Parcel in) {
|
||||
return new SubredditData(in);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SubredditData[] newArray(int size) {
|
||||
return new SubredditData[size];
|
||||
}
|
||||
};
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
@@ -201,7 +276,7 @@ public class SubredditData {
|
||||
this.subscribers = subscribers;
|
||||
}
|
||||
|
||||
public SubredditData(int id, String name, String title, String description, boolean removed, String published, String updated, boolean deleted, boolean nsfw, String actorId, boolean local, String icon, String banner, boolean hidden, boolean postingRestrictedToMods, int instanceId, int subscribers) {
|
||||
public SubredditData(int id, String name, String title, String description, boolean removed, String published, String updated, boolean deleted, boolean nsfw, String actorId, boolean local, String icon, String banner, boolean hidden, boolean postingRestrictedToMods, int instanceId, int subscribers, boolean blocked) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.title = title;
|
||||
@@ -219,6 +294,29 @@ public class SubredditData {
|
||||
this.postingRestrictedToMods = postingRestrictedToMods;
|
||||
this.instanceId = instanceId;
|
||||
this.subscribers = subscribers;
|
||||
this.blocked = blocked;
|
||||
}
|
||||
|
||||
public SubredditData(int id, String name, String title, String description, boolean removed, String published, String updated, boolean deleted, boolean nsfw, String actorId, boolean local, String icon, String banner, boolean hidden, boolean postingRestrictedToMods, int instanceId, int subscribers, boolean blocked, CommunityStats communityStats) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.title = title;
|
||||
this.description = description;
|
||||
this.removed = removed;
|
||||
this.published = published;
|
||||
this.updated = updated;
|
||||
this.deleted = deleted;
|
||||
this.nsfw = nsfw;
|
||||
this.actorId = actorId;
|
||||
this.local = local;
|
||||
this.icon = icon;
|
||||
this.banner = banner;
|
||||
this.hidden = hidden;
|
||||
this.postingRestrictedToMods = postingRestrictedToMods;
|
||||
this.instanceId = instanceId;
|
||||
this.subscribers = subscribers;
|
||||
this.blocked = blocked;
|
||||
this.communityStats = communityStats;
|
||||
}
|
||||
|
||||
public boolean isNSFW() {
|
||||
@@ -250,6 +348,22 @@ public class SubredditData {
|
||||
}
|
||||
|
||||
public void setSelected(boolean b) {
|
||||
isSelected =b;
|
||||
isSelected = b;
|
||||
}
|
||||
|
||||
public boolean isBlocked() {
|
||||
return blocked;
|
||||
}
|
||||
|
||||
public void setBlocked(boolean blocked) {
|
||||
this.blocked = blocked;
|
||||
}
|
||||
|
||||
public CommunityStats getCommunityStats() {
|
||||
return communityStats;
|
||||
}
|
||||
|
||||
public void setCommunityStats(CommunityStats communityStats) {
|
||||
this.communityStats = communityStats;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,11 +2,8 @@ package eu.toldi.infinityforlemmy.user;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import eu.toldi.infinityforlemmy.apis.RedditAPI;
|
||||
import eu.toldi.infinityforlemmy.utils.APIUtils;
|
||||
import eu.toldi.infinityforlemmy.apis.LemmyAPI;
|
||||
import eu.toldi.infinityforlemmy.dto.UserBlockDTO;
|
||||
import retrofit2.Call;
|
||||
import retrofit2.Callback;
|
||||
import retrofit2.Response;
|
||||
@@ -15,13 +12,13 @@ import retrofit2.Retrofit;
|
||||
public class BlockUser {
|
||||
public interface BlockUserListener {
|
||||
void success();
|
||||
|
||||
void failed();
|
||||
}
|
||||
|
||||
public static void blockUser(Retrofit oauthRetrofit, String accessToken, String username, BlockUserListener blockUserListener) {
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.put(APIUtils.NAME_KEY, username);
|
||||
oauthRetrofit.create(RedditAPI.class).blockUser(APIUtils.getOAuthHeader(accessToken), params).enqueue(new Callback<String>() {
|
||||
public static void blockUser(Retrofit retrofit, String accessToken, int userID, boolean block, BlockUserListener blockUserListener) {
|
||||
LemmyAPI api = retrofit.create(LemmyAPI.class);
|
||||
api.userBlock(new UserBlockDTO(userID, block, accessToken)).enqueue(new Callback<>() {
|
||||
@Override
|
||||
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
|
||||
if (response.isSuccessful()) {
|
||||
|
||||
@@ -21,13 +21,14 @@ public class ParseUserData {
|
||||
new ParseUserListingDataAsyncTask(response, parseUserListingDataListener).execute();
|
||||
}
|
||||
|
||||
private static UserData parseUserDataBase(JSONObject userDataJson, boolean parseFullKarma) throws JSONException {
|
||||
public static UserData parseUserDataBase(JSONObject userDataJson, boolean parseFullKarma) throws JSONException {
|
||||
if (userDataJson == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
JSONObject personJson = (userDataJson.has("person_view")) ? userDataJson.getJSONObject("person_view").getJSONObject("person") : userDataJson.getJSONObject("person");
|
||||
JSONObject countsJson = (userDataJson.has("person_view")) ? userDataJson.getJSONObject("person_view").getJSONObject("counts") : userDataJson.getJSONObject("counts");
|
||||
String userName = personJson.getString(JSONUtils.NAME_KEY);
|
||||
String actor_id = personJson.getString("actor_id");
|
||||
String iconImageUrl = "";
|
||||
@@ -38,10 +39,7 @@ public class ParseUserData {
|
||||
if (!personJson.isNull("banner")) {
|
||||
bannerImageUrl = personJson.getString("banner");
|
||||
}
|
||||
JSONObject countsJson = (userDataJson.has("person_view")) ? userDataJson.getJSONObject("person_view").getJSONObject("counts") : userDataJson.getJSONObject("counts");
|
||||
|
||||
int linkKarma = countsJson.getInt(JSONUtils.POST_SCORE_KEY);
|
||||
int commentKarma = countsJson.getInt(JSONUtils.COMMENT_SCORE_KEY);
|
||||
int account_id = personJson.getInt("id");
|
||||
int instance_id = personJson.getInt("instance_id");
|
||||
|
||||
@@ -62,9 +60,13 @@ public class ParseUserData {
|
||||
if (!personJson.isNull("display_name")) {
|
||||
title = personJson.getString("display_name");
|
||||
}
|
||||
int postCount = countsJson.optInt("post_count", 0);
|
||||
int commentCount = countsJson.optInt("comment_count", 0);
|
||||
int postScore = countsJson.optInt("post_score", 0);
|
||||
int commentScore = countsJson.optInt("comment_score", 0);
|
||||
UserStats userStats = new UserStats(postCount, postScore, commentCount, commentScore);
|
||||
|
||||
|
||||
return new UserData(account_id,userName,title, iconImageUrl,isBanned,cakeday,actor_id,isLocal,isDeleted,isAdmin,isBot,instance_id);
|
||||
return new UserData(account_id, userName, title, iconImageUrl, isBanned, cakeday, actor_id, isLocal, isDeleted, isAdmin, isBot, instance_id, userStats);
|
||||
}
|
||||
|
||||
interface ParseUserDataListener {
|
||||
|
||||
@@ -49,6 +49,9 @@ public class UserData {
|
||||
@Ignore
|
||||
private boolean isSelected;
|
||||
|
||||
@Ignore
|
||||
private UserStats stats;
|
||||
|
||||
public boolean isSelected() {
|
||||
return isSelected;
|
||||
}
|
||||
@@ -157,6 +160,10 @@ public class UserData {
|
||||
this.instanceId = instanceId;
|
||||
}
|
||||
|
||||
public UserStats getStats() {
|
||||
return stats;
|
||||
}
|
||||
|
||||
public UserData(int id, String name, String displayName, String avatar, boolean banned, String published, String actorId, boolean local, boolean deleted, boolean admin, boolean botAccount, int instanceId) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
@@ -172,6 +179,23 @@ public class UserData {
|
||||
this.instanceId = instanceId;
|
||||
}
|
||||
|
||||
public UserData(int id, String name, String displayName, String avatar, boolean banned, String published, String actorId, boolean local, boolean deleted, boolean admin, boolean botAccount, int instanceId, UserStats stats) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.displayName = displayName;
|
||||
this.avatar = avatar;
|
||||
this.banned = banned;
|
||||
this.published = published;
|
||||
this.actorId = actorId;
|
||||
this.local = local;
|
||||
this.deleted = deleted;
|
||||
this.admin = admin;
|
||||
this.botAccount = botAccount;
|
||||
this.instanceId = instanceId;
|
||||
this.stats = stats;
|
||||
}
|
||||
|
||||
|
||||
public boolean isCanBeFollowed() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1,11 +1,20 @@
|
||||
package eu.toldi.infinityforlemmy.utils;
|
||||
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
import java.util.TimeZone;
|
||||
|
||||
public class LemmyUtils {
|
||||
public static String actorID2FullName(String url) {
|
||||
String[] splitURL = url.split("/");
|
||||
String userName = splitURL[splitURL.length - 1];
|
||||
String domain = splitURL[2];
|
||||
return userName + "@" + domain;
|
||||
return (userName.contains("@")) ? userName : userName + "@" + domain;
|
||||
}
|
||||
|
||||
public static String qualifiedCommunityName2ActorId(String qualifiedName) {
|
||||
@@ -21,4 +30,25 @@ public class LemmyUtils {
|
||||
String domain = splitQualifiedName[1];
|
||||
return "https://" + domain + "/u/" + userName;
|
||||
}
|
||||
|
||||
public static Long dateStringToMills(String dateStr) {
|
||||
long postTimeMillis = 0;
|
||||
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
|
||||
postTimeMillis = ZonedDateTime.parse(dateStr,
|
||||
DateTimeFormatter.ISO_DATE_TIME.withZone(ZoneId.of("Z"))).toInstant().toEpochMilli();
|
||||
} else {
|
||||
dateStr = dateStr.substring(0, dateStr.lastIndexOf(".") + 4) + 'Z';
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.getDefault());
|
||||
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
try {
|
||||
Date date = sdf.parse(dateStr);
|
||||
if (date != null) {
|
||||
postTimeMillis = date.getTime();
|
||||
}
|
||||
} catch (ParseException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return postTimeMillis;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,6 +48,16 @@ public class SharedPreferencesUtils {
|
||||
|
||||
public static final String USE_CIRCULAR_FAB = "use_circular_fab";
|
||||
|
||||
public static final String POST_SEPARATE_UP_AND_DOWN_VOTES = "post_separate_down_and_up_votes";
|
||||
|
||||
public static final String POST_DETAIL_SEPARATE_UP_AND_DOWN_VOTES = "post_detail_separate_down_and_up_votes";
|
||||
|
||||
public static final String COMMENT_SEPARATE_UP_AND_DOWN_VOTES = "comment_separate_down_and_up_votes";
|
||||
|
||||
public static final String POST_DISPLAY_NAME_INSTEAD_OF_USERNAME = "post_display_name_instead_of_user_name";
|
||||
|
||||
public static final String POST_DETAIL_DISPLAY_NAME_INSTEAD_OF_USERNAME = "post_detail_display_name_instead_of_user_name";
|
||||
|
||||
public static final String SORT_TYPE_SHARED_PREFERENCES_FILE = "eu.toldi.infinityforlemmy.sort_type";
|
||||
public static final String SORT_TYPE_BEST_POST = "sort_type_best_post";
|
||||
public static final String SORT_TIME_BEST_POST = "sort_time_best_post";
|
||||
|
||||
@@ -49,7 +49,9 @@ public class UploadImageUtils {
|
||||
if (uploadMediaResponse.isSuccessful()) {
|
||||
JSONObject responseObject = new JSONObject(uploadMediaResponse.body());
|
||||
String fileName = responseObject.getJSONArray("files").getJSONObject(0).getString("file");
|
||||
return mRetrofit.getBaseURL() + "/pictrs/image/" + fileName;
|
||||
String baseURL = mRetrofit.getBaseURL();
|
||||
|
||||
return baseURL + "/pictrs/image/" + fileName;
|
||||
} else {
|
||||
return "Error: " + uploadMediaResponse.code();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
package eu.toldi.infinityforlemmy.comment
|
||||
|
||||
import eu.toldi.infinityforlemmy.RetrofitHolder
|
||||
import eu.toldi.infinityforlemmy.apis.LemmyAPI
|
||||
import eu.toldi.infinityforlemmy.dto.ReportCommentDTO
|
||||
import retrofit2.Call
|
||||
import retrofit2.Callback
|
||||
|
||||
class LemmyCommentAPI(val retrofitHolder: RetrofitHolder) {
|
||||
|
||||
fun reportComment(id: Int, reason: String, auth: String, callback: ReportCommentCallback) {
|
||||
val api = retrofitHolder.retrofit.create(LemmyAPI::class.java)
|
||||
api.commentReport(ReportCommentDTO(id, reason, auth)).enqueue(object : Callback<String> {
|
||||
override fun onResponse(
|
||||
call: retrofit2.Call<String>,
|
||||
response: retrofit2.Response<String>
|
||||
) {
|
||||
if (response.isSuccessful) {
|
||||
callback.onSuccess()
|
||||
} else {
|
||||
callback.onFailure()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFailure(call: Call<String>, t: Throwable) {
|
||||
callback.onFailure()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
public interface ReportCommentCallback {
|
||||
fun onSuccess()
|
||||
fun onFailure()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package eu.toldi.infinityforlemmy.community
|
||||
|
||||
import android.os.Parcel
|
||||
import android.os.Parcelable
|
||||
|
||||
data class BasicCommunityInfo(
|
||||
val id: Int,
|
||||
val name: String,
|
||||
val qualifiedName: String,
|
||||
val icon: String?,
|
||||
val displayName: String
|
||||
) : Parcelable {
|
||||
constructor(parcel: Parcel) : this(
|
||||
parcel.readInt(),
|
||||
parcel.readString()!!,
|
||||
parcel.readString()!!,
|
||||
parcel.readString(),
|
||||
parcel.readString()!!
|
||||
) {
|
||||
}
|
||||
|
||||
override fun writeToParcel(parcel: Parcel, flags: Int) {
|
||||
parcel.writeInt(id)
|
||||
parcel.writeString(name)
|
||||
parcel.writeString(qualifiedName)
|
||||
parcel.writeString(icon)
|
||||
parcel.writeString(displayName)
|
||||
}
|
||||
|
||||
override fun describeContents(): Int {
|
||||
return 0
|
||||
}
|
||||
|
||||
companion object CREATOR : Parcelable.Creator<BasicCommunityInfo> {
|
||||
override fun createFromParcel(parcel: Parcel): BasicCommunityInfo {
|
||||
return BasicCommunityInfo(parcel)
|
||||
}
|
||||
|
||||
override fun newArray(size: Int): Array<BasicCommunityInfo?> {
|
||||
return arrayOfNulls(size)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
package eu.toldi.infinityforlemmy.community
|
||||
|
||||
import eu.toldi.infinityforlemmy.apis.LemmyAPI
|
||||
import eu.toldi.infinityforlemmy.dto.BlockCommunityDTO
|
||||
import retrofit2.Call
|
||||
import retrofit2.Callback
|
||||
import retrofit2.Response
|
||||
import retrofit2.Retrofit
|
||||
|
||||
object BlockCommunity {
|
||||
|
||||
fun blockCommunity(
|
||||
retrofit: Retrofit,
|
||||
communityId: Int,
|
||||
auth: String,
|
||||
blockCommunityListener: BlockCommunityListener
|
||||
) {
|
||||
val api = retrofit.create(LemmyAPI::class.java)
|
||||
api.communityBlock(BlockCommunityDTO(communityId, true, auth))?.enqueue(
|
||||
object : Callback<String> {
|
||||
override fun onResponse(call: Call<String>, response: Response<String>) {
|
||||
if (response.isSuccessful) {
|
||||
blockCommunityListener.onBlockCommunitySuccess()
|
||||
} else {
|
||||
blockCommunityListener.onBlockCommunityError()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFailure(call: Call<String>, t: Throwable) {
|
||||
blockCommunityListener.onBlockCommunityError()
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
fun unBlockCommunity(
|
||||
retrofit: Retrofit,
|
||||
communityId: Int,
|
||||
auth: String,
|
||||
blockCommunityListener: BlockCommunityListener
|
||||
) {
|
||||
val api = retrofit.create(LemmyAPI::class.java)
|
||||
api.communityBlock(BlockCommunityDTO(communityId, false, auth))?.enqueue(
|
||||
object : Callback<String> {
|
||||
override fun onResponse(call: Call<String>, response: Response<String>) {
|
||||
if (response.isSuccessful) {
|
||||
blockCommunityListener.onBlockCommunitySuccess()
|
||||
} else {
|
||||
blockCommunityListener.onBlockCommunityError()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFailure(call: Call<String>, t: Throwable) {
|
||||
blockCommunityListener.onBlockCommunityError()
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
interface BlockCommunityListener {
|
||||
fun onBlockCommunitySuccess()
|
||||
fun onBlockCommunityError()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package eu.toldi.infinityforlemmy.community
|
||||
|
||||
import android.os.Parcel
|
||||
import android.os.Parcelable
|
||||
|
||||
data class CommunityStats(
|
||||
val subscribers: Int,
|
||||
val activeUsers: Int,
|
||||
val posts: Int,
|
||||
val comments: Int
|
||||
) : Parcelable {
|
||||
constructor(parcel: Parcel) : this(
|
||||
parcel.readInt(),
|
||||
parcel.readInt(),
|
||||
parcel.readInt(),
|
||||
parcel.readInt()
|
||||
) {
|
||||
}
|
||||
|
||||
override fun writeToParcel(parcel: Parcel, flags: Int) {
|
||||
parcel.writeInt(subscribers)
|
||||
parcel.writeInt(activeUsers)
|
||||
parcel.writeInt(posts)
|
||||
parcel.writeInt(comments)
|
||||
}
|
||||
|
||||
override fun describeContents(): Int {
|
||||
return 0
|
||||
}
|
||||
|
||||
companion object CREATOR : Parcelable.Creator<CommunityStats> {
|
||||
override fun createFromParcel(parcel: Parcel): CommunityStats {
|
||||
return CommunityStats(parcel)
|
||||
}
|
||||
|
||||
override fun newArray(size: Int): Array<CommunityStats?> {
|
||||
return arrayOfNulls(size)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
package eu.toldi.infinityforlemmy.dto
|
||||
|
||||
data class BlockCommunityDTO(val community_id: Int, val block: Boolean, val auth: String)
|
||||
@@ -0,0 +1,23 @@
|
||||
package eu.toldi.infinityforlemmy.dto
|
||||
|
||||
data class PrivateMessageDTO(val recipient_id: Int, val content: String, val auth: String)
|
||||
|
||||
data class PrivateMessageUpdateDTO(
|
||||
val private_message_id: Int,
|
||||
val auth: String,
|
||||
val content: String
|
||||
)
|
||||
|
||||
data class PrivateMessageDeleteDTO(
|
||||
val private_message_id: Int,
|
||||
val auth: String,
|
||||
val deleted: Boolean
|
||||
)
|
||||
|
||||
data class PrivateMessageReadDTO(val private_message_id: Int, val auth: String, val read: Boolean)
|
||||
|
||||
data class PrivateMessageReportDTO(
|
||||
val private_message_id: Int,
|
||||
val auth: String,
|
||||
val reason: String
|
||||
)
|
||||
@@ -0,0 +1,5 @@
|
||||
package eu.toldi.infinityforlemmy.dto
|
||||
|
||||
data class ReportPostDTO(val post_id: Int, val reason: String, val auth: String)
|
||||
|
||||
data class ReportCommentDTO(val comment_id: Int, val reason: String, val auth: String)
|
||||
@@ -0,0 +1,4 @@
|
||||
package eu.toldi.infinityforlemmy.dto
|
||||
|
||||
data class UserBlockDTO(val person_id: Int, val block: Boolean, val auth: String)
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
package eu.toldi.infinityforlemmy.markdown
|
||||
|
||||
|
||||
import android.text.Spannable
|
||||
import android.text.SpannableStringBuilder
|
||||
import android.text.style.URLSpan
|
||||
import android.text.util.Linkify
|
||||
import eu.toldi.infinityforlemmy.utils.LemmyUtils
|
||||
import io.noties.markwon.AbstractMarkwonPlugin
|
||||
import io.noties.markwon.MarkwonPlugin
|
||||
import io.noties.markwon.MarkwonVisitor
|
||||
import io.noties.markwon.SpannableBuilder
|
||||
import io.noties.markwon.core.CorePlugin
|
||||
import io.noties.markwon.core.CoreProps
|
||||
import org.commonmark.node.Link
|
||||
import java.util.regex.Pattern
|
||||
|
||||
// Source : https://github.com/dessalines/jerboa/blob/main/app/src/main/java/com/jerboa/util/markwon/MarkwonLemmyLinkPlugin.kt
|
||||
class MarkwonLemmyLinkPlugin : AbstractMarkwonPlugin() {
|
||||
|
||||
companion object {
|
||||
/**
|
||||
* pattern that matches all valid communities; intended to be loose
|
||||
*/
|
||||
const val communityPatternFragment: String = """[a-zA-Z0-9_]{3,}"""
|
||||
|
||||
/**
|
||||
* pattern to match all valid instances
|
||||
*/
|
||||
const val instancePatternFragment: String =
|
||||
"""([a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]\.)+[a-zA-Z]{2,}"""
|
||||
|
||||
/**
|
||||
* pattern to match all valid usernames
|
||||
*/
|
||||
const val userPatternFragment: String = """[a-zA-Z0-9_]{3,}"""
|
||||
|
||||
/**
|
||||
* Pattern to match lemmy's unique community pattern, e.g. !commmunity[@instance]
|
||||
*/
|
||||
val lemmyCommunityPattern: Pattern =
|
||||
Pattern.compile("(?<!\\S)!($communityPatternFragment)(?:@($instancePatternFragment))\\b")
|
||||
|
||||
/**
|
||||
* Pattern to match lemmy's unique user pattern, e.g. @user[@instance]
|
||||
*/
|
||||
val lemmyUserPattern: Pattern =
|
||||
Pattern.compile("(?<!\\S)@($userPatternFragment)(?:@($instancePatternFragment))\\b")
|
||||
|
||||
}
|
||||
override fun configure(registry: MarkwonPlugin.Registry) {
|
||||
registry.require(CorePlugin::class.java) { it.addOnTextAddedListener(LemmyTextAddedListener()) }
|
||||
}
|
||||
|
||||
private class LemmyTextAddedListener : CorePlugin.OnTextAddedListener {
|
||||
override fun onTextAdded(visitor: MarkwonVisitor, text: String, start: Int) {
|
||||
// we will be using the link that is used by markdown (instead of directly applying URLSpan)
|
||||
val spanFactory = visitor.configuration().spansFactory().get(
|
||||
Link::class.java,
|
||||
) ?: return
|
||||
|
||||
// don't re-use builder (thread safety achieved for
|
||||
// render calls from different threads and ... better performance)
|
||||
val builder = SpannableStringBuilder(text)
|
||||
if (addLinks(builder)) {
|
||||
// target URL span specifically
|
||||
val spans = builder.getSpans(0, builder.length, URLSpan::class.java)
|
||||
if (!spans.isNullOrEmpty()) {
|
||||
val renderProps = visitor.renderProps()
|
||||
val spannableBuilder = visitor.builder()
|
||||
for (span in spans) {
|
||||
CoreProps.LINK_DESTINATION[renderProps] = if (span.url.startsWith("!")) { LemmyUtils.qualifiedCommunityName2ActorId(span.url.drop(1)) } else { LemmyUtils.qualifiedUserName2ActorId(span.url.drop(1)) }
|
||||
SpannableBuilder.setSpans(
|
||||
spannableBuilder,
|
||||
spanFactory.getSpans(visitor.configuration(), renderProps),
|
||||
start + builder.getSpanStart(span),
|
||||
start + builder.getSpanEnd(span),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun addLinks(text: Spannable): Boolean {
|
||||
val communityLinkAdded = Linkify.addLinks(text, lemmyCommunityPattern, null)
|
||||
val userLinkAdded = Linkify.addLinks(text, lemmyUserPattern, null)
|
||||
|
||||
return communityLinkAdded || userLinkAdded
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package eu.toldi.infinityforlemmy.post
|
||||
|
||||
import eu.toldi.infinityforlemmy.RetrofitHolder
|
||||
import eu.toldi.infinityforlemmy.apis.LemmyAPI
|
||||
import eu.toldi.infinityforlemmy.dto.ReportPostDTO
|
||||
import retrofit2.Call
|
||||
import retrofit2.Callback
|
||||
|
||||
class LemmyPostAPI(val retrofitHolder: RetrofitHolder) {
|
||||
|
||||
fun reportPost(postId: Int, reason: String, auth: String, callback: ReportPostCallback) {
|
||||
val api = retrofitHolder.retrofit.create(LemmyAPI::class.java)
|
||||
api.postReport(ReportPostDTO(postId, reason, auth)).enqueue(object : Callback<String> {
|
||||
override fun onResponse(
|
||||
call: retrofit2.Call<String>,
|
||||
response: retrofit2.Response<String>
|
||||
) {
|
||||
if (response.isSuccessful) {
|
||||
callback.onSuccess()
|
||||
} else {
|
||||
callback.onFailure()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFailure(call: Call<String>, t: Throwable) {
|
||||
callback.onFailure()
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
public interface ReportPostCallback {
|
||||
fun onSuccess()
|
||||
fun onFailure()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,153 @@
|
||||
package eu.toldi.infinityforlemmy.privatemessage
|
||||
|
||||
import eu.toldi.infinityforlemmy.RetrofitHolder
|
||||
import eu.toldi.infinityforlemmy.apis.LemmyAPI
|
||||
import eu.toldi.infinityforlemmy.dto.PrivateMessageDTO
|
||||
import eu.toldi.infinityforlemmy.dto.PrivateMessageReadDTO
|
||||
import eu.toldi.infinityforlemmy.utils.LemmyUtils
|
||||
import org.json.JSONObject
|
||||
|
||||
class LemmyPrivateMessageAPI(val retrofitHolder: RetrofitHolder) {
|
||||
|
||||
|
||||
fun fetchPrivateMessages(
|
||||
auth: String,
|
||||
page: Int,
|
||||
listener: PrivateMessageFetchedListener,
|
||||
limit: Int = 25,
|
||||
unreadOnly: Boolean = false
|
||||
) {
|
||||
val api = retrofitHolder.retrofit.create(LemmyAPI::class.java)
|
||||
api.privateMessagesList(page, limit, unreadOnly, auth).enqueue(
|
||||
object : retrofit2.Callback<String> {
|
||||
override fun onResponse(
|
||||
call: retrofit2.Call<String>,
|
||||
response: retrofit2.Response<String>
|
||||
) {
|
||||
if (response.isSuccessful) {
|
||||
val jresponse = JSONObject(response.body()!!);
|
||||
val privateMessages = jresponse.getJSONArray("private_messages")
|
||||
val privateMessageList = mutableListOf<PrivateMessage>()
|
||||
for (i in 0 until privateMessages.length()) {
|
||||
val privateMessage =
|
||||
parsePrivateMessage(privateMessages.getJSONObject(i))
|
||||
privateMessageList.add(privateMessage)
|
||||
}
|
||||
listener.onPrivateMessageFetchedSuccess(privateMessageList)
|
||||
} else {
|
||||
listener.onPrivateMessageFetchedError()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFailure(call: retrofit2.Call<String>, t: Throwable) {
|
||||
listener.onPrivateMessageFetchedError()
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
fun markPrivateMessageAsRead(
|
||||
auth: String,
|
||||
privateMessageId: Int,
|
||||
listener: PrivateMessageMarkedAsReadListener
|
||||
) {
|
||||
val api = retrofitHolder.retrofit.create(LemmyAPI::class.java)
|
||||
api.privateMessageMarkAsRead(PrivateMessageReadDTO(privateMessageId, auth, true)).enqueue(
|
||||
object : retrofit2.Callback<String> {
|
||||
override fun onResponse(
|
||||
call: retrofit2.Call<String>,
|
||||
response: retrofit2.Response<String>
|
||||
) {
|
||||
if (response.isSuccessful) {
|
||||
listener.onPrivateMessageMarkedAsReadSuccess()
|
||||
} else {
|
||||
listener.onPrivateMessageMarkedAsReadError()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFailure(call: retrofit2.Call<String>, t: Throwable) {
|
||||
listener.onPrivateMessageMarkedAsReadError()
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
fun sendPrivateMessage(
|
||||
auth: String,
|
||||
recipientId: Int,
|
||||
content: String,
|
||||
listener: PrivateMessageSentListener
|
||||
) {
|
||||
val api = retrofitHolder.retrofit.create(LemmyAPI::class.java)
|
||||
|
||||
api.privateMessageSend(PrivateMessageDTO(recipientId, content, auth)).enqueue(
|
||||
object : retrofit2.Callback<String> {
|
||||
override fun onResponse(
|
||||
call: retrofit2.Call<String>,
|
||||
response: retrofit2.Response<String>
|
||||
) {
|
||||
if (response.isSuccessful) {
|
||||
listener.onPrivateMessageSentSuccess(
|
||||
parsePrivateMessage(
|
||||
JSONObject(response.body()!!).getJSONObject(
|
||||
"private_message_view"
|
||||
)
|
||||
)
|
||||
)
|
||||
} else {
|
||||
listener.onPrivateMessageSentError()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFailure(call: retrofit2.Call<String>, t: Throwable) {
|
||||
listener.onPrivateMessageSentError()
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
interface PrivateMessageSentListener {
|
||||
fun onPrivateMessageSentSuccess(privateMessage: PrivateMessage)
|
||||
fun onPrivateMessageSentError()
|
||||
}
|
||||
|
||||
interface PrivateMessageMarkedAsReadListener {
|
||||
fun onPrivateMessageMarkedAsReadSuccess()
|
||||
fun onPrivateMessageMarkedAsReadError()
|
||||
}
|
||||
|
||||
|
||||
interface PrivateMessageFetchedListener {
|
||||
fun onPrivateMessageFetchedSuccess(privateMessage: List<PrivateMessage>)
|
||||
fun onPrivateMessageFetchedError()
|
||||
}
|
||||
|
||||
private fun parsePrivateMessage(jsonObject: JSONObject): PrivateMessage {
|
||||
|
||||
val privateMessage = jsonObject.getJSONObject("private_message")
|
||||
val creator = jsonObject.getJSONObject("creator")
|
||||
val recipient = jsonObject.getJSONObject("recipient")
|
||||
val updated = privateMessage.optString("updated", "")
|
||||
|
||||
return PrivateMessage(
|
||||
id = privateMessage.getInt("id"),
|
||||
creatorId = privateMessage.getInt("creator_id"),
|
||||
recipientId = privateMessage.getInt("recipient_id"),
|
||||
content = privateMessage.getString("content"),
|
||||
deleted = privateMessage.getBoolean("deleted"),
|
||||
read = privateMessage.getBoolean("read"),
|
||||
published = LemmyUtils.dateStringToMills(privateMessage.getString("published")),
|
||||
updated = if (updated == "") {
|
||||
null
|
||||
} else {
|
||||
LemmyUtils.dateStringToMills(updated)
|
||||
},
|
||||
creatorName = creator.getString("name"),
|
||||
creatorAvatar = creator.optString("avatar", ""),
|
||||
creatorQualifiedName = LemmyUtils.actorID2FullName(creator.getString("actor_id")),
|
||||
recipientName = recipient.getString("name"),
|
||||
recipientAvatar = recipient.optString("avatar", ""),
|
||||
recipientQualifiedName = LemmyUtils.actorID2FullName(recipient.getString("actor_id"))
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
package eu.toldi.infinityforlemmy.privatemessage
|
||||
|
||||
import android.os.Parcel
|
||||
import android.os.Parcelable
|
||||
|
||||
data class PrivateMessage(
|
||||
val id: Int,
|
||||
val creatorId: Int,
|
||||
val recipientId: Int,
|
||||
val content: String,
|
||||
val deleted: Boolean,
|
||||
var read: Boolean,
|
||||
val published: Long,
|
||||
val updated: Long?,
|
||||
val creatorName: String,
|
||||
val creatorAvatar: String,
|
||||
val creatorQualifiedName: String,
|
||||
val recipientName: String,
|
||||
val recipientAvatar: String,
|
||||
val recipientQualifiedName: String
|
||||
) : Parcelable {
|
||||
fun addReply(reply: PrivateMessage) {
|
||||
replies.add(reply)
|
||||
}
|
||||
|
||||
val replies = mutableListOf<PrivateMessage>()
|
||||
|
||||
constructor(parcel: Parcel) : this(
|
||||
parcel.readInt(),
|
||||
parcel.readInt(),
|
||||
parcel.readInt(),
|
||||
parcel.readString()!!,
|
||||
parcel.readByte() != 0.toByte(),
|
||||
parcel.readByte() != 0.toByte(),
|
||||
parcel.readLong(),
|
||||
parcel.readValue(Long::class.java.classLoader) as? Long,
|
||||
parcel.readString()!!,
|
||||
parcel.readString()!!,
|
||||
parcel.readString()!!,
|
||||
parcel.readString()!!,
|
||||
parcel.readString()!!,
|
||||
parcel.readString()!!
|
||||
) {
|
||||
}
|
||||
|
||||
override fun writeToParcel(parcel: Parcel, flags: Int) {
|
||||
parcel.writeInt(id)
|
||||
parcel.writeInt(creatorId)
|
||||
parcel.writeInt(recipientId)
|
||||
parcel.writeString(content)
|
||||
parcel.writeByte(if (deleted) 1 else 0)
|
||||
parcel.writeByte(if (read) 1 else 0)
|
||||
parcel.writeLong(published)
|
||||
parcel.writeValue(updated)
|
||||
parcel.writeString(creatorName)
|
||||
parcel.writeString(creatorAvatar)
|
||||
parcel.writeString(creatorQualifiedName)
|
||||
parcel.writeString(recipientName)
|
||||
parcel.writeString(recipientAvatar)
|
||||
parcel.writeString(recipientQualifiedName)
|
||||
}
|
||||
|
||||
override fun describeContents(): Int {
|
||||
return 0
|
||||
}
|
||||
|
||||
companion object CREATOR : Parcelable.Creator<PrivateMessage> {
|
||||
override fun createFromParcel(parcel: Parcel): PrivateMessage {
|
||||
return PrivateMessage(parcel)
|
||||
}
|
||||
|
||||
override fun newArray(size: Int): Array<PrivateMessage?> {
|
||||
return arrayOfNulls(size)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
package eu.toldi.infinityforlemmy.privatemessage
|
||||
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.paging.PageKeyedDataSource
|
||||
import eu.toldi.infinityforlemmy.NetworkState
|
||||
|
||||
|
||||
class PrivateMessageDataSource(
|
||||
private val mLemmyPrivateMessageAPI: LemmyPrivateMessageAPI,
|
||||
private val accessToken: String
|
||||
) : PageKeyedDataSource<Int, PrivateMessage>() {
|
||||
|
||||
val initialLoadStateLiveData = MutableLiveData<NetworkState>()
|
||||
|
||||
override fun loadInitial(
|
||||
params: LoadInitialParams<Int>,
|
||||
callback: LoadInitialCallback<Int, PrivateMessage>
|
||||
) {
|
||||
mLemmyPrivateMessageAPI.fetchPrivateMessages(accessToken, 1, object :
|
||||
LemmyPrivateMessageAPI.PrivateMessageFetchedListener {
|
||||
override fun onPrivateMessageFetchedSuccess(privateMessages: List<PrivateMessage>) {
|
||||
initialLoadStateLiveData.postValue(NetworkState.LOADED)
|
||||
if (privateMessages.isEmpty()) {
|
||||
callback.onResult(ArrayList(), null, null)
|
||||
} else {
|
||||
callback.onResult(privateMessages, null, 2)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onPrivateMessageFetchedError() {
|
||||
initialLoadStateLiveData.postValue(
|
||||
NetworkState(
|
||||
NetworkState.Status.FAILED,
|
||||
"Error fetching messages"
|
||||
)
|
||||
)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
override fun loadAfter(
|
||||
params: LoadParams<Int>,
|
||||
callback: LoadCallback<Int, PrivateMessage>
|
||||
) {
|
||||
mLemmyPrivateMessageAPI.fetchPrivateMessages(accessToken, params.key, object :
|
||||
LemmyPrivateMessageAPI.PrivateMessageFetchedListener {
|
||||
override fun onPrivateMessageFetchedSuccess(privateMessages: List<PrivateMessage>) {
|
||||
initialLoadStateLiveData.postValue(NetworkState.LOADED)
|
||||
if (privateMessages.isEmpty()) {
|
||||
callback.onResult(ArrayList(), null)
|
||||
} else {
|
||||
callback.onResult(privateMessages, params.key + 1)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
override fun onPrivateMessageFetchedError() {
|
||||
initialLoadStateLiveData.postValue(
|
||||
NetworkState(
|
||||
NetworkState.Status.FAILED,
|
||||
"Error fetching messages"
|
||||
)
|
||||
)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
override fun loadBefore(
|
||||
params: LoadParams<Int>,
|
||||
callback: LoadCallback<Int, PrivateMessage>
|
||||
) {
|
||||
|
||||
}
|
||||
|
||||
fun refresh() {
|
||||
invalidate()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package eu.toldi.infinityforlemmy.privatemessage
|
||||
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.paging.DataSource
|
||||
|
||||
|
||||
class PrivateMessageDataSourceFactory(
|
||||
private val mLemmyPrivateMessageAPI: LemmyPrivateMessageAPI,
|
||||
private val accessToken: String
|
||||
) : DataSource.Factory<Int, PrivateMessage>() {
|
||||
|
||||
val dataSourceLiveData = MutableLiveData<PrivateMessageDataSource>()
|
||||
|
||||
override fun create(): DataSource<Int, PrivateMessage> {
|
||||
val dataSource = PrivateMessageDataSource(mLemmyPrivateMessageAPI, accessToken)
|
||||
dataSourceLiveData.postValue(dataSource)
|
||||
return dataSource
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
package eu.toldi.infinityforlemmy.privatemessage
|
||||
|
||||
import androidx.lifecycle.Transformations
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.paging.LivePagedListBuilder
|
||||
import androidx.paging.PagedList
|
||||
import retrofit2.Retrofit
|
||||
import java.util.Locale
|
||||
|
||||
|
||||
class PrivateMessageViewModel(
|
||||
private val mLemmyPrivateMessageAPI: LemmyPrivateMessageAPI,
|
||||
private val accessToken: String
|
||||
) : ViewModel() {
|
||||
|
||||
private val dataSourceFactory =
|
||||
PrivateMessageDataSourceFactory(mLemmyPrivateMessageAPI, accessToken)
|
||||
|
||||
val privateMessages = LivePagedListBuilder(
|
||||
dataSourceFactory, PagedList.Config.Builder()
|
||||
.setPageSize(20)
|
||||
.setEnablePlaceholders(false)
|
||||
.build()
|
||||
)
|
||||
.build()
|
||||
|
||||
val initialLoadState = Transformations.switchMap(dataSourceFactory.dataSourceLiveData) {
|
||||
it.initialLoadStateLiveData
|
||||
}
|
||||
|
||||
fun refresh() {
|
||||
dataSourceFactory.dataSourceLiveData.value?.refresh()
|
||||
}
|
||||
|
||||
|
||||
class Factory(
|
||||
private val retrofit: Retrofit,
|
||||
private val locale: Locale,
|
||||
private val accessToken: String,
|
||||
private val lemmyPrivateMessageAPI: LemmyPrivateMessageAPI
|
||||
) :
|
||||
ViewModelProvider.NewInstanceFactory() {
|
||||
|
||||
override fun <T : ViewModel> create(modelClass: Class<T>): T {
|
||||
return PrivateMessageViewModel(
|
||||
lemmyPrivateMessageAPI,
|
||||
accessToken,
|
||||
) as T
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package eu.toldi.infinityforlemmy.user
|
||||
|
||||
import android.os.Parcel
|
||||
import android.os.Parcelable
|
||||
|
||||
data class BasicUserInfo(
|
||||
val id: Int,
|
||||
val username: String,
|
||||
val qualifiedName: String,
|
||||
val avatar: String?,
|
||||
val displayName: String
|
||||
) : Parcelable {
|
||||
constructor(parcel: Parcel) : this(
|
||||
parcel.readInt(),
|
||||
parcel.readString()!!,
|
||||
parcel.readString()!!,
|
||||
parcel.readString(),
|
||||
parcel.readString()!!
|
||||
) {
|
||||
}
|
||||
|
||||
override fun writeToParcel(parcel: Parcel, flags: Int) {
|
||||
parcel.writeInt(id)
|
||||
parcel.writeString(username)
|
||||
parcel.writeString(qualifiedName)
|
||||
parcel.writeString(avatar)
|
||||
parcel.writeString(displayName)
|
||||
}
|
||||
|
||||
override fun describeContents(): Int {
|
||||
return 0
|
||||
}
|
||||
|
||||
companion object CREATOR : Parcelable.Creator<BasicUserInfo> {
|
||||
override fun createFromParcel(parcel: Parcel): BasicUserInfo {
|
||||
return BasicUserInfo(parcel)
|
||||
}
|
||||
|
||||
override fun newArray(size: Int): Array<BasicUserInfo?> {
|
||||
return arrayOfNulls(size)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package eu.toldi.infinityforlemmy.user
|
||||
|
||||
import android.os.Parcel
|
||||
import android.os.Parcelable
|
||||
|
||||
data class UserStats(
|
||||
val postCount: Int,
|
||||
val postScore: Int,
|
||||
val commentCount: Int,
|
||||
val commentScore: Int
|
||||
) : Parcelable {
|
||||
constructor(parcel: Parcel) : this(
|
||||
parcel.readInt(),
|
||||
parcel.readInt(),
|
||||
parcel.readInt(),
|
||||
parcel.readInt()
|
||||
) {
|
||||
}
|
||||
|
||||
override fun writeToParcel(parcel: Parcel, flags: Int) {
|
||||
parcel.writeInt(postCount)
|
||||
parcel.writeInt(postScore)
|
||||
parcel.writeInt(commentCount)
|
||||
parcel.writeInt(commentScore)
|
||||
}
|
||||
|
||||
override fun describeContents(): Int {
|
||||
return 0
|
||||
}
|
||||
|
||||
companion object CREATOR : Parcelable.Creator<UserStats> {
|
||||
override fun createFromParcel(parcel: Parcel): UserStats {
|
||||
return UserStats(parcel)
|
||||
}
|
||||
|
||||
override fun newArray(size: Int): Array<UserStats?> {
|
||||
return arrayOfNulls(size)
|
||||
}
|
||||
}
|
||||
}
|
||||
10
app/src/main/res/drawable/ic_baseline_info_24.xml
Normal file
10
app/src/main/res/drawable/ic_baseline_info_24.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<vector android:height="24dp"
|
||||
android:tint="#000000"
|
||||
android:viewportHeight="24"
|
||||
android:viewportWidth="24"
|
||||
android:width="24dp"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-6h2v6zM13,9h-2L11,7h2v2z" />
|
||||
</vector>
|
||||
10
app/src/main/res/drawable/ic_bolt_24.xml
Normal file
10
app/src/main/res/drawable/ic_bolt_24.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<vector android:height="24dp"
|
||||
android:tint="#000000"
|
||||
android:viewportHeight="24"
|
||||
android:viewportWidth="24"
|
||||
android:width="24dp"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M11,21h-1l1,-7H7.5c-0.58,0 -0.57,-0.32 -0.38,-0.66 0.19,-0.34 0.05,-0.08 0.07,-0.12C8.48,10.94 10.42,7.54 13,3h1l-1,7h3.5c0.49,0 0.56,0.33 0.47,0.51l-0.07,0.15C12.96,17.55 11,21 11,21z" />
|
||||
</vector>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user