mirror of
				https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy.git
				synced 2025-11-04 02:39:09 +01:00 
			
		
		
		
	Compare commits
	
		
			4 Commits
		
	
	
		
			v0.2.1
			...
			reproducib
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					134c895cd4 | ||
| 
						 | 
					ec6567b9b2 | ||
| 
						 | 
					40fa3a1987 | ||
| 
						 | 
					05123c7068 | 
							
								
								
									
										
											BIN
										
									
								
								.assets/IzzyOnDroid.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								.assets/IzzyOnDroid.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 20 KiB  | 
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 14 KiB  | 
@@ -1,28 +0,0 @@
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
name: "Feature request"
 | 
			
		||||
about: "Request a feature!"
 | 
			
		||||
title: "[Feature] "
 | 
			
		||||
ref: "master"
 | 
			
		||||
labels:
 | 
			
		||||
 | 
			
		||||
- Kind/Feature
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
### Description
 | 
			
		||||
<!-- A clear and concise description of what the feature is and what problem it solves. -->
 | 
			
		||||
 | 
			
		||||
### Background
 | 
			
		||||
<!-- Any background information or context that would be helpful. -->
 | 
			
		||||
 | 
			
		||||
### Proposed Solution
 | 
			
		||||
<!--
 | 
			
		||||
- Describe the solution you'd like.
 | 
			
		||||
- A clear and concise description of what you want to happen.
 | 
			
		||||
- Include any alternative solutions or features you've considered.
 | 
			
		||||
- Add any technical details, mockups, or examples if available.
 | 
			
		||||
-->
 | 
			
		||||
 | 
			
		||||
### Additional Context
 | 
			
		||||
<!-- Add any other context, screenshots, or links to existing issues/discussions about the feature here. -->
 | 
			
		||||
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -56,8 +56,6 @@ gen-external-apklibs
 | 
			
		||||
 | 
			
		||||
# NDK
 | 
			
		||||
obj/
 | 
			
		||||
**/ndkHelperBin
 | 
			
		||||
**/.cxx
 | 
			
		||||
 | 
			
		||||
# IntelliJ IDEA
 | 
			
		||||
*.iml
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +1,13 @@
 | 
			
		||||
steps:
 | 
			
		||||
  build:
 | 
			
		||||
    image: alvrme/alpine-android:android-34-jdk11
 | 
			
		||||
    image: alvrme/alpine-android:android-33-jdk11
 | 
			
		||||
    commands:
 | 
			
		||||
      - apk add --no-cache python3
 | 
			
		||||
      - ./gradlew :app:assembleRelease
 | 
			
		||||
    when:
 | 
			
		||||
      path: [ app/**, build.gradle ]
 | 
			
		||||
  sign:
 | 
			
		||||
    image: alvrme/alpine-android:android-34-jdk11
 | 
			
		||||
    image: alvrme/alpine-android:android-33-jdk11
 | 
			
		||||
    commands:
 | 
			
		||||
      - ./scripts/apk-sign.sh Eternity-signed.apk app/build/outputs/apk/release/app-release-unsigned.apk
 | 
			
		||||
    secrets: [ APK_KS_PASS, APK_KS, APK_KS_ALIAS ]
 | 
			
		||||
@@ -23,7 +23,7 @@ steps:
 | 
			
		||||
        from_secret: GITEA_ACCESS_TOKEN
 | 
			
		||||
      target: main
 | 
			
		||||
      prerelease: true
 | 
			
		||||
      note: "Pending release notes..."
 | 
			
		||||
      note: "This is an alpha release. Expect many bugs and unfinished features!"
 | 
			
		||||
    when:
 | 
			
		||||
      event: [ tag ]
 | 
			
		||||
when:
 | 
			
		||||
 
 | 
			
		||||
@@ -6,12 +6,12 @@ clone:
 | 
			
		||||
 | 
			
		||||
steps:
 | 
			
		||||
  build:
 | 
			
		||||
    image: alvrme/alpine-android:android-34-jdk11
 | 
			
		||||
    image: alvrme/alpine-android:android-33-jdk11
 | 
			
		||||
    commands:
 | 
			
		||||
      - apk add --no-cache python3
 | 
			
		||||
      - ./gradlew :app:assembleNightly
 | 
			
		||||
  sign:
 | 
			
		||||
    image: alvrme/alpine-android:android-34-jdk11
 | 
			
		||||
    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 ]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										80
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										80
									
								
								README.md
									
									
									
									
									
								
							@@ -1,5 +1,5 @@
 | 
			
		||||
<h1 align="center">
 | 
			
		||||
  Eternity for Lemmy
 | 
			
		||||
  Eternity (formerly Infinity for Lemmy)
 | 
			
		||||
</h1>
 | 
			
		||||
 | 
			
		||||
<div align="center">
 | 
			
		||||
@@ -14,20 +14,18 @@ A Lemmy client for Android written in Java. It's a fork of the [Infinity for Red
 | 
			
		||||
 | 
			
		||||
[](https://ci.codeberg.org/repos/12474)
 | 
			
		||||
[](https://liberapay.com/Bazsalanszky)
 | 
			
		||||
[](https://lemdro.id/c/eternityapp)
 | 
			
		||||
 | 
			
		||||
<a href="https://codeberg.org/Bazsalanszky/Eternity/issues">Report a Bug</a>
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<div align="center">
 | 
			
		||||
<a href="https://f-droid.org/packages/eu.toldi.infinityforlemmy/">
 | 
			
		||||
    <img src="./.assets/fdroid-badge.png" height="80">
 | 
			
		||||
</a>
 | 
			
		||||
<a href="https://play.google.com/store/apps/details?id=eu.toldi.infinityforlemmy">
 | 
			
		||||
    <img src="./.assets/google-play-badge.png" height="80">
 | 
			
		||||
</a>
 | 
			
		||||
 | 
			
		||||
<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/Eternity/releases/">
 | 
			
		||||
    <img src="./.assets/codeberg.png" height="80">
 | 
			
		||||
</a>
 | 
			
		||||
@@ -38,62 +36,24 @@ A Lemmy client for Android written in Java. It's a fork of the [Infinity for Red
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## Features
 | 
			
		||||
## Action Items for Eternity
 | 
			
		||||
 | 
			
		||||
Eternity is currently in the early stages of development. Expect many unfinished features and bugs!
 | 
			
		||||
 | 
			
		||||
### Browsing Lemmy
 | 
			
		||||
 | 
			
		||||
 - Explore various feeds (Subscribed/Local/All) and communities
 | 
			
		||||
 - Subscribe or unsubscribe from specific communities, with the option to block
 | 
			
		||||
 - Discover communities federated with the current instance
 | 
			
		||||
 - Favorite a community for quick access
 | 
			
		||||
 - Manage your subscriptions and blocked communities
 | 
			
		||||
 | 
			
		||||
### Content Engagement
 | 
			
		||||
 | 
			
		||||
- Engage with content by voting, saving, sharing, and creating posts or comments
 | 
			
		||||
- Enjoy endless scrolling through feeds and posts
 | 
			
		||||
- Tailor the view settings for posts (card,compact, gallery)
 | 
			
		||||
- Set default preferences for post and comment sorting
 | 
			
		||||
- Stay updated with notifications for replies
 | 
			
		||||
 | 
			
		||||
### Account Management
 | 
			
		||||
 | 
			
		||||
- Sign in to multiple accounts or instances, and effortlessly switch between them
 | 
			
		||||
- Use the inbox features to view replies, mentions, and private messages
 | 
			
		||||
- Access your profile to view your posts, comments, and saved content
 | 
			
		||||
 | 
			
		||||
### Customization
 | 
			
		||||
 | 
			
		||||
- Choose between various theme options including Light, Dark, OLED
 | 
			
		||||
- Support Material You theming
 | 
			
		||||
- Explore user-created themes
 | 
			
		||||
- Customize font settings
 | 
			
		||||
- Optional bottom navigation bar
 | 
			
		||||
- Discover a plethora of other customization features
 | 
			
		||||
 | 
			
		||||
<img 
 | 
			
		||||
  src="https://codeberg.org/Bazsalanszky/Eternity/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png" 
 | 
			
		||||
  alt="Screenshot 1"
 | 
			
		||||
  height="200" >
 | 
			
		||||
<img 
 | 
			
		||||
  src="https://codeberg.org/Bazsalanszky/Eternity/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png" 
 | 
			
		||||
  alt="Screenshot 2"
 | 
			
		||||
  height="200" >
 | 
			
		||||
<img 
 | 
			
		||||
  src="https://codeberg.org/Bazsalanszky/Eternity/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png" 
 | 
			
		||||
  alt="Screenshot 3"
 | 
			
		||||
  height="200" >
 | 
			
		||||
<img 
 | 
			
		||||
  src="https://codeberg.org/Bazsalanszky/Eternity/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png" 
 | 
			
		||||
  alt="Screenshot 4"
 | 
			
		||||
  height="200" >
 | 
			
		||||
<img 
 | 
			
		||||
  src="https://codeberg.org/Bazsalanszky/Eternity/raw/branch/master/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png" 
 | 
			
		||||
  alt="Screenshot 5"
 | 
			
		||||
  height="200" >
 | 
			
		||||
 | 
			
		||||
- [x] Implementation of basic post browsing feature
 | 
			
		||||
- [x] Support for multiple account handling
 | 
			
		||||
- [x] Functionality for post upvotes/downvotes
 | 
			
		||||
- [x] Functionality to browse comments
 | 
			
		||||
- [x] Capability for creating a new post
 | 
			
		||||
- [x] Ability to create comments
 | 
			
		||||
- [x] Edit/Delete posts and comments
 | 
			
		||||
- [x] Basic inbox
 | 
			
		||||
- [ ] Elimination of code/string references specific to Reddit
 | 
			
		||||
- [x] Incorporation of private messaging feature
 | 
			
		||||
- [x] Feature for saving posts/comments
 | 
			
		||||
- [x] Resolving links
 | 
			
		||||
- [ ] Account editing function
 | 
			
		||||
- [ ] Multi community view?
 | 
			
		||||
 | 
			
		||||
## Contributing
 | 
			
		||||
 | 
			
		||||
@@ -112,7 +72,7 @@ Don't forget to give the project a star! Thanks again!
 | 
			
		||||
 | 
			
		||||
### Translation
 | 
			
		||||
 | 
			
		||||
You can also help Eternity by translating it to your native langugage! Translations are done via [Weblate](https://translate.codeberg.org/projects/infinity-for-lemmy/app/)!
 | 
			
		||||
You can alos help Eternity 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/Eternity/)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -16,13 +16,13 @@ def getCommitVersionCode = { ->
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
android {
 | 
			
		||||
    compileSdk 34
 | 
			
		||||
    compileSdk 33
 | 
			
		||||
    defaultConfig {
 | 
			
		||||
        applicationId "eu.toldi.infinityforlemmy"
 | 
			
		||||
        minSdk 21
 | 
			
		||||
        targetSdk 34
 | 
			
		||||
        versionCode 136
 | 
			
		||||
        versionName "0.2.1"
 | 
			
		||||
        targetSdk 33
 | 
			
		||||
        versionCode 130
 | 
			
		||||
        versionName "0.1.1"
 | 
			
		||||
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
 | 
			
		||||
        javaCompileOptions {
 | 
			
		||||
            annotationProcessorOptions {
 | 
			
		||||
@@ -33,8 +33,7 @@ android {
 | 
			
		||||
    buildTypes {
 | 
			
		||||
 | 
			
		||||
        release {
 | 
			
		||||
            minifyEnabled true
 | 
			
		||||
            shrinkResources true
 | 
			
		||||
            minifyEnabled false
 | 
			
		||||
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -98,17 +97,11 @@ android {
 | 
			
		||||
    packagingOptions {
 | 
			
		||||
        doNotStrip '**/*.so'
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Kotlin jvm target
 | 
			
		||||
    kotlinOptions {
 | 
			
		||||
        jvmTarget = '11'
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    namespace 'eu.toldi.infinityforlemmy'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    task rearrangeClass(type: Exec) {
 | 
			
		||||
        commandLine 'python3', '../scripts/fixEventBus.py'
 | 
			
		||||
        commandLine 'python', '../scripts/fixEventBus.py'
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    applicationVariants.all { variant ->
 | 
			
		||||
@@ -232,7 +225,7 @@ dependencies {
 | 
			
		||||
    implementation 'com.github.santalu:aspect-ratio-imageview:1.0.9'
 | 
			
		||||
    implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.23'
 | 
			
		||||
    def bivVersion = "1.8.1"
 | 
			
		||||
    implementation "com.github.piasy:BigImageViewer:$bivVersion"
 | 
			
		||||
    implementation "com.github.piasy:BigImageViewer:bivVersion"
 | 
			
		||||
    implementation "com.github.piasy:GlideImageLoader:$bivVersion"
 | 
			
		||||
    implementation "com.github.piasy:GlideImageViewFactory:$bivVersion"
 | 
			
		||||
 | 
			
		||||
@@ -254,6 +247,8 @@ dependencies {
 | 
			
		||||
    // Loading ProgressBar
 | 
			
		||||
    implementation 'com.lsjwzh:materialloadingprogressbar:0.5.8-RELEASE'
 | 
			
		||||
 | 
			
		||||
    // Customizable TextView
 | 
			
		||||
    implementation 'com.libRG:customtextview:2.4'
 | 
			
		||||
 | 
			
		||||
    // Dismiss gesturing
 | 
			
		||||
    implementation 'app.futured.hauler:hauler:5.0.0'
 | 
			
		||||
@@ -269,8 +264,6 @@ dependencies {
 | 
			
		||||
 | 
			
		||||
    implementation 'com.otaliastudios:zoomlayout:1.9.0'
 | 
			
		||||
 | 
			
		||||
    implementation 'androidx.core:core-splashscreen:1.0.1'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**** Builds and flavors ****/
 | 
			
		||||
    // debugImplementation because LeakCanary should only run in debug builds.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								app/proguard-rules.pro
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								app/proguard-rules.pro
									
									
									
									
										vendored
									
									
								
							@@ -5,8 +5,6 @@
 | 
			
		||||
# If you keep the line number information, uncomment this to
 | 
			
		||||
# hide the original source file name.
 | 
			
		||||
#-renamesourcefileattribute SourceFile
 | 
			
		||||
-dontobfuscate
 | 
			
		||||
-keepattributes SourceFile,LineNumberTable
 | 
			
		||||
 | 
			
		||||
## Preferences reflection
 | 
			
		||||
-keep class * extends androidx.preference.PreferenceFragmentCompat
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    package="eu.toldi.infinityforlemmy">
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools">
 | 
			
		||||
 | 
			
		||||
    <queries>
 | 
			
		||||
        <intent>
 | 
			
		||||
@@ -17,14 +16,12 @@
 | 
			
		||||
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
 | 
			
		||||
        android:maxSdkVersion="22" />
 | 
			
		||||
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
 | 
			
		||||
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC"/>
 | 
			
		||||
 | 
			
		||||
    <uses-permission-sdk-23
 | 
			
		||||
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
 | 
			
		||||
        android:maxSdkVersion="28" />
 | 
			
		||||
 | 
			
		||||
    <uses-permission android:name="android.permission.WAKE_LOCK" />
 | 
			
		||||
 | 
			
		||||
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
 | 
			
		||||
 | 
			
		||||
    <application
 | 
			
		||||
@@ -44,26 +41,9 @@
 | 
			
		||||
            android:parentActivityName=".activities.MainActivity"
 | 
			
		||||
            android:theme="@style/AppTheme.Slidable" />
 | 
			
		||||
        <activity
 | 
			
		||||
            android:name=".activities.CommentFilterUsageListingActivity"
 | 
			
		||||
            android:parentActivityName=".activities.SettingsActivity"
 | 
			
		||||
            android:theme="@style/AppTheme.NoActionBar"
 | 
			
		||||
            android:exported="false" />
 | 
			
		||||
        <activity
 | 
			
		||||
            android:name=".activities.CustomizeCommentFilterActivity"
 | 
			
		||||
            android:label="@string/customize_comment_filter_activity_label"
 | 
			
		||||
            android:parentActivityName=".activities.SettingsActivity"
 | 
			
		||||
            android:theme="@style/AppTheme.NoActionBar"
 | 
			
		||||
            android:exported="false" />
 | 
			
		||||
        <activity
 | 
			
		||||
            android:name=".activities.CommentFilterPreferenceActivity"
 | 
			
		||||
            android:label="@string/comment_filter_preference_activity_label"
 | 
			
		||||
            android:parentActivityName=".activities.SettingsActivity"
 | 
			
		||||
            android:theme="@style/AppTheme.NoActionBar"
 | 
			
		||||
            android:exported="false" />
 | 
			
		||||
 | 
			
		||||
        <activity
 | 
			
		||||
            android:name=".activities.BlockedThingListingActivity"
 | 
			
		||||
            android:label="@string/blocks"
 | 
			
		||||
            android:name=".activities.HistoryActivity"
 | 
			
		||||
            android:exported="false"
 | 
			
		||||
            android:label="@string/history_activity_label"
 | 
			
		||||
            android:parentActivityName=".activities.MainActivity"
 | 
			
		||||
            android:theme="@style/AppTheme.Slidable" />
 | 
			
		||||
        <activity
 | 
			
		||||
@@ -136,7 +116,11 @@
 | 
			
		||||
            android:name=".activities.FetchRandomSubredditOrPostActivity"
 | 
			
		||||
            android:parentActivityName=".activities.MainActivity"
 | 
			
		||||
            android:theme="@style/AppTheme.NoActionBar" />
 | 
			
		||||
 | 
			
		||||
        <activity
 | 
			
		||||
            android:name=".activities.GiveAwardActivity"
 | 
			
		||||
            android:label="@string/give_award_activity_label"
 | 
			
		||||
            android:parentActivityName=".activities.MainActivity"
 | 
			
		||||
            android:theme="@style/AppTheme.Slidable" />
 | 
			
		||||
        <activity
 | 
			
		||||
            android:name=".activities.SelectUserFlairActivity"
 | 
			
		||||
            android:parentActivityName=".activities.MainActivity"
 | 
			
		||||
@@ -155,7 +139,6 @@
 | 
			
		||||
        <service
 | 
			
		||||
            android:name=".services.DownloadMediaService"
 | 
			
		||||
            android:enabled="true"
 | 
			
		||||
            android:foregroundServiceType="dataSync"
 | 
			
		||||
            android:exported="false" />
 | 
			
		||||
 | 
			
		||||
        <activity
 | 
			
		||||
@@ -173,7 +156,6 @@
 | 
			
		||||
        <service
 | 
			
		||||
            android:name=".services.DownloadRedditVideoService"
 | 
			
		||||
            android:enabled="true"
 | 
			
		||||
            android:foregroundServiceType="dataSync"
 | 
			
		||||
            android:exported="false" />
 | 
			
		||||
 | 
			
		||||
        <activity
 | 
			
		||||
@@ -322,7 +304,7 @@
 | 
			
		||||
                <data android:host="feddit.de" />
 | 
			
		||||
                <data android:host="lemmy.fmhy.ml" />
 | 
			
		||||
                <data android:host="lemmy.ca" />
 | 
			
		||||
                <data android:host="hexbear.net" />
 | 
			
		||||
                <data android:host="www.hexbear.net" />
 | 
			
		||||
                <data android:host="programming.dev" />
 | 
			
		||||
                <data android:host="lemmy.dbzer0.com" />
 | 
			
		||||
                <data android:host="lemmy.blahaj.zone" />
 | 
			
		||||
@@ -425,6 +407,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"
 | 
			
		||||
@@ -454,37 +441,11 @@
 | 
			
		||||
            android:theme="@style/AppTheme.Launcher"
 | 
			
		||||
            android:windowSoftInputMode="adjustPan">
 | 
			
		||||
            <intent-filter>
 | 
			
		||||
                <action android:name="android.intent.action.MAIN" />
 | 
			
		||||
 | 
			
		||||
                <category android:name="android.intent.category.LAUNCHER" />
 | 
			
		||||
            </intent-filter>
 | 
			
		||||
        </activity>
 | 
			
		||||
 | 
			
		||||
        <activity-alias
 | 
			
		||||
            android:name=".DefaultIcon"
 | 
			
		||||
            android:targetActivity=".activities.MainActivity"
 | 
			
		||||
            android:label="@string/application_name"
 | 
			
		||||
            android:enabled="true"
 | 
			
		||||
            android:icon="@mipmap/ic_launcher"
 | 
			
		||||
            android:exported="true">
 | 
			
		||||
            <intent-filter>
 | 
			
		||||
                <action android:name="android.intent.action.MAIN" />
 | 
			
		||||
 | 
			
		||||
                <category android:name="android.intent.category.LAUNCHER" />
 | 
			
		||||
            </intent-filter>
 | 
			
		||||
        </activity-alias>
 | 
			
		||||
 | 
			
		||||
        <activity-alias
 | 
			
		||||
            android:name=".OriginalIcon"
 | 
			
		||||
            android:targetActivity=".activities.MainActivity"
 | 
			
		||||
            android:label="@string/application_name"
 | 
			
		||||
            android:enabled="false"
 | 
			
		||||
            android:icon="@mipmap/original_ic_launcher"
 | 
			
		||||
            android:exported="true">
 | 
			
		||||
            <intent-filter>
 | 
			
		||||
                <action android:name="android.intent.action.MAIN" />
 | 
			
		||||
                <category android:name="android.intent.category.LAUNCHER" />
 | 
			
		||||
            </intent-filter>
 | 
			
		||||
        </activity-alias>
 | 
			
		||||
 | 
			
		||||
        <activity
 | 
			
		||||
            android:name=".activities.LoginActivity"
 | 
			
		||||
            android:configChanges="orientation|screenLayout|screenSize|layoutDirection"
 | 
			
		||||
@@ -513,7 +474,6 @@
 | 
			
		||||
            android:name=".activities.ViewUserDetailActivity"
 | 
			
		||||
            android:parentActivityName=".activities.MainActivity"
 | 
			
		||||
            android:theme="@style/AppTheme.Slidable" />
 | 
			
		||||
 | 
			
		||||
        <provider
 | 
			
		||||
            android:name="androidx.core.content.FileProvider"
 | 
			
		||||
            android:authorities="${applicationId}.provider"
 | 
			
		||||
@@ -536,12 +496,10 @@
 | 
			
		||||
        <service
 | 
			
		||||
            android:name=".services.SubmitPostService"
 | 
			
		||||
            android:enabled="true"
 | 
			
		||||
            android:foregroundServiceType="dataSync"
 | 
			
		||||
            android:exported="false" />
 | 
			
		||||
        <service
 | 
			
		||||
            android:name=".services.EditProfileService"
 | 
			
		||||
            android:enabled="true"
 | 
			
		||||
            android:foregroundServiceType="dataSync"
 | 
			
		||||
            android:exported="false" />
 | 
			
		||||
 | 
			
		||||
        <receiver android:name=".broadcastreceivers.DownloadedMediaDeleteActionBroadcastReceiver" />
 | 
			
		||||
 
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 33 KiB  | 
@@ -12,12 +12,9 @@ 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.CommentFilterPreferenceActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.CommentFilterUsageListingActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.CreateMultiRedditActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.CustomThemeListingActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.CustomThemePreviewActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.CustomizeCommentFilterActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.CustomizePostFilterActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.CustomizeThemeActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.EditCommentActivity;
 | 
			
		||||
@@ -28,6 +25,7 @@ import eu.toldi.infinityforlemmy.activities.FetchRandomSubredditOrPostActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.FilteredPostsActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.FullMarkdownActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.GiveAwardActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.HistoryActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.InboxActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.InstanceInfoActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.LinkResolverActivity;
 | 
			
		||||
@@ -74,10 +72,10 @@ import eu.toldi.infinityforlemmy.bottomsheetfragments.AccountChooserBottomSheetF
 | 
			
		||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.CommentMoreBottomSheetFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.FlairBottomSheetFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.BlockedCommunitiesListingFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.BlockedInstancesListingFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.BlockedUsersListingFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.CommentsListingFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.FollowedUsersListingFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.HistoryPostFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.InboxFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.MorePostsInfoFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.MultiRedditListingFragment;
 | 
			
		||||
@@ -311,6 +309,10 @@ public interface AppComponent {
 | 
			
		||||
 | 
			
		||||
    void inject(MaterialYouWorker materialYouWorker);
 | 
			
		||||
 | 
			
		||||
    void inject(HistoryPostFragment historyPostFragment);
 | 
			
		||||
 | 
			
		||||
    void inject(HistoryActivity historyActivity);
 | 
			
		||||
 | 
			
		||||
    void inject(MorePostsInfoFragment morePostsInfoFragment);
 | 
			
		||||
 | 
			
		||||
    void inject(BlockedThingListingActivity blockedThingListingActivity);
 | 
			
		||||
@@ -319,20 +321,12 @@ public interface AppComponent {
 | 
			
		||||
 | 
			
		||||
    void inject(BlockedUsersListingFragment blockedUsersListingFragment);
 | 
			
		||||
 | 
			
		||||
    void inject(BlockedInstancesListingFragment blockedInstancesListingFragment);
 | 
			
		||||
 | 
			
		||||
    void inject(CommentMoreBottomSheetFragment commentMoreBottomSheetFragment);
 | 
			
		||||
 | 
			
		||||
    void inject(PrivateMessageFragment privateMessageFragment);
 | 
			
		||||
 | 
			
		||||
    void inject(@NotNull InstanceInfoActivity instanceInfoActivity);
 | 
			
		||||
 | 
			
		||||
    void inject(CommentFilterPreferenceActivity commentFilterPreferenceActivity);
 | 
			
		||||
 | 
			
		||||
    void inject(CustomizeCommentFilterActivity customizeCommentFilterActivity);
 | 
			
		||||
 | 
			
		||||
    void inject(CommentFilterUsageListingActivity commentFilterUsageListingActivity);
 | 
			
		||||
 | 
			
		||||
    @Component.Factory
 | 
			
		||||
    interface Factory {
 | 
			
		||||
        AppComponent create(@BindsInstance Application application);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,85 +0,0 @@
 | 
			
		||||
package eu.toldi.infinityforlemmy;
 | 
			
		||||
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.graphics.drawable.GradientDrawable;
 | 
			
		||||
import android.util.AttributeSet;
 | 
			
		||||
import androidx.appcompat.widget.AppCompatTextView;
 | 
			
		||||
import android.content.res.TypedArray;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
public class CustomTextView extends AppCompatTextView {
 | 
			
		||||
 | 
			
		||||
    private float radius = 6f;
 | 
			
		||||
    private boolean roundedView = true;
 | 
			
		||||
    private int shape = 0;
 | 
			
		||||
 | 
			
		||||
    public CustomTextView(Context context) {
 | 
			
		||||
        super(context);
 | 
			
		||||
        init(null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public CustomTextView(Context context, AttributeSet attrs) {
 | 
			
		||||
        super(context, attrs);
 | 
			
		||||
        init(attrs);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public CustomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
 | 
			
		||||
        super(context, attrs, defStyleAttr);
 | 
			
		||||
        init(attrs);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void init(AttributeSet attrs) {
 | 
			
		||||
        if (attrs != null) {
 | 
			
		||||
            TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CustomTextView);
 | 
			
		||||
 | 
			
		||||
            radius = a.getDimension(R.styleable.CustomTextView_lib_setRadius, radius);
 | 
			
		||||
            roundedView = a.getBoolean(R.styleable.CustomTextView_lib_setRoundedView, roundedView);
 | 
			
		||||
            shape = a.getInt(R.styleable.CustomTextView_lib_setShape, shape);
 | 
			
		||||
 | 
			
		||||
            a.recycle();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        updateBackground();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void updateBackground() {
 | 
			
		||||
        GradientDrawable drawable = new GradientDrawable();
 | 
			
		||||
 | 
			
		||||
        if (shape == 0) {  // Rectangle
 | 
			
		||||
            drawable.setShape(GradientDrawable.RECTANGLE);
 | 
			
		||||
        } else if (shape == 1) {  // Oval
 | 
			
		||||
            drawable.setShape(GradientDrawable.OVAL);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (roundedView) {
 | 
			
		||||
            drawable.setCornerRadius(radius);
 | 
			
		||||
        } else {
 | 
			
		||||
            drawable.setCornerRadius(0);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.setBackground(drawable);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setBackgroundColor(int color) {
 | 
			
		||||
        GradientDrawable background = (GradientDrawable) this.getBackground();
 | 
			
		||||
        background.setColor(color);
 | 
			
		||||
        this.setBackground(background);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setBorderColor(int borderColor, int borderWidthDp) {
 | 
			
		||||
        GradientDrawable background = (GradientDrawable) this.getBackground();
 | 
			
		||||
        background.setStroke(dpToPx(borderWidthDp), borderColor);
 | 
			
		||||
        this.setBackground(background);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setBorderColor(int borderColor) {
 | 
			
		||||
        this.setBorderColor(borderColor, 1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private int dpToPx(int dp) {
 | 
			
		||||
        float density = getContext().getResources().getDisplayMetrics().density;
 | 
			
		||||
        return Math.round(dp * density);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1,78 +0,0 @@
 | 
			
		||||
package eu.toldi.infinityforlemmy;
 | 
			
		||||
 | 
			
		||||
import android.graphics.Canvas;
 | 
			
		||||
import android.graphics.ColorFilter;
 | 
			
		||||
import android.graphics.Rect;
 | 
			
		||||
import android.graphics.drawable.Drawable;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
public class DualBadgeDrawable extends Drawable {
 | 
			
		||||
    private Drawable leftBadge;
 | 
			
		||||
    private Drawable rightBadge;
 | 
			
		||||
 | 
			
		||||
    public DualBadgeDrawable(Drawable leftBadge, Drawable rightBadge) {
 | 
			
		||||
        this.leftBadge = leftBadge;
 | 
			
		||||
        this.rightBadge = rightBadge;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void draw(Canvas canvas) {
 | 
			
		||||
        if (leftBadge == null || rightBadge == null) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        int width = getBounds().width();
 | 
			
		||||
        int height = getBounds().height();
 | 
			
		||||
 | 
			
		||||
        // Draw the left badge on the left half of the canvas
 | 
			
		||||
        Rect leftRect = new Rect(0, 0, width / 2, height);
 | 
			
		||||
        leftBadge.setBounds(leftRect);
 | 
			
		||||
        leftBadge.draw(canvas);
 | 
			
		||||
 | 
			
		||||
        // Draw the right badge on the right half of the canvas
 | 
			
		||||
        Rect rightRect = new Rect(width / 2, 0, width, height);
 | 
			
		||||
        rightBadge.setBounds(rightRect);
 | 
			
		||||
        rightBadge.draw(canvas);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setAlpha(int alpha) {
 | 
			
		||||
        if (leftBadge != null) {
 | 
			
		||||
            leftBadge.setAlpha(alpha);
 | 
			
		||||
        }
 | 
			
		||||
        if (rightBadge != null) {
 | 
			
		||||
            rightBadge.setAlpha(alpha);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setColorFilter(@Nullable ColorFilter colorFilter) {
 | 
			
		||||
        if (leftBadge != null) {
 | 
			
		||||
            leftBadge.setColorFilter(colorFilter);
 | 
			
		||||
        }
 | 
			
		||||
        if (rightBadge != null) {
 | 
			
		||||
            rightBadge.setColorFilter(colorFilter);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getOpacity() {
 | 
			
		||||
        return leftBadge != null ? leftBadge.getOpacity() : rightBadge.getOpacity();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getIntrinsicWidth() {
 | 
			
		||||
        int leftWidth = leftBadge != null ? leftBadge.getIntrinsicWidth() : 0;
 | 
			
		||||
        int rightWidth = rightBadge != null ? rightBadge.getIntrinsicWidth() : 0;
 | 
			
		||||
        return leftWidth + rightWidth;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getIntrinsicHeight() {
 | 
			
		||||
        int leftHeight = leftBadge != null ? leftBadge.getIntrinsicHeight() : 0;
 | 
			
		||||
        int rightHeight = rightBadge != null ? rightBadge.getIntrinsicHeight() : 0;
 | 
			
		||||
        return Math.max(leftHeight, rightHeight);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,129 @@
 | 
			
		||||
package eu.toldi.infinityforlemmy;
 | 
			
		||||
 | 
			
		||||
import android.os.Handler;
 | 
			
		||||
 | 
			
		||||
import org.json.JSONException;
 | 
			
		||||
import org.json.JSONObject;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.concurrent.Executor;
 | 
			
		||||
 | 
			
		||||
import eu.toldi.infinityforlemmy.apis.GfycatAPI;
 | 
			
		||||
import eu.toldi.infinityforlemmy.apis.RedgifsAPI;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.JSONUtils;
 | 
			
		||||
import retrofit2.Call;
 | 
			
		||||
import retrofit2.Response;
 | 
			
		||||
import retrofit2.Retrofit;
 | 
			
		||||
 | 
			
		||||
public class FetchGfycatOrRedgifsVideoLinks {
 | 
			
		||||
 | 
			
		||||
    public interface FetchGfycatOrRedgifsVideoLinksListener {
 | 
			
		||||
        void success(String webm, String mp4);
 | 
			
		||||
        void failed(int errorCode);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void fetchGfycatVideoLinks(Executor executor, Handler handler, Retrofit gfycatRetrofit,
 | 
			
		||||
                                             String gfycatId,
 | 
			
		||||
                                             FetchGfycatOrRedgifsVideoLinksListener fetchGfycatOrRedgifsVideoLinksListener) {
 | 
			
		||||
        executor.execute(() -> {
 | 
			
		||||
            try {
 | 
			
		||||
                Response<String> response = gfycatRetrofit.create(GfycatAPI.class).getGfycatData(gfycatId).execute();
 | 
			
		||||
                if (response.isSuccessful()) {
 | 
			
		||||
                    parseGfycatVideoLinks(handler, response.body(), fetchGfycatOrRedgifsVideoLinksListener);
 | 
			
		||||
                } else {
 | 
			
		||||
                    handler.post(() -> fetchGfycatOrRedgifsVideoLinksListener.failed(response.code()));
 | 
			
		||||
                }
 | 
			
		||||
            } catch (IOException e) {
 | 
			
		||||
                e.printStackTrace();
 | 
			
		||||
                handler.post(() -> fetchGfycatOrRedgifsVideoLinksListener.failed(-1));
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void fetchRedgifsVideoLinks(Executor executor, Handler handler, Retrofit redgifsRetrofit,
 | 
			
		||||
                                              String gfycatId,
 | 
			
		||||
                                              FetchGfycatOrRedgifsVideoLinksListener fetchGfycatOrRedgifsVideoLinksListener) {
 | 
			
		||||
        executor.execute(() -> {
 | 
			
		||||
            try {
 | 
			
		||||
                Response<String> response = redgifsRetrofit.create(RedgifsAPI.class).getRedgifsData(gfycatId).execute();
 | 
			
		||||
                if (response.isSuccessful()) {
 | 
			
		||||
                    parseRedgifsVideoLinks(handler, response.body(), fetchGfycatOrRedgifsVideoLinksListener);
 | 
			
		||||
                } else {
 | 
			
		||||
                    handler.post(() -> fetchGfycatOrRedgifsVideoLinksListener.failed(response.code()));
 | 
			
		||||
                }
 | 
			
		||||
            } catch (IOException e) {
 | 
			
		||||
                e.printStackTrace();
 | 
			
		||||
                handler.post(() -> fetchGfycatOrRedgifsVideoLinksListener.failed(-1));
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void fetchGfycatOrRedgifsVideoLinksInRecyclerViewAdapter(Executor executor, Handler handler,
 | 
			
		||||
                                                                           Call<String> gfycatCall,
 | 
			
		||||
                                                                           boolean isGfycatVideo,
 | 
			
		||||
                                                                           boolean automaticallyTryRedgifs,
 | 
			
		||||
                                                                           FetchGfycatOrRedgifsVideoLinksListener fetchGfycatOrRedgifsVideoLinksListener) {
 | 
			
		||||
        executor.execute(() -> {
 | 
			
		||||
            try {
 | 
			
		||||
                Response<String> response = gfycatCall.execute();
 | 
			
		||||
                if (response.isSuccessful()) {
 | 
			
		||||
                    if (isGfycatVideo) {
 | 
			
		||||
                        parseGfycatVideoLinks(handler, response.body(), fetchGfycatOrRedgifsVideoLinksListener);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        parseRedgifsVideoLinks(handler, response.body(), fetchGfycatOrRedgifsVideoLinksListener);
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    if (response.code() == 404 && isGfycatVideo && automaticallyTryRedgifs) {
 | 
			
		||||
                        fetchGfycatOrRedgifsVideoLinksInRecyclerViewAdapter(executor, handler, gfycatCall.clone(),
 | 
			
		||||
                                false, false, fetchGfycatOrRedgifsVideoLinksListener);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        handler.post(() -> fetchGfycatOrRedgifsVideoLinksListener.failed(response.code()));
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            } catch (IOException e) {
 | 
			
		||||
                e.printStackTrace();
 | 
			
		||||
                handler.post(() -> fetchGfycatOrRedgifsVideoLinksListener.failed(-1));
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void parseGfycatVideoLinks(Handler handler, String response,
 | 
			
		||||
                                              FetchGfycatOrRedgifsVideoLinksListener fetchGfycatOrRedgifsVideoLinksListener) {
 | 
			
		||||
        try {
 | 
			
		||||
            JSONObject jsonObject = new JSONObject(response);
 | 
			
		||||
            String mp4 = jsonObject.getJSONObject(JSONUtils.GFY_ITEM_KEY).has(JSONUtils.MP4_URL_KEY) ?
 | 
			
		||||
                    jsonObject.getJSONObject(JSONUtils.GFY_ITEM_KEY).getString(JSONUtils.MP4_URL_KEY)
 | 
			
		||||
                    : jsonObject.getJSONObject(JSONUtils.GFY_ITEM_KEY)
 | 
			
		||||
                    .getJSONObject(JSONUtils.CONTENT_URLS_KEY)
 | 
			
		||||
                    .getJSONObject(JSONUtils.MP4_KEY)
 | 
			
		||||
                    .getString(JSONUtils.URL_KEY);
 | 
			
		||||
            String webm;
 | 
			
		||||
            if (jsonObject.getJSONObject(JSONUtils.GFY_ITEM_KEY).has(JSONUtils.WEBM_URL_KEY)) {
 | 
			
		||||
                webm = jsonObject.getJSONObject(JSONUtils.GFY_ITEM_KEY).getString(JSONUtils.WEBM_URL_KEY);
 | 
			
		||||
            } else if (jsonObject.getJSONObject(JSONUtils.GFY_ITEM_KEY).getJSONObject(JSONUtils.CONTENT_URLS_KEY).has(JSONUtils.WEBM_KEY)) {
 | 
			
		||||
                webm = jsonObject.getJSONObject(JSONUtils.GFY_ITEM_KEY)
 | 
			
		||||
                        .getJSONObject(JSONUtils.CONTENT_URLS_KEY)
 | 
			
		||||
                        .getJSONObject(JSONUtils.WEBM_KEY)
 | 
			
		||||
                        .getString(JSONUtils.URL_KEY);
 | 
			
		||||
            } else {
 | 
			
		||||
                webm = mp4;
 | 
			
		||||
            }
 | 
			
		||||
            handler.post(() -> fetchGfycatOrRedgifsVideoLinksListener.success(webm, mp4));
 | 
			
		||||
        } catch (JSONException e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
            handler.post(() -> fetchGfycatOrRedgifsVideoLinksListener.failed(-1));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void parseRedgifsVideoLinks(Handler handler, String response,
 | 
			
		||||
                                              FetchGfycatOrRedgifsVideoLinksListener fetchGfycatOrRedgifsVideoLinksListener) {
 | 
			
		||||
        try {
 | 
			
		||||
            String mp4 = new JSONObject(response).getJSONObject(JSONUtils.GIF_KEY).getJSONObject(JSONUtils.URLS_KEY)
 | 
			
		||||
                    .getString(JSONUtils.HD_KEY);
 | 
			
		||||
            handler.post(() -> fetchGfycatOrRedgifsVideoLinksListener.success(mp4, mp4));
 | 
			
		||||
        } catch (JSONException e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
            handler.post(() -> fetchGfycatOrRedgifsVideoLinksListener.failed(-1));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										99
									
								
								app/src/main/java/eu/toldi/infinityforlemmy/FetchMyInfo.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								app/src/main/java/eu/toldi/infinityforlemmy/FetchMyInfo.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,99 @@
 | 
			
		||||
package eu.toldi.infinityforlemmy;
 | 
			
		||||
 | 
			
		||||
import android.os.AsyncTask;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
 | 
			
		||||
import org.json.JSONException;
 | 
			
		||||
import org.json.JSONObject;
 | 
			
		||||
 | 
			
		||||
import eu.toldi.infinityforlemmy.apis.LemmyAPI;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.LemmyUtils;
 | 
			
		||||
import retrofit2.Call;
 | 
			
		||||
import retrofit2.Callback;
 | 
			
		||||
import retrofit2.Retrofit;
 | 
			
		||||
 | 
			
		||||
public class FetchMyInfo {
 | 
			
		||||
 | 
			
		||||
    public static void fetchAccountInfo(final Retrofit retrofit, RedditDataRoomDatabase redditDataRoomDatabase,
 | 
			
		||||
                                        String username,String accessToken, final FetchMyInfoListener fetchMyInfoListener) {
 | 
			
		||||
        LemmyAPI api = retrofit.create(LemmyAPI.class);
 | 
			
		||||
 | 
			
		||||
        Call<String> userInfo = api.userInfo(username,accessToken);
 | 
			
		||||
        userInfo.enqueue(new Callback<String>() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
 | 
			
		||||
                if (response.isSuccessful()) {
 | 
			
		||||
                    new ParseAndSaveAccountInfoAsyncTask(response.body(), redditDataRoomDatabase, fetchMyInfoListener).execute();
 | 
			
		||||
                } else {
 | 
			
		||||
                    fetchMyInfoListener.onFetchMyInfoFailed(false);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
 | 
			
		||||
                fetchMyInfoListener.onFetchMyInfoFailed(false);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public interface FetchMyInfoListener {
 | 
			
		||||
        void onFetchMyInfoSuccess(String name, String display_name,String profileImageUrl, String bannerImageUrl);
 | 
			
		||||
 | 
			
		||||
        void onFetchMyInfoFailed(boolean parseFailed);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static class ParseAndSaveAccountInfoAsyncTask extends AsyncTask<Void, Void, Void> {
 | 
			
		||||
        private JSONObject jsonResponse;
 | 
			
		||||
        private RedditDataRoomDatabase redditDataRoomDatabase;
 | 
			
		||||
        private FetchMyInfoListener fetchMyInfoListener;
 | 
			
		||||
        private boolean parseFailed;
 | 
			
		||||
 | 
			
		||||
        private String name;
 | 
			
		||||
        private String profileImageUrl;
 | 
			
		||||
        private String bannerImageUrl;
 | 
			
		||||
 | 
			
		||||
        private String display_name;
 | 
			
		||||
 | 
			
		||||
        ParseAndSaveAccountInfoAsyncTask(String response, RedditDataRoomDatabase redditDataRoomDatabase,
 | 
			
		||||
                                         FetchMyInfoListener fetchMyInfoListener) {
 | 
			
		||||
            try {
 | 
			
		||||
                jsonResponse = new JSONObject(response);
 | 
			
		||||
                this.redditDataRoomDatabase = redditDataRoomDatabase;
 | 
			
		||||
                this.fetchMyInfoListener = fetchMyInfoListener;
 | 
			
		||||
                parseFailed = false;
 | 
			
		||||
            } catch (JSONException e) {
 | 
			
		||||
                fetchMyInfoListener.onFetchMyInfoFailed(true);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        protected Void doInBackground(Void... voids) {
 | 
			
		||||
            try {
 | 
			
		||||
                JSONObject person = jsonResponse.getJSONObject("person_view").getJSONObject("person");
 | 
			
		||||
 | 
			
		||||
                name = LemmyUtils.actorID2FullName(person.getString("actor_id"));
 | 
			
		||||
                if (!person.isNull("avatar")) {
 | 
			
		||||
                    profileImageUrl = person.getString("avatar");
 | 
			
		||||
                }
 | 
			
		||||
                if (!person.isNull("banner")) {
 | 
			
		||||
                    bannerImageUrl = person.getString("banner");
 | 
			
		||||
                }
 | 
			
		||||
                display_name = (person.has("display_name")) ? person.getString("display_name") : person.getString("name");
 | 
			
		||||
                redditDataRoomDatabase.accountDao().updateAccountInfo(name, profileImageUrl, bannerImageUrl);
 | 
			
		||||
            } catch (JSONException e) {
 | 
			
		||||
                parseFailed = true;
 | 
			
		||||
            }
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        protected void onPostExecute(Void aVoid) {
 | 
			
		||||
            if (!parseFailed) {
 | 
			
		||||
                fetchMyInfoListener.onFetchMyInfoSuccess(name,display_name, profileImageUrl, bannerImageUrl);
 | 
			
		||||
            } else {
 | 
			
		||||
                fetchMyInfoListener.onFetchMyInfoFailed(true);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -49,7 +49,7 @@ public class FetchPostFilterReadPostsAndConcatenatedSubredditNames {
 | 
			
		||||
            if (anonymousSubscribedSubreddits != null && !anonymousSubscribedSubreddits.isEmpty()) {
 | 
			
		||||
                StringBuilder stringBuilder = new StringBuilder();
 | 
			
		||||
                for (SubscribedSubredditData s : anonymousSubscribedSubreddits) {
 | 
			
		||||
                    stringBuilder.append(s.getQualified_name()).append(",");
 | 
			
		||||
                    stringBuilder.append(s.getName()).append("+");
 | 
			
		||||
                }
 | 
			
		||||
                if (stringBuilder.length() > 0) {
 | 
			
		||||
                    stringBuilder.deleteCharAt(stringBuilder.length() - 1);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,71 +0,0 @@
 | 
			
		||||
package eu.toldi.infinityforlemmy;
 | 
			
		||||
 | 
			
		||||
import android.os.Handler;
 | 
			
		||||
 | 
			
		||||
import org.json.JSONException;
 | 
			
		||||
import org.json.JSONObject;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.concurrent.Executor;
 | 
			
		||||
 | 
			
		||||
import eu.toldi.infinityforlemmy.apis.RedgifsAPI;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.JSONUtils;
 | 
			
		||||
import retrofit2.Call;
 | 
			
		||||
import retrofit2.Response;
 | 
			
		||||
import retrofit2.Retrofit;
 | 
			
		||||
 | 
			
		||||
public class FetchRedgifsVideoLinks {
 | 
			
		||||
 | 
			
		||||
    public interface FetchRedgifsVideoLinksListener {
 | 
			
		||||
        void success(String webm, String mp4);
 | 
			
		||||
        void failed(int errorCode);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void fetchRedgifsVideoLinks(Executor executor, Handler handler, Retrofit redgifsRetrofit,
 | 
			
		||||
                                              String redgifsId,
 | 
			
		||||
                                              FetchRedgifsVideoLinksListener fetchRedgifsVideoLinksListener) {
 | 
			
		||||
        executor.execute(() -> {
 | 
			
		||||
            try {
 | 
			
		||||
                Response<String> response = redgifsRetrofit.create(RedgifsAPI.class).getRedgifsData(redgifsId).execute();
 | 
			
		||||
                if (response.isSuccessful()) {
 | 
			
		||||
                    parseRedgifsVideoLinks(handler, response.body(), fetchRedgifsVideoLinksListener);
 | 
			
		||||
                } else {
 | 
			
		||||
                    handler.post(() -> fetchRedgifsVideoLinksListener.failed(response.code()));
 | 
			
		||||
                }
 | 
			
		||||
            } catch (IOException e) {
 | 
			
		||||
                e.printStackTrace();
 | 
			
		||||
                handler.post(() -> fetchRedgifsVideoLinksListener.failed(-1));
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void fetchRedgifsVideoLinksInRecyclerViewAdapter(Executor executor, Handler handler,
 | 
			
		||||
                                                                   Call<String> redgifsCall,
 | 
			
		||||
                                                                   FetchRedgifsVideoLinksListener fetchRedgifsVideoLinksListener) {
 | 
			
		||||
        executor.execute(() -> {
 | 
			
		||||
            try {
 | 
			
		||||
                Response<String> response = redgifsCall.execute();
 | 
			
		||||
                if (response.isSuccessful()) {
 | 
			
		||||
                    parseRedgifsVideoLinks(handler, response.body(), fetchRedgifsVideoLinksListener);
 | 
			
		||||
                } else {
 | 
			
		||||
                    handler.post(() -> fetchRedgifsVideoLinksListener.failed(response.code()));
 | 
			
		||||
                }
 | 
			
		||||
            } catch (IOException e) {
 | 
			
		||||
                e.printStackTrace();
 | 
			
		||||
                handler.post(() -> fetchRedgifsVideoLinksListener.failed(-1));
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void parseRedgifsVideoLinks(Handler handler, String response,
 | 
			
		||||
                                              FetchRedgifsVideoLinksListener fetchRedgifsVideoLinksListener) {
 | 
			
		||||
        try {
 | 
			
		||||
            String mp4 = new JSONObject(response).getJSONObject(JSONUtils.GIF_KEY).getJSONObject(JSONUtils.URLS_KEY)
 | 
			
		||||
                    .getString(JSONUtils.HD_KEY);
 | 
			
		||||
            handler.post(() -> fetchRedgifsVideoLinksListener.success(mp4, mp4));
 | 
			
		||||
        } catch (JSONException e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
            handler.post(() -> fetchRedgifsVideoLinksListener.failed(-1));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -143,6 +143,15 @@ abstract class NetworkModule {
 | 
			
		||||
                .build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Provides
 | 
			
		||||
    @Named("gfycat")
 | 
			
		||||
    @Singleton
 | 
			
		||||
    static Retrofit provideGfycatRetrofit(@Named("base") RetrofitHolder retrofit) {
 | 
			
		||||
        return retrofit.getRetrofit().newBuilder()
 | 
			
		||||
                .baseUrl(APIUtils.GFYCAT_API_BASE_URI)
 | 
			
		||||
                .build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Provides
 | 
			
		||||
    @Named("RedgifsAccessTokenAuthenticator")
 | 
			
		||||
    static Interceptor redgifsAccessTokenAuthenticator(@Named("current_account") SharedPreferences currentAccountSharedPreferences) {
 | 
			
		||||
@@ -246,13 +255,4 @@ abstract class NetworkModule {
 | 
			
		||||
    static LemmyPrivateMessageAPI provideLemmyPrivateMessageAPI(@Named("base") RetrofitHolder retrofit) {
 | 
			
		||||
        return new LemmyPrivateMessageAPI(retrofit);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Provides
 | 
			
		||||
    @Named("lemmyVerse")
 | 
			
		||||
    @Singleton
 | 
			
		||||
    static Retrofit provideLemmyVerseRetrofit(@Named("base") RetrofitHolder retrofit) {
 | 
			
		||||
        return retrofit.getRetrofit().newBuilder()
 | 
			
		||||
                .baseUrl(APIUtils.LEMMYVERSE_API_BASE_URI)
 | 
			
		||||
                .build();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,6 @@ import eu.toldi.infinityforlemmy.post.enrich.CompositePostEnricher;
 | 
			
		||||
import eu.toldi.infinityforlemmy.post.enrich.PostEnricher;
 | 
			
		||||
import eu.toldi.infinityforlemmy.post.enrich.RedGifsPostEnricher;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@Module
 | 
			
		||||
abstract class PostEnricherModule {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -15,14 +15,8 @@ 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.blockedinstances.BlockedInstanceDao;
 | 
			
		||||
import eu.toldi.infinityforlemmy.blockedinstances.BlockedInstanceData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserDao;
 | 
			
		||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.commentfilter.CommentFilter;
 | 
			
		||||
import eu.toldi.infinityforlemmy.commentfilter.CommentFilterDao;
 | 
			
		||||
import eu.toldi.infinityforlemmy.commentfilter.CommentFilterUsage;
 | 
			
		||||
import eu.toldi.infinityforlemmy.commentfilter.CommentFilterUsageDao;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomTheme;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeDao;
 | 
			
		||||
import eu.toldi.infinityforlemmy.multireddit.AnonymousMultiredditSubreddit;
 | 
			
		||||
@@ -48,8 +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,
 | 
			
		||||
        BlockedUserData.class, BlockedCommunityData.class, BlockedInstanceData.class, CommentFilter.class, CommentFilterUsage.class}, version = 30)
 | 
			
		||||
        ReadPost.class, PostFilter.class, PostFilterUsage.class, AnonymousMultiredditSubreddit.class, BlockedUserData.class, BlockedCommunityData.class}, version = 27)
 | 
			
		||||
public abstract class RedditDataRoomDatabase extends RoomDatabase {
 | 
			
		||||
 | 
			
		||||
    public static RedditDataRoomDatabase create(final Context context) {
 | 
			
		||||
@@ -60,9 +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_24_25,
 | 
			
		||||
                        MIGRATION_25_26, MIGRATION_26_27, MIGRATION_27_28, MIGRATION_28_29,
 | 
			
		||||
                        MIGRATION_29_30)
 | 
			
		||||
                        MIGRATION_21_22, MIGRATION_22_23, MIGRATION_23_24, MIGRATION_24_25, MIGRATION_25_26, MIGRATION_26_27)
 | 
			
		||||
                .build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -76,8 +67,6 @@ public abstract class RedditDataRoomDatabase extends RoomDatabase {
 | 
			
		||||
 | 
			
		||||
    public abstract BlockedCommunityDao blockedCommunityDao();
 | 
			
		||||
 | 
			
		||||
    public abstract BlockedInstanceDao blockedInstanceDao();
 | 
			
		||||
 | 
			
		||||
    public abstract UserDao userDao();
 | 
			
		||||
 | 
			
		||||
    public abstract SubscribedUserDao subscribedUserDao();
 | 
			
		||||
@@ -96,10 +85,6 @@ public abstract class RedditDataRoomDatabase extends RoomDatabase {
 | 
			
		||||
 | 
			
		||||
    public abstract AnonymousMultiredditSubredditDao anonymousMultiredditSubredditDao();
 | 
			
		||||
 | 
			
		||||
    public abstract CommentFilterDao commentFilterDao();
 | 
			
		||||
 | 
			
		||||
    public abstract CommentFilterUsageDao commentFilterUsageDao();
 | 
			
		||||
 | 
			
		||||
    private static final Migration MIGRATION_1_2 = new Migration(1, 2) {
 | 
			
		||||
        @Override
 | 
			
		||||
        public void migrate(SupportSQLiteDatabase database) {
 | 
			
		||||
@@ -439,35 +424,4 @@ public abstract class RedditDataRoomDatabase extends RoomDatabase {
 | 
			
		||||
                    + " ADD COLUMN is_favorite INTEGER DEFAULT 0 NOT NULL");
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    private static final Migration MIGRATION_27_28 = new Migration(27, 28) {
 | 
			
		||||
        @Override
 | 
			
		||||
        public void migrate(@NonNull SupportSQLiteDatabase database) {
 | 
			
		||||
            database.execSQL("ALTER TABLE custom_themes ADD COLUMN filled_card_view_background_color INTEGER DEFAULT " + Color.parseColor("#E6F4FF") + " NOT NULL");
 | 
			
		||||
            database.execSQL("ALTER TABLE custom_themes ADD COLUMN read_post_filled_card_view_background_color INTEGER DEFAULT " + Color.parseColor("#F5F5F5") + " NOT NULL");
 | 
			
		||||
            database.execSQL("CREATE TABLE comment_filter " +
 | 
			
		||||
                    "(name TEXT NOT NULL PRIMARY KEY, max_vote INTEGER NOT NULL, min_vote INTEGER NOT NULL, exclude_strings TEXT, exclude_users TEXT)");
 | 
			
		||||
            database.execSQL("CREATE TABLE comment_filter_usage (name TEXT NOT NULL, usage INTEGER NOT NULL, " +
 | 
			
		||||
                    "name_of_usage TEXT NOT NULL, PRIMARY KEY(name, usage, name_of_usage), FOREIGN KEY(name) REFERENCES comment_filter(name) ON DELETE CASCADE)");
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    private static final Migration MIGRATION_28_29 = new Migration(28, 29) {
 | 
			
		||||
        @Override
 | 
			
		||||
        public void migrate(@NonNull SupportSQLiteDatabase database) {
 | 
			
		||||
            database.execSQL("CREATE TABLE blocked_instances" +
 | 
			
		||||
                    "(domain TEXT, id INTEGER NOT NULL, account_name TEXT NOT NULL, PRIMARY KEY( id, account_name))");
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    private static final Migration MIGRATION_29_30 = new Migration(29, 30) {
 | 
			
		||||
        @Override
 | 
			
		||||
        public void migrate(@NonNull SupportSQLiteDatabase database) {
 | 
			
		||||
            // Alter table "blocked_instances" to add new columns "instance_name" and "icon"
 | 
			
		||||
            database.execSQL("ALTER TABLE blocked_instances ADD COLUMN instance_name TEXT");
 | 
			
		||||
            database.execSQL("ALTER TABLE blocked_instances ADD COLUMN icon TEXT");
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -35,8 +35,8 @@ public class SortType {
 | 
			
		||||
        NEW("New", "New"),
 | 
			
		||||
        OLD("Old", "Old"),
 | 
			
		||||
        TOP("Top", "Top"),
 | 
			
		||||
        MOST_COMMENTS("MostComments", "Most Comments"),
 | 
			
		||||
        NEW_COMMENTS("NewComments", "New Comments"),
 | 
			
		||||
        MOST_COMMENTS("MostCommentes", "Most Commentes"),
 | 
			
		||||
        NEW_COMMENTS("NewCommentes", "New Commentes"),
 | 
			
		||||
 | 
			
		||||
        TOP_HOUR("TopHour", "Top"),
 | 
			
		||||
        TOP_SIX_HOURS("TopSixHour", "Top"),
 | 
			
		||||
@@ -48,10 +48,7 @@ public class SortType {
 | 
			
		||||
        TOP_SIX_MONTHS("TopSixMonths", "Top"),
 | 
			
		||||
        TOP_NINE_MONTHS("TopNineMonths", "Top"),
 | 
			
		||||
        TOP_YEAR("TopYear", "Top"),
 | 
			
		||||
        TOP_ALL("TopAll", "Top"),
 | 
			
		||||
 | 
			
		||||
        SCALED("Scaled", "Scaled"),
 | 
			
		||||
        CONTROVERSIAL("Controversial", "Controversial");
 | 
			
		||||
        TOP_ALL("TopAll", "Top");
 | 
			
		||||
 | 
			
		||||
        public final String value;
 | 
			
		||||
        public final String fullName;
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,6 @@ import java.util.List;
 | 
			
		||||
 | 
			
		||||
import eu.toldi.infinityforlemmy.apis.LemmyAPI;
 | 
			
		||||
import eu.toldi.infinityforlemmy.blockedcommunity.BlockedCommunityData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.blockedinstances.BlockedInstanceData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subreddit.ParseSubredditData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subreddit.SubredditData;
 | 
			
		||||
@@ -32,13 +31,10 @@ public class FetchBlockedThings {
 | 
			
		||||
                    if (siteInfo != null) {
 | 
			
		||||
                        List<BlockedUserData> blockedUsers = new ArrayList<>();
 | 
			
		||||
                        List<BlockedCommunityData> blockedCommunities = new ArrayList<>();
 | 
			
		||||
                        List<BlockedInstanceData> blockedInstances = 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;
 | 
			
		||||
                            JSONArray blockedInstancesJson = (siteInfoJson.has("instance_blocks")) ? siteInfoJson.getJSONArray("instance_blocks") : null;
 | 
			
		||||
                            if (blockedUsersJson != null) {
 | 
			
		||||
                                for (int i = 0; i < blockedUsersJson.length(); i++) {
 | 
			
		||||
                                    JSONObject blockedUserJson = blockedUsersJson.getJSONObject(i).getJSONObject("target");
 | 
			
		||||
@@ -61,29 +57,7 @@ public class FetchBlockedThings {
 | 
			
		||||
                                    blockedCommunities.add(new BlockedCommunityData(blockedCommunityData, accountName));
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                            if (blockedInstancesJson != null) {
 | 
			
		||||
                                for (int i = 0; i < blockedInstancesJson.length(); i++) {
 | 
			
		||||
                                    JSONObject blockedInstanceJson = blockedInstancesJson.getJSONObject(i);
 | 
			
		||||
                                    // Get the "instance" object if it exists
 | 
			
		||||
                                    JSONObject instanceJson = blockedInstanceJson.has("instance") ? blockedInstanceJson.getJSONObject("instance") : null;
 | 
			
		||||
                                    if (instanceJson == null) {
 | 
			
		||||
                                        continue;
 | 
			
		||||
                                    }
 | 
			
		||||
                                    int id = instanceJson.getInt("id");
 | 
			
		||||
                                    String domain = instanceJson.getString("domain");
 | 
			
		||||
                                    JSONObject siteJson = blockedInstanceJson.has("site") ? blockedInstanceJson.getJSONObject("site") : null;
 | 
			
		||||
                                    if (siteJson == null) {
 | 
			
		||||
                                        blockedInstances.add(new BlockedInstanceData(id, domain, null, null, accountName));
 | 
			
		||||
                                        continue;
 | 
			
		||||
                                    }
 | 
			
		||||
 | 
			
		||||
                                    String name = siteJson.getString("name");
 | 
			
		||||
                                    String icon = siteJson.optString("icon");
 | 
			
		||||
                                    blockedInstances.add(new BlockedInstanceData(id, domain, name, icon, accountName));
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            fetchBlockedThingsListener.onFetchBlockedThingsSuccess(blockedUsers, blockedCommunities, blockedInstances);
 | 
			
		||||
                            fetchBlockedThingsListener.onFetchBlockedThingsSuccess(blockedUsers, blockedCommunities);
 | 
			
		||||
                        } catch (JSONException e) {
 | 
			
		||||
                            e.printStackTrace();
 | 
			
		||||
                            fetchBlockedThingsListener.onFetchBlockedThingsFailure();
 | 
			
		||||
@@ -104,7 +78,7 @@ public class FetchBlockedThings {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public interface FetchBlockedThingsListener {
 | 
			
		||||
        void onFetchBlockedThingsSuccess(List<BlockedUserData> blockedUsers, List<BlockedCommunityData> blockedCommunities, List<BlockedInstanceData> blockedInstances);
 | 
			
		||||
        void onFetchBlockedThingsSuccess(List<BlockedUserData> blockedUsers, List<BlockedCommunityData> blockedCommunities);
 | 
			
		||||
 | 
			
		||||
        void onFetchBlockedThingsFailure();
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -286,7 +286,7 @@ public class AccountSavedThingActivity extends BaseActivity implements ActivityT
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_USER_NAME, mAccountQualifiedName);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_USER_WHERE, PostPagingSource.USER_WHERE_SAVED);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountQualifiedName);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountName);
 | 
			
		||||
                bundle.putBoolean(PostFragment.EXTRA_DISABLE_READ_POSTS, true);
 | 
			
		||||
                fragment.setArguments(bundle);
 | 
			
		||||
                return fragment;
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,6 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton;
 | 
			
		||||
import com.google.android.material.shape.CornerFamily;
 | 
			
		||||
import com.google.android.material.shape.MaterialShapeDrawable;
 | 
			
		||||
import com.google.android.material.shape.ShapeAppearanceModel;
 | 
			
		||||
import com.google.android.material.snackbar.Snackbar;
 | 
			
		||||
import com.google.android.material.tabs.TabLayout;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.Field;
 | 
			
		||||
@@ -322,12 +321,6 @@ public abstract class BaseActivity extends AppCompatActivity implements CustomFo
 | 
			
		||||
        applyAppBarLayoutAndCollapsingToolbarLayoutAndToolbarTheme(appBarLayout, collapsingToolbarLayout, toolbar, true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected Snackbar applySnackBarTheme(Snackbar snackbar) {
 | 
			
		||||
        snackbar.setBackgroundTint(customThemeWrapper.getBackgroundColor());
 | 
			
		||||
        snackbar.setTextColor(customThemeWrapper.getSecondaryTextColor());
 | 
			
		||||
        return snackbar;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void applyAppBarLayoutAndCollapsingToolbarLayoutAndToolbarTheme(AppBarLayout appBarLayout, @Nullable CollapsingToolbarLayout collapsingToolbarLayout, Toolbar toolbar, boolean setToolbarBackgroundColor) {
 | 
			
		||||
        appBarLayout.setBackgroundColor(customThemeWrapper.getColorPrimary());
 | 
			
		||||
        if (collapsingToolbarLayout != null) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
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;
 | 
			
		||||
@@ -23,6 +24,7 @@ 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;
 | 
			
		||||
@@ -49,7 +51,6 @@ 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.blockedinstances.BlockedInstanceData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.ViewPagerBugFixed;
 | 
			
		||||
@@ -57,7 +58,6 @@ 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.BlockedInstancesListingFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.BlockedUsersListingFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.Utils;
 | 
			
		||||
@@ -110,6 +110,8 @@ public class BlockedThingListingActivity extends BaseActivity implements Activit
 | 
			
		||||
 | 
			
		||||
    private String mAccountQualifiedName;
 | 
			
		||||
    private boolean mInsertSuccess = false;
 | 
			
		||||
    private boolean mInsertMultiredditSuccess = false;
 | 
			
		||||
    private boolean showMultiReddits = false;
 | 
			
		||||
    private SectionsPagerAdapter sectionsPagerAdapter;
 | 
			
		||||
    private Menu mMenu;
 | 
			
		||||
 | 
			
		||||
@@ -165,6 +167,9 @@ public class BlockedThingListingActivity extends BaseActivity implements Activit
 | 
			
		||||
 | 
			
		||||
        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) {
 | 
			
		||||
@@ -211,13 +216,38 @@ public class BlockedThingListingActivity extends BaseActivity implements Activit
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void initializeViewPagerAndLoadSubscriptions() {
 | 
			
		||||
        fab.hide();
 | 
			
		||||
        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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -273,6 +303,7 @@ public class BlockedThingListingActivity extends BaseActivity implements Activit
 | 
			
		||||
    protected void onSaveInstanceState(@NonNull Bundle outState) {
 | 
			
		||||
        super.onSaveInstanceState(outState);
 | 
			
		||||
        outState.putBoolean(INSERT_SUBSCRIBED_SUBREDDIT_STATE, mInsertSuccess);
 | 
			
		||||
        outState.putBoolean(INSERT_MULTIREDDIT_STATE, mInsertMultiredditSuccess);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -285,9 +316,9 @@ public class BlockedThingListingActivity extends BaseActivity implements Activit
 | 
			
		||||
        if (mAccessToken != null && !(!forceLoad && mInsertSuccess)) {
 | 
			
		||||
            FetchBlockedThings.fetchBlockedThings(mRetrofit.getRetrofit(), mAccessToken, mAccountQualifiedName, new FetchBlockedThings.FetchBlockedThingsListener() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onFetchBlockedThingsSuccess(List<BlockedUserData> blockedUsers, List<BlockedCommunityData> blockedCommunities, List<BlockedInstanceData> blockedInstances) {
 | 
			
		||||
                public void onFetchBlockedThingsSuccess(List<BlockedUserData> blockedUsers, List<BlockedCommunityData> blockedCommunities) {
 | 
			
		||||
                    InsertBlockedThings.insertBlockedThings(mExecutor, new Handler(), mRedditDataRoomDatabase, mAccountQualifiedName,
 | 
			
		||||
                            blockedCommunities, blockedUsers, blockedInstances, () -> {
 | 
			
		||||
                            blockedCommunities, blockedUsers, () -> {
 | 
			
		||||
                                mInsertSuccess = true;
 | 
			
		||||
                                sectionsPagerAdapter.stopRefreshProgressbar();
 | 
			
		||||
                            });
 | 
			
		||||
@@ -365,20 +396,12 @@ public class BlockedThingListingActivity extends BaseActivity implements Activit
 | 
			
		||||
                    fragment.setArguments(bundle);
 | 
			
		||||
                    return fragment;
 | 
			
		||||
                }
 | 
			
		||||
                case 2: {
 | 
			
		||||
                    BlockedInstancesListingFragment fragment = new BlockedInstancesListingFragment();
 | 
			
		||||
                    Bundle bundle = new Bundle();
 | 
			
		||||
                    bundle.putString(BlockedInstancesListingFragment.EXTRA_ACCOUNT_NAME, mAccountQualifiedName);
 | 
			
		||||
                    bundle.putString(BlockedInstancesListingFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
 | 
			
		||||
                    fragment.setArguments(bundle);
 | 
			
		||||
                    return fragment;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public int getCount() {
 | 
			
		||||
            return 3;
 | 
			
		||||
            return 2;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
@@ -389,7 +412,7 @@ public class BlockedThingListingActivity extends BaseActivity implements Activit
 | 
			
		||||
                case 1:
 | 
			
		||||
                    return Utils.getTabTextWithCustomFont(typeface, getString(R.string.users));
 | 
			
		||||
                case 2:
 | 
			
		||||
                    return Utils.getTabTextWithCustomFont(typeface, getString(R.string.instances));
 | 
			
		||||
                    return Utils.getTabTextWithCustomFont(typeface, getString(R.string.multi_reddits));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return null;
 | 
			
		||||
 
 | 
			
		||||
@@ -170,7 +170,6 @@ public class CommentActivity extends BaseActivity implements UploadImageEnabledA
 | 
			
		||||
 | 
			
		||||
        String parentBodyMarkdown = intent.getStringExtra(EXTRA_COMMENT_PARENT_BODY_MARKDOWN_KEY);
 | 
			
		||||
        String parentBody = intent.getStringExtra(EXTRA_COMMENT_PARENT_BODY_KEY);
 | 
			
		||||
        mGlide = Glide.with(getApplication());
 | 
			
		||||
        if (parentBodyMarkdown != null && !parentBodyMarkdown.equals("")) {
 | 
			
		||||
            binding.commentContentMarkdownView.setVisibility(View.VISIBLE);
 | 
			
		||||
            binding.commentContentMarkdownView.setNestedScrollingEnabled(false);
 | 
			
		||||
@@ -205,9 +204,8 @@ public class CommentActivity extends BaseActivity implements UploadImageEnabledA
 | 
			
		||||
                    builder.linkColor(linkColor);
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            Markwon postBodyMarkwon = MarkdownUtils.createFullRedditMarkwon(this,
 | 
			
		||||
                    miscPlugin, parentTextColor, parentSpoilerBackgroundColor, mGlide, null, mSharedPreferences.getBoolean(SharedPreferencesUtils.DISABLE_IMAGE_PREVIEW, false));
 | 
			
		||||
                    miscPlugin, parentTextColor, parentSpoilerBackgroundColor, null);
 | 
			
		||||
            MarkwonAdapter markwonAdapter = MarkdownUtils.createTablesAdapter();
 | 
			
		||||
            binding.commentContentMarkdownView.setLayoutManager(new LinearLayoutManagerBugFixed(this));
 | 
			
		||||
            binding.commentContentMarkdownView.setAdapter(markwonAdapter);
 | 
			
		||||
@@ -228,6 +226,8 @@ public class CommentActivity extends BaseActivity implements UploadImageEnabledA
 | 
			
		||||
 | 
			
		||||
        setSupportActionBar(binding.commentToolbar);
 | 
			
		||||
 | 
			
		||||
        mGlide = Glide.with(getApplication());
 | 
			
		||||
 | 
			
		||||
        if (savedInstanceState != null) {
 | 
			
		||||
            selectedAccount = savedInstanceState.getParcelable(SELECTED_ACCOUNT_STATE);
 | 
			
		||||
            uploadedImages = savedInstanceState.getParcelableArrayList(UPLOADED_IMAGES_STATE);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,126 +0,0 @@
 | 
			
		||||
package eu.toldi.infinityforlemmy.activities;
 | 
			
		||||
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.content.SharedPreferences;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.view.MenuItem;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.lifecycle.ViewModelProvider;
 | 
			
		||||
 | 
			
		||||
import java.util.concurrent.Executor;
 | 
			
		||||
 | 
			
		||||
import javax.inject.Inject;
 | 
			
		||||
import javax.inject.Named;
 | 
			
		||||
 | 
			
		||||
import butterknife.ButterKnife;
 | 
			
		||||
import eu.toldi.infinityforlemmy.Infinity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
 | 
			
		||||
import eu.toldi.infinityforlemmy.adapters.CommentFilterWithUsageRecyclerViewAdapter;
 | 
			
		||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.CommentFilterOptionsBottomSheetFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.commentfilter.CommentFilter;
 | 
			
		||||
import eu.toldi.infinityforlemmy.commentfilter.DeleteCommentFilter;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.databinding.ActivityCommentFilterPreferenceBinding;
 | 
			
		||||
import eu.toldi.infinityforlemmy.commentfilter.CommentFilterWithUsageViewModel;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
 | 
			
		||||
 | 
			
		||||
public class CommentFilterPreferenceActivity extends BaseActivity {
 | 
			
		||||
 | 
			
		||||
    private ActivityCommentFilterPreferenceBinding binding;
 | 
			
		||||
 | 
			
		||||
    @Inject
 | 
			
		||||
    @Named("default")
 | 
			
		||||
    SharedPreferences sharedPreferences;
 | 
			
		||||
    @Inject
 | 
			
		||||
    RedditDataRoomDatabase redditDataRoomDatabase;
 | 
			
		||||
    @Inject
 | 
			
		||||
    CustomThemeWrapper customThemeWrapper;
 | 
			
		||||
    @Inject
 | 
			
		||||
    Executor executor;
 | 
			
		||||
    public CommentFilterWithUsageViewModel commentFilterWithUsageViewModel;
 | 
			
		||||
    private CommentFilterWithUsageRecyclerViewAdapter adapter;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onCreate(Bundle savedInstanceState) {
 | 
			
		||||
        ((Infinity) getApplication()).getAppComponent().inject(this);
 | 
			
		||||
 | 
			
		||||
        setImmersiveModeNotApplicable();
 | 
			
		||||
 | 
			
		||||
        super.onCreate(savedInstanceState);
 | 
			
		||||
        binding = ActivityCommentFilterPreferenceBinding.inflate(getLayoutInflater());
 | 
			
		||||
 | 
			
		||||
        setContentView(binding.getRoot());
 | 
			
		||||
 | 
			
		||||
        ButterKnife.bind(this);
 | 
			
		||||
 | 
			
		||||
        applyCustomTheme();
 | 
			
		||||
 | 
			
		||||
        setSupportActionBar(binding.toolbarCommentFilterPreferenceActivity);
 | 
			
		||||
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 | 
			
		||||
 | 
			
		||||
        binding.fabCommentFilterPreferenceActivity.setOnClickListener(view -> {
 | 
			
		||||
            Intent intent = new Intent(this, CustomizeCommentFilterActivity.class);
 | 
			
		||||
            intent.putExtra(CustomizeCommentFilterActivity.EXTRA_FROM_SETTINGS, true);
 | 
			
		||||
            startActivity(intent);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        adapter = new CommentFilterWithUsageRecyclerViewAdapter(this, commentFilter -> {
 | 
			
		||||
            CommentFilterOptionsBottomSheetFragment commentFilterOptionsBottomSheetFragment = new CommentFilterOptionsBottomSheetFragment();
 | 
			
		||||
            Bundle bundle = new Bundle();
 | 
			
		||||
            bundle.putParcelable(CommentFilterOptionsBottomSheetFragment.EXTRA_POST_FILTER, commentFilter);
 | 
			
		||||
            commentFilterOptionsBottomSheetFragment.setArguments(bundle);
 | 
			
		||||
            commentFilterOptionsBottomSheetFragment.show(getSupportFragmentManager(), commentFilterOptionsBottomSheetFragment.getTag());
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        binding.recyclerViewCommentFilterPreferenceActivity.setAdapter(adapter);
 | 
			
		||||
 | 
			
		||||
        commentFilterWithUsageViewModel = new ViewModelProvider(this,
 | 
			
		||||
                new CommentFilterWithUsageViewModel.Factory(redditDataRoomDatabase)).get(CommentFilterWithUsageViewModel.class);
 | 
			
		||||
 | 
			
		||||
        commentFilterWithUsageViewModel.getCommentFilterWithUsageListLiveData().observe(this, commentFilterWithUsages -> adapter.setCommentFilterWithUsageList(commentFilterWithUsages));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void editCommentFilter(CommentFilter commentFilter) {
 | 
			
		||||
        Intent intent = new Intent(this, CustomizeCommentFilterActivity.class);
 | 
			
		||||
        intent.putExtra(CustomizeCommentFilterActivity.EXTRA_COMMENT_FILTER, commentFilter);
 | 
			
		||||
        intent.putExtra(CustomizeCommentFilterActivity.EXTRA_FROM_SETTINGS, true);
 | 
			
		||||
        startActivity(intent);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void applyCommentFilterTo(CommentFilter commentFilter) {
 | 
			
		||||
        Intent intent = new Intent(this, CommentFilterUsageListingActivity.class);
 | 
			
		||||
        intent.putExtra(CommentFilterUsageListingActivity.EXTRA_COMMENT_FILTER, commentFilter);
 | 
			
		||||
        startActivity(intent);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void deleteCommentFilter(CommentFilter commentFilter) {
 | 
			
		||||
        DeleteCommentFilter.deleteCommentFilter(redditDataRoomDatabase, executor, commentFilter);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected SharedPreferences getDefaultSharedPreferences() {
 | 
			
		||||
        return sharedPreferences;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected CustomThemeWrapper getCustomThemeWrapper() {
 | 
			
		||||
        return customThemeWrapper;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void applyCustomTheme() {
 | 
			
		||||
        applyAppBarLayoutAndCollapsingToolbarLayoutAndToolbarTheme(binding.appbarLayoutCommentFilterPreferenceActivity, binding.collapsingToolbarLayoutCommentFilterPreferenceActivity, binding.toolbarCommentFilterPreferenceActivity);
 | 
			
		||||
        applyFABTheme(binding.fabCommentFilterPreferenceActivity, sharedPreferences.getBoolean(SharedPreferencesUtils.USE_CIRCULAR_FAB, false));
 | 
			
		||||
        binding.getRoot().setBackgroundColor(customThemeWrapper.getBackgroundColor());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
 | 
			
		||||
        if (item.getItemId() == android.R.id.home) {
 | 
			
		||||
            finish();
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,181 +0,0 @@
 | 
			
		||||
package eu.toldi.infinityforlemmy.activities;
 | 
			
		||||
 | 
			
		||||
import android.app.Activity;
 | 
			
		||||
 | 
			
		||||
import android.content.SharedPreferences;
 | 
			
		||||
import android.content.res.ColorStateList;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.os.Handler;
 | 
			
		||||
import android.view.MenuItem;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.lifecycle.ViewModelProvider;
 | 
			
		||||
 | 
			
		||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 | 
			
		||||
import com.google.android.material.textfield.TextInputEditText;
 | 
			
		||||
import com.google.android.material.textfield.TextInputLayout;
 | 
			
		||||
 | 
			
		||||
import java.util.concurrent.Executor;
 | 
			
		||||
 | 
			
		||||
import javax.inject.Inject;
 | 
			
		||||
import javax.inject.Named;
 | 
			
		||||
 | 
			
		||||
import eu.toldi.infinityforlemmy.Infinity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.R;
 | 
			
		||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
 | 
			
		||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.CommentFilterUsageOptionsBottomSheetFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.NewCommentFilterUsageBottomSheetFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.commentfilter.CommentFilter;
 | 
			
		||||
import eu.toldi.infinityforlemmy.commentfilter.CommentFilterUsage;
 | 
			
		||||
import eu.toldi.infinityforlemmy.commentfilter.CommentFilterUsageViewModel;
 | 
			
		||||
import eu.toldi.infinityforlemmy.commentfilter.DeleteCommentFilterUsage;
 | 
			
		||||
import eu.toldi.infinityforlemmy.commentfilter.SaveCommentFilterUsage;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.databinding.ActivityCommentFilterUsageListingBinding;
 | 
			
		||||
import eu.toldi.infinityforlemmy.adapters.CommentFilterUsageRecyclerViewAdapter;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.Utils;
 | 
			
		||||
 | 
			
		||||
public class CommentFilterUsageListingActivity extends BaseActivity {
 | 
			
		||||
 | 
			
		||||
    public static final String EXTRA_COMMENT_FILTER = "ECF";
 | 
			
		||||
    @Inject
 | 
			
		||||
    @Named("default")
 | 
			
		||||
    SharedPreferences sharedPreferences;
 | 
			
		||||
    @Inject
 | 
			
		||||
    RedditDataRoomDatabase redditDataRoomDatabase;
 | 
			
		||||
    @Inject
 | 
			
		||||
    CustomThemeWrapper customThemeWrapper;
 | 
			
		||||
    @Inject
 | 
			
		||||
    Executor executor;
 | 
			
		||||
    private ActivityCommentFilterUsageListingBinding binding;
 | 
			
		||||
    public CommentFilterUsageViewModel commentFilterUsageViewModel;
 | 
			
		||||
    private CommentFilterUsageRecyclerViewAdapter adapter;
 | 
			
		||||
    private CommentFilter commentFilter;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onCreate(Bundle savedInstanceState) {
 | 
			
		||||
        ((Infinity) getApplication()).getAppComponent().inject(this);
 | 
			
		||||
 | 
			
		||||
        setImmersiveModeNotApplicable();
 | 
			
		||||
 | 
			
		||||
        super.onCreate(savedInstanceState);
 | 
			
		||||
        binding = ActivityCommentFilterUsageListingBinding.inflate(getLayoutInflater());
 | 
			
		||||
        setContentView(binding.getRoot());
 | 
			
		||||
 | 
			
		||||
        applyCustomTheme();
 | 
			
		||||
 | 
			
		||||
        setSupportActionBar(binding.toolbarCommentFilterUsageListingActivity);
 | 
			
		||||
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 | 
			
		||||
 | 
			
		||||
        commentFilter = getIntent().getParcelableExtra(EXTRA_COMMENT_FILTER);
 | 
			
		||||
 | 
			
		||||
        setTitle(commentFilter.name);
 | 
			
		||||
 | 
			
		||||
        binding.fabCommentFilterUsageListingActivity.setOnClickListener(view -> {
 | 
			
		||||
            NewCommentFilterUsageBottomSheetFragment newCommentFilterUsageBottomSheetFragment = new NewCommentFilterUsageBottomSheetFragment();
 | 
			
		||||
            newCommentFilterUsageBottomSheetFragment.show(getSupportFragmentManager(), newCommentFilterUsageBottomSheetFragment.getTag());
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        adapter = new CommentFilterUsageRecyclerViewAdapter(this, customThemeWrapper, commentFilterUsage -> {
 | 
			
		||||
            CommentFilterUsageOptionsBottomSheetFragment commentFilterUsageOptionsBottomSheetFragment = new CommentFilterUsageOptionsBottomSheetFragment();
 | 
			
		||||
            Bundle bundle = new Bundle();
 | 
			
		||||
            bundle.putParcelable(CommentFilterUsageOptionsBottomSheetFragment.EXTRA_COMMENT_FILTER_USAGE, commentFilterUsage);
 | 
			
		||||
            commentFilterUsageOptionsBottomSheetFragment.setArguments(bundle);
 | 
			
		||||
            commentFilterUsageOptionsBottomSheetFragment.show(getSupportFragmentManager(), commentFilterUsageOptionsBottomSheetFragment.getTag());
 | 
			
		||||
        });
 | 
			
		||||
        binding.recyclerViewCommentFilterUsageListingActivity.setAdapter(adapter);
 | 
			
		||||
 | 
			
		||||
        commentFilterUsageViewModel = new ViewModelProvider(this,
 | 
			
		||||
                new CommentFilterUsageViewModel.Factory(redditDataRoomDatabase, commentFilter.name)).get(CommentFilterUsageViewModel.class);
 | 
			
		||||
 | 
			
		||||
        commentFilterUsageViewModel.getCommentFilterUsageListLiveData().observe(this, commentFilterUsages -> adapter.setCommentFilterUsages(commentFilterUsages));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void newCommentFilterUsage(int type) {
 | 
			
		||||
        switch (type) {
 | 
			
		||||
            case CommentFilterUsage.SUBREDDIT_TYPE:
 | 
			
		||||
                editAndCommentFilterUsageNameOfUsage(type, null);
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void editAndCommentFilterUsageNameOfUsage(int type, String nameOfUsage) {
 | 
			
		||||
        View dialogView = getLayoutInflater().inflate(R.layout.dialog_edit_post_or_comment_filter_name_of_usage, null);
 | 
			
		||||
        TextView messageTextView = dialogView.findViewById(R.id.message_text_view_edit_post_or_comment_filter_name_of_usage_dialog);
 | 
			
		||||
        messageTextView.setVisibility(View.GONE);
 | 
			
		||||
        TextInputLayout textInputLayout = dialogView.findViewById(R.id.text_input_layout_edit_post_or_comment_filter_name_of_usage_dialog);
 | 
			
		||||
        TextInputEditText textInputEditText = dialogView.findViewById(R.id.text_input_edit_text_edit_post_or_comment_filter_name_of_usage_dialog);
 | 
			
		||||
        int primaryTextColor = customThemeWrapper.getPrimaryTextColor();
 | 
			
		||||
        textInputLayout.setBoxStrokeColor(primaryTextColor);
 | 
			
		||||
        textInputLayout.setDefaultHintTextColor(ColorStateList.valueOf(primaryTextColor));
 | 
			
		||||
        textInputEditText.setTextColor(primaryTextColor);
 | 
			
		||||
        if (nameOfUsage != null) {
 | 
			
		||||
            textInputEditText.setText(nameOfUsage);
 | 
			
		||||
        }
 | 
			
		||||
        textInputEditText.requestFocus();
 | 
			
		||||
        int titleStringId = R.string.community;
 | 
			
		||||
        switch (type) {
 | 
			
		||||
            case CommentFilterUsage.SUBREDDIT_TYPE:
 | 
			
		||||
                textInputEditText.setHint(R.string.settings_tab_community_name);
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Utils.showKeyboard(this, new Handler(), textInputEditText);
 | 
			
		||||
        new MaterialAlertDialogBuilder(this, R.style.MaterialAlertDialogTheme)
 | 
			
		||||
                .setTitle(titleStringId)
 | 
			
		||||
                .setView(dialogView)
 | 
			
		||||
                .setPositiveButton(R.string.ok, (editTextDialogInterface, i1)
 | 
			
		||||
                        -> {
 | 
			
		||||
                    Utils.hideKeyboard(this);
 | 
			
		||||
 | 
			
		||||
                    CommentFilterUsage commentFilterUsage;
 | 
			
		||||
                    if (!textInputEditText.getText().toString().equals("")) {
 | 
			
		||||
                        commentFilterUsage = new CommentFilterUsage(commentFilter.name, type, textInputEditText.getText().toString());
 | 
			
		||||
                        SaveCommentFilterUsage.saveCommentFilterUsage(redditDataRoomDatabase, executor, commentFilterUsage);
 | 
			
		||||
                    }
 | 
			
		||||
                })
 | 
			
		||||
                .setNegativeButton(R.string.cancel, null)
 | 
			
		||||
                .setOnDismissListener(editTextDialogInterface -> {
 | 
			
		||||
                    Utils.hideKeyboard(this);
 | 
			
		||||
                })
 | 
			
		||||
                .show();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void editCommentFilterUsage(CommentFilterUsage commentFilterUsage) {
 | 
			
		||||
        editAndCommentFilterUsageNameOfUsage(commentFilterUsage.usage, commentFilterUsage.nameOfUsage);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void deleteCommentFilterUsage(CommentFilterUsage commentFilterUsage) {
 | 
			
		||||
        DeleteCommentFilterUsage.deleteCommentFilterUsage(redditDataRoomDatabase, executor, commentFilterUsage);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
 | 
			
		||||
        if (item.getItemId() == android.R.id.home) {
 | 
			
		||||
            finish();
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected SharedPreferences getDefaultSharedPreferences() {
 | 
			
		||||
        return sharedPreferences;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected CustomThemeWrapper getCustomThemeWrapper() {
 | 
			
		||||
        return customThemeWrapper;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void applyCustomTheme() {
 | 
			
		||||
        applyAppBarLayoutAndCollapsingToolbarLayoutAndToolbarTheme(binding.appbarLayoutCommentFilterUsageListingActivity, binding.collapsingToolbarLayoutCommentFilterUsageListingActivity, binding.toolbarCommentFilterUsageListingActivity);
 | 
			
		||||
        applyFABTheme(binding.fabCommentFilterUsageListingActivity, sharedPreferences.getBoolean(SharedPreferencesUtils.USE_CIRCULAR_FAB, false));
 | 
			
		||||
        binding.getRoot().setBackgroundColor(customThemeWrapper.getBackgroundColor());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -34,13 +34,13 @@ import butterknife.ButterKnife;
 | 
			
		||||
import eu.toldi.infinityforlemmy.Infinity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.R;
 | 
			
		||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
 | 
			
		||||
import eu.toldi.infinityforlemmy.RetrofitHolder;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.slidr.Slidr;
 | 
			
		||||
import eu.toldi.infinityforlemmy.multireddit.CreateMultiReddit;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subreddit.SubredditWithSelection;
 | 
			
		||||
import eu.toldi.infinityforlemmy.multireddit.MultiRedditJSONModel;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.Utils;
 | 
			
		||||
import retrofit2.Retrofit;
 | 
			
		||||
 | 
			
		||||
public class CreateMultiRedditActivity extends BaseActivity {
 | 
			
		||||
 | 
			
		||||
@@ -71,8 +71,8 @@ public class CreateMultiRedditActivity extends BaseActivity {
 | 
			
		||||
    @BindView(R.id.select_subreddit_text_view_create_multi_reddit_activity)
 | 
			
		||||
    TextView selectSubredditTextView;
 | 
			
		||||
    @Inject
 | 
			
		||||
    @Named("no_oauth")
 | 
			
		||||
    RetrofitHolder mRetrofit;
 | 
			
		||||
    @Named("oauth")
 | 
			
		||||
    Retrofit mOauthRetrofit;
 | 
			
		||||
    @Inject
 | 
			
		||||
    RedditDataRoomDatabase mRedditDataRoomDatabase;
 | 
			
		||||
    @Inject
 | 
			
		||||
@@ -87,14 +87,14 @@ public class CreateMultiRedditActivity extends BaseActivity {
 | 
			
		||||
    Executor mExecutor;
 | 
			
		||||
    private String mAccessToken;
 | 
			
		||||
    private String mAccountName;
 | 
			
		||||
    private ArrayList<SubredditWithSelection> mSubreddits;
 | 
			
		||||
    private ArrayList<String> mSubreddits;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onCreate(Bundle savedInstanceState) {
 | 
			
		||||
        ((Infinity) getApplication()).getAppComponent().inject(this);
 | 
			
		||||
 | 
			
		||||
        setImmersiveModeNotApplicable();
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        super.onCreate(savedInstanceState);
 | 
			
		||||
        setContentView(R.layout.activity_create_multi_reddit);
 | 
			
		||||
 | 
			
		||||
@@ -114,10 +114,10 @@ public class CreateMultiRedditActivity extends BaseActivity {
 | 
			
		||||
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 | 
			
		||||
 | 
			
		||||
        mAccessToken = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN, null);
 | 
			
		||||
        mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_QUALIFIED_NAME, "-");
 | 
			
		||||
        mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_NAME, "-");
 | 
			
		||||
 | 
			
		||||
        visibilityLinearLayout.setVisibility(View.GONE);
 | 
			
		||||
        if (mAccessToken == null) {
 | 
			
		||||
            visibilityLinearLayout.setVisibility(View.GONE);
 | 
			
		||||
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
 | 
			
		||||
                nameEditText.setImeOptions(nameEditText.getImeOptions() | EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING);
 | 
			
		||||
                descriptionEditText.setImeOptions(descriptionEditText.getImeOptions() | EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING);
 | 
			
		||||
@@ -125,7 +125,7 @@ public class CreateMultiRedditActivity extends BaseActivity {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (savedInstanceState != null) {
 | 
			
		||||
            mSubreddits = savedInstanceState.getParcelableArrayList(SELECTED_SUBREDDITS_STATE);
 | 
			
		||||
            mSubreddits = savedInstanceState.getStringArrayList(SELECTED_SUBREDDITS_STATE);
 | 
			
		||||
        } else {
 | 
			
		||||
            mSubreddits = new ArrayList<>();
 | 
			
		||||
        }
 | 
			
		||||
@@ -135,7 +135,7 @@ public class CreateMultiRedditActivity extends BaseActivity {
 | 
			
		||||
    private void bindView() {
 | 
			
		||||
        selectSubredditTextView.setOnClickListener(view -> {
 | 
			
		||||
            Intent intent = new Intent(CreateMultiRedditActivity.this, SelectedSubredditsAndUsersActivity.class);
 | 
			
		||||
            intent.putParcelableArrayListExtra(SelectedSubredditsAndUsersActivity.EXTRA_SELECTED_SUBREDDITS, mSubreddits);
 | 
			
		||||
            intent.putStringArrayListExtra(SelectedSubredditsAndUsersActivity.EXTRA_SELECTED_SUBREDDITS, mSubreddits);
 | 
			
		||||
            startActivityForResult(intent, SUBREDDIT_SELECTION_REQUEST_CODE);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
@@ -159,29 +159,42 @@ public class CreateMultiRedditActivity extends BaseActivity {
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Create a list of community qualified names seperated by a comma
 | 
			
		||||
            StringBuilder subredditList = new StringBuilder();
 | 
			
		||||
            String prefix = "";
 | 
			
		||||
            for (SubredditWithSelection s : mSubreddits) {
 | 
			
		||||
                subredditList.append(prefix);
 | 
			
		||||
                prefix = ",";
 | 
			
		||||
                subredditList.append(s.getQualifiedName());
 | 
			
		||||
            if (mAccessToken != null) {
 | 
			
		||||
                String jsonModel = new MultiRedditJSONModel(nameEditText.getText().toString(), descriptionEditText.getText().toString(),
 | 
			
		||||
                        visibilitySwitch.isChecked(), mSubreddits).createJSONModel();
 | 
			
		||||
                CreateMultiReddit.createMultiReddit(mOauthRetrofit, mRedditDataRoomDatabase, mAccessToken,
 | 
			
		||||
                        "/user/" + mAccountName + "/m/" + nameEditText.getText().toString(),
 | 
			
		||||
                        jsonModel, new CreateMultiReddit.CreateMultiRedditListener() {
 | 
			
		||||
                            @Override
 | 
			
		||||
                            public void success() {
 | 
			
		||||
                                finish();
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            @Override
 | 
			
		||||
                            public void failed(int errorCode) {
 | 
			
		||||
                                if (errorCode == 409) {
 | 
			
		||||
                                    Snackbar.make(coordinatorLayout, R.string.duplicate_multi_reddit, Snackbar.LENGTH_SHORT).show();
 | 
			
		||||
                                } else {
 | 
			
		||||
                                    Snackbar.make(coordinatorLayout, R.string.create_multi_reddit_failed, Snackbar.LENGTH_SHORT).show();
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        });
 | 
			
		||||
            } else {
 | 
			
		||||
                CreateMultiReddit.anonymousCreateMultiReddit(mExecutor, new Handler(), mRedditDataRoomDatabase,
 | 
			
		||||
                        "/user/-/m/" + nameEditText.getText().toString(),
 | 
			
		||||
                        nameEditText.getText().toString(), descriptionEditText.getText().toString(),
 | 
			
		||||
                        mSubreddits, new CreateMultiReddit.CreateMultiRedditListener() {
 | 
			
		||||
                            @Override
 | 
			
		||||
                            public void success() {
 | 
			
		||||
                                finish();
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            @Override
 | 
			
		||||
                            public void failed(int errorType) {
 | 
			
		||||
                                //Will not be called
 | 
			
		||||
                            }
 | 
			
		||||
                        });
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            CreateMultiReddit.anonymousCreateMultiReddit(mExecutor, new Handler(), mRedditDataRoomDatabase,
 | 
			
		||||
                    mAccountName, subredditList.toString(),
 | 
			
		||||
                    nameEditText.getText().toString(), descriptionEditText.getText().toString(),
 | 
			
		||||
                    mSubreddits, new CreateMultiReddit.CreateMultiRedditListener() {
 | 
			
		||||
                        @Override
 | 
			
		||||
                        public void success() {
 | 
			
		||||
                            finish();
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        @Override
 | 
			
		||||
                        public void failed(int errorType) {
 | 
			
		||||
                            //Will not be called
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
@@ -191,7 +204,7 @@ public class CreateMultiRedditActivity extends BaseActivity {
 | 
			
		||||
        super.onActivityResult(requestCode, resultCode, data);
 | 
			
		||||
        if (requestCode == SUBREDDIT_SELECTION_REQUEST_CODE && resultCode == RESULT_OK) {
 | 
			
		||||
            if (data != null) {
 | 
			
		||||
                mSubreddits = data.getParcelableArrayListExtra(
 | 
			
		||||
                mSubreddits = data.getStringArrayListExtra(
 | 
			
		||||
                        SubredditMultiselectionActivity.EXTRA_RETURN_SELECTED_SUBREDDITS);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -200,7 +213,7 @@ public class CreateMultiRedditActivity extends BaseActivity {
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onSaveInstanceState(@NonNull Bundle outState) {
 | 
			
		||||
        super.onSaveInstanceState(outState);
 | 
			
		||||
        outState.putParcelableArrayList(SELECTED_SUBREDDITS_STATE, mSubreddits);
 | 
			
		||||
        outState.putStringArrayList(SELECTED_SUBREDDITS_STATE, mSubreddits);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -1,302 +0,0 @@
 | 
			
		||||
package eu.toldi.infinityforlemmy.activities;
 | 
			
		||||
 | 
			
		||||
import android.app.Activity;
 | 
			
		||||
 | 
			
		||||
import android.Manifest;
 | 
			
		||||
import android.app.Activity;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.content.SharedPreferences;
 | 
			
		||||
import android.content.pm.PackageManager;
 | 
			
		||||
import android.content.res.ColorStateList;
 | 
			
		||||
import android.graphics.PorterDuff;
 | 
			
		||||
import android.graphics.drawable.Drawable;
 | 
			
		||||
import android.os.Build;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.os.Handler;
 | 
			
		||||
import android.view.Menu;
 | 
			
		||||
import android.view.MenuItem;
 | 
			
		||||
import android.widget.EditText;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
import android.widget.Toast;
 | 
			
		||||
 | 
			
		||||
import androidx.activity.result.ActivityResultLauncher;
 | 
			
		||||
import androidx.activity.result.contract.ActivityResultContracts;
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.core.content.ContextCompat;
 | 
			
		||||
 | 
			
		||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.Field;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.concurrent.Executor;
 | 
			
		||||
import java.util.regex.PatternSyntaxException;
 | 
			
		||||
 | 
			
		||||
import javax.inject.Inject;
 | 
			
		||||
import javax.inject.Named;
 | 
			
		||||
 | 
			
		||||
import eu.toldi.infinityforlemmy.Infinity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.R;
 | 
			
		||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
 | 
			
		||||
import eu.toldi.infinityforlemmy.commentfilter.CommentFilter;
 | 
			
		||||
import eu.toldi.infinityforlemmy.commentfilter.SaveCommentFilter;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.databinding.ActivityCustomizeCommentFilterBinding;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.Utils;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
public class CustomizeCommentFilterActivity extends BaseActivity {
 | 
			
		||||
 | 
			
		||||
    public static final String EXTRA_COMMENT_FILTER = "ECF";
 | 
			
		||||
    public static final String EXTRA_FROM_SETTINGS = "EFS";
 | 
			
		||||
    public static final String RETURN_EXTRA_COMMENT_FILTER = "RECF";
 | 
			
		||||
    private static final String COMMENT_FILTER_STATE = "CFS";
 | 
			
		||||
    private static final String ORIGINAL_NAME_STATE = "ONS";
 | 
			
		||||
    @Inject
 | 
			
		||||
    RedditDataRoomDatabase mRedditDataRoomDatabase;
 | 
			
		||||
    @Inject
 | 
			
		||||
    @Named("default")
 | 
			
		||||
    SharedPreferences mSharedPreferences;
 | 
			
		||||
    @Inject
 | 
			
		||||
    @Named("current_account")
 | 
			
		||||
    SharedPreferences currentAccountSharedPreferences;
 | 
			
		||||
    @Inject
 | 
			
		||||
    CustomThemeWrapper mCustomThemeWrapper;
 | 
			
		||||
    @Inject
 | 
			
		||||
    Executor mExecutor;
 | 
			
		||||
    private CommentFilter commentFilter;
 | 
			
		||||
    private boolean fromSettings;
 | 
			
		||||
    private String originalName;
 | 
			
		||||
    private ActivityCustomizeCommentFilterBinding binding;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onCreate(Bundle savedInstanceState) {
 | 
			
		||||
        ((Infinity) getApplication()).getAppComponent().inject(this);
 | 
			
		||||
 | 
			
		||||
        setImmersiveModeNotApplicable();
 | 
			
		||||
 | 
			
		||||
        super.onCreate(savedInstanceState);
 | 
			
		||||
        binding = ActivityCustomizeCommentFilterBinding.inflate(getLayoutInflater());
 | 
			
		||||
        setContentView(binding.getRoot());
 | 
			
		||||
 | 
			
		||||
        applyCustomTheme();
 | 
			
		||||
 | 
			
		||||
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && isChangeStatusBarIconColor()) {
 | 
			
		||||
            addOnOffsetChangedListener(binding.appbarLayoutCustomizeCommentFilterActivity);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        setSupportActionBar(binding.toolbarCustomizeCommentFilterActivity);
 | 
			
		||||
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 | 
			
		||||
        setToolbarGoToTop(binding.toolbarCustomizeCommentFilterActivity);
 | 
			
		||||
 | 
			
		||||
        ActivityResultLauncher<Intent> requestAddUsersLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
 | 
			
		||||
            Intent data = result.getData();
 | 
			
		||||
            if (data == null) {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            ArrayList<String> usernames = data.getStringArrayListExtra(SearchActivity.RETURN_EXTRA_SELECTED_USERNAMES);
 | 
			
		||||
            String currentUsers = binding.excludeUsersTextInputEditTextCustomizeCommentFilterActivity.getText().toString().trim();
 | 
			
		||||
            if (usernames != null && !usernames.isEmpty()) {
 | 
			
		||||
                if (!currentUsers.isEmpty() && currentUsers.charAt(currentUsers.length() - 1) != ',') {
 | 
			
		||||
                    String newString = currentUsers + ",";
 | 
			
		||||
                    binding.excludeUsersTextInputEditTextCustomizeCommentFilterActivity.setText(newString);
 | 
			
		||||
                }
 | 
			
		||||
                StringBuilder stringBuilder = new StringBuilder();
 | 
			
		||||
                for (String s : usernames) {
 | 
			
		||||
                    stringBuilder.append(s).append(",");
 | 
			
		||||
                }
 | 
			
		||||
                stringBuilder.deleteCharAt(stringBuilder.length() - 1);
 | 
			
		||||
                binding.excludeUsersTextInputEditTextCustomizeCommentFilterActivity.append(stringBuilder.toString());
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        binding.addUsersImageViewCustomizeCommentFilterActivity.setOnClickListener(view -> {
 | 
			
		||||
            Intent intent = new Intent(this, SearchActivity.class);
 | 
			
		||||
            intent.putExtra(SearchActivity.EXTRA_SEARCH_ONLY_USERS, true);
 | 
			
		||||
            intent.putExtra(SearchActivity.EXTRA_IS_MULTI_SELECTION, true);
 | 
			
		||||
            requestAddUsersLauncher.launch(intent);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        fromSettings = getIntent().getBooleanExtra(EXTRA_FROM_SETTINGS, false);
 | 
			
		||||
 | 
			
		||||
        if (savedInstanceState != null) {
 | 
			
		||||
            commentFilter = savedInstanceState.getParcelable(COMMENT_FILTER_STATE);
 | 
			
		||||
            originalName = savedInstanceState.getString(ORIGINAL_NAME_STATE);
 | 
			
		||||
        } else {
 | 
			
		||||
            commentFilter = getIntent().getParcelableExtra(EXTRA_COMMENT_FILTER);
 | 
			
		||||
            if (commentFilter == null) {
 | 
			
		||||
                commentFilter = new CommentFilter();
 | 
			
		||||
                originalName = "";
 | 
			
		||||
            } else {
 | 
			
		||||
                if (!fromSettings) {
 | 
			
		||||
                    originalName = "";
 | 
			
		||||
                } else {
 | 
			
		||||
                    originalName = commentFilter.name;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            bindView();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void bindView() {
 | 
			
		||||
        binding.nameTextInputEditTextCustomizeCommentFilterActivity.setText(commentFilter.name);
 | 
			
		||||
        binding.excludeStringsTextInputEditTextCustomizeCommentFilterActivity.setText(commentFilter.excludeStrings);
 | 
			
		||||
        binding.excludeUsersTextInputEditTextCustomizeCommentFilterActivity.setText(commentFilter.excludeUsers);
 | 
			
		||||
        binding.minVoteTextInputEditTextCustomizeCommentFilterActivity.setText(Integer.toString(commentFilter.minVote));
 | 
			
		||||
        binding.maxVoteTextInputEditTextCustomizeCommentFilterActivity.setText(Integer.toString(commentFilter.maxVote));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected SharedPreferences getDefaultSharedPreferences() {
 | 
			
		||||
        return mSharedPreferences;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected CustomThemeWrapper getCustomThemeWrapper() {
 | 
			
		||||
        return mCustomThemeWrapper;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void applyCustomTheme() {
 | 
			
		||||
        binding.getRoot().setBackgroundColor(mCustomThemeWrapper.getBackgroundColor());
 | 
			
		||||
        applyAppBarLayoutAndCollapsingToolbarLayoutAndToolbarTheme(binding.appbarLayoutCustomizeCommentFilterActivity, binding.collapsingToolbarLayoutCustomizeCommentFilterActivity, binding.toolbarCustomizeCommentFilterActivity);
 | 
			
		||||
        int primaryTextColor = mCustomThemeWrapper.getPrimaryTextColor();
 | 
			
		||||
        int primaryIconColor = mCustomThemeWrapper.getPrimaryIconColor();
 | 
			
		||||
        Drawable cursorDrawable = Utils.getTintedDrawable(this, R.drawable.edit_text_cursor, primaryTextColor);
 | 
			
		||||
        binding.nameTextInputLayoutCustomizeCommentFilterActivity.setBoxStrokeColor(primaryTextColor);
 | 
			
		||||
        binding.nameTextInputLayoutCustomizeCommentFilterActivity.setDefaultHintTextColor(ColorStateList.valueOf(primaryTextColor));
 | 
			
		||||
        binding.nameTextInputEditTextCustomizeCommentFilterActivity.setTextColor(primaryTextColor);
 | 
			
		||||
        binding.excludeStringsTextInputLayoutCustomizeCommentFilterActivity.setBoxStrokeColor(primaryTextColor);
 | 
			
		||||
        binding.excludeStringsTextInputLayoutCustomizeCommentFilterActivity.setDefaultHintTextColor(ColorStateList.valueOf(primaryTextColor));
 | 
			
		||||
        binding.excludeStringsTextInputEditTextCustomizeCommentFilterActivity.setTextColor(primaryTextColor);
 | 
			
		||||
        binding.excludeUsersTextInputLayoutCustomizeCommentFilterActivity.setDefaultHintTextColor(ColorStateList.valueOf(primaryTextColor));
 | 
			
		||||
        binding.excludeUsersTextInputEditTextCustomizeCommentFilterActivity.setTextColor(primaryTextColor);
 | 
			
		||||
        binding.addUsersImageViewCustomizeCommentFilterActivity.setImageDrawable(Utils.getTintedDrawable(this, R.drawable.ic_add_24dp, primaryIconColor));
 | 
			
		||||
        binding.minVoteTextInputLayoutCustomizeCommentFilterActivity.setBoxStrokeColor(primaryTextColor);
 | 
			
		||||
        binding.minVoteTextInputLayoutCustomizeCommentFilterActivity.setDefaultHintTextColor(ColorStateList.valueOf(primaryTextColor));
 | 
			
		||||
        binding.minVoteTextInputEditTextCustomizeCommentFilterActivity.setTextColor(primaryTextColor);
 | 
			
		||||
        binding.maxVoteTextInputLayoutCustomizeCommentFilterActivity.setBoxStrokeColor(primaryTextColor);
 | 
			
		||||
        binding.maxVoteTextInputLayoutCustomizeCommentFilterActivity.setDefaultHintTextColor(ColorStateList.valueOf(primaryTextColor));
 | 
			
		||||
        binding.maxVoteTextInputEditTextCustomizeCommentFilterActivity.setTextColor(primaryTextColor);
 | 
			
		||||
 | 
			
		||||
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
 | 
			
		||||
            binding.nameTextInputEditTextCustomizeCommentFilterActivity.setTextCursorDrawable(cursorDrawable);
 | 
			
		||||
            binding.excludeStringsTextInputEditTextCustomizeCommentFilterActivity.setTextCursorDrawable(cursorDrawable);
 | 
			
		||||
            binding.excludeUsersTextInputEditTextCustomizeCommentFilterActivity.setTextCursorDrawable(cursorDrawable);
 | 
			
		||||
            binding.minVoteTextInputEditTextCustomizeCommentFilterActivity.setTextCursorDrawable(cursorDrawable);
 | 
			
		||||
            binding.maxVoteTextInputEditTextCustomizeCommentFilterActivity.setTextCursorDrawable(cursorDrawable);
 | 
			
		||||
        } else {
 | 
			
		||||
            setCursorDrawableColor(binding.nameTextInputEditTextCustomizeCommentFilterActivity, primaryTextColor);
 | 
			
		||||
            setCursorDrawableColor(binding.excludeStringsTextInputEditTextCustomizeCommentFilterActivity, primaryTextColor);
 | 
			
		||||
            setCursorDrawableColor(binding.excludeUsersTextInputEditTextCustomizeCommentFilterActivity, primaryTextColor);
 | 
			
		||||
            setCursorDrawableColor(binding.minVoteTextInputEditTextCustomizeCommentFilterActivity, primaryTextColor);
 | 
			
		||||
            setCursorDrawableColor(binding.maxVoteTextInputEditTextCustomizeCommentFilterActivity, primaryTextColor);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (typeface != null) {
 | 
			
		||||
            Utils.setFontToAllTextViews(binding.getRoot(), typeface);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setCursorDrawableColor(EditText editText, int color) {
 | 
			
		||||
        try {
 | 
			
		||||
            Field fCursorDrawableRes = TextView.class.getDeclaredField("mCursorDrawableRes");
 | 
			
		||||
            fCursorDrawableRes.setAccessible(true);
 | 
			
		||||
            int mCursorDrawableRes = fCursorDrawableRes.getInt(editText);
 | 
			
		||||
            Field fEditor = TextView.class.getDeclaredField("mEditor");
 | 
			
		||||
            fEditor.setAccessible(true);
 | 
			
		||||
            Object editor = fEditor.get(editText);
 | 
			
		||||
            Class<?> clazz = editor.getClass();
 | 
			
		||||
            Field fCursorDrawable = clazz.getDeclaredField("mCursorDrawable");
 | 
			
		||||
            fCursorDrawable.setAccessible(true);
 | 
			
		||||
            Drawable[] drawables = new Drawable[2];
 | 
			
		||||
            drawables[0] = editText.getContext().getResources().getDrawable(mCursorDrawableRes);
 | 
			
		||||
            drawables[1] = editText.getContext().getResources().getDrawable(mCursorDrawableRes);
 | 
			
		||||
            drawables[0].setColorFilter(color, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
            drawables[1].setColorFilter(color, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
            fCursorDrawable.set(editor, drawables);
 | 
			
		||||
        } catch (Throwable ignored) {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onCreateOptionsMenu(Menu menu) {
 | 
			
		||||
        getMenuInflater().inflate(R.menu.customize_comment_filter_activity, menu);
 | 
			
		||||
        if (fromSettings) {
 | 
			
		||||
            menu.findItem(R.id.action_save_customize_comment_filter_activity).setVisible(false);
 | 
			
		||||
        }
 | 
			
		||||
        applyMenuItemTheme(menu);
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
 | 
			
		||||
        if (item.getItemId() == android.R.id.home) {
 | 
			
		||||
            finish();
 | 
			
		||||
            return true;
 | 
			
		||||
        } else if (item.getItemId() == R.id.action_save_customize_comment_filter_activity) {
 | 
			
		||||
            try {
 | 
			
		||||
                constructCommentFilter();
 | 
			
		||||
                Intent returnIntent = new Intent();
 | 
			
		||||
                returnIntent.putExtra(RETURN_EXTRA_COMMENT_FILTER, commentFilter);
 | 
			
		||||
                setResult(Activity.RESULT_OK, returnIntent);
 | 
			
		||||
                finish();
 | 
			
		||||
            } catch (PatternSyntaxException e) {
 | 
			
		||||
                Toast.makeText(this, R.string.invalid_regex, Toast.LENGTH_SHORT).show();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return true;
 | 
			
		||||
        } else if (item.getItemId() == R.id.action_save_to_database_customize_comment_filter_activity) {
 | 
			
		||||
            try {
 | 
			
		||||
                constructCommentFilter();
 | 
			
		||||
 | 
			
		||||
                if (!commentFilter.name.equals("")) {
 | 
			
		||||
                    saveCommentFilter(originalName);
 | 
			
		||||
                } else {
 | 
			
		||||
                    Toast.makeText(CustomizeCommentFilterActivity.this, R.string.comment_filter_requires_a_name, Toast.LENGTH_LONG).show();
 | 
			
		||||
                }
 | 
			
		||||
            } catch (PatternSyntaxException e) {
 | 
			
		||||
                Toast.makeText(this, R.string.invalid_regex, Toast.LENGTH_SHORT).show();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void saveCommentFilter(String originalName) {
 | 
			
		||||
        SaveCommentFilter.saveCommentFilter(mExecutor, new Handler(), mRedditDataRoomDatabase, commentFilter, originalName,
 | 
			
		||||
                new SaveCommentFilter.SaveCommentFilterListener() {
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void success() {
 | 
			
		||||
                        Intent returnIntent = new Intent();
 | 
			
		||||
                        returnIntent.putExtra(RETURN_EXTRA_COMMENT_FILTER, commentFilter);
 | 
			
		||||
                        setResult(Activity.RESULT_OK, returnIntent);
 | 
			
		||||
                        finish();
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void duplicate() {
 | 
			
		||||
                        new MaterialAlertDialogBuilder(CustomizeCommentFilterActivity.this, R.style.MaterialAlertDialogTheme)
 | 
			
		||||
                                .setTitle(getString(R.string.duplicate_comment_filter_dialog_title, commentFilter.name))
 | 
			
		||||
                                .setMessage(R.string.duplicate_comment_filter_dialog_message)
 | 
			
		||||
                                .setPositiveButton(R.string.override, (dialogInterface, i) -> saveCommentFilter(commentFilter.name))
 | 
			
		||||
                                .setNegativeButton(R.string.cancel, null)
 | 
			
		||||
                                .show();
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void constructCommentFilter() throws PatternSyntaxException {
 | 
			
		||||
        commentFilter.name = binding.nameTextInputEditTextCustomizeCommentFilterActivity.getText().toString();
 | 
			
		||||
        commentFilter.excludeStrings = binding.excludeStringsTextInputEditTextCustomizeCommentFilterActivity.getText().toString();
 | 
			
		||||
        commentFilter.excludeUsers = binding.excludeUsersTextInputEditTextCustomizeCommentFilterActivity.getText().toString();
 | 
			
		||||
        commentFilter.maxVote = binding.maxVoteTextInputEditTextCustomizeCommentFilterActivity.getText() == null || binding.maxVoteTextInputEditTextCustomizeCommentFilterActivity.getText().toString().equals("") ? -1 : Integer.parseInt(binding.maxVoteTextInputEditTextCustomizeCommentFilterActivity.getText().toString());
 | 
			
		||||
        commentFilter.minVote = binding.minVoteTextInputEditTextCustomizeCommentFilterActivity.getText() == null || binding.minVoteTextInputEditTextCustomizeCommentFilterActivity.getText().toString().equals("") ? -1 : Integer.parseInt(binding.minVoteTextInputEditTextCustomizeCommentFilterActivity.getText().toString());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onSaveInstanceState(@NonNull Bundle outState) {
 | 
			
		||||
        super.onSaveInstanceState(outState);
 | 
			
		||||
        outState.putParcelable(COMMENT_FILTER_STATE, commentFilter);
 | 
			
		||||
        outState.putString(ORIGINAL_NAME_STATE, originalName);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -157,7 +157,14 @@ public class CustomizePostFilterActivity extends BaseActivity {
 | 
			
		||||
    TextInputEditText excludesUsersTextInputEditText;
 | 
			
		||||
    @BindView(R.id.add_users_image_view_customize_post_filter_activity)
 | 
			
		||||
    ImageView addUsersImageView;
 | 
			
		||||
 | 
			
		||||
    @BindView(R.id.excludes_flairs_text_input_layout_customize_post_filter_activity)
 | 
			
		||||
    TextInputLayout excludesFlairsTextInputLayout;
 | 
			
		||||
    @BindView(R.id.excludes_flairs_text_input_edit_text_customize_post_filter_activity)
 | 
			
		||||
    TextInputEditText excludesFlairsTextInputEditText;
 | 
			
		||||
    @BindView(R.id.contains_flairs_text_input_layout_customize_post_filter_activity)
 | 
			
		||||
    TextInputLayout containsFlairsTextInputLayout;
 | 
			
		||||
    @BindView(R.id.contains_flairs_text_input_edit_text_customize_post_filter_activity)
 | 
			
		||||
    TextInputEditText containsFlairsTextInputEditText;
 | 
			
		||||
    @BindView(R.id.exclude_domains_text_input_layout_customize_post_filter_activity)
 | 
			
		||||
    TextInputLayout excludeDomainsTextInputLayout;
 | 
			
		||||
    @BindView(R.id.exclude_domains_text_input_edit_text_customize_post_filter_activity)
 | 
			
		||||
@@ -182,7 +189,14 @@ public class CustomizePostFilterActivity extends BaseActivity {
 | 
			
		||||
    TextInputLayout maxCommentsTextInputLayout;
 | 
			
		||||
    @BindView(R.id.max_comments_text_input_edit_text_customize_post_filter_activity)
 | 
			
		||||
    TextInputEditText maxCommentsTextInputEditText;
 | 
			
		||||
 | 
			
		||||
    @BindView(R.id.min_awards_text_input_layout_customize_post_filter_activity)
 | 
			
		||||
    TextInputLayout minAwardsTextInputLayout;
 | 
			
		||||
    @BindView(R.id.min_awards_text_input_edit_text_customize_post_filter_activity)
 | 
			
		||||
    TextInputEditText minAwardsTextInputEditText;
 | 
			
		||||
    @BindView(R.id.max_awards_text_input_layout_customize_post_filter_activity)
 | 
			
		||||
    TextInputLayout maxAwardsTextInputLayout;
 | 
			
		||||
    @BindView(R.id.max_awards_text_input_edit_text_customize_post_filter_activity)
 | 
			
		||||
    TextInputEditText maxAwardsTextInputEditText;
 | 
			
		||||
    @Inject
 | 
			
		||||
    RedditDataRoomDatabase mRedditDataRoomDatabase;
 | 
			
		||||
    @Inject
 | 
			
		||||
@@ -212,6 +226,10 @@ public class CustomizePostFilterActivity extends BaseActivity {
 | 
			
		||||
 | 
			
		||||
        applyCustomTheme();
 | 
			
		||||
 | 
			
		||||
        if (mSharedPreferences.getBoolean(SharedPreferencesUtils.SWIPE_RIGHT_TO_GO_BACK, true)) {
 | 
			
		||||
            Slidr.attach(this);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && isChangeStatusBarIconColor()) {
 | 
			
		||||
            addOnOffsetChangedListener(appBarLayout);
 | 
			
		||||
        }
 | 
			
		||||
@@ -309,12 +327,16 @@ public class CustomizePostFilterActivity extends BaseActivity {
 | 
			
		||||
        titleContainsRegexTextInputEditText.setText(postFilter.postTitleContainsRegex);
 | 
			
		||||
        excludesSubredditsTextInputEditText.setText(postFilter.excludeSubreddits);
 | 
			
		||||
        excludesUsersTextInputEditText.setText(postFilter.excludeUsers);
 | 
			
		||||
        excludesFlairsTextInputEditText.setText(postFilter.excludeFlairs);
 | 
			
		||||
        containsFlairsTextInputEditText.setText(postFilter.containFlairs);
 | 
			
		||||
        excludeDomainsTextInputEditText.setText(postFilter.excludeDomains);
 | 
			
		||||
        containDomainsTextInputEditText.setText(postFilter.containDomains);
 | 
			
		||||
        minVoteTextInputEditText.setText(Integer.toString(postFilter.minVote));
 | 
			
		||||
        maxVoteTextInputEditText.setText(Integer.toString(postFilter.maxVote));
 | 
			
		||||
        minCommentsTextInputEditText.setText(Integer.toString(postFilter.minComments));
 | 
			
		||||
        maxCommentsTextInputEditText.setText(Integer.toString(postFilter.maxComments));
 | 
			
		||||
        minAwardsTextInputEditText.setText(Integer.toString(postFilter.minAwards));
 | 
			
		||||
        maxAwardsTextInputEditText.setText(Integer.toString(postFilter.maxAwards));
 | 
			
		||||
 | 
			
		||||
        Intent intent = getIntent();
 | 
			
		||||
        String excludeSubreddit = intent.getStringExtra(EXTRA_EXCLUDE_SUBREDDIT);
 | 
			
		||||
@@ -336,6 +358,18 @@ public class CustomizePostFilterActivity extends BaseActivity {
 | 
			
		||||
            }
 | 
			
		||||
            excludesUsersTextInputEditText.append(excludeUser);
 | 
			
		||||
        }
 | 
			
		||||
        if (excludeFlair != null && !excludeFlair.equals("")) {
 | 
			
		||||
            if (!excludesFlairsTextInputEditText.getText().toString().equals("")) {
 | 
			
		||||
                excludesFlairsTextInputEditText.append(",");
 | 
			
		||||
            }
 | 
			
		||||
            excludesFlairsTextInputEditText.append(excludeFlair);
 | 
			
		||||
        }
 | 
			
		||||
        if (containFlair != null && !containFlair.equals("")) {
 | 
			
		||||
            if (!containsFlairsTextInputEditText.getText().toString().equals("")) {
 | 
			
		||||
                containsFlairsTextInputEditText.append(",");
 | 
			
		||||
            }
 | 
			
		||||
            containsFlairsTextInputEditText.append(containFlair);
 | 
			
		||||
        }
 | 
			
		||||
        if (excludeDomain != null && !excludeDomain.equals("")) {
 | 
			
		||||
            if (!excludeDomainsTextInputEditText.getText().toString().equals("")) {
 | 
			
		||||
                excludeDomainsTextInputEditText.append(",");
 | 
			
		||||
@@ -398,6 +432,12 @@ public class CustomizePostFilterActivity extends BaseActivity {
 | 
			
		||||
        excludesUsersTextInputLayout.setDefaultHintTextColor(ColorStateList.valueOf(primaryTextColor));
 | 
			
		||||
        excludesUsersTextInputEditText.setTextColor(primaryTextColor);
 | 
			
		||||
        addUsersImageView.setImageDrawable(Utils.getTintedDrawable(this, R.drawable.ic_add_24dp, primaryIconColor));
 | 
			
		||||
        excludesFlairsTextInputLayout.setBoxStrokeColor(primaryTextColor);
 | 
			
		||||
        excludesFlairsTextInputLayout.setDefaultHintTextColor(ColorStateList.valueOf(primaryTextColor));
 | 
			
		||||
        excludesFlairsTextInputEditText.setTextColor(primaryTextColor);
 | 
			
		||||
        containsFlairsTextInputLayout.setBoxStrokeColor(primaryTextColor);
 | 
			
		||||
        containsFlairsTextInputLayout.setDefaultHintTextColor(ColorStateList.valueOf(primaryTextColor));
 | 
			
		||||
        containsFlairsTextInputEditText.setTextColor(primaryTextColor);
 | 
			
		||||
        excludeDomainsTextInputLayout.setBoxStrokeColor(primaryTextColor);
 | 
			
		||||
        excludeDomainsTextInputLayout.setDefaultHintTextColor(ColorStateList.valueOf(primaryTextColor));
 | 
			
		||||
        excludeDomainsTextInputEditText.setTextColor(primaryTextColor);
 | 
			
		||||
@@ -416,6 +456,13 @@ public class CustomizePostFilterActivity extends BaseActivity {
 | 
			
		||||
        maxCommentsTextInputLayout.setBoxStrokeColor(primaryTextColor);
 | 
			
		||||
        maxCommentsTextInputLayout.setDefaultHintTextColor(ColorStateList.valueOf(primaryTextColor));
 | 
			
		||||
        maxCommentsTextInputEditText.setTextColor(primaryTextColor);
 | 
			
		||||
        minAwardsTextInputLayout.setBoxStrokeColor(primaryTextColor);
 | 
			
		||||
        minAwardsTextInputLayout.setDefaultHintTextColor(ColorStateList.valueOf(primaryTextColor));
 | 
			
		||||
        minAwardsTextInputEditText.setTextColor(primaryTextColor);
 | 
			
		||||
        maxAwardsTextInputLayout.setBoxStrokeColor(primaryTextColor);
 | 
			
		||||
        maxAwardsTextInputLayout.setDefaultHintTextColor(ColorStateList.valueOf(primaryTextColor));
 | 
			
		||||
        maxAwardsTextInputEditText.setTextColor(primaryTextColor);
 | 
			
		||||
 | 
			
		||||
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
 | 
			
		||||
            nameTextInputEditText.setTextCursorDrawable(cursorDrawable);
 | 
			
		||||
            titleExcludesStringsTextInputEditText.setTextCursorDrawable(cursorDrawable);
 | 
			
		||||
@@ -424,12 +471,16 @@ public class CustomizePostFilterActivity extends BaseActivity {
 | 
			
		||||
            titleContainsRegexTextInputEditText.setTextCursorDrawable(cursorDrawable);
 | 
			
		||||
            excludesSubredditsTextInputEditText.setTextCursorDrawable(cursorDrawable);
 | 
			
		||||
            excludesUsersTextInputEditText.setTextCursorDrawable(cursorDrawable);
 | 
			
		||||
            excludesFlairsTextInputEditText.setTextCursorDrawable(cursorDrawable);
 | 
			
		||||
            containsFlairsTextInputEditText.setTextCursorDrawable(cursorDrawable);
 | 
			
		||||
            excludeDomainsTextInputEditText.setTextCursorDrawable(cursorDrawable);
 | 
			
		||||
            containDomainsTextInputEditText.setTextCursorDrawable(cursorDrawable);
 | 
			
		||||
            minVoteTextInputEditText.setTextCursorDrawable(cursorDrawable);
 | 
			
		||||
            maxVoteTextInputEditText.setTextCursorDrawable(cursorDrawable);
 | 
			
		||||
            minCommentsTextInputEditText.setTextCursorDrawable(cursorDrawable);
 | 
			
		||||
            maxCommentsTextInputEditText.setTextCursorDrawable(cursorDrawable);
 | 
			
		||||
            minAwardsTextInputEditText.setTextCursorDrawable(cursorDrawable);
 | 
			
		||||
            maxAwardsTextInputEditText.setTextCursorDrawable(cursorDrawable);
 | 
			
		||||
        } else {
 | 
			
		||||
            setCursorDrawableColor(nameTextInputEditText, primaryTextColor);
 | 
			
		||||
            setCursorDrawableColor(titleExcludesStringsTextInputEditText, primaryTextColor);
 | 
			
		||||
@@ -438,12 +489,16 @@ public class CustomizePostFilterActivity extends BaseActivity {
 | 
			
		||||
            setCursorDrawableColor(titleContainsRegexTextInputEditText, primaryTextColor);
 | 
			
		||||
            setCursorDrawableColor(excludesSubredditsTextInputEditText, primaryTextColor);
 | 
			
		||||
            setCursorDrawableColor(excludesUsersTextInputEditText, primaryTextColor);
 | 
			
		||||
            setCursorDrawableColor(excludesFlairsTextInputEditText, primaryTextColor);
 | 
			
		||||
            setCursorDrawableColor(containsFlairsTextInputEditText, primaryTextColor);
 | 
			
		||||
            setCursorDrawableColor(excludeDomainsTextInputEditText, primaryTextColor);
 | 
			
		||||
            setCursorDrawableColor(containDomainsTextInputEditText, primaryTextColor);
 | 
			
		||||
            setCursorDrawableColor(minVoteTextInputEditText, primaryTextColor);
 | 
			
		||||
            setCursorDrawableColor(maxVoteTextInputEditText, primaryTextColor);
 | 
			
		||||
            setCursorDrawableColor(minCommentsTextInputEditText, primaryTextColor);
 | 
			
		||||
            setCursorDrawableColor(maxCommentsTextInputEditText, primaryTextColor);
 | 
			
		||||
            setCursorDrawableColor(minAwardsTextInputEditText, primaryTextColor);
 | 
			
		||||
            setCursorDrawableColor(maxAwardsTextInputEditText, primaryTextColor);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (typeface != null) {
 | 
			
		||||
@@ -588,6 +643,8 @@ public class CustomizePostFilterActivity extends BaseActivity {
 | 
			
		||||
        postFilter.minVote = minVoteTextInputEditText.getText() == null || minVoteTextInputEditText.getText().toString().equals("") ? -1 : Integer.parseInt(minVoteTextInputEditText.getText().toString());
 | 
			
		||||
        postFilter.maxComments = maxCommentsTextInputEditText.getText() == null || maxCommentsTextInputEditText.getText().toString().equals("") ? -1 : Integer.parseInt(maxCommentsTextInputEditText.getText().toString());
 | 
			
		||||
        postFilter.minComments = minCommentsTextInputEditText.getText() == null || minCommentsTextInputEditText.getText().toString().equals("") ? -1 : Integer.parseInt(minCommentsTextInputEditText.getText().toString());
 | 
			
		||||
        postFilter.maxAwards = maxAwardsTextInputEditText.getText() == null || maxAwardsTextInputEditText.getText().toString().equals("") ? -1 : Integer.parseInt(maxAwardsTextInputEditText.getText().toString());
 | 
			
		||||
        postFilter.minAwards = minAwardsTextInputEditText.getText() == null || minAwardsTextInputEditText.getText().toString().equals("") ? -1 : Integer.parseInt(minAwardsTextInputEditText.getText().toString());
 | 
			
		||||
        postFilter.postTitleExcludesRegex = titleExcludesRegexTextInputEditText.getText().toString();
 | 
			
		||||
        Pattern.compile(postFilter.postTitleExcludesRegex);
 | 
			
		||||
        postFilter.postTitleContainsRegex = titleContainsRegexTextInputEditText.getText().toString();
 | 
			
		||||
@@ -596,6 +653,8 @@ public class CustomizePostFilterActivity extends BaseActivity {
 | 
			
		||||
        postFilter.postTitleContainsStrings = titleContainsStringsTextInputEditText.getText().toString();
 | 
			
		||||
        postFilter.excludeSubreddits = excludesSubredditsTextInputEditText.getText().toString();
 | 
			
		||||
        postFilter.excludeUsers = excludesUsersTextInputEditText.getText().toString();
 | 
			
		||||
        postFilter.excludeFlairs = excludesFlairsTextInputEditText.getText().toString();
 | 
			
		||||
        postFilter.containFlairs = containsFlairsTextInputEditText.getText().toString();
 | 
			
		||||
        postFilter.excludeDomains = excludeDomainsTextInputEditText.getText().toString();
 | 
			
		||||
        postFilter.containDomains = containDomainsTextInputEditText.getText().toString();
 | 
			
		||||
        postFilter.containTextType = postTypeTextCheckBox.isChecked();
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,7 @@ import android.view.View;
 | 
			
		||||
import android.widget.EditText;
 | 
			
		||||
import android.widget.LinearLayout;
 | 
			
		||||
import android.widget.ProgressBar;
 | 
			
		||||
import android.widget.Switch;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
@@ -24,7 +25,6 @@ import com.google.android.material.appbar.AppBarLayout;
 | 
			
		||||
import com.google.android.material.appbar.CollapsingToolbarLayout;
 | 
			
		||||
import com.google.android.material.snackbar.Snackbar;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.concurrent.Executor;
 | 
			
		||||
 | 
			
		||||
import javax.inject.Inject;
 | 
			
		||||
@@ -40,7 +40,7 @@ import eu.toldi.infinityforlemmy.customviews.slidr.Slidr;
 | 
			
		||||
import eu.toldi.infinityforlemmy.multireddit.EditMultiReddit;
 | 
			
		||||
import eu.toldi.infinityforlemmy.multireddit.FetchMultiRedditInfo;
 | 
			
		||||
import eu.toldi.infinityforlemmy.multireddit.MultiReddit;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subreddit.SubredditWithSelection;
 | 
			
		||||
import eu.toldi.infinityforlemmy.multireddit.MultiRedditJSONModel;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.Utils;
 | 
			
		||||
import retrofit2.Retrofit;
 | 
			
		||||
@@ -70,6 +70,12 @@ public class EditMultiRedditActivity extends BaseActivity {
 | 
			
		||||
    EditText descriptionEditText;
 | 
			
		||||
    @BindView(R.id.divider_2_edit_multi_reddit_activity)
 | 
			
		||||
    View divider2;
 | 
			
		||||
    @BindView(R.id.visibility_wrapper_linear_layout_edit_multi_reddit_activity)
 | 
			
		||||
    LinearLayout visibilityLinearLayout;
 | 
			
		||||
    @BindView(R.id.visibility_text_view_edit_multi_reddit_activity)
 | 
			
		||||
    TextView visibilityTextView;
 | 
			
		||||
    @BindView(R.id.visibility_switch_edit_multi_reddit_activity)
 | 
			
		||||
    Switch visibilitySwitch;
 | 
			
		||||
    @BindView(R.id.select_subreddit_text_view_edit_multi_reddit_activity)
 | 
			
		||||
    TextView selectSubredditTextView;
 | 
			
		||||
    @Inject
 | 
			
		||||
@@ -117,9 +123,10 @@ public class EditMultiRedditActivity extends BaseActivity {
 | 
			
		||||
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 | 
			
		||||
 | 
			
		||||
        mAccessToken = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN, null);
 | 
			
		||||
        mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_QUALIFIED_NAME, "-");
 | 
			
		||||
        mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_NAME, "-");
 | 
			
		||||
 | 
			
		||||
        if (mAccessToken == null) {
 | 
			
		||||
            visibilityLinearLayout.setVisibility(View.GONE);
 | 
			
		||||
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
 | 
			
		||||
                nameEditText.setImeOptions(nameEditText.getImeOptions() | EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING);
 | 
			
		||||
                descriptionEditText.setImeOptions(descriptionEditText.getImeOptions() | EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING);
 | 
			
		||||
@@ -138,44 +145,53 @@ public class EditMultiRedditActivity extends BaseActivity {
 | 
			
		||||
 | 
			
		||||
    private void bindView() {
 | 
			
		||||
        if (multiReddit == null) {
 | 
			
		||||
            if (mAccessToken == null) {
 | 
			
		||||
                FetchMultiRedditInfo.anonymousFetchMultiRedditInfo(mExecutor, new Handler(),
 | 
			
		||||
                        mRedditDataRoomDatabase, multipath, new FetchMultiRedditInfo.FetchMultiRedditInfoListener() {
 | 
			
		||||
                            @Override
 | 
			
		||||
                            public void success(MultiReddit multiReddit) {
 | 
			
		||||
                                EditMultiRedditActivity.this.multiReddit = multiReddit;
 | 
			
		||||
                                progressBar.setVisibility(View.GONE);
 | 
			
		||||
                                linearLayout.setVisibility(View.VISIBLE);
 | 
			
		||||
                                nameEditText.setText(multiReddit.getDisplayName());
 | 
			
		||||
                                descriptionEditText.setText(multiReddit.getDescription());
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
            FetchMultiRedditInfo.anonymousFetchMultiRedditInfo(mExecutor, new Handler(),
 | 
			
		||||
                    mRedditDataRoomDatabase, multipath, mAccountName, new FetchMultiRedditInfo.FetchMultiRedditInfoListener() {
 | 
			
		||||
                        @Override
 | 
			
		||||
                        public void success(MultiReddit multiReddit) {
 | 
			
		||||
                            EditMultiRedditActivity.this.multiReddit = multiReddit;
 | 
			
		||||
                            progressBar.setVisibility(View.GONE);
 | 
			
		||||
                            linearLayout.setVisibility(View.VISIBLE);
 | 
			
		||||
                            nameEditText.setText(multiReddit.getDisplayName());
 | 
			
		||||
                            descriptionEditText.setText(multiReddit.getDescription());
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        @Override
 | 
			
		||||
                        public void failed() {
 | 
			
		||||
                            //Will not be called
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
                            @Override
 | 
			
		||||
                            public void failed() {
 | 
			
		||||
                                //Will not be called
 | 
			
		||||
                            }
 | 
			
		||||
                        });
 | 
			
		||||
            } else {
 | 
			
		||||
                FetchMultiRedditInfo.fetchMultiRedditInfo(mRetrofit, mAccessToken, multipath, new FetchMultiRedditInfo.FetchMultiRedditInfoListener() {
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void success(MultiReddit multiReddit) {
 | 
			
		||||
                        EditMultiRedditActivity.this.multiReddit = multiReddit;
 | 
			
		||||
                        progressBar.setVisibility(View.GONE);
 | 
			
		||||
                        linearLayout.setVisibility(View.VISIBLE);
 | 
			
		||||
                        nameEditText.setText(multiReddit.getDisplayName());
 | 
			
		||||
                        descriptionEditText.setText(multiReddit.getDescription());
 | 
			
		||||
                        visibilitySwitch.setChecked(!multiReddit.getVisibility().equals("public"));
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void failed() {
 | 
			
		||||
                        Snackbar.make(coordinatorLayout, R.string.cannot_fetch_multireddit, Snackbar.LENGTH_SHORT).show();
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            progressBar.setVisibility(View.GONE);
 | 
			
		||||
            linearLayout.setVisibility(View.VISIBLE);
 | 
			
		||||
            nameEditText.setText(multiReddit.getDisplayName());
 | 
			
		||||
            descriptionEditText.setText(multiReddit.getDescription());
 | 
			
		||||
            visibilitySwitch.setChecked(!multiReddit.getVisibility().equals("public"));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        selectSubredditTextView.setOnClickListener(view -> {
 | 
			
		||||
            Intent intent = new Intent(EditMultiRedditActivity.this, SelectedSubredditsAndUsersActivity.class);
 | 
			
		||||
            if (multiReddit.getSubreddits() != null) {
 | 
			
		||||
                if (multiReddit.getSubreddits().isEmpty() && !multiReddit.getPath().equals("")) {
 | 
			
		||||
                    String[] communities = multiReddit.getPath().split(",");
 | 
			
		||||
                    ArrayList<SubredditWithSelection> communitiesList = new ArrayList<>();
 | 
			
		||||
                    for (String community : communities) {
 | 
			
		||||
                        communitiesList.add(new SubredditWithSelection(community.substring(0, community.indexOf('@')), null, community));
 | 
			
		||||
                    }
 | 
			
		||||
                    intent.putParcelableArrayListExtra(SelectedSubredditsAndUsersActivity.EXTRA_SELECTED_SUBREDDITS, communitiesList);
 | 
			
		||||
                } else {
 | 
			
		||||
                    intent.putParcelableArrayListExtra(SelectedSubredditsAndUsersActivity.EXTRA_SELECTED_SUBREDDITS, multiReddit.getSubreddits());
 | 
			
		||||
                }
 | 
			
		||||
                intent.putStringArrayListExtra(SelectedSubredditsAndUsersActivity.EXTRA_SELECTED_SUBREDDITS, multiReddit.getSubreddits());
 | 
			
		||||
            }
 | 
			
		||||
            startActivityForResult(intent, SUBREDDIT_SELECTION_REQUEST_CODE);
 | 
			
		||||
        });
 | 
			
		||||
@@ -200,34 +216,39 @@ public class EditMultiRedditActivity extends BaseActivity {
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (mAccessToken == null) {
 | 
			
		||||
                String name = nameEditText.getText().toString();
 | 
			
		||||
                multiReddit.setDisplayName(name);
 | 
			
		||||
                multiReddit.setName(name);
 | 
			
		||||
                multiReddit.setDescription(descriptionEditText.getText().toString());
 | 
			
		||||
                EditMultiReddit.anonymousEditMultiReddit(mExecutor, new Handler(), mRedditDataRoomDatabase,
 | 
			
		||||
                        multiReddit, new EditMultiReddit.EditMultiRedditListener() {
 | 
			
		||||
                            @Override
 | 
			
		||||
                            public void success() {
 | 
			
		||||
                                finish();
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
            String name = nameEditText.getText().toString();
 | 
			
		||||
            multiReddit.setDisplayName(name);
 | 
			
		||||
            multiReddit.setName(name);
 | 
			
		||||
            multiReddit.setDescription(descriptionEditText.getText().toString());
 | 
			
		||||
            StringBuilder pathStringBuilder = new StringBuilder();
 | 
			
		||||
            String prefix = "";
 | 
			
		||||
            for (SubredditWithSelection s : multiReddit.getSubreddits()) {
 | 
			
		||||
                pathStringBuilder.append(prefix);
 | 
			
		||||
                prefix = ",";
 | 
			
		||||
                pathStringBuilder.append(s.getQualifiedName());
 | 
			
		||||
                            @Override
 | 
			
		||||
                            public void failed() {
 | 
			
		||||
                                //Will not be called
 | 
			
		||||
                            }
 | 
			
		||||
                        });
 | 
			
		||||
            } else {
 | 
			
		||||
                String jsonModel = new MultiRedditJSONModel(nameEditText.getText().toString(), descriptionEditText.getText().toString(),
 | 
			
		||||
                        visibilitySwitch.isChecked(), multiReddit.getSubreddits()).createJSONModel();
 | 
			
		||||
                EditMultiReddit.editMultiReddit(mRetrofit, mAccessToken, multiReddit.getPath(),
 | 
			
		||||
                        jsonModel, new EditMultiReddit.EditMultiRedditListener() {
 | 
			
		||||
                            @Override
 | 
			
		||||
                            public void success() {
 | 
			
		||||
                                finish();
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            @Override
 | 
			
		||||
                            public void failed() {
 | 
			
		||||
                                Snackbar.make(coordinatorLayout, R.string.edit_multi_reddit_failed, Snackbar.LENGTH_SHORT).show();
 | 
			
		||||
                            }
 | 
			
		||||
                        });
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            multiReddit.setPath(pathStringBuilder.toString());
 | 
			
		||||
 | 
			
		||||
            EditMultiReddit.anonymousEditMultiReddit(mExecutor, new Handler(), mRedditDataRoomDatabase,
 | 
			
		||||
                    multiReddit, multipath, new EditMultiReddit.EditMultiRedditListener() {
 | 
			
		||||
                        @Override
 | 
			
		||||
                        public void success() {
 | 
			
		||||
                            finish();
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        @Override
 | 
			
		||||
                        public void failed() {
 | 
			
		||||
                            //Will not be called
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
@@ -238,7 +259,7 @@ public class EditMultiRedditActivity extends BaseActivity {
 | 
			
		||||
        super.onActivityResult(requestCode, resultCode, data);
 | 
			
		||||
        if (requestCode == SUBREDDIT_SELECTION_REQUEST_CODE && resultCode == RESULT_OK) {
 | 
			
		||||
            if (data != null) {
 | 
			
		||||
                multiReddit.setSubreddits(data.getParcelableArrayListExtra(
 | 
			
		||||
                multiReddit.setSubreddits(data.getStringArrayListExtra(
 | 
			
		||||
                        SelectedSubredditsAndUsersActivity.EXTRA_RETURN_SELECTED_SUBREDDITS));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -275,6 +296,7 @@ public class EditMultiRedditActivity extends BaseActivity {
 | 
			
		||||
        divider2.setBackgroundColor(dividerColor);
 | 
			
		||||
        descriptionEditText.setTextColor(primaryTextColor);
 | 
			
		||||
        descriptionEditText.setHintTextColor(secondaryTextColor);
 | 
			
		||||
        visibilityTextView.setTextColor(primaryTextColor);
 | 
			
		||||
        selectSubredditTextView.setTextColor(primaryTextColor);
 | 
			
		||||
 | 
			
		||||
        if (typeface != null) {
 | 
			
		||||
 
 | 
			
		||||
@@ -317,7 +317,7 @@ public class FilteredPostsActivity extends BaseActivity implements SortTypeSelec
 | 
			
		||||
            bundle.putInt(PostFragment.EXTRA_POST_TYPE, postType);
 | 
			
		||||
            bundle.putParcelable(PostFragment.EXTRA_FILTER, postFilter);
 | 
			
		||||
            bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
 | 
			
		||||
            bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountQualifiedName);
 | 
			
		||||
            bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountName);
 | 
			
		||||
            if (postType == PostPagingSource.TYPE_USER) {
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_USER_NAME, name);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_USER_WHERE, userWhere);
 | 
			
		||||
@@ -371,17 +371,20 @@ public class FilteredPostsActivity extends BaseActivity implements SortTypeSelec
 | 
			
		||||
        } else if (itemId == R.id.action_sort_filtered_thing_activity) {
 | 
			
		||||
            switch (postType) {
 | 
			
		||||
                case PostPagingSource.TYPE_FRONT_PAGE:
 | 
			
		||||
                case PostPagingSource.TYPE_SUBREDDIT:
 | 
			
		||||
                case PostPagingSource.TYPE_MULTI_REDDIT:
 | 
			
		||||
                case PostPagingSource.TYPE_ANONYMOUS_MULTIREDDIT:
 | 
			
		||||
                case PostPagingSource.TYPE_ANONYMOUS_FRONT_PAGE:
 | 
			
		||||
                    SortTypeBottomSheetFragment bestSortTypeBottomSheetFragment = SortTypeBottomSheetFragment.getNewInstance(postType, mFragment.getSortType());
 | 
			
		||||
                    SortTypeBottomSheetFragment bestSortTypeBottomSheetFragment = SortTypeBottomSheetFragment.getNewInstance(false, mFragment.getSortType());
 | 
			
		||||
                    bestSortTypeBottomSheetFragment.show(getSupportFragmentManager(), bestSortTypeBottomSheetFragment.getTag());
 | 
			
		||||
                    break;
 | 
			
		||||
                case PostPagingSource.TYPE_SEARCH:
 | 
			
		||||
                    SearchPostSortTypeBottomSheetFragment searchPostSortTypeBottomSheetFragment = SearchPostSortTypeBottomSheetFragment.getNewInstance(mFragment.getSortType());
 | 
			
		||||
                    searchPostSortTypeBottomSheetFragment.show(getSupportFragmentManager(), searchPostSortTypeBottomSheetFragment.getTag());
 | 
			
		||||
                    break;
 | 
			
		||||
                case PostPagingSource.TYPE_SUBREDDIT:
 | 
			
		||||
                case PostPagingSource.TYPE_MULTI_REDDIT:
 | 
			
		||||
                case PostPagingSource.TYPE_ANONYMOUS_MULTIREDDIT:
 | 
			
		||||
                case PostPagingSource.TYPE_ANONYMOUS_FRONT_PAGE:
 | 
			
		||||
                    SortTypeBottomSheetFragment sortTypeBottomSheetFragment = SortTypeBottomSheetFragment.getNewInstance(true, mFragment.getSortType());
 | 
			
		||||
                    sortTypeBottomSheetFragment.show(getSupportFragmentManager(), sortTypeBottomSheetFragment.getTag());
 | 
			
		||||
                    break;
 | 
			
		||||
                case PostPagingSource.TYPE_USER:
 | 
			
		||||
                    UserThingSortTypeBottomSheetFragment userThingSortTypeBottomSheetFragment = UserThingSortTypeBottomSheetFragment.getNewInstance(mFragment.getSortType());
 | 
			
		||||
                    userThingSortTypeBottomSheetFragment.show(getSupportFragmentManager(), userThingSortTypeBottomSheetFragment.getTag());
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,6 @@ import androidx.appcompat.widget.Toolbar;
 | 
			
		||||
import androidx.coordinatorlayout.widget.CoordinatorLayout;
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView;
 | 
			
		||||
 | 
			
		||||
import com.bumptech.glide.Glide;
 | 
			
		||||
import com.google.android.material.appbar.AppBarLayout;
 | 
			
		||||
import com.google.android.material.appbar.CollapsingToolbarLayout;
 | 
			
		||||
 | 
			
		||||
@@ -140,7 +139,7 @@ public class FullMarkdownActivity extends BaseActivity {
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        Markwon markwon = MarkdownUtils.createFullRedditMarkwon(this,
 | 
			
		||||
                miscPlugin, markdownColor, spoilerBackgroundColor, Glide.with(getApplication()), null, mSharedPreferences.getBoolean(SharedPreferencesUtils.DISABLE_IMAGE_PREVIEW, false));
 | 
			
		||||
                miscPlugin, markdownColor, spoilerBackgroundColor, null);
 | 
			
		||||
 | 
			
		||||
        MarkwonAdapter markwonAdapter = MarkdownUtils.createTablesAdapter();
 | 
			
		||||
        LinearLayoutManagerBugFixed linearLayoutManager = new SwipeLockLinearLayoutManager(this, new SwipeLockInterface() {
 | 
			
		||||
 
 | 
			
		||||
@@ -117,7 +117,7 @@ public class GiveAwardActivity extends BaseActivity {
 | 
			
		||||
            View layout = inflater.inflate(R.layout.dialog_give_award, null);
 | 
			
		||||
            MaterialSwitch materialSwitch = layout.findViewById(R.id.switch_material_give_award_dialog);
 | 
			
		||||
            new MaterialAlertDialogBuilder(this)
 | 
			
		||||
                    .setTitle("")
 | 
			
		||||
                    .setTitle(R.string.give_award_dialog_title)
 | 
			
		||||
                    .setView(layout)
 | 
			
		||||
                    .setPositiveButton(R.string.yes, (dialogInterface, i) -> {
 | 
			
		||||
                        boolean isAnonymous = materialSwitch.isChecked();
 | 
			
		||||
@@ -138,10 +138,10 @@ public class GiveAwardActivity extends BaseActivity {
 | 
			
		||||
                                    public void failed(int code, String message) {
 | 
			
		||||
                                        View layout = inflater.inflate(R.layout.copy_text_material_dialog, null);
 | 
			
		||||
                                        TextView textView = layout.findViewById(R.id.text_view_copy_text_material_dialog);
 | 
			
		||||
                                        String text = "";
 | 
			
		||||
                                        String text = getString(R.string.give_award_error_message, code, message == null ? "" : message);
 | 
			
		||||
                                        textView.setText(text);
 | 
			
		||||
                                        new MaterialAlertDialogBuilder(GiveAwardActivity.this, R.style.CopyTextMaterialAlertDialogTheme)
 | 
			
		||||
                                                .setTitle("")
 | 
			
		||||
                                                .setTitle(R.string.give_award_failed)
 | 
			
		||||
                                                .setView(layout)
 | 
			
		||||
                                                .setPositiveButton(R.string.copy_all, (dialogInterface, i) -> {
 | 
			
		||||
                                                    ClipboardManager clipboard = (ClipboardManager) GiveAwardActivity.this.getSystemService(Context.CLIPBOARD_SERVICE);
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,336 @@
 | 
			
		||||
package eu.toldi.infinityforlemmy.activities;
 | 
			
		||||
 | 
			
		||||
import android.content.SharedPreferences;
 | 
			
		||||
import android.os.Build;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.view.KeyEvent;
 | 
			
		||||
import android.view.Menu;
 | 
			
		||||
import android.view.MenuItem;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.view.Window;
 | 
			
		||||
import android.view.WindowManager;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.annotation.Nullable;
 | 
			
		||||
import androidx.appcompat.widget.Toolbar;
 | 
			
		||||
import androidx.coordinatorlayout.widget.CoordinatorLayout;
 | 
			
		||||
import androidx.fragment.app.Fragment;
 | 
			
		||||
import androidx.fragment.app.FragmentActivity;
 | 
			
		||||
import androidx.fragment.app.FragmentManager;
 | 
			
		||||
import androidx.viewpager2.adapter.FragmentStateAdapter;
 | 
			
		||||
import androidx.viewpager2.widget.ViewPager2;
 | 
			
		||||
 | 
			
		||||
import com.google.android.material.appbar.AppBarLayout;
 | 
			
		||||
import com.google.android.material.appbar.CollapsingToolbarLayout;
 | 
			
		||||
import com.google.android.material.tabs.TabLayout;
 | 
			
		||||
 | 
			
		||||
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.ActivityToolbarInterface;
 | 
			
		||||
import eu.toldi.infinityforlemmy.Infinity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.R;
 | 
			
		||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.PostLayoutBottomSheetFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.slidr.Slidr;
 | 
			
		||||
import eu.toldi.infinityforlemmy.events.ChangeNSFWEvent;
 | 
			
		||||
import eu.toldi.infinityforlemmy.events.SwitchAccountEvent;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.CommentsListingFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.HistoryPostFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.PostFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
 | 
			
		||||
 | 
			
		||||
public class HistoryActivity extends BaseActivity implements ActivityToolbarInterface,
 | 
			
		||||
        PostLayoutBottomSheetFragment.PostLayoutSelectionCallback {
 | 
			
		||||
 | 
			
		||||
    @BindView(R.id.coordinator_layout_history_activity)
 | 
			
		||||
    CoordinatorLayout coordinatorLayout;
 | 
			
		||||
    @BindView(R.id.appbar_layout_history_activity)
 | 
			
		||||
    AppBarLayout appBarLayout;
 | 
			
		||||
    @BindView(R.id.collapsing_toolbar_layout_history_activity)
 | 
			
		||||
    CollapsingToolbarLayout collapsingToolbarLayout;
 | 
			
		||||
    @BindView(R.id.toolbar_history_activity)
 | 
			
		||||
    Toolbar toolbar;
 | 
			
		||||
    @BindView(R.id.tab_layout_tab_layout_history_activity_activity)
 | 
			
		||||
    TabLayout tabLayout;
 | 
			
		||||
    @BindView(R.id.view_pager_history_activity)
 | 
			
		||||
    ViewPager2 viewPager2;
 | 
			
		||||
    @Inject
 | 
			
		||||
    @Named("default")
 | 
			
		||||
    SharedPreferences mSharedPreferences;
 | 
			
		||||
    @Inject
 | 
			
		||||
    @Named("post_layout")
 | 
			
		||||
    SharedPreferences mPostLayoutSharedPreferences;
 | 
			
		||||
    @Inject
 | 
			
		||||
    @Named("current_account")
 | 
			
		||||
    SharedPreferences mCurrentAccountSharedPreferences;
 | 
			
		||||
    @Inject
 | 
			
		||||
    CustomThemeWrapper mCustomThemeWrapper;
 | 
			
		||||
    private FragmentManager fragmentManager;
 | 
			
		||||
    private SectionsPagerAdapter sectionsPagerAdapter;
 | 
			
		||||
    private String mAccessToken;
 | 
			
		||||
    private String mAccountName;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onCreate(Bundle savedInstanceState) {
 | 
			
		||||
        ((Infinity) getApplication()).getAppComponent().inject(this);
 | 
			
		||||
 | 
			
		||||
        super.onCreate(savedInstanceState);
 | 
			
		||||
 | 
			
		||||
        setContentView(R.layout.activity_history);
 | 
			
		||||
 | 
			
		||||
        ButterKnife.bind(this);
 | 
			
		||||
 | 
			
		||||
        EventBus.getDefault().register(this);
 | 
			
		||||
 | 
			
		||||
        applyCustomTheme();
 | 
			
		||||
 | 
			
		||||
        if (mSharedPreferences.getBoolean(SharedPreferencesUtils.SWIPE_RIGHT_TO_GO_BACK, true)) {
 | 
			
		||||
            mSliderPanel = Slidr.attach(this);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //mViewPager2 = viewPager2;
 | 
			
		||||
 | 
			
		||||
        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);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        setSupportActionBar(toolbar);
 | 
			
		||||
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 | 
			
		||||
        setToolbarGoToTop(toolbar);
 | 
			
		||||
 | 
			
		||||
        fragmentManager = getSupportFragmentManager();
 | 
			
		||||
 | 
			
		||||
        mAccessToken = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN, null);
 | 
			
		||||
        mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_NAME, null);
 | 
			
		||||
 | 
			
		||||
        initializeViewPager();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onKeyDown(int keyCode, KeyEvent event) {
 | 
			
		||||
        if (sectionsPagerAdapter != null) {
 | 
			
		||||
            return sectionsPagerAdapter.handleKeyDown(keyCode) || super.onKeyDown(keyCode, event);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return super.onKeyDown(keyCode, event);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void initializeViewPager() {
 | 
			
		||||
        sectionsPagerAdapter = new SectionsPagerAdapter(this);
 | 
			
		||||
        tabLayout.setVisibility(View.GONE);
 | 
			
		||||
        viewPager2.setAdapter(sectionsPagerAdapter);
 | 
			
		||||
        viewPager2.setOffscreenPageLimit(2);
 | 
			
		||||
        //viewPager2.setUserInputEnabled(!mSharedPreferences.getBoolean(SharedPreferencesUtils.DISABLE_SWIPING_BETWEEN_TABS, false));
 | 
			
		||||
        viewPager2.setUserInputEnabled(false);
 | 
			
		||||
        /*new TabLayoutMediator(tabLayout, viewPager2, (tab, position) -> {
 | 
			
		||||
            switch (position) {
 | 
			
		||||
                case 0:
 | 
			
		||||
                    Utils.setTitleWithCustomFontToTab(typeface, tab, getString(R.string.posts));
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        }).attach();*/
 | 
			
		||||
 | 
			
		||||
        viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onPageSelected(int position) {
 | 
			
		||||
                if (position == 0) {
 | 
			
		||||
                    unlockSwipeRightToGoBack();
 | 
			
		||||
                } else {
 | 
			
		||||
                    lockSwipeRightToGoBack();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        fixViewPager2Sensitivity(viewPager2);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onCreateOptionsMenu(Menu menu) {
 | 
			
		||||
        getMenuInflater().inflate(R.menu.history_activity, menu);
 | 
			
		||||
        applyMenuItemTheme(menu);
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
 | 
			
		||||
        int itemId = item.getItemId();
 | 
			
		||||
        if (itemId == android.R.id.home) {
 | 
			
		||||
            finish();
 | 
			
		||||
            return true;
 | 
			
		||||
        } else if (itemId == R.id.action_refresh_history_activity) {
 | 
			
		||||
            sectionsPagerAdapter.refresh();
 | 
			
		||||
            return true;
 | 
			
		||||
        } else if (itemId == R.id.action_change_post_layout_history_activity) {
 | 
			
		||||
            PostLayoutBottomSheetFragment postLayoutBottomSheetFragment = new PostLayoutBottomSheetFragment();
 | 
			
		||||
            postLayoutBottomSheetFragment.show(getSupportFragmentManager(), postLayoutBottomSheetFragment.getTag());
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onDestroy() {
 | 
			
		||||
        super.onDestroy();
 | 
			
		||||
        EventBus.getDefault().unregister(this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Subscribe
 | 
			
		||||
    public void onAccountSwitchEvent(SwitchAccountEvent event) {
 | 
			
		||||
        finish();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Subscribe
 | 
			
		||||
    public void onChangeNSFWEvent(ChangeNSFWEvent changeNSFWEvent) {
 | 
			
		||||
        sectionsPagerAdapter.changeNSFW(changeNSFWEvent.nsfw);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @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();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void postLayoutSelected(int postLayout) {
 | 
			
		||||
        if (sectionsPagerAdapter != null) {
 | 
			
		||||
            mPostLayoutSharedPreferences.edit().putInt(SharedPreferencesUtils.HISTORY_POST_LAYOUT_READ_POST, postLayout).apply();
 | 
			
		||||
            sectionsPagerAdapter.changePostLayout(postLayout);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private class SectionsPagerAdapter extends FragmentStateAdapter {
 | 
			
		||||
 | 
			
		||||
        SectionsPagerAdapter(FragmentActivity fa) {
 | 
			
		||||
            super(fa);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @NonNull
 | 
			
		||||
        @Override
 | 
			
		||||
        public Fragment createFragment(int position) {
 | 
			
		||||
            if (position == 0) {
 | 
			
		||||
                HistoryPostFragment fragment = new HistoryPostFragment();
 | 
			
		||||
                Bundle bundle = new Bundle();
 | 
			
		||||
                bundle.putInt(HistoryPostFragment.EXTRA_HISTORY_TYPE, HistoryPostFragment.HISTORY_TYPE_READ_POSTS);
 | 
			
		||||
                bundle.putString(HistoryPostFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
 | 
			
		||||
                bundle.putString(HistoryPostFragment.EXTRA_ACCOUNT_NAME, mAccountName);
 | 
			
		||||
                fragment.setArguments(bundle);
 | 
			
		||||
                return fragment;
 | 
			
		||||
            } else {
 | 
			
		||||
                HistoryPostFragment fragment = new HistoryPostFragment();
 | 
			
		||||
                Bundle bundle = new Bundle();
 | 
			
		||||
                bundle.putInt(HistoryPostFragment.EXTRA_HISTORY_TYPE, HistoryPostFragment.HISTORY_TYPE_READ_POSTS);
 | 
			
		||||
                bundle.putString(HistoryPostFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
 | 
			
		||||
                bundle.putString(HistoryPostFragment.EXTRA_ACCOUNT_NAME, mAccountName);
 | 
			
		||||
                fragment.setArguments(bundle);
 | 
			
		||||
                return fragment;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Nullable
 | 
			
		||||
        private Fragment getCurrentFragment() {
 | 
			
		||||
            if (viewPager2 == null || fragmentManager == null) {
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
            return fragmentManager.findFragmentByTag("f" + viewPager2.getCurrentItem());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public boolean handleKeyDown(int keyCode) {
 | 
			
		||||
            if (viewPager2.getCurrentItem() == 0) {
 | 
			
		||||
                Fragment fragment = getCurrentFragment();
 | 
			
		||||
                if (fragment instanceof PostFragment) {
 | 
			
		||||
                    return ((PostFragment) fragment).handleKeyDown(keyCode);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void refresh() {
 | 
			
		||||
            Fragment fragment = getCurrentFragment();
 | 
			
		||||
            if (fragment instanceof PostFragment) {
 | 
			
		||||
                ((PostFragment) fragment).refresh();
 | 
			
		||||
            } else if (fragment instanceof CommentsListingFragment) {
 | 
			
		||||
                ((CommentsListingFragment) fragment).refresh();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void changeNSFW(boolean nsfw) {
 | 
			
		||||
            Fragment fragment = getCurrentFragment();
 | 
			
		||||
            if (fragment instanceof PostFragment) {
 | 
			
		||||
                ((PostFragment) fragment).changeNSFW(nsfw);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void changePostLayout(int postLayout) {
 | 
			
		||||
            Fragment fragment = getCurrentFragment();
 | 
			
		||||
            if (fragment instanceof HistoryPostFragment) {
 | 
			
		||||
                ((HistoryPostFragment) fragment).changePostLayout(postLayout);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        public void goBackToTop() {
 | 
			
		||||
            Fragment fragment = getCurrentFragment();
 | 
			
		||||
            if (fragment instanceof PostFragment) {
 | 
			
		||||
                ((PostFragment) fragment).goBackToTop();
 | 
			
		||||
            } else if (fragment instanceof CommentsListingFragment) {
 | 
			
		||||
                ((CommentsListingFragment) fragment).goBackToTop();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public int getItemCount() {
 | 
			
		||||
            return 1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -156,7 +156,7 @@ public class InboxActivity extends BaseActivity implements ActivityToolbarInterf
 | 
			
		||||
        fragmentManager = getSupportFragmentManager();
 | 
			
		||||
 | 
			
		||||
        mAccessToken = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN, null);
 | 
			
		||||
        mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_QUALIFIED_NAME, null);
 | 
			
		||||
        mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_NAME, null);
 | 
			
		||||
 | 
			
		||||
        if (savedInstanceState != null) {
 | 
			
		||||
            mNewAccountName = savedInstanceState.getString(NEW_ACCOUNT_NAME_STATE);
 | 
			
		||||
 
 | 
			
		||||
@@ -8,12 +8,10 @@ import android.net.Uri;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.text.Spanned;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
import android.view.Menu;
 | 
			
		||||
import android.view.MenuItem;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.widget.ImageView;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
import android.widget.Toast;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.annotation.Nullable;
 | 
			
		||||
@@ -23,10 +21,8 @@ import androidx.coordinatorlayout.widget.CoordinatorLayout;
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager;
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView;
 | 
			
		||||
 | 
			
		||||
import com.bumptech.glide.Glide;
 | 
			
		||||
import com.google.android.material.appbar.AppBarLayout;
 | 
			
		||||
import com.google.android.material.card.MaterialCardView;
 | 
			
		||||
import com.google.android.material.snackbar.Snackbar;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
@@ -36,22 +32,16 @@ import javax.inject.Named;
 | 
			
		||||
import eu.toldi.infinityforlemmy.Infinity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.R;
 | 
			
		||||
import eu.toldi.infinityforlemmy.RetrofitHolder;
 | 
			
		||||
import eu.toldi.infinityforlemmy.account.FetchBlockedThings;
 | 
			
		||||
import eu.toldi.infinityforlemmy.adapters.AdminRecyclerViewAdapter;
 | 
			
		||||
import eu.toldi.infinityforlemmy.blockedcommunity.BlockedCommunityData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.blockedinstances.BlockedInstanceData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.LinearLayoutManagerBugFixed;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.slidr.Slidr;
 | 
			
		||||
import eu.toldi.infinityforlemmy.databinding.ActivityInstanceInfoBinding;
 | 
			
		||||
import eu.toldi.infinityforlemmy.markdown.MarkdownUtils;
 | 
			
		||||
import eu.toldi.infinityforlemmy.site.BlockInstance;
 | 
			
		||||
import eu.toldi.infinityforlemmy.site.FetchSiteInfo;
 | 
			
		||||
import eu.toldi.infinityforlemmy.site.SiteInfo;
 | 
			
		||||
import eu.toldi.infinityforlemmy.site.SiteStatistics;
 | 
			
		||||
import eu.toldi.infinityforlemmy.user.BasicUserInfo;
 | 
			
		||||
import eu.toldi.infinityforlemmy.user.MyUserInfo;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
 | 
			
		||||
import io.noties.markwon.AbstractMarkwonPlugin;
 | 
			
		||||
import io.noties.markwon.Markwon;
 | 
			
		||||
@@ -59,13 +49,9 @@ import io.noties.markwon.MarkwonConfiguration;
 | 
			
		||||
import io.noties.markwon.MarkwonPlugin;
 | 
			
		||||
import io.noties.markwon.core.MarkwonTheme;
 | 
			
		||||
import io.noties.markwon.recycler.MarkwonAdapter;
 | 
			
		||||
import retrofit2.Retrofit;
 | 
			
		||||
 | 
			
		||||
public class InstanceInfoActivity extends BaseActivity {
 | 
			
		||||
 | 
			
		||||
    public static final String EXTRA_INSTANCE_DOMAIN = "instance_info_domain";
 | 
			
		||||
    public static final String EXTRA_INSTANCE_ID = "instance_info_id";
 | 
			
		||||
 | 
			
		||||
    @Inject
 | 
			
		||||
    @Named("default")
 | 
			
		||||
    SharedPreferences mSharedPreferences;
 | 
			
		||||
@@ -77,10 +63,6 @@ public class InstanceInfoActivity extends BaseActivity {
 | 
			
		||||
    @Named("no_oauth")
 | 
			
		||||
    RetrofitHolder mRetorifitHolder;
 | 
			
		||||
 | 
			
		||||
    @Inject
 | 
			
		||||
    @Named("current_account")
 | 
			
		||||
    SharedPreferences mCurrentAccountSharedPreferences;
 | 
			
		||||
 | 
			
		||||
    ActivityInstanceInfoBinding mInstanceInfoActivityViewBinding;
 | 
			
		||||
    private CoordinatorLayout coordinatorLayout;
 | 
			
		||||
    private Toolbar toolbar;
 | 
			
		||||
@@ -110,11 +92,6 @@ public class InstanceInfoActivity extends BaseActivity {
 | 
			
		||||
    private MarkwonAdapter mMarkwonAdapter;
 | 
			
		||||
    private Markwon mPostDetailMarkwon;
 | 
			
		||||
    private AdminRecyclerViewAdapter mAdminAdapter;
 | 
			
		||||
    private Retrofit mRetrofit;
 | 
			
		||||
    private String mInstanceDomain;
 | 
			
		||||
    private int mInstanceId;
 | 
			
		||||
    private String mAccessToken;
 | 
			
		||||
    private String mAccountName;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onCreate(@Nullable Bundle savedInstanceState) {
 | 
			
		||||
@@ -127,25 +104,6 @@ public class InstanceInfoActivity extends BaseActivity {
 | 
			
		||||
        setContentView(view);
 | 
			
		||||
        setSupportActionBar(mInstanceInfoActivityViewBinding.toolbarInstanceInfoActivity);
 | 
			
		||||
 | 
			
		||||
        if (savedInstanceState != null) {
 | 
			
		||||
            mInstanceDomain = savedInstanceState.getString(EXTRA_INSTANCE_DOMAIN);
 | 
			
		||||
            mInstanceId = savedInstanceState.getInt(EXTRA_INSTANCE_ID);
 | 
			
		||||
        } else {
 | 
			
		||||
            mInstanceDomain = getIntent().getStringExtra(EXTRA_INSTANCE_DOMAIN);
 | 
			
		||||
            mInstanceId = getIntent().getIntExtra(EXTRA_INSTANCE_ID, -1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (mInstanceDomain == null) {
 | 
			
		||||
            mRetrofit = mRetorifitHolder.getRetrofit();
 | 
			
		||||
        } else {
 | 
			
		||||
            String originalBaseUrl = mRetorifitHolder.getBaseURL();
 | 
			
		||||
            mRetorifitHolder.setBaseURL("https://" + mInstanceDomain);
 | 
			
		||||
            mRetrofit = mRetorifitHolder.getRetrofit();
 | 
			
		||||
            mRetorifitHolder.setBaseURL(originalBaseUrl);
 | 
			
		||||
        }
 | 
			
		||||
        mAccessToken = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN, null);
 | 
			
		||||
        mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_NAME, null);
 | 
			
		||||
 | 
			
		||||
        setUpBindings();
 | 
			
		||||
        applyCustomTheme();
 | 
			
		||||
 | 
			
		||||
@@ -191,7 +149,7 @@ public class InstanceInfoActivity extends BaseActivity {
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        mPostDetailMarkwon = MarkdownUtils.createFullRedditMarkwon(this,
 | 
			
		||||
                miscPlugin, markdownColor, postSpoilerBackgroundColor, Glide.with(getApplication()), null, mSharedPreferences.getBoolean(SharedPreferencesUtils.DISABLE_IMAGE_PREVIEW, false));
 | 
			
		||||
                miscPlugin, markdownColor, postSpoilerBackgroundColor, null);
 | 
			
		||||
        mMarkwonAdapter = MarkdownUtils.createTablesAdapter();
 | 
			
		||||
        mContentMarkdownView.setAdapter(mMarkwonAdapter);
 | 
			
		||||
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
 | 
			
		||||
@@ -210,9 +168,9 @@ public class InstanceInfoActivity extends BaseActivity {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void fetchInstanceInfo() {
 | 
			
		||||
        FetchSiteInfo.fetchSiteInfo(mRetrofit, null, new FetchSiteInfo.FetchSiteInfoListener() {
 | 
			
		||||
        FetchSiteInfo.fetchSiteInfo(mRetorifitHolder.getRetrofit(), null, new FetchSiteInfo.FetchSiteInfoListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onFetchSiteInfoSuccess(SiteInfo siteInfo, MyUserInfo myUserInfo) {
 | 
			
		||||
            public void onFetchSiteInfoSuccess(SiteInfo siteInfo) {
 | 
			
		||||
                mLoadingConstraintLayout.setVisibility(View.GONE);
 | 
			
		||||
                toolbar.setTitle(siteInfo.getName());
 | 
			
		||||
                if (siteInfo.getSidebar() != null) {
 | 
			
		||||
@@ -239,7 +197,7 @@ public class InstanceInfoActivity extends BaseActivity {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onFetchSiteInfoFailed(boolean parseFailed) {
 | 
			
		||||
            public void onFetchSiteInfoFailed() {
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
@@ -298,88 +256,11 @@ public class InstanceInfoActivity extends BaseActivity {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onSaveInstanceState(@NonNull Bundle outState) {
 | 
			
		||||
        super.onSaveInstanceState(outState);
 | 
			
		||||
        outState.putString(EXTRA_INSTANCE_DOMAIN, mInstanceDomain);
 | 
			
		||||
        outState.putInt(EXTRA_INSTANCE_ID, mInstanceId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
 | 
			
		||||
        super.onRestoreInstanceState(savedInstanceState);
 | 
			
		||||
        mInstanceDomain = savedInstanceState.getString(EXTRA_INSTANCE_DOMAIN);
 | 
			
		||||
        mInstanceId = savedInstanceState.getInt(EXTRA_INSTANCE_ID);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onCreateOptionsMenu(Menu menu) {
 | 
			
		||||
        getMenuInflater().inflate(R.menu.instance_info_activity, menu);
 | 
			
		||||
        if (mInstanceDomain == null || mInstanceDomain.equalsIgnoreCase(mRetorifitHolder.getBaseURL().split("/")[2])) {
 | 
			
		||||
            menu.findItem(R.id.action_block_instance_info).setVisible(false);
 | 
			
		||||
            menu.findItem(R.id.action_unblock_instance_info).setVisible(false);
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        if (mAccessToken == null) {
 | 
			
		||||
            menu.findItem(R.id.action_block_instance_info).setVisible(false);
 | 
			
		||||
            menu.findItem(R.id.action_unblock_instance_info).setVisible(false);
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        FetchBlockedThings.fetchBlockedThings(mRetorifitHolder.getRetrofit(), mAccessToken, mAccountName, new FetchBlockedThings.FetchBlockedThingsListener() {
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onFetchBlockedThingsSuccess(List<BlockedUserData> blockedUsers, List<BlockedCommunityData> blockedCommunities, List<BlockedInstanceData> blockedInstances) {
 | 
			
		||||
                for (BlockedInstanceData blockedInstanceData : blockedInstances) {
 | 
			
		||||
                    if (blockedInstanceData.getDomain().equals(mInstanceDomain)) {
 | 
			
		||||
                        menu.findItem(R.id.action_block_instance_info).setVisible(false);
 | 
			
		||||
                        menu.findItem(R.id.action_unblock_instance_info).setVisible(true);
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                menu.findItem(R.id.action_block_instance_info).setVisible(true);
 | 
			
		||||
                menu.findItem(R.id.action_unblock_instance_info).setVisible(false);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onFetchBlockedThingsFailure() {
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
 | 
			
		||||
    public boolean onOptionsItemSelected(MenuItem item) {
 | 
			
		||||
        if (item.getItemId() == android.R.id.home) {
 | 
			
		||||
            finish();
 | 
			
		||||
            return true;
 | 
			
		||||
        } else if (item.getItemId() == R.id.action_block_instance_info) {
 | 
			
		||||
            blockInstance(true);
 | 
			
		||||
            return true;
 | 
			
		||||
        } else if (item.getItemId() == R.id.action_unblock_instance_info) {
 | 
			
		||||
            blockInstance(false);
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        return super.onOptionsItemSelected(item);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void blockInstance(boolean blocked) {
 | 
			
		||||
        BlockInstance.INSTANCE.blockInstance(mRetorifitHolder.getRetrofit(), mInstanceId, blocked, new BlockInstance.BlockInstanceResponse() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onResponse() {
 | 
			
		||||
                if (blocked) {
 | 
			
		||||
                    applySnackBarTheme(Snackbar.make(coordinatorLayout, R.string.block_instance_success, Snackbar.LENGTH_SHORT)).show();
 | 
			
		||||
                } else {
 | 
			
		||||
                    applySnackBarTheme(Snackbar.make(coordinatorLayout, R.string.unblock_instance_success, Snackbar.LENGTH_SHORT)).show();
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                InstanceInfoActivity.this.invalidateOptionsMenu();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onFailure() {
 | 
			
		||||
                Toast.makeText(InstanceInfoActivity.this, R.string.block_instance_failed, Toast.LENGTH_SHORT).show();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,6 @@ import androidx.browser.customtabs.CustomTabsIntent;
 | 
			
		||||
import androidx.browser.customtabs.CustomTabsService;
 | 
			
		||||
 | 
			
		||||
import org.apache.commons.io.FilenameUtils;
 | 
			
		||||
import org.greenrobot.eventbus.EventBus;
 | 
			
		||||
 | 
			
		||||
import java.net.MalformedURLException;
 | 
			
		||||
import java.net.URL;
 | 
			
		||||
@@ -30,13 +29,10 @@ import javax.inject.Named;
 | 
			
		||||
 | 
			
		||||
import eu.toldi.infinityforlemmy.Infinity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.R;
 | 
			
		||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
 | 
			
		||||
import eu.toldi.infinityforlemmy.RetrofitHolder;
 | 
			
		||||
import eu.toldi.infinityforlemmy.asynctasks.SwitchAccount;
 | 
			
		||||
import eu.toldi.infinityforlemmy.comment.Comment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.comment.FetchComment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.events.SwitchAccountEvent;
 | 
			
		||||
import eu.toldi.infinityforlemmy.post.FetchPost;
 | 
			
		||||
import eu.toldi.infinityforlemmy.post.ObjectResolver;
 | 
			
		||||
import eu.toldi.infinityforlemmy.post.Post;
 | 
			
		||||
@@ -59,6 +55,7 @@ public class LinkResolverActivity extends AppCompatActivity {
 | 
			
		||||
    private static final String MULTIREDDIT_PATTERN = "/user/[\\w-]+/m/\\w+/?";
 | 
			
		||||
    private static final String MULTIREDDIT_PATTERN_2 = "/[rR]/(\\w+\\+?)+/?";
 | 
			
		||||
    private static final String REDD_IT_POST_PATTERN = "/\\w+/?";
 | 
			
		||||
    private static final String GFYCAT_PATTERN = "(/i?fr)?/[\\w-]+$";
 | 
			
		||||
    private static final String REDGIFS_PATTERN = "/watch/[\\w-]+$";
 | 
			
		||||
    private static final String IMGUR_GALLERY_PATTERN = "/gallery/\\w+/?";
 | 
			
		||||
    private static final String IMGUR_ALBUM_PATTERN = "/(album|a)/\\w+/?";
 | 
			
		||||
@@ -73,9 +70,6 @@ public class LinkResolverActivity extends AppCompatActivity {
 | 
			
		||||
    @Inject
 | 
			
		||||
    CustomThemeWrapper mCustomThemeWrapper;
 | 
			
		||||
 | 
			
		||||
    @Inject
 | 
			
		||||
    RedditDataRoomDatabase mRedditDataRoomDatabase;
 | 
			
		||||
 | 
			
		||||
    @Inject
 | 
			
		||||
    ObjectResolver mObjectResolver;
 | 
			
		||||
 | 
			
		||||
@@ -94,7 +88,6 @@ public class LinkResolverActivity extends AppCompatActivity {
 | 
			
		||||
    PostEnricher postEnricher;
 | 
			
		||||
 | 
			
		||||
    private String mAccessToken;
 | 
			
		||||
    private String mAccountQualifedName;
 | 
			
		||||
 | 
			
		||||
    private Uri getRedditUriByPath(String path) {
 | 
			
		||||
        if (path.charAt(0) != '/') {
 | 
			
		||||
@@ -110,7 +103,6 @@ public class LinkResolverActivity extends AppCompatActivity {
 | 
			
		||||
 | 
			
		||||
        ((Infinity) getApplication()).getAppComponent().inject(this);
 | 
			
		||||
        mAccessToken = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN, null);
 | 
			
		||||
        mAccountQualifedName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_QUALIFIED_NAME,null);
 | 
			
		||||
        if (mAccessToken != null) {
 | 
			
		||||
            String instance = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_INSTANCE, null);
 | 
			
		||||
            mRetrofit.setBaseURL(instance);
 | 
			
		||||
@@ -224,17 +216,52 @@ public class LinkResolverActivity extends AppCompatActivity {
 | 
			
		||||
                                intent.putExtra(ViewPostDetailActivity.EXTRA_NEW_ACCOUNT_NAME, newAccountName);
 | 
			
		||||
                                startActivity(intent);
 | 
			
		||||
                            } else {
 | 
			
		||||
                                if (mAccountQualifedName == null || newAccountName != null && !mAccountQualifedName.equals(newAccountName)) {
 | 
			
		||||
                                    SwitchAccount.switchAccount(mRedditDataRoomDatabase, mRetrofit, mCurrentAccountSharedPreferences,
 | 
			
		||||
                                            mExecutor, new Handler(), newAccountName, newAccount -> {
 | 
			
		||||
                                                EventBus.getDefault().post(new SwitchAccountEvent(getClass().getName()));
 | 
			
		||||
                                                Toast.makeText(this, R.string.account_switched, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                                openPost(uri, segments, messageFullname);
 | 
			
		||||
                                            });
 | 
			
		||||
                                } else {
 | 
			
		||||
                                    openPost(uri, segments, messageFullname);
 | 
			
		||||
                                }
 | 
			
		||||
                                boolean local = false;
 | 
			
		||||
                                try {
 | 
			
		||||
                                    URL baseURL = new URL(mRetrofit.getBaseURL());
 | 
			
		||||
                                    if (baseURL.getHost().equalsIgnoreCase(uri.getHost())) {
 | 
			
		||||
                                        local = true;
 | 
			
		||||
                                        FetchPost.fetchPost(mExecutor, new Handler(), mRetrofit.getRetrofit(), segments.get(segments.size() - 1), mAccessToken, postEnricher, new FetchPost.FetchPostListener() {
 | 
			
		||||
                                            @Override
 | 
			
		||||
                                            public void fetchPostSuccess(Post post) {
 | 
			
		||||
 | 
			
		||||
                                                Intent intent = new Intent(LinkResolverActivity.this, ViewPostDetailActivity.class);
 | 
			
		||||
                                                intent.putExtra(ViewPostDetailActivity.EXTRA_POST_ID, post.getId());
 | 
			
		||||
                                                intent.putExtra(ViewPostDetailActivity.EXTRA_MESSAGE_FULLNAME, messageFullname);
 | 
			
		||||
                                                intent.putExtra(ViewPostDetailActivity.EXTRA_NEW_ACCOUNT_NAME, newAccountName);
 | 
			
		||||
                                                startActivity(intent);
 | 
			
		||||
                                            }
 | 
			
		||||
 | 
			
		||||
                                            @Override
 | 
			
		||||
                                            public void fetchPostFailed() {
 | 
			
		||||
                                                Toast.makeText(getApplicationContext(), R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                                finish();
 | 
			
		||||
                                            }
 | 
			
		||||
                                        });
 | 
			
		||||
                                    }
 | 
			
		||||
                                } catch (MalformedURLException e) {
 | 
			
		||||
                                    Toast.makeText(getApplicationContext(), R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                    finish();
 | 
			
		||||
                                }
 | 
			
		||||
                                if (!local) {
 | 
			
		||||
                                    mObjectResolver.resolvePost(uri.toString(), mAccessToken, new ObjectResolver.ObjectResolverListener() {
 | 
			
		||||
                                        @Override
 | 
			
		||||
                                        public void onResolveObjectSuccess(Object p) {
 | 
			
		||||
                                            Post post = (Post) p;
 | 
			
		||||
                                            Intent intent = new Intent(LinkResolverActivity.this, ViewPostDetailActivity.class);
 | 
			
		||||
                                            intent.putExtra(ViewPostDetailActivity.EXTRA_POST_ID, post.getId());
 | 
			
		||||
                                            intent.putExtra(ViewPostDetailActivity.EXTRA_MESSAGE_FULLNAME, messageFullname);
 | 
			
		||||
                                            intent.putExtra(ViewPostDetailActivity.EXTRA_NEW_ACCOUNT_NAME, newAccountName);
 | 
			
		||||
                                            startActivity(intent);
 | 
			
		||||
                                        }
 | 
			
		||||
 | 
			
		||||
                                        @Override
 | 
			
		||||
                                        public void onResolveObjectFailed() {
 | 
			
		||||
                                            Toast.makeText(getApplicationContext(), R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                            finish();
 | 
			
		||||
                                        }
 | 
			
		||||
                                    });
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        } else if (uri.toString().matches(COMMENT_PATTERN)) {
 | 
			
		||||
                            if (mAccessToken == null) {
 | 
			
		||||
@@ -259,31 +286,138 @@ public class LinkResolverActivity extends AppCompatActivity {
 | 
			
		||||
                                    }
 | 
			
		||||
                                });
 | 
			
		||||
                            } else {
 | 
			
		||||
                                if (mAccountQualifedName == null || newAccountName != null && !mAccountQualifedName.equals(newAccountName)) {
 | 
			
		||||
                                    SwitchAccount.switchAccount(mRedditDataRoomDatabase, mRetrofit, mCurrentAccountSharedPreferences,
 | 
			
		||||
                                            mExecutor, new Handler(), newAccountName, newAccount -> {
 | 
			
		||||
                                                EventBus.getDefault().post(new SwitchAccountEvent(getClass().getName()));
 | 
			
		||||
                                                Toast.makeText(this, R.string.account_switched, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                                openComment(uri, segments, messageFullname);
 | 
			
		||||
                                            });
 | 
			
		||||
                                } else {
 | 
			
		||||
                                    openComment(uri, segments, messageFullname);
 | 
			
		||||
                                }
 | 
			
		||||
                                boolean local = false;
 | 
			
		||||
                                try {
 | 
			
		||||
                                    URL baseURL = new URL(mRetrofit.getBaseURL());
 | 
			
		||||
                                    if (baseURL.getHost().equalsIgnoreCase(uri.getHost())) {
 | 
			
		||||
                                        local = true;
 | 
			
		||||
                                        FetchComment.fetchSingleComment(mRetrofit.getRetrofit(), mAccessToken, Integer.parseInt(segments.get(segments.size() - 1)), new FetchComment.FetchCommentListener() {
 | 
			
		||||
                                            @Override
 | 
			
		||||
                                            public void onFetchCommentSuccess(ArrayList<Comment> comments, Integer parentId, ArrayList<Integer> moreChildrenIds) {
 | 
			
		||||
                                                Intent intent = new Intent(LinkResolverActivity.this, ViewPostDetailActivity.class);
 | 
			
		||||
                                                Comment comment = comments.get(0);
 | 
			
		||||
                                                intent.putExtra(ViewPostDetailActivity.EXTRA_POST_ID, comment.getPostId());
 | 
			
		||||
                                                intent.putExtra(ViewPostDetailActivity.EXTRA_MESSAGE_FULLNAME, messageFullname);
 | 
			
		||||
                                                intent.putExtra(ViewPostDetailActivity.EXTRA_NEW_ACCOUNT_NAME, newAccountName);
 | 
			
		||||
                                                intent.putExtra(ViewPostDetailActivity.EXTRA_SINGLE_COMMENT_ID, comment.getId());
 | 
			
		||||
                                                intent.putExtra(ViewPostDetailActivity.EXTRA_SINGLE_COMMENT_PARENT_ID, comment.getParentId());
 | 
			
		||||
                                                startActivity(intent);
 | 
			
		||||
                                            }
 | 
			
		||||
 | 
			
		||||
                                            @Override
 | 
			
		||||
                                            public void onFetchCommentFailed() {
 | 
			
		||||
                                                Toast.makeText(getApplicationContext(), R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                                finish();
 | 
			
		||||
                                            }
 | 
			
		||||
                                        });
 | 
			
		||||
                                    }
 | 
			
		||||
                                } catch (MalformedURLException e) {
 | 
			
		||||
                                    Toast.makeText(getApplicationContext(), R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                    finish();
 | 
			
		||||
                                }
 | 
			
		||||
                                if (!local) {
 | 
			
		||||
                                    mObjectResolver.resolveComment(uri.toString(), mAccessToken, new ObjectResolver.ObjectResolverListener() {
 | 
			
		||||
                                        @Override
 | 
			
		||||
                                        public void onResolveObjectSuccess(Object c) {
 | 
			
		||||
                                            Comment comment = (Comment) c;
 | 
			
		||||
                                            Intent intent = new Intent(LinkResolverActivity.this, ViewPostDetailActivity.class);
 | 
			
		||||
                                            intent.putExtra(ViewPostDetailActivity.EXTRA_POST_ID, comment.getPostId());
 | 
			
		||||
                                            intent.putExtra(ViewPostDetailActivity.EXTRA_MESSAGE_FULLNAME, messageFullname);
 | 
			
		||||
                                            intent.putExtra(ViewPostDetailActivity.EXTRA_NEW_ACCOUNT_NAME, newAccountName);
 | 
			
		||||
                                            intent.putExtra(ViewPostDetailActivity.EXTRA_SINGLE_COMMENT_ID, comment.getId());
 | 
			
		||||
                                            intent.putExtra(ViewPostDetailActivity.EXTRA_SINGLE_COMMENT_PARENT_ID, comment.getParentId());
 | 
			
		||||
                                            startActivity(intent);
 | 
			
		||||
                                        }
 | 
			
		||||
 | 
			
		||||
                                        @Override
 | 
			
		||||
                                        public void onResolveObjectFailed() {
 | 
			
		||||
                                            Toast.makeText(getApplicationContext(), R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                            finish();
 | 
			
		||||
                                        }
 | 
			
		||||
                                    });
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        } else if (authority.equals("v.redd.it")) {
 | 
			
		||||
                            Intent intent = new Intent(this, ViewVideoActivity.class);
 | 
			
		||||
                            intent.putExtra(ViewVideoActivity.EXTRA_VIDEO_TYPE, ViewVideoActivity.VIDEO_TYPE_V_REDD_IT);
 | 
			
		||||
                            intent.putExtra(ViewVideoActivity.EXTRA_V_REDD_IT_URL, uri.toString());
 | 
			
		||||
                            startActivity(intent);
 | 
			
		||||
                        } else if (authority.contains("reddit.com") || authority.contains("redd.it") || authority.contains("reddit.app")) {
 | 
			
		||||
                            if (authority.equals("reddit.app.link") && path.isEmpty()) {
 | 
			
		||||
                                String redirect = uri.getQueryParameter("$og_redirect");
 | 
			
		||||
                                if (redirect != null) {
 | 
			
		||||
                                    handleUri(Uri.parse(redirect));
 | 
			
		||||
                                } else {
 | 
			
		||||
                                    deepLinkError(uri);
 | 
			
		||||
                                }
 | 
			
		||||
                            } else if (path.isEmpty()) {
 | 
			
		||||
                                Intent intent = new Intent(this, MainActivity.class);
 | 
			
		||||
                                startActivity(intent);
 | 
			
		||||
                            } else if (path.equals("/report")) {
 | 
			
		||||
                                openInWebView(uri);
 | 
			
		||||
                            } else if (path.matches(POST_PATTERN_3)) {
 | 
			
		||||
                                Intent intent = new Intent(this, ViewPostDetailActivity.class);
 | 
			
		||||
                                intent.putExtra(ViewPostDetailActivity.EXTRA_POST_ID, path.substring(1));
 | 
			
		||||
                                intent.putExtra(ViewPostDetailActivity.EXTRA_MESSAGE_FULLNAME, messageFullname);
 | 
			
		||||
                                intent.putExtra(ViewPostDetailActivity.EXTRA_NEW_ACCOUNT_NAME, newAccountName);
 | 
			
		||||
                                startActivity(intent);
 | 
			
		||||
                            } else if (path.matches(WIKI_PATTERN)) {
 | 
			
		||||
                                String[] pathSegments = path.split("/");
 | 
			
		||||
                                String wikiPage;
 | 
			
		||||
                                if (pathSegments.length == 4) {
 | 
			
		||||
                                    wikiPage = "index";
 | 
			
		||||
                                } else {
 | 
			
		||||
                                    int lengthThroughWiki = 0;
 | 
			
		||||
                                    for (int i = 1; i <= 3; ++i) {
 | 
			
		||||
                                        lengthThroughWiki += pathSegments[i].length() + 1;
 | 
			
		||||
                                    }
 | 
			
		||||
                                    wikiPage = path.substring(lengthThroughWiki);
 | 
			
		||||
                                }
 | 
			
		||||
                                Intent intent = new Intent(this, WikiActivity.class);
 | 
			
		||||
                                intent.putExtra(WikiActivity.EXTRA_SUBREDDIT_NAME, segments.get(1));
 | 
			
		||||
                                intent.putExtra(WikiActivity.EXTRA_WIKI_PATH, wikiPage);
 | 
			
		||||
                                startActivity(intent);
 | 
			
		||||
                            } else if (path.matches(SIDEBAR_PATTERN)) {
 | 
			
		||||
                                Intent intent = new Intent(this, ViewSubredditDetailActivity.class);
 | 
			
		||||
                                intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, path.substring(3, path.length() - 14));
 | 
			
		||||
                                intent.putExtra(ViewSubredditDetailActivity.EXTRA_VIEW_SIDEBAR, true);
 | 
			
		||||
                                startActivity(intent);
 | 
			
		||||
                            } else if (path.matches(MULTIREDDIT_PATTERN)) {
 | 
			
		||||
                                Intent intent = new Intent(this, ViewMultiRedditDetailActivity.class);
 | 
			
		||||
                                intent.putExtra(ViewMultiRedditDetailActivity.EXTRA_MULTIREDDIT_PATH, path);
 | 
			
		||||
                                startActivity(intent);
 | 
			
		||||
                            } else if (path.matches(MULTIREDDIT_PATTERN_2)) {
 | 
			
		||||
                                String subredditName = path.substring(3);
 | 
			
		||||
                                Intent intent = new Intent(this, ViewSubredditDetailActivity.class);
 | 
			
		||||
                                intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, subredditName);
 | 
			
		||||
                                intent.putExtra(ViewSubredditDetailActivity.EXTRA_MESSAGE_FULLNAME, messageFullname);
 | 
			
		||||
                                intent.putExtra(ViewSubredditDetailActivity.EXTRA_NEW_ACCOUNT_NAME, newAccountName);
 | 
			
		||||
                                startActivity(intent);
 | 
			
		||||
                            } else if (authority.equals("redd.it") && path.matches(REDD_IT_POST_PATTERN)) {
 | 
			
		||||
                                Intent intent = new Intent(this, ViewPostDetailActivity.class);
 | 
			
		||||
                                intent.putExtra(ViewPostDetailActivity.EXTRA_POST_ID, path.substring(1));
 | 
			
		||||
                                startActivity(intent);
 | 
			
		||||
                            } else {
 | 
			
		||||
                                deepLinkError(uri);
 | 
			
		||||
                            }
 | 
			
		||||
                        } else if (authority.equals("click.redditmail.com")) {
 | 
			
		||||
                            if (path.startsWith("/CL0/")) {
 | 
			
		||||
                                handleUri(Uri.parse(path.substring("/CL0/".length())));
 | 
			
		||||
                            }
 | 
			
		||||
                        } else if (authority.contains("gfycat.com")) {
 | 
			
		||||
                            if (path.matches(GFYCAT_PATTERN)) {
 | 
			
		||||
                                Intent intent = new Intent(this, ViewVideoActivity.class);
 | 
			
		||||
                                intent.putExtra(ViewVideoActivity.EXTRA_GFYCAT_ID, path.substring(path.lastIndexOf("/") + 1));
 | 
			
		||||
                                intent.putExtra(ViewVideoActivity.EXTRA_VIDEO_TYPE, ViewVideoActivity.VIDEO_TYPE_GFYCAT);
 | 
			
		||||
                                intent.putExtra(ViewVideoActivity.EXTRA_IS_NSFW, getIntent().getBooleanExtra(EXTRA_IS_NSFW, false));
 | 
			
		||||
                                startActivity(intent);
 | 
			
		||||
                            } else {
 | 
			
		||||
                                deepLinkError(uri);
 | 
			
		||||
                            }
 | 
			
		||||
                        } else if (authority.contains("redgifs.com")) {
 | 
			
		||||
                            if (path.matches(REDGIFS_PATTERN)) {
 | 
			
		||||
                                Intent intent = new Intent(this, ViewVideoActivity.class);
 | 
			
		||||
                                intent.putExtra(ViewVideoActivity.EXTRA_REDGIFS_ID, path.substring(path.lastIndexOf("/") + 1));
 | 
			
		||||
                                intent.putExtra(ViewVideoActivity.EXTRA_GFYCAT_ID, path.substring(path.lastIndexOf("/") + 1));
 | 
			
		||||
                                intent.putExtra(ViewVideoActivity.EXTRA_VIDEO_TYPE, ViewVideoActivity.VIDEO_TYPE_REDGIFS);
 | 
			
		||||
                                intent.putExtra(ViewVideoActivity.EXTRA_IS_NSFW, true);
 | 
			
		||||
                                startActivity(intent);
 | 
			
		||||
@@ -349,110 +483,12 @@ public class LinkResolverActivity extends AppCompatActivity {
 | 
			
		||||
        finish();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void openComment(Uri uri, List<String> segments, String messageFullname) {
 | 
			
		||||
        boolean local = false;
 | 
			
		||||
        try {
 | 
			
		||||
            URL baseURL = new URL(mRetrofit.getBaseURL());
 | 
			
		||||
            if (baseURL.getHost().equalsIgnoreCase(uri.getHost())) {
 | 
			
		||||
                local = true;
 | 
			
		||||
                FetchComment.fetchSingleComment(mRetrofit.getRetrofit(), mAccessToken, Integer.parseInt(segments.get(segments.size() - 1)), new FetchComment.FetchCommentListener() {
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void onFetchCommentSuccess(ArrayList<Comment> comments, Integer parentId, ArrayList<Integer> moreChildrenIds) {
 | 
			
		||||
                        Intent intent = new Intent(LinkResolverActivity.this, ViewPostDetailActivity.class);
 | 
			
		||||
                        Comment comment = comments.get(0);
 | 
			
		||||
                        intent.putExtra(ViewPostDetailActivity.EXTRA_POST_ID, comment.getPostId());
 | 
			
		||||
                        intent.putExtra(ViewPostDetailActivity.EXTRA_MESSAGE_FULLNAME, messageFullname);
 | 
			
		||||
                        intent.putExtra(ViewPostDetailActivity.EXTRA_SINGLE_COMMENT_ID, comment.getId());
 | 
			
		||||
                        intent.putExtra(ViewPostDetailActivity.EXTRA_SINGLE_COMMENT_PARENT_ID, comment.getParentId());
 | 
			
		||||
                        startActivity(intent);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void onFetchCommentFailed() {
 | 
			
		||||
                        Toast.makeText(getApplicationContext(), R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                        finish();
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        } catch (MalformedURLException e) {
 | 
			
		||||
            Toast.makeText(getApplicationContext(), R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
 | 
			
		||||
            finish();
 | 
			
		||||
        }
 | 
			
		||||
        if (!local) {
 | 
			
		||||
            mObjectResolver.resolveComment(uri.toString(), mAccessToken, new ObjectResolver.ObjectResolverListener() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onResolveObjectSuccess(Object c) {
 | 
			
		||||
                    Comment comment = (Comment) c;
 | 
			
		||||
                    Intent intent = new Intent(LinkResolverActivity.this, ViewPostDetailActivity.class);
 | 
			
		||||
                    intent.putExtra(ViewPostDetailActivity.EXTRA_POST_ID, comment.getPostId());
 | 
			
		||||
                    intent.putExtra(ViewPostDetailActivity.EXTRA_MESSAGE_FULLNAME, messageFullname);
 | 
			
		||||
                    intent.putExtra(ViewPostDetailActivity.EXTRA_SINGLE_COMMENT_ID, comment.getId());
 | 
			
		||||
                    intent.putExtra(ViewPostDetailActivity.EXTRA_SINGLE_COMMENT_PARENT_ID, comment.getParentId());
 | 
			
		||||
                    startActivity(intent);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onResolveObjectFailed() {
 | 
			
		||||
                    Toast.makeText(getApplicationContext(), R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                    finish();
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void openPost(Uri uri, List<String> segments, String messageFullname) {
 | 
			
		||||
        boolean local = false;
 | 
			
		||||
        try {
 | 
			
		||||
            URL baseURL = new URL(mRetrofit.getBaseURL());
 | 
			
		||||
            if (baseURL.getHost().equalsIgnoreCase(uri.getHost())) {
 | 
			
		||||
                local = true;
 | 
			
		||||
                FetchPost.fetchPost(mExecutor, new Handler(), mRetrofit.getRetrofit(), segments.get(segments.size() - 1), mAccessToken, postEnricher, new FetchPost.FetchPostListener() {
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void fetchPostSuccess(Post post) {
 | 
			
		||||
 | 
			
		||||
                        Intent intent = new Intent(LinkResolverActivity.this, ViewPostDetailActivity.class);
 | 
			
		||||
                        intent.putExtra(ViewPostDetailActivity.EXTRA_POST_ID, post.getId());
 | 
			
		||||
                        intent.putExtra(ViewPostDetailActivity.EXTRA_MESSAGE_FULLNAME, messageFullname);
 | 
			
		||||
                        startActivity(intent);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void fetchPostFailed() {
 | 
			
		||||
                        Toast.makeText(getApplicationContext(), R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                        finish();
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        } catch (MalformedURLException e) {
 | 
			
		||||
            Toast.makeText(getApplicationContext(), R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
 | 
			
		||||
            finish();
 | 
			
		||||
        }
 | 
			
		||||
        if (!local) {
 | 
			
		||||
            mObjectResolver.resolvePost(uri.toString(), mAccessToken, new ObjectResolver.ObjectResolverListener() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onResolveObjectSuccess(Object p) {
 | 
			
		||||
                    Post post = (Post) p;
 | 
			
		||||
                    Intent intent = new Intent(LinkResolverActivity.this, ViewPostDetailActivity.class);
 | 
			
		||||
                    intent.putExtra(ViewPostDetailActivity.EXTRA_POST_ID, post.getId());
 | 
			
		||||
                    intent.putExtra(ViewPostDetailActivity.EXTRA_MESSAGE_FULLNAME, messageFullname);
 | 
			
		||||
                    startActivity(intent);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onResolveObjectFailed() {
 | 
			
		||||
                    Toast.makeText(getApplicationContext(), R.string.could_not_resolve_link, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                    finish();
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void deepLinkError(Uri uri) {
 | 
			
		||||
        PackageManager pm = getPackageManager();
 | 
			
		||||
 | 
			
		||||
        String authority = uri.getAuthority();
 | 
			
		||||
        if(authority != null && (authority.contains("reddit.com") || authority.contains("redd.it") || authority.contains("reddit.app.link"))) {
 | 
			
		||||
            openInBrowser(uri, pm, false);
 | 
			
		||||
            openInCustomTabs(uri, pm, false);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -10,14 +10,12 @@ import android.text.Editable;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
import android.view.InflateException;
 | 
			
		||||
import android.view.MenuItem;
 | 
			
		||||
import android.widget.ArrayAdapter;
 | 
			
		||||
import android.widget.Button;
 | 
			
		||||
import android.widget.ProgressBar;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
import android.widget.Toast;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.appcompat.widget.AppCompatAutoCompleteTextView;
 | 
			
		||||
import androidx.appcompat.widget.Toolbar;
 | 
			
		||||
import androidx.coordinatorlayout.widget.CoordinatorLayout;
 | 
			
		||||
 | 
			
		||||
@@ -30,8 +28,6 @@ import org.json.JSONObject;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.net.MalformedURLException;
 | 
			
		||||
import java.net.URL;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.concurrent.Executor;
 | 
			
		||||
 | 
			
		||||
import javax.inject.Inject;
 | 
			
		||||
@@ -39,22 +35,18 @@ import javax.inject.Named;
 | 
			
		||||
 | 
			
		||||
import butterknife.BindView;
 | 
			
		||||
import butterknife.ButterKnife;
 | 
			
		||||
import eu.toldi.infinityforlemmy.FetchMyInfo;
 | 
			
		||||
import eu.toldi.infinityforlemmy.Infinity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.R;
 | 
			
		||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
 | 
			
		||||
import eu.toldi.infinityforlemmy.RetrofitHolder;
 | 
			
		||||
import eu.toldi.infinityforlemmy.adapters.CustomArrayAdapter;
 | 
			
		||||
import eu.toldi.infinityforlemmy.apis.LemmyAPI;
 | 
			
		||||
import eu.toldi.infinityforlemmy.asynctasks.ParseAndInsertNewAccount;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.slidr.Slidr;
 | 
			
		||||
import eu.toldi.infinityforlemmy.dto.AccountLoginDTO;
 | 
			
		||||
import eu.toldi.infinityforlemmy.lemmyverse.FetchInstancesListener;
 | 
			
		||||
import eu.toldi.infinityforlemmy.lemmyverse.LemmyInstance;
 | 
			
		||||
import eu.toldi.infinityforlemmy.lemmyverse.LemmyVerseFetchInstances;
 | 
			
		||||
import eu.toldi.infinityforlemmy.site.FetchSiteInfo;
 | 
			
		||||
import eu.toldi.infinityforlemmy.site.SiteInfo;
 | 
			
		||||
import eu.toldi.infinityforlemmy.user.MyUserInfo;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.Utils;
 | 
			
		||||
import retrofit2.Call;
 | 
			
		||||
@@ -67,9 +59,6 @@ public class LoginActivity extends BaseActivity {
 | 
			
		||||
    private static final String ENABLE_DOM_STATE = "EDS";
 | 
			
		||||
    private static final String IS_AGREE_TO_USER_AGGREMENT_STATE = "IATUAS";
 | 
			
		||||
 | 
			
		||||
    public static final String EXTRA_INPUT_USERNAME = "INPUT_USERNAME";
 | 
			
		||||
    public static final String EXTRA_INPUT_INSTANCE = "INPUT_INSTANCE";
 | 
			
		||||
 | 
			
		||||
    @BindView(R.id.coordinator_layout_login_activity)
 | 
			
		||||
    CoordinatorLayout coordinatorLayout;
 | 
			
		||||
    @BindView(R.id.appbar_layout_login_activity)
 | 
			
		||||
@@ -80,7 +69,7 @@ public class LoginActivity extends BaseActivity {
 | 
			
		||||
    TextView twoFAInfoTextView;
 | 
			
		||||
 | 
			
		||||
    @BindView(R.id.instance_url_input)
 | 
			
		||||
    AppCompatAutoCompleteTextView instance_input;
 | 
			
		||||
    TextInputEditText instance_input;
 | 
			
		||||
    @BindView(R.id.username_input)
 | 
			
		||||
    TextInputEditText username_input;
 | 
			
		||||
    @BindView(R.id.user_password_input)
 | 
			
		||||
@@ -97,11 +86,9 @@ public class LoginActivity extends BaseActivity {
 | 
			
		||||
    @Inject
 | 
			
		||||
    @Named("no_oauth")
 | 
			
		||||
    RetrofitHolder mRetrofit;
 | 
			
		||||
 | 
			
		||||
    @Inject
 | 
			
		||||
    @Named("lemmyVerse")
 | 
			
		||||
    Retrofit mLemmyVerseRetrofit;
 | 
			
		||||
 | 
			
		||||
    @Named("oauth")
 | 
			
		||||
    Retrofit mOauthRetrofit;
 | 
			
		||||
    @Inject
 | 
			
		||||
    RedditDataRoomDatabase mRedditDataRoomDatabase;
 | 
			
		||||
    @Inject
 | 
			
		||||
@@ -152,34 +139,9 @@ public class LoginActivity extends BaseActivity {
 | 
			
		||||
            isAgreeToUserAgreement = savedInstanceState.getBoolean(IS_AGREE_TO_USER_AGGREMENT_STATE);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Get username and instance from intent
 | 
			
		||||
        Intent intent = getIntent();
 | 
			
		||||
        String username_intent = intent.getStringExtra(EXTRA_INPUT_USERNAME);
 | 
			
		||||
        String instance_intent = intent.getStringExtra(EXTRA_INPUT_INSTANCE);
 | 
			
		||||
        if (username_intent != null) {
 | 
			
		||||
            username_input.setText(username_intent);
 | 
			
		||||
        }
 | 
			
		||||
        if (instance_intent != null) {
 | 
			
		||||
            instance_input.setText(instance_intent);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        LemmyVerseFetchInstances.INSTANCE.fetchInstances(mLemmyVerseRetrofit, new FetchInstancesListener() {
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onFetchInstancesSuccess(@NonNull List<LemmyInstance> instances) {
 | 
			
		||||
                ArrayList<String> instanceNames = new ArrayList<>();
 | 
			
		||||
                for (LemmyInstance instance : instances) {
 | 
			
		||||
                    instanceNames.add(instance.getFqdn());
 | 
			
		||||
                }
 | 
			
		||||
                ArrayAdapter<String> adapter = new CustomArrayAdapter(LoginActivity.this, android.R.layout.simple_dropdown_item_1line, instanceNames, mCustomThemeWrapper);
 | 
			
		||||
                instance_input.setAdapter(adapter);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        loginButton.setOnClickListener(view -> {
 | 
			
		||||
            Log.i("LoginActivity", "Login button clicked");
 | 
			
		||||
            if (!checkFields())
 | 
			
		||||
            if(!checkFields())
 | 
			
		||||
                return;
 | 
			
		||||
            loginButton.setEnabled(false);
 | 
			
		||||
            progressBar.setVisibility(ProgressBar.VISIBLE);
 | 
			
		||||
@@ -217,58 +179,64 @@ public class LoginActivity extends BaseActivity {
 | 
			
		||||
                        try {
 | 
			
		||||
                            JSONObject responseJSON = new JSONObject(accountResponse);
 | 
			
		||||
                            String accessToken = responseJSON.getString("jwt");
 | 
			
		||||
                            mRetrofit.setAccessToken(accessToken);
 | 
			
		||||
                            mRetrofit.setAccessToken(null);
 | 
			
		||||
 | 
			
		||||
                            FetchSiteInfo.fetchSiteInfo(mRetrofit.getRetrofit(), accessToken, new FetchSiteInfo.FetchSiteInfoListener() {
 | 
			
		||||
                                @Override
 | 
			
		||||
                                public void onFetchSiteInfoSuccess(SiteInfo siteInfo, MyUserInfo myUserInfo) {
 | 
			
		||||
                                    if (myUserInfo == null) {
 | 
			
		||||
                                        finish();
 | 
			
		||||
                                        Toast.makeText(LoginActivity.this, R.string.parse_user_info_error, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                        return;
 | 
			
		||||
                                    }
 | 
			
		||||
                            FetchMyInfo.fetchAccountInfo(mRetrofit.getRetrofit(), mRedditDataRoomDatabase, username,
 | 
			
		||||
                                    accessToken, new FetchMyInfo.FetchMyInfoListener() {
 | 
			
		||||
                                        @Override
 | 
			
		||||
                                        public void onFetchMyInfoSuccess(String name, String display_name, String profileImageUrl, String bannerImageUrl) {
 | 
			
		||||
                                            FetchSiteInfo.fetchSiteInfo(mRetrofit.getRetrofit(), accessToken, new FetchSiteInfo.FetchSiteInfoListener() {
 | 
			
		||||
                                                @Override
 | 
			
		||||
                                                public void onFetchSiteInfoSuccess(SiteInfo siteInfo) {
 | 
			
		||||
                                                    boolean canDownvote = siteInfo.isEnable_downvotes();
 | 
			
		||||
                                                    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);
 | 
			
		||||
                                                                finish();
 | 
			
		||||
                                                            });
 | 
			
		||||
                                                    mCurrentAccountSharedPreferences.edit().putBoolean(SharedPreferencesUtils.CAN_DOWNVOTE, canDownvote).apply();
 | 
			
		||||
                                                    String[] version = siteInfo.getVersion().split("\\.");
 | 
			
		||||
                                                    if (version.length > 0) {
 | 
			
		||||
                                                        Log.d("SwitchAccount", "Lemmy Version: " + version[0] + "." + version[1]);
 | 
			
		||||
                                                        int majorVersion = Integer.parseInt(version[0]);
 | 
			
		||||
                                                        int minorVersion = Integer.parseInt(version[1]);
 | 
			
		||||
                                                        if (majorVersion > 0 || (majorVersion == 0 && minorVersion >= 19)) {
 | 
			
		||||
                                                            mRetrofit.setAccessToken(accessToken);
 | 
			
		||||
                                                            mCurrentAccountSharedPreferences.edit().putBoolean(SharedPreferencesUtils.BEARER_TOKEN_AUTH, true).apply();
 | 
			
		||||
                                                        }
 | 
			
		||||
                                                    }
 | 
			
		||||
                                                }
 | 
			
		||||
 | 
			
		||||
                                    boolean canDownvote = siteInfo.isEnable_downvotes();
 | 
			
		||||
                                    ParseAndInsertNewAccount.parseAndInsertNewAccount(mExecutor, new Handler(), myUserInfo.getQualifiedName(), myUserInfo.getDisplayName(), accessToken, myUserInfo.getProfileImageUrl(), myUserInfo.getBannerImageUrl(), authCode, finalInstance, canDownvote, mRedditDataRoomDatabase.accountDao(),
 | 
			
		||||
                                            () -> {
 | 
			
		||||
                                                Intent resultIntent = new Intent();
 | 
			
		||||
                                                setResult(Activity.RESULT_OK, resultIntent);
 | 
			
		||||
                                                finish();
 | 
			
		||||
                                                @Override
 | 
			
		||||
                                                public void onFetchSiteInfoFailed() {
 | 
			
		||||
                                                    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);
 | 
			
		||||
                                                                finish();
 | 
			
		||||
                                                            });
 | 
			
		||||
                                                    mCurrentAccountSharedPreferences.edit().putBoolean(SharedPreferencesUtils.CAN_DOWNVOTE, true).apply();
 | 
			
		||||
                                                }
 | 
			
		||||
                                            });
 | 
			
		||||
                                    mCurrentAccountSharedPreferences.edit()
 | 
			
		||||
                                            .putString(SharedPreferencesUtils.ACCESS_TOKEN, accessToken)
 | 
			
		||||
                                            .putString(SharedPreferencesUtils.ACCOUNT_NAME, myUserInfo.getDisplayName())
 | 
			
		||||
                                            .putString(SharedPreferencesUtils.ACCOUNT_QUALIFIED_NAME, myUserInfo.getQualifiedName())
 | 
			
		||||
                                            .putString(SharedPreferencesUtils.ACCOUNT_INSTANCE,finalInstance)
 | 
			
		||||
                                            .putString(SharedPreferencesUtils.ACCOUNT_IMAGE_URL, myUserInfo.getProfileImageUrl())
 | 
			
		||||
                                            .putBoolean(SharedPreferencesUtils.CAN_DOWNVOTE, canDownvote).apply();
 | 
			
		||||
                                    String[] version = siteInfo.getVersion().split("\\.");
 | 
			
		||||
                                    if (version.length > 0) {
 | 
			
		||||
                                        Log.d("SwitchAccount", "Lemmy Version: " + version[0] + "." + version[1]);
 | 
			
		||||
                                        int majorVersion = Integer.parseInt(version[0]);
 | 
			
		||||
                                        int minorVersion = Integer.parseInt(version[1]);
 | 
			
		||||
                                        if (majorVersion > 0 || (majorVersion == 0 && minorVersion >= 19)) {
 | 
			
		||||
                                            mRetrofit.setAccessToken(accessToken);
 | 
			
		||||
                                            mCurrentAccountSharedPreferences.edit().putBoolean(SharedPreferencesUtils.BEARER_TOKEN_AUTH, true).apply();
 | 
			
		||||
                                        } else {
 | 
			
		||||
                                            mRetrofit.setAccessToken(null);
 | 
			
		||||
                                            mCurrentAccountSharedPreferences.edit().putBoolean(SharedPreferencesUtils.BEARER_TOKEN_AUTH, false).apply();
 | 
			
		||||
                                            mCurrentAccountSharedPreferences.edit().putString(SharedPreferencesUtils.ACCESS_TOKEN, accessToken)
 | 
			
		||||
                                                    .putString(SharedPreferencesUtils.ACCOUNT_NAME, display_name)
 | 
			
		||||
                                                    .putString(SharedPreferencesUtils.ACCOUNT_QUALIFIED_NAME, name)
 | 
			
		||||
                                                    .putString(SharedPreferencesUtils.ACCOUNT_INSTANCE,finalInstance)
 | 
			
		||||
                                                    .putString(SharedPreferencesUtils.ACCOUNT_IMAGE_URL, profileImageUrl).apply();
 | 
			
		||||
                                        }
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
 | 
			
		||||
                                @Override
 | 
			
		||||
                                public void onFetchSiteInfoFailed(boolean parseFailed) {
 | 
			
		||||
                                    if (parseFailed) {
 | 
			
		||||
                                        finish();
 | 
			
		||||
                                        Toast.makeText(LoginActivity.this, R.string.parse_user_info_error, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                    } else {
 | 
			
		||||
                                        progressBar.setVisibility(ProgressBar.GONE);
 | 
			
		||||
                                        loginButton.setEnabled(true);
 | 
			
		||||
                                        Toast.makeText(LoginActivity.this, R.string.cannot_fetch_user_info, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                            });
 | 
			
		||||
                                        @Override
 | 
			
		||||
                                        public void onFetchMyInfoFailed(boolean parseFailed) {
 | 
			
		||||
                                            if (parseFailed) {
 | 
			
		||||
                                                Toast.makeText(LoginActivity.this, R.string.parse_user_info_error, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                            } else {
 | 
			
		||||
                                                Toast.makeText(LoginActivity.this, R.string.cannot_fetch_user_info, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                            }
 | 
			
		||||
 | 
			
		||||
                                            finish();
 | 
			
		||||
                                        }
 | 
			
		||||
                                    });
 | 
			
		||||
                        } catch (JSONException e) {
 | 
			
		||||
                            throw new RuntimeException(e);
 | 
			
		||||
                        }
 | 
			
		||||
@@ -370,7 +338,6 @@ public class LoginActivity extends BaseActivity {
 | 
			
		||||
        if (typeface != null) {
 | 
			
		||||
            twoFAInfoTextView.setTypeface(typeface);
 | 
			
		||||
        }
 | 
			
		||||
        instance_input.setTextColor(mCustomThemeWrapper.getPrimaryTextColor());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,6 @@ 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;
 | 
			
		||||
@@ -34,7 +33,6 @@ import androidx.appcompat.app.AppCompatDelegate;
 | 
			
		||||
import androidx.coordinatorlayout.widget.CoordinatorLayout;
 | 
			
		||||
import androidx.core.app.ActivityCompat;
 | 
			
		||||
import androidx.core.content.ContextCompat;
 | 
			
		||||
import androidx.core.splashscreen.SplashScreen;
 | 
			
		||||
import androidx.drawerlayout.widget.DrawerLayout;
 | 
			
		||||
import androidx.fragment.app.Fragment;
 | 
			
		||||
import androidx.fragment.app.FragmentActivity;
 | 
			
		||||
@@ -54,7 +52,6 @@ import com.google.android.material.appbar.CollapsingToolbarLayout;
 | 
			
		||||
import com.google.android.material.appbar.MaterialToolbar;
 | 
			
		||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 | 
			
		||||
import com.google.android.material.navigation.NavigationView;
 | 
			
		||||
import com.google.android.material.snackbar.Snackbar;
 | 
			
		||||
import com.google.android.material.tabs.TabLayout;
 | 
			
		||||
import com.google.android.material.tabs.TabLayoutMediator;
 | 
			
		||||
import com.google.android.material.textfield.TextInputEditText;
 | 
			
		||||
@@ -121,15 +118,12 @@ import eu.toldi.infinityforlemmy.post.MarkPostAsRead;
 | 
			
		||||
import eu.toldi.infinityforlemmy.post.Post;
 | 
			
		||||
import eu.toldi.infinityforlemmy.post.PostPagingSource;
 | 
			
		||||
import eu.toldi.infinityforlemmy.readpost.InsertReadPost;
 | 
			
		||||
import eu.toldi.infinityforlemmy.site.FetchSiteInfo;
 | 
			
		||||
import eu.toldi.infinityforlemmy.site.SiteInfo;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subreddit.ParseSubredditData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subreddit.SubredditData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subscribedsubreddit.SubscribedSubredditData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subscribedsubreddit.SubscribedSubredditViewModel;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subscribeduser.SubscribedUserData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.user.FetchUserData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.user.MyUserInfo;
 | 
			
		||||
import eu.toldi.infinityforlemmy.user.UserData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.APIUtils;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.CustomThemeSharedPreferencesUtils;
 | 
			
		||||
@@ -253,12 +247,8 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
 | 
			
		||||
    private int fabOption;
 | 
			
		||||
    private int inboxCount;
 | 
			
		||||
 | 
			
		||||
    private boolean mBearerTokenUsed = true;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onCreate(Bundle savedInstanceState) {
 | 
			
		||||
        SplashScreen.installSplashScreen(this);
 | 
			
		||||
 | 
			
		||||
        ((Infinity) getApplication()).getAppComponent().inject(this);
 | 
			
		||||
 | 
			
		||||
        setTheme(R.style.AppTheme_NoActionBarWithTransparentStatusBar);
 | 
			
		||||
@@ -346,8 +336,9 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
 | 
			
		||||
        fragmentManager = getSupportFragmentManager();
 | 
			
		||||
 | 
			
		||||
        mAccessToken = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN, null);
 | 
			
		||||
        mRetrofit.setAccessToken(mAccessToken);
 | 
			
		||||
        mBearerTokenUsed = mCurrentAccountSharedPreferences.getBoolean(SharedPreferencesUtils.BEARER_TOKEN_AUTH, true);
 | 
			
		||||
        if (mCurrentAccountSharedPreferences.getBoolean(SharedPreferencesUtils.BEARER_TOKEN_AUTH, true)) {
 | 
			
		||||
            mRetrofit.setAccessToken(mAccessToken);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_NAME, null);
 | 
			
		||||
        mAccountQualifiedName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_QUALIFIED_NAME, null);
 | 
			
		||||
@@ -381,8 +372,6 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
 | 
			
		||||
                mRetrofit.setBaseURL(instancePreference);
 | 
			
		||||
                this.recreate();
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            checkUserToken();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -835,6 +824,8 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
 | 
			
		||||
                } else if (stringId == R.string.multi_reddit) {
 | 
			
		||||
                            intent = new Intent(MainActivity.this, SubscribedThingListingActivity.class);
 | 
			
		||||
                            intent.putExtra(SubscribedThingListingActivity.EXTRA_SHOW_MULTIREDDITS, true);
 | 
			
		||||
                        } else if (stringId == R.string.history) {
 | 
			
		||||
                            intent = new Intent(MainActivity.this, HistoryActivity.class);
 | 
			
		||||
                        } else if (stringId == R.string.trending) {
 | 
			
		||||
                            intent = new Intent(MainActivity.this, TrendingActivity.class);
 | 
			
		||||
                        } else if (stringId == R.string.upvoted) {
 | 
			
		||||
@@ -936,7 +927,7 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
 | 
			
		||||
        sectionsPagerAdapter = new SectionsPagerAdapter(this, tabCount, mShowFavoriteMultiReddits,
 | 
			
		||||
                mShowMultiReddits, mShowFavoriteSubscribedSubreddits, mShowSubscribedSubreddits);
 | 
			
		||||
        viewPager2.setAdapter(sectionsPagerAdapter);
 | 
			
		||||
        viewPager2.setOffscreenPageLimit(ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT);
 | 
			
		||||
        viewPager2.setOffscreenPageLimit(1);
 | 
			
		||||
        viewPager2.setUserInputEnabled(!mDisableSwipingBetweenTabs);
 | 
			
		||||
        if (mMainActivityTabsSharedPreferences.getBoolean((mAccountName == null ? "" : mAccountName) + SharedPreferencesUtils.MAIN_PAGE_SHOW_TAB_NAMES, true)) {
 | 
			
		||||
            if (mShowFavoriteMultiReddits || mShowMultiReddits || mShowFavoriteSubscribedSubreddits || mShowSubscribedSubreddits) {
 | 
			
		||||
@@ -1090,39 +1081,6 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void checkUserToken() {
 | 
			
		||||
        if (mBearerTokenUsed) {
 | 
			
		||||
            FetchUserData.validateAuthToken(mRetrofit.getRetrofit(), new FetchUserData.ValidateAuthTokenListener() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onValidateAuthTokenSuccess() {
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onValidateAuthTokenFailed() {
 | 
			
		||||
                    // Alert user that the token is invalid and they need to re-login
 | 
			
		||||
                    new MaterialAlertDialogBuilder(MainActivity.this, R.style.MaterialAlertDialogTheme)
 | 
			
		||||
                            .setTitle(R.string.token_expired)
 | 
			
		||||
                            .setMessage(R.string.token_expired_message)
 | 
			
		||||
                            .setPositiveButton(R.string.ok, (dialogInterface, i) -> {
 | 
			
		||||
                                Intent intent = new Intent(MainActivity.this, LoginActivity.class);
 | 
			
		||||
                                // Username without instance
 | 
			
		||||
                                String username = mAccountName.substring(0, mAccountQualifiedName.indexOf("@"));
 | 
			
		||||
                                intent.putExtra(LoginActivity.EXTRA_INPUT_USERNAME, username);
 | 
			
		||||
                                intent.putExtra(LoginActivity.EXTRA_INPUT_INSTANCE, mRetrofit.getBaseURL());
 | 
			
		||||
                                startActivity(intent);
 | 
			
		||||
                            })
 | 
			
		||||
                            .setCancelable(false)
 | 
			
		||||
                            .show();
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onCheckFailed(String message) {
 | 
			
		||||
                    applySnackBarTheme(Snackbar.make(findViewById(android.R.id.content), getString(R.string.failed_to_check_token_validity,message), Snackbar.LENGTH_LONG)).show();
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void loadUserData() {
 | 
			
		||||
        if (!mFetchUserInfoSuccess) {
 | 
			
		||||
            FetchUserData.fetchUnreadCount(mRetrofit.getRetrofit(), mAccessToken, new FetchUserData.FetchUserUnreadCountListener() {
 | 
			
		||||
@@ -1148,35 +1106,9 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
 | 
			
		||||
 | 
			
		||||
                        @Override
 | 
			
		||||
                        public void onFetchUserDataFailed() {
 | 
			
		||||
                            mFetchUserInfoSuccess = false;
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
            if (mAccessToken != null) {
 | 
			
		||||
                FetchSiteInfo.fetchSiteInfo(mRetrofit.getRetrofit(), mAccessToken, new FetchSiteInfo.FetchSiteInfoListener() {
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void onFetchSiteInfoSuccess(SiteInfo siteInfo, MyUserInfo myUserInfo) {
 | 
			
		||||
                        String[] version = siteInfo.getVersion().split("\\.");
 | 
			
		||||
                        if (version.length > 0) {
 | 
			
		||||
                            Log.d("MainActvity", "Lemmy Version: " + version[0] + "." + version[1]);
 | 
			
		||||
                            int majorVersion = Integer.parseInt(version[0]);
 | 
			
		||||
                            int minorVersion = Integer.parseInt(version[1]);
 | 
			
		||||
                            if (majorVersion > 0 || (majorVersion == 0 && minorVersion >= 19)) {
 | 
			
		||||
                                mRetrofit.setAccessToken(mAccessToken);
 | 
			
		||||
                                mCurrentAccountSharedPreferences.edit().putBoolean(SharedPreferencesUtils.BEARER_TOKEN_AUTH, true).apply();
 | 
			
		||||
                                checkUserToken();
 | 
			
		||||
                            } else {
 | 
			
		||||
                                mRetrofit.setAccessToken(null);
 | 
			
		||||
                                mCurrentAccountSharedPreferences.edit().putBoolean(SharedPreferencesUtils.BEARER_TOKEN_AUTH, false).apply();
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void onFetchSiteInfoFailed(boolean parseFailed) {
 | 
			
		||||
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
                    mFetchUserInfoSuccess = false;
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1202,7 +1134,7 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
 | 
			
		||||
        int currentPostType = sectionsPagerAdapter.getCurrentPostType();
 | 
			
		||||
        PostFragment postFragment = sectionsPagerAdapter.getCurrentFragment();
 | 
			
		||||
        if (postFragment != null) {
 | 
			
		||||
            SortTypeBottomSheetFragment sortTypeBottomSheetFragment = SortTypeBottomSheetFragment.getNewInstance(currentPostType, postFragment.getSortType());
 | 
			
		||||
            SortTypeBottomSheetFragment sortTypeBottomSheetFragment = SortTypeBottomSheetFragment.getNewInstance(currentPostType != PostPagingSource.TYPE_FRONT_PAGE, postFragment.getSortType());
 | 
			
		||||
            sortTypeBottomSheetFragment.show(getSupportFragmentManager(), sortTypeBottomSheetFragment.getTag());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -1734,7 +1666,7 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void doNotShowRedditAPIInfoAgain() {
 | 
			
		||||
        mInternalSharedPreferences.edit().putBoolean(SharedPreferencesUtils.DO_NOT_SHOW_REDDIT_API_INFO_V2_AGAIN, true).apply();
 | 
			
		||||
        mInternalSharedPreferences.edit().putBoolean(SharedPreferencesUtils.DO_NOT_SHOW_REDDIT_API_INFO_AGAIN, true).apply();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private class SectionsPagerAdapter extends FragmentStateAdapter {
 | 
			
		||||
@@ -1846,7 +1778,7 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
 | 
			
		||||
                Bundle bundle = new Bundle();
 | 
			
		||||
                bundle.putInt(PostFragment.EXTRA_POST_TYPE, mAccessToken == null ? PostPagingSource.TYPE_ANONYMOUS_FRONT_PAGE : PostPagingSource.TYPE_FRONT_PAGE);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountQualifiedName);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountName);
 | 
			
		||||
                fragment.setArguments(bundle);
 | 
			
		||||
                return fragment;
 | 
			
		||||
            } else if (postType == SharedPreferencesUtils.MAIN_PAGE_TAB_POST_TYPE_ALL) {
 | 
			
		||||
@@ -1855,7 +1787,7 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
 | 
			
		||||
                bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostPagingSource.TYPE_FRONT_PAGE);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_NAME, "all");
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountQualifiedName);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountName);
 | 
			
		||||
                fragment.setArguments(bundle);
 | 
			
		||||
                return fragment;
 | 
			
		||||
            } else if (postType == SharedPreferencesUtils.MAIN_PAGE_TAB_POST_TYPE_SUBREDDIT) {
 | 
			
		||||
@@ -1864,7 +1796,7 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
 | 
			
		||||
                bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostPagingSource.TYPE_SUBREDDIT);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_NAME, name);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountQualifiedName);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountName);
 | 
			
		||||
                fragment.setArguments(bundle);
 | 
			
		||||
                return fragment;
 | 
			
		||||
            } else if (postType == SharedPreferencesUtils.MAIN_PAGE_TAB_POST_TYPE_MULTIREDDIT) {
 | 
			
		||||
@@ -1873,7 +1805,7 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_NAME, name);
 | 
			
		||||
                bundle.putInt(PostFragment.EXTRA_POST_TYPE, mAccessToken == null ? PostPagingSource.TYPE_ANONYMOUS_MULTIREDDIT : PostPagingSource.TYPE_MULTI_REDDIT);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountQualifiedName);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountName);
 | 
			
		||||
                fragment.setArguments(bundle);
 | 
			
		||||
                return fragment;
 | 
			
		||||
            } else if (postType == SharedPreferencesUtils.MAIN_PAGE_TAB_POST_TYPE_USER) {
 | 
			
		||||
@@ -1883,7 +1815,7 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_USER_NAME, name);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_USER_WHERE, PostPagingSource.USER_WHERE_SUBMITTED);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountQualifiedName);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountName);
 | 
			
		||||
                fragment.setArguments(bundle);
 | 
			
		||||
                return fragment;
 | 
			
		||||
            } else if (postType == SharedPreferencesUtils.MAIN_PAGE_TAB_POST_TYPE_UPVOTED
 | 
			
		||||
@@ -1896,7 +1828,7 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
 | 
			
		||||
                bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostPagingSource.TYPE_USER);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_USER_NAME, mAccountName);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountQualifiedName);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountName);
 | 
			
		||||
                bundle.putBoolean(PostFragment.EXTRA_DISABLE_READ_POSTS, true);
 | 
			
		||||
 | 
			
		||||
                if (postType == SharedPreferencesUtils.MAIN_PAGE_TAB_POST_TYPE_UPVOTED) {
 | 
			
		||||
@@ -1919,7 +1851,7 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
 | 
			
		||||
                bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostPagingSource.TYPE_FRONT_PAGE);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_NAME, "local");
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountQualifiedName);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountName);
 | 
			
		||||
                fragment.setArguments(bundle);
 | 
			
		||||
                return fragment;
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -117,7 +117,7 @@ public class MultiredditSelectionActivity extends BaseActivity implements Activi
 | 
			
		||||
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 | 
			
		||||
 | 
			
		||||
        mAccessToken = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN, null);
 | 
			
		||||
        mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_QUALIFIED_NAME, null);
 | 
			
		||||
        mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_NAME, null);
 | 
			
		||||
 | 
			
		||||
        if (savedInstanceState == null) {
 | 
			
		||||
            bindView(true);
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,6 @@ import android.view.MenuItem;
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.appcompat.widget.Toolbar;
 | 
			
		||||
import androidx.coordinatorlayout.widget.CoordinatorLayout;
 | 
			
		||||
import androidx.lifecycle.Observer;
 | 
			
		||||
import androidx.lifecycle.ViewModelProvider;
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView;
 | 
			
		||||
 | 
			
		||||
@@ -17,7 +16,6 @@ import com.google.android.material.appbar.CollapsingToolbarLayout;
 | 
			
		||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 | 
			
		||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.concurrent.Executor;
 | 
			
		||||
 | 
			
		||||
import javax.inject.Inject;
 | 
			
		||||
@@ -28,14 +26,13 @@ import butterknife.ButterKnife;
 | 
			
		||||
import eu.toldi.infinityforlemmy.Infinity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.R;
 | 
			
		||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
 | 
			
		||||
import eu.toldi.infinityforlemmy.adapters.PostFilterWithUsageRecyclerViewAdapter;
 | 
			
		||||
import eu.toldi.infinityforlemmy.adapters.PostFilterRecyclerViewAdapter;
 | 
			
		||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.PostFilterOptionsBottomSheetFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.post.Post;
 | 
			
		||||
import eu.toldi.infinityforlemmy.postfilter.DeletePostFilter;
 | 
			
		||||
import eu.toldi.infinityforlemmy.postfilter.PostFilter;
 | 
			
		||||
import eu.toldi.infinityforlemmy.postfilter.PostFilterWithUsageViewModel;
 | 
			
		||||
import eu.toldi.infinityforlemmy.postfilter.PostFilterWithUsage;
 | 
			
		||||
import eu.toldi.infinityforlemmy.postfilter.PostFilterViewModel;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
 | 
			
		||||
 | 
			
		||||
public class PostFilterPreferenceActivity extends BaseActivity {
 | 
			
		||||
@@ -65,8 +62,8 @@ public class PostFilterPreferenceActivity extends BaseActivity {
 | 
			
		||||
    CustomThemeWrapper customThemeWrapper;
 | 
			
		||||
    @Inject
 | 
			
		||||
    Executor executor;
 | 
			
		||||
    public PostFilterWithUsageViewModel postFilterWithUsageViewModel;
 | 
			
		||||
    private PostFilterWithUsageRecyclerViewAdapter adapter;
 | 
			
		||||
    public PostFilterViewModel postFilterViewModel;
 | 
			
		||||
    private PostFilterRecyclerViewAdapter adapter;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onCreate(Bundle savedInstanceState) {
 | 
			
		||||
@@ -102,7 +99,7 @@ public class PostFilterPreferenceActivity extends BaseActivity {
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        adapter = new PostFilterWithUsageRecyclerViewAdapter(this, customThemeWrapper, postFilter -> {
 | 
			
		||||
        adapter = new PostFilterRecyclerViewAdapter(this, customThemeWrapper, postFilter -> {
 | 
			
		||||
            if (post != null) {
 | 
			
		||||
                showPostFilterOptions(post, postFilter);
 | 
			
		||||
            } else if (subredditName != null) {
 | 
			
		||||
@@ -120,15 +117,10 @@ public class PostFilterPreferenceActivity extends BaseActivity {
 | 
			
		||||
 | 
			
		||||
        recyclerView.setAdapter(adapter);
 | 
			
		||||
 | 
			
		||||
        postFilterWithUsageViewModel = new ViewModelProvider(this,
 | 
			
		||||
                new PostFilterWithUsageViewModel.Factory(redditDataRoomDatabase)).get(PostFilterWithUsageViewModel.class);
 | 
			
		||||
        postFilterViewModel = new ViewModelProvider(this,
 | 
			
		||||
                new PostFilterViewModel.Factory(redditDataRoomDatabase)).get(PostFilterViewModel.class);
 | 
			
		||||
 | 
			
		||||
        postFilterWithUsageViewModel.getPostFilterWithUsageListLiveData().observe(this, new Observer<List<PostFilterWithUsage>>() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onChanged(List<PostFilterWithUsage> postFilterWithUsages) {
 | 
			
		||||
                adapter.setPostFilterWithUsageList(postFilterWithUsages);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        postFilterViewModel.getPostFilterListLiveData().observe(this, postFilters -> adapter.setPostFilterList(postFilters));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void showPostFilterOptions(Post post, PostFilter postFilter) {
 | 
			
		||||
 
 | 
			
		||||
@@ -126,9 +126,9 @@ public class PostFilterUsageListingActivity extends BaseActivity {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void editAndPostFilterUsageNameOfUsage(int type, String nameOfUsage) {
 | 
			
		||||
        View dialogView = getLayoutInflater().inflate(R.layout.dialog_edit_post_or_comment_filter_name_of_usage, null);
 | 
			
		||||
        TextInputLayout textInputLayout = dialogView.findViewById(R.id.text_input_layout_edit_post_or_comment_filter_name_of_usage_dialog);
 | 
			
		||||
        TextInputEditText textInputEditText = dialogView.findViewById(R.id.text_input_edit_text_edit_post_or_comment_filter_name_of_usage_dialog);
 | 
			
		||||
        View dialogView = getLayoutInflater().inflate(R.layout.dialog_edit_post_filter_name_of_usage, null);
 | 
			
		||||
        TextInputLayout textInputLayout = dialogView.findViewById(R.id.text_input_layout_edit_post_filter_name_of_usage_dialog);
 | 
			
		||||
        TextInputEditText textInputEditText = dialogView.findViewById(R.id.text_input_edit_text_edit_post_filter_name_of_usage_dialog);
 | 
			
		||||
        int primaryTextColor = customThemeWrapper.getPrimaryTextColor();
 | 
			
		||||
        textInputLayout.setBoxStrokeColor(primaryTextColor);
 | 
			
		||||
        textInputLayout.setDefaultHintTextColor(ColorStateList.valueOf(primaryTextColor));
 | 
			
		||||
@@ -147,6 +147,7 @@ public class PostFilterUsageListingActivity extends BaseActivity {
 | 
			
		||||
                titleStringId = R.string.user;
 | 
			
		||||
                break;
 | 
			
		||||
            case PostFilterUsage.MULTIREDDIT_TYPE:
 | 
			
		||||
                textInputEditText.setHint(R.string.settings_tab_multi_reddit_name);
 | 
			
		||||
                titleStringId = R.string.multi_reddit;
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ import com.google.android.material.divider.MaterialDivider;
 | 
			
		||||
import com.google.android.material.materialswitch.MaterialSwitch;
 | 
			
		||||
import com.google.android.material.snackbar.Snackbar;
 | 
			
		||||
import com.google.gson.Gson;
 | 
			
		||||
import eu.toldi.infinityforlemmy.CustomTextView;
 | 
			
		||||
import com.libRG.CustomTextView;
 | 
			
		||||
 | 
			
		||||
import org.greenrobot.eventbus.EventBus;
 | 
			
		||||
import org.greenrobot.eventbus.Subscribe;
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ import com.google.android.material.divider.MaterialDivider;
 | 
			
		||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
 | 
			
		||||
import com.google.android.material.materialswitch.MaterialSwitch;
 | 
			
		||||
import com.google.android.material.snackbar.Snackbar;
 | 
			
		||||
import eu.toldi.infinityforlemmy.CustomTextView;
 | 
			
		||||
import com.libRG.CustomTextView;
 | 
			
		||||
 | 
			
		||||
import org.greenrobot.eventbus.EventBus;
 | 
			
		||||
import org.greenrobot.eventbus.Subscribe;
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 | 
			
		||||
import com.google.android.material.divider.MaterialDivider;
 | 
			
		||||
import com.google.android.material.materialswitch.MaterialSwitch;
 | 
			
		||||
import com.google.android.material.snackbar.Snackbar;
 | 
			
		||||
import eu.toldi.infinityforlemmy.CustomTextView;
 | 
			
		||||
import com.libRG.CustomTextView;
 | 
			
		||||
 | 
			
		||||
import org.greenrobot.eventbus.EventBus;
 | 
			
		||||
import org.greenrobot.eventbus.Subscribe;
 | 
			
		||||
 
 | 
			
		||||
@@ -35,7 +35,7 @@ import com.google.android.material.snackbar.Snackbar;
 | 
			
		||||
import com.google.android.material.textfield.TextInputEditText;
 | 
			
		||||
import com.google.android.material.textfield.TextInputLayout;
 | 
			
		||||
import com.google.gson.Gson;
 | 
			
		||||
import eu.toldi.infinityforlemmy.CustomTextView;
 | 
			
		||||
import com.libRG.CustomTextView;
 | 
			
		||||
 | 
			
		||||
import org.greenrobot.eventbus.EventBus;
 | 
			
		||||
import org.greenrobot.eventbus.Subscribe;
 | 
			
		||||
 
 | 
			
		||||
@@ -35,7 +35,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 | 
			
		||||
import com.google.android.material.divider.MaterialDivider;
 | 
			
		||||
import com.google.android.material.materialswitch.MaterialSwitch;
 | 
			
		||||
import com.google.android.material.snackbar.Snackbar;
 | 
			
		||||
import eu.toldi.infinityforlemmy.CustomTextView;
 | 
			
		||||
import com.libRG.CustomTextView;
 | 
			
		||||
 | 
			
		||||
import org.greenrobot.eventbus.EventBus;
 | 
			
		||||
import org.greenrobot.eventbus.Subscribe;
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@ import com.google.android.material.divider.MaterialDivider;
 | 
			
		||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
 | 
			
		||||
import com.google.android.material.materialswitch.MaterialSwitch;
 | 
			
		||||
import com.google.android.material.snackbar.Snackbar;
 | 
			
		||||
import eu.toldi.infinityforlemmy.CustomTextView;
 | 
			
		||||
import com.libRG.CustomTextView;
 | 
			
		||||
 | 
			
		||||
import org.greenrobot.eventbus.EventBus;
 | 
			
		||||
import org.greenrobot.eventbus.Subscribe;
 | 
			
		||||
 
 | 
			
		||||
@@ -132,7 +132,7 @@ public class RulesActivity extends BaseActivity {
 | 
			
		||||
 | 
			
		||||
        mSubredditName = getIntent().getExtras().getString(EXTRA_SUBREDDIT_NAME);
 | 
			
		||||
 | 
			
		||||
        mAdapter = new RulesRecyclerViewAdapter(this, mCustomThemeWrapper, sliderPanel, mSharedPreferences.getBoolean(SharedPreferencesUtils.DISABLE_IMAGE_PREVIEW, false));
 | 
			
		||||
        mAdapter = new RulesRecyclerViewAdapter(this, mCustomThemeWrapper, sliderPanel);
 | 
			
		||||
        recyclerView.setAdapter(mAdapter);
 | 
			
		||||
        FetchSubredditData.fetchSubredditData(mRetrofit.getRetrofit(), mSubredditName, mAccessToken, new FetchSubredditData.FetchSubredditDataListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ package eu.toldi.infinityforlemmy.activities;
 | 
			
		||||
import android.app.Activity;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.content.SharedPreferences;
 | 
			
		||||
import android.content.res.ColorStateList;
 | 
			
		||||
import android.net.Uri;
 | 
			
		||||
import android.os.Build;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
@@ -28,14 +27,11 @@ import androidx.lifecycle.ViewModelProvider;
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView;
 | 
			
		||||
 | 
			
		||||
import com.google.android.material.appbar.AppBarLayout;
 | 
			
		||||
import com.google.android.material.button.MaterialButton;
 | 
			
		||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 | 
			
		||||
 | 
			
		||||
import org.greenrobot.eventbus.EventBus;
 | 
			
		||||
import org.greenrobot.eventbus.Subscribe;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.concurrent.Executor;
 | 
			
		||||
 | 
			
		||||
import javax.inject.Inject;
 | 
			
		||||
import javax.inject.Named;
 | 
			
		||||
@@ -51,14 +47,13 @@ import eu.toldi.infinityforlemmy.apis.RedditAPI;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.slidr.Slidr;
 | 
			
		||||
import eu.toldi.infinityforlemmy.events.SwitchAccountEvent;
 | 
			
		||||
import eu.toldi.infinityforlemmy.recentsearchquery.DeleteRecentSearchQuery;
 | 
			
		||||
import eu.toldi.infinityforlemmy.recentsearchquery.RecentSearchQuery;
 | 
			
		||||
import eu.toldi.infinityforlemmy.recentsearchquery.RecentSearchQueryViewModel;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subreddit.ParseSubredditData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subreddit.SubredditData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subreddit.SubredditWithSelection;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subscribedsubreddit.SubscribedSubredditData;
 | 
			
		||||
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 retrofit2.Call;
 | 
			
		||||
@@ -103,8 +98,6 @@ public class SearchActivity extends BaseActivity {
 | 
			
		||||
    ImageView clearSearchTextImageView;
 | 
			
		||||
    @BindView(R.id.link_handler_image_view_search_activity)
 | 
			
		||||
    ImageView linkHandlerImageView;
 | 
			
		||||
    @BindView(R.id.delete_all_recent_searches_button_search_activity)
 | 
			
		||||
    MaterialButton deleteAllSearchesButton;
 | 
			
		||||
    @BindView(R.id.subreddit_name_relative_layout_search_activity)
 | 
			
		||||
    RelativeLayout subredditNameRelativeLayout;
 | 
			
		||||
    @BindView(R.id.search_in_text_view_search_activity)
 | 
			
		||||
@@ -131,8 +124,6 @@ public class SearchActivity extends BaseActivity {
 | 
			
		||||
    SharedPreferences mNsfwAndSpoilerSharedPreferences;
 | 
			
		||||
    @Inject
 | 
			
		||||
    CustomThemeWrapper mCustomThemeWrapper;
 | 
			
		||||
    @Inject
 | 
			
		||||
    Executor executor;
 | 
			
		||||
    private String mAccountName;
 | 
			
		||||
    private String mAccessToken;
 | 
			
		||||
    private String query;
 | 
			
		||||
@@ -172,7 +163,6 @@ public class SearchActivity extends BaseActivity {
 | 
			
		||||
        setSupportActionBar(toolbar);
 | 
			
		||||
 | 
			
		||||
        clearSearchTextImageView.setVisibility(View.GONE);
 | 
			
		||||
        deleteAllSearchesButton.setVisibility(View.GONE);
 | 
			
		||||
 | 
			
		||||
        searchOnlySubreddits = getIntent().getBooleanExtra(EXTRA_SEARCH_ONLY_SUBREDDITS, false);
 | 
			
		||||
        searchOnlyUsers = getIntent().getBooleanExtra(EXTRA_SEARCH_ONLY_USERS, false);
 | 
			
		||||
@@ -192,9 +182,9 @@ public class SearchActivity extends BaseActivity {
 | 
			
		||||
            if (searchOnlySubreddits) {
 | 
			
		||||
                Intent returnIntent = new Intent();
 | 
			
		||||
                if (getIntent().getBooleanExtra(EXTRA_IS_MULTI_SELECTION, false)) {
 | 
			
		||||
                    ArrayList<SubredditWithSelection> subredditNameList = new ArrayList<>();
 | 
			
		||||
                    subredditNameList.add(new SubredditWithSelection(subredditData.getName(), subredditData.getIconUrl(), LemmyUtils.actorID2FullName(subredditData.getActorId())));
 | 
			
		||||
                    returnIntent.putParcelableArrayListExtra(RETURN_EXTRA_SELECTED_SUBREDDIT_NAMES, subredditNameList);
 | 
			
		||||
                    ArrayList<String> subredditNameList = new ArrayList<>();
 | 
			
		||||
                    subredditNameList.add(subredditData.getName());
 | 
			
		||||
                    returnIntent.putStringArrayListExtra(RETURN_EXTRA_SELECTED_SUBREDDIT_NAMES, subredditNameList);
 | 
			
		||||
                } else {
 | 
			
		||||
                    returnIntent.putExtra(EXTRA_RETURN_SUBREDDIT_NAME, new SubscribedSubredditData(subredditData));
 | 
			
		||||
                    returnIntent.putExtra(EXTRA_RETURN_SUBREDDIT_ICON_URL, subredditData.getIconUrl());
 | 
			
		||||
@@ -264,7 +254,7 @@ public class SearchActivity extends BaseActivity {
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        searchEditText.setOnEditorActionListener((v, actionId, event) -> {
 | 
			
		||||
            if ((actionId == EditorInfo.IME_ACTION_DONE || actionId == EditorInfo.IME_ACTION_SEARCH) || (event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN)) {
 | 
			
		||||
            if ((actionId == EditorInfo.IME_ACTION_DONE || actionId == EditorInfo.IME_ACTION_SEARCH) || (event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN )) {
 | 
			
		||||
                if (!searchEditText.getText().toString().isEmpty()) {
 | 
			
		||||
                    search(searchEditText.getText().toString());
 | 
			
		||||
                    return true;
 | 
			
		||||
@@ -286,17 +276,6 @@ public class SearchActivity extends BaseActivity {
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        deleteAllSearchesButton.setOnClickListener(view -> {
 | 
			
		||||
            new MaterialAlertDialogBuilder(this, R.style.MaterialAlertDialogTheme)
 | 
			
		||||
                    .setTitle(R.string.confirm)
 | 
			
		||||
                    .setMessage(R.string.confirm_delete_all_recent_searches)
 | 
			
		||||
                    .setPositiveButton(R.string.yes, (dialogInterface, i) -> {
 | 
			
		||||
                        executor.execute(() -> mRedditDataRoomDatabase.recentSearchQueryDao().deleteAllRecentSearchQueries(mAccountName));
 | 
			
		||||
                    })
 | 
			
		||||
                    .setNegativeButton(R.string.no, null)
 | 
			
		||||
                    .show();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        if (savedInstanceState != null) {
 | 
			
		||||
            subredditName = savedInstanceState.getString(SUBREDDIT_NAME_STATE);
 | 
			
		||||
            subredditIsUser = savedInstanceState.getBoolean(SUBREDDIT_IS_USER_STATE);
 | 
			
		||||
@@ -340,7 +319,7 @@ public class SearchActivity extends BaseActivity {
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onDelete(RecentSearchQuery recentSearchQuery) {
 | 
			
		||||
                    executor.execute(() -> mRedditDataRoomDatabase.recentSearchQueryDao().deleteRecentSearchQueries(recentSearchQuery));
 | 
			
		||||
                    DeleteRecentSearchQuery.deleteRecentSearchQueryListener(mRedditDataRoomDatabase, recentSearchQuery, () -> {});
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
            recyclerView.setVisibility(View.VISIBLE);
 | 
			
		||||
@@ -355,10 +334,8 @@ public class SearchActivity extends BaseActivity {
 | 
			
		||||
                mRecentSearchQueryViewModel.getAllRecentSearchQueries().observe(this, recentSearchQueries -> {
 | 
			
		||||
                    if (recentSearchQueries != null && !recentSearchQueries.isEmpty()) {
 | 
			
		||||
                        divider.setVisibility(View.VISIBLE);
 | 
			
		||||
                        deleteAllSearchesButton.setVisibility(View.VISIBLE);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        divider.setVisibility(View.GONE);
 | 
			
		||||
                        deleteAllSearchesButton.setVisibility(View.GONE);
 | 
			
		||||
                    }
 | 
			
		||||
                    adapter.setRecentSearchQueries(recentSearchQueries);
 | 
			
		||||
                });
 | 
			
		||||
@@ -387,11 +364,6 @@ public class SearchActivity extends BaseActivity {
 | 
			
		||||
            intent.putExtra(SearchUsersResultActivity.EXTRA_QUERY, query);
 | 
			
		||||
            intent.putExtra(SearchUsersResultActivity.EXTRA_IS_MULTI_SELECTION, getIntent().getBooleanExtra(EXTRA_IS_MULTI_SELECTION, false));
 | 
			
		||||
            startActivityForResult(intent, USER_SEARCH_REQUEST_CODE);
 | 
			
		||||
        } else if (query.startsWith("http://") || query.startsWith("https://")) {
 | 
			
		||||
            Intent intent = new Intent(this, LinkResolverActivity.class);
 | 
			
		||||
            intent.setData(Uri.parse(query));
 | 
			
		||||
            startActivity(intent);
 | 
			
		||||
            finish();
 | 
			
		||||
        } else {
 | 
			
		||||
            Intent intent = new Intent(SearchActivity.this, SearchResultActivity.class);
 | 
			
		||||
            intent.putExtra(SearchResultActivity.EXTRA_QUERY, query);
 | 
			
		||||
@@ -405,7 +377,6 @@ public class SearchActivity extends BaseActivity {
 | 
			
		||||
            }
 | 
			
		||||
            startActivity(intent);
 | 
			
		||||
            finish();
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -430,7 +401,6 @@ public class SearchActivity extends BaseActivity {
 | 
			
		||||
        linkHandlerImageView.setColorFilter(mCustomThemeWrapper.getToolbarPrimaryTextAndIconColor(), android.graphics.PorterDuff.Mode.SRC_IN);
 | 
			
		||||
        int colorAccent = mCustomThemeWrapper.getColorAccent();
 | 
			
		||||
        searchInTextView.setTextColor(colorAccent);
 | 
			
		||||
        deleteAllSearchesButton.setIconTint(ColorStateList.valueOf(mCustomThemeWrapper.getPrimaryIconColor()));
 | 
			
		||||
        subredditNameTextView.setTextColor(mCustomThemeWrapper.getPrimaryTextColor());
 | 
			
		||||
        divider.setBackgroundColor(mCustomThemeWrapper.getDividerColor());
 | 
			
		||||
        if (typeface != null) {
 | 
			
		||||
@@ -476,7 +446,7 @@ public class SearchActivity extends BaseActivity {
 | 
			
		||||
            } else if (requestCode == SUBREDDIT_SEARCH_REQUEST_CODE) {
 | 
			
		||||
                Intent returnIntent = new Intent();
 | 
			
		||||
                if (getIntent().getBooleanExtra(EXTRA_IS_MULTI_SELECTION, false)) {
 | 
			
		||||
                    returnIntent.putParcelableArrayListExtra(RETURN_EXTRA_SELECTED_SUBREDDIT_NAMES, data.getParcelableArrayListExtra(SearchSubredditsResultActivity.RETURN_EXTRA_SELECTED_SUBREDDIT_NAMES));
 | 
			
		||||
                    returnIntent.putStringArrayListExtra(RETURN_EXTRA_SELECTED_SUBREDDIT_NAMES, data.getStringArrayListExtra(SearchSubredditsResultActivity.RETURN_EXTRA_SELECTED_SUBREDDIT_NAMES));
 | 
			
		||||
                } else {
 | 
			
		||||
                    SubscribedSubredditData communityData = data.getParcelableExtra(SearchSubredditsResultActivity.EXTRA_RETURN_SUBREDDIT_NAME);
 | 
			
		||||
                    String iconUrl = data.getStringExtra(SearchSubredditsResultActivity.EXTRA_RETURN_SUBREDDIT_ICON_URL);
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,6 @@ import org.greenrobot.eventbus.EventBus;
 | 
			
		||||
import org.greenrobot.eventbus.Subscribe;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.concurrent.Executor;
 | 
			
		||||
 | 
			
		||||
import javax.inject.Inject;
 | 
			
		||||
import javax.inject.Named;
 | 
			
		||||
@@ -59,13 +58,13 @@ import eu.toldi.infinityforlemmy.bottomsheetfragments.FABMoreOptionsBottomSheetF
 | 
			
		||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.PostLayoutBottomSheetFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.PostTypeBottomSheetFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.RandomBottomSheetFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.SearchPostSortTypeBottomSheetFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.SearchUserAndSubredditSortTypeBottomSheetFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.SortTimeBottomSheetFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.SortTypeBottomSheetFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.slidr.Slidr;
 | 
			
		||||
import eu.toldi.infinityforlemmy.events.ChangeNSFWEvent;
 | 
			
		||||
import eu.toldi.infinityforlemmy.events.SwitchAccountEvent;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.CommentsListingFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.PostFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.SubredditListingFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.UserListingFragment;
 | 
			
		||||
@@ -131,11 +130,10 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect
 | 
			
		||||
    SharedPreferences mCurrentAccountSharedPreferences;
 | 
			
		||||
    @Inject
 | 
			
		||||
    CustomThemeWrapper mCustomThemeWrapper;
 | 
			
		||||
    @Inject
 | 
			
		||||
    Executor executor;
 | 
			
		||||
    private Call<String> subredditAutocompleteCall;
 | 
			
		||||
    private String mAccessToken;
 | 
			
		||||
    private String mAccountName;
 | 
			
		||||
 | 
			
		||||
    private String mAccountQualifiedName;
 | 
			
		||||
    private String mQuery;
 | 
			
		||||
    private String mSubredditName;
 | 
			
		||||
@@ -246,7 +244,7 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect
 | 
			
		||||
    private void bindView(Bundle savedInstanceState) {
 | 
			
		||||
        sectionsPagerAdapter = new SectionsPagerAdapter(this);
 | 
			
		||||
        viewPager2.setAdapter(sectionsPagerAdapter);
 | 
			
		||||
        viewPager2.setOffscreenPageLimit(ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT);
 | 
			
		||||
        viewPager2.setOffscreenPageLimit(3);
 | 
			
		||||
        viewPager2.setUserInputEnabled(!mSharedPreferences.getBoolean(SharedPreferencesUtils.DISABLE_SWIPING_BETWEEN_TABS, false));
 | 
			
		||||
        viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
 | 
			
		||||
            @Override
 | 
			
		||||
@@ -271,9 +269,6 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect
 | 
			
		||||
                case 2:
 | 
			
		||||
                    Utils.setTitleWithCustomFontToTab(typeface, tab, getString(R.string.users));
 | 
			
		||||
                    break;
 | 
			
		||||
                case 3:
 | 
			
		||||
                    Utils.setTitleWithCustomFontToTab(typeface, tab, getString(R.string.comments));
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        }).attach();
 | 
			
		||||
        fixViewPager2Sensitivity(viewPager2);
 | 
			
		||||
@@ -339,7 +334,7 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect
 | 
			
		||||
                case SharedPreferencesUtils.OTHER_ACTIVITIES_BOTTOM_APP_BAR_FAB_CHANGE_SORT_TYPE: {
 | 
			
		||||
                    Fragment fragment = sectionsPagerAdapter.getCurrentFragment();
 | 
			
		||||
                    if (fragment instanceof PostFragment) {
 | 
			
		||||
                        SortTypeBottomSheetFragment searchPostSortTypeBottomSheetFragment = SortTypeBottomSheetFragment.getNewInstance(SortTypeBottomSheetFragment.PAGE_TYPE_SEARCH,((PostFragment) fragment).getSortType());
 | 
			
		||||
                        SearchPostSortTypeBottomSheetFragment searchPostSortTypeBottomSheetFragment = SearchPostSortTypeBottomSheetFragment.getNewInstance(((PostFragment) fragment).getSortType());
 | 
			
		||||
                        searchPostSortTypeBottomSheetFragment.show(getSupportFragmentManager(), searchPostSortTypeBottomSheetFragment.getTag());
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
@@ -397,26 +392,25 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        if (mAccountName != null && mSharedPreferences.getBoolean(SharedPreferencesUtils.ENABLE_SEARCH_HISTORY, true) && !mInsertSearchQuerySuccess && mQuery != null) {
 | 
			
		||||
            InsertRecentSearchQuery.insertRecentSearchQueryListener(executor, new Handler(getMainLooper()),
 | 
			
		||||
                    mRedditDataRoomDatabase, mAccountQualifiedName, mQuery, () -> mInsertSearchQuerySuccess = true);
 | 
			
		||||
            InsertRecentSearchQuery.insertRecentSearchQueryListener(mRedditDataRoomDatabase, mAccountQualifiedName,
 | 
			
		||||
                    mQuery, () -> mInsertSearchQuerySuccess = true);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void displaySortTypeBottomSheetFragment() {
 | 
			
		||||
        Fragment fragment = sectionsPagerAdapter.getCurrentFragment();
 | 
			
		||||
        if (fragment instanceof PostFragment) {
 | 
			
		||||
            SortTypeBottomSheetFragment searchPostSortTypeBottomSheetFragment = SortTypeBottomSheetFragment.getNewInstance(SortTypeBottomSheetFragment.PAGE_TYPE_SEARCH,((PostFragment) fragment).getSortType());
 | 
			
		||||
            SearchPostSortTypeBottomSheetFragment searchPostSortTypeBottomSheetFragment = SearchPostSortTypeBottomSheetFragment.getNewInstance(((PostFragment) fragment).getSortType());
 | 
			
		||||
            searchPostSortTypeBottomSheetFragment.show(getSupportFragmentManager(), searchPostSortTypeBottomSheetFragment.getTag());
 | 
			
		||||
        } else {
 | 
			
		||||
            if (fragment instanceof SubredditListingFragment) {
 | 
			
		||||
                SortTypeBottomSheetFragment searchPostSortTypeBottomSheetFragment = SortTypeBottomSheetFragment.getNewInstance(SortTypeBottomSheetFragment.PAGE_TYPE_SEARCH,((SubredditListingFragment) fragment).getSortType());
 | 
			
		||||
                searchPostSortTypeBottomSheetFragment.show(getSupportFragmentManager(), searchPostSortTypeBottomSheetFragment.getTag());
 | 
			
		||||
                SearchUserAndSubredditSortTypeBottomSheetFragment searchUserAndSubredditSortTypeBottomSheetFragment
 | 
			
		||||
                        = SearchUserAndSubredditSortTypeBottomSheetFragment.getNewInstance(viewPager2.getCurrentItem(), ((SubredditListingFragment) fragment).getSortType());
 | 
			
		||||
                searchUserAndSubredditSortTypeBottomSheetFragment.show(getSupportFragmentManager(), searchUserAndSubredditSortTypeBottomSheetFragment.getTag());
 | 
			
		||||
            } else if (fragment instanceof UserListingFragment) {
 | 
			
		||||
                SortTypeBottomSheetFragment searchPostSortTypeBottomSheetFragment = SortTypeBottomSheetFragment.getNewInstance(SortTypeBottomSheetFragment.PAGE_TYPE_SEARCH,((UserListingFragment) fragment).getSortType());
 | 
			
		||||
                searchPostSortTypeBottomSheetFragment.show(getSupportFragmentManager(), searchPostSortTypeBottomSheetFragment.getTag());
 | 
			
		||||
            } else if (fragment instanceof CommentsListingFragment) {
 | 
			
		||||
                SortTypeBottomSheetFragment searchPostSortTypeBottomSheetFragment = SortTypeBottomSheetFragment.getNewInstance(SortTypeBottomSheetFragment.PAGE_TYPE_SEARCH,((CommentsListingFragment) fragment).getSortType());
 | 
			
		||||
                searchPostSortTypeBottomSheetFragment.show(getSupportFragmentManager(), searchPostSortTypeBottomSheetFragment.getTag());
 | 
			
		||||
                SearchUserAndSubredditSortTypeBottomSheetFragment searchUserAndSubredditSortTypeBottomSheetFragment
 | 
			
		||||
                        = SearchUserAndSubredditSortTypeBottomSheetFragment.getNewInstance(viewPager2.getCurrentItem(), ((UserListingFragment) fragment).getSortType());
 | 
			
		||||
                searchUserAndSubredditSortTypeBottomSheetFragment.show(getSupportFragmentManager(), searchUserAndSubredditSortTypeBottomSheetFragment.getTag());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -476,6 +470,7 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect
 | 
			
		||||
        if (sectionsPagerAdapter != null) {
 | 
			
		||||
            sectionsPagerAdapter.changeSortType(sortType);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -779,7 +774,7 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect
 | 
			
		||||
                    bundle.putString(PostFragment.EXTRA_QUERY, mQuery);
 | 
			
		||||
                    bundle.putString(PostFragment.EXTRA_TRENDING_SOURCE, getIntent().getStringExtra(EXTRA_TRENDING_SOURCE));
 | 
			
		||||
                    bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
 | 
			
		||||
                    bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountQualifiedName);
 | 
			
		||||
                    bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountName);
 | 
			
		||||
                    mFragment.setArguments(bundle);
 | 
			
		||||
                    return mFragment;
 | 
			
		||||
                }
 | 
			
		||||
@@ -794,7 +789,7 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect
 | 
			
		||||
                    mFragment.setArguments(bundle);
 | 
			
		||||
                    return mFragment;
 | 
			
		||||
                }
 | 
			
		||||
                case 2: {
 | 
			
		||||
                default: {
 | 
			
		||||
                    UserListingFragment mFragment = new UserListingFragment();
 | 
			
		||||
                    Bundle bundle = new Bundle();
 | 
			
		||||
                    bundle.putString(UserListingFragment.EXTRA_QUERY, mQuery);
 | 
			
		||||
@@ -804,15 +799,6 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect
 | 
			
		||||
                    mFragment.setArguments(bundle);
 | 
			
		||||
                    return mFragment;
 | 
			
		||||
                }
 | 
			
		||||
                default: {
 | 
			
		||||
                    CommentsListingFragment mFragment = new CommentsListingFragment();
 | 
			
		||||
                    Bundle bundle = new Bundle();
 | 
			
		||||
                    bundle.putString(CommentsListingFragment.EXTRA_SEARCH_QUERY, mQuery);
 | 
			
		||||
                    bundle.putString(CommentsListingFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
 | 
			
		||||
                    bundle.putString(CommentsListingFragment.EXTRA_ACCOUNT_NAME, mAccountName);
 | 
			
		||||
                    mFragment.setArguments(bundle);
 | 
			
		||||
                    return mFragment;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -837,19 +823,9 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect
 | 
			
		||||
 | 
			
		||||
        void changeSortType(SortType sortType) {
 | 
			
		||||
            Fragment fragment = getCurrentFragment();
 | 
			
		||||
 | 
			
		||||
            if (fragment instanceof PostFragment) {
 | 
			
		||||
                ((PostFragment) fragment).changeSortType(sortType);
 | 
			
		||||
                displaySortTypeInToolbar();
 | 
			
		||||
            } else if (fragment instanceof SubredditListingFragment) {
 | 
			
		||||
                ((SubredditListingFragment) fragment).changeSortType(sortType);
 | 
			
		||||
                displaySortTypeInToolbar();
 | 
			
		||||
            } else if (fragment instanceof UserListingFragment) {
 | 
			
		||||
                ((UserListingFragment) fragment).changeSortType(sortType);
 | 
			
		||||
                displaySortTypeInToolbar();
 | 
			
		||||
            } else if (fragment instanceof CommentsListingFragment) {
 | 
			
		||||
                ((CommentsListingFragment) fragment).changeSortType(sortType);
 | 
			
		||||
                displaySortTypeInToolbar();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -892,8 +868,6 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect
 | 
			
		||||
                ((SubredditListingFragment) fragment).goBackToTop();
 | 
			
		||||
            } else if (fragment instanceof UserListingFragment) {
 | 
			
		||||
                ((UserListingFragment) fragment).goBackToTop();
 | 
			
		||||
            } else if (fragment instanceof CommentsListingFragment) {
 | 
			
		||||
                ((CommentsListingFragment) fragment).goBackToTop();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -908,9 +882,6 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect
 | 
			
		||||
            } else if (fragment instanceof UserListingFragment) {
 | 
			
		||||
                SortType sortType = ((UserListingFragment) fragment).getSortType();
 | 
			
		||||
                Utils.displaySortTypeInToolbar(sortType, toolbar);
 | 
			
		||||
            } else if (fragment instanceof CommentsListingFragment) {
 | 
			
		||||
                SortType sortType = ((CommentsListingFragment) fragment).getSortType();
 | 
			
		||||
                Utils.displaySortTypeInToolbar(sortType, toolbar);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -930,7 +901,7 @@ public class SearchResultActivity extends BaseActivity implements SortTypeSelect
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public int getItemCount() {
 | 
			
		||||
            return 4;
 | 
			
		||||
            return 3;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -35,7 +35,6 @@ import eu.toldi.infinityforlemmy.customviews.slidr.Slidr;
 | 
			
		||||
import eu.toldi.infinityforlemmy.events.SwitchAccountEvent;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.SubredditListingFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subreddit.SubredditData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subreddit.SubredditWithSelection;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subscribedsubreddit.SubscribedSubredditData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
 | 
			
		||||
 | 
			
		||||
@@ -172,9 +171,9 @@ public class SearchSubredditsResultActivity extends BaseActivity implements Acti
 | 
			
		||||
            return true;
 | 
			
		||||
        } else if (item.getItemId() == R.id.action_save_search_subreddits_result_activity) {
 | 
			
		||||
            if (mFragment != null) {
 | 
			
		||||
                ArrayList<SubredditWithSelection> selectedSubredditNames = ((SubredditListingFragment) mFragment).getSelectedSubredditNames();
 | 
			
		||||
                ArrayList<String> selectedSubredditNames = ((SubredditListingFragment) mFragment).getSelectedSubredditNames();
 | 
			
		||||
                Intent returnIntent = new Intent();
 | 
			
		||||
                returnIntent.putParcelableArrayListExtra(RETURN_EXTRA_SELECTED_SUBREDDIT_NAMES, selectedSubredditNames);
 | 
			
		||||
                returnIntent.putStringArrayListExtra(RETURN_EXTRA_SELECTED_SUBREDDIT_NAMES, selectedSubredditNames);
 | 
			
		||||
                setResult(Activity.RESULT_OK, returnIntent);
 | 
			
		||||
                finish();
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -138,7 +138,7 @@ public class SelectUserFlairActivity extends BaseActivity implements ActivityToo
 | 
			
		||||
                flairEditText.requestFocus();
 | 
			
		||||
                Utils.showKeyboard(this, new Handler(), flairEditText);
 | 
			
		||||
                new MaterialAlertDialogBuilder(this, R.style.MaterialAlertDialogTheme)
 | 
			
		||||
                        .setTitle("")
 | 
			
		||||
                        .setTitle(R.string.edit_flair)
 | 
			
		||||
                        .setView(dialogView)
 | 
			
		||||
                        .setPositiveButton(R.string.ok, (dialogInterface, i)
 | 
			
		||||
                                -> {
 | 
			
		||||
@@ -156,13 +156,13 @@ public class SelectUserFlairActivity extends BaseActivity implements ActivityToo
 | 
			
		||||
            } else {
 | 
			
		||||
                if (userFlair == null) {
 | 
			
		||||
                    new MaterialAlertDialogBuilder(this, R.style.MaterialAlertDialogTheme)
 | 
			
		||||
                            .setTitle("")
 | 
			
		||||
                            .setTitle(R.string.clear_user_flair)
 | 
			
		||||
                            .setPositiveButton(R.string.yes, (dialogInterface, i) -> selectUserFlair(userFlair))
 | 
			
		||||
                            .setNegativeButton(R.string.no, null)
 | 
			
		||||
                            .show();
 | 
			
		||||
                } else {
 | 
			
		||||
                    new MaterialAlertDialogBuilder(this, R.style.MaterialAlertDialogTheme)
 | 
			
		||||
                            .setTitle("")
 | 
			
		||||
                            .setTitle(R.string.select_this_user_flair)
 | 
			
		||||
                            .setMessage(userFlair.getText())
 | 
			
		||||
                            .setPositiveButton(R.string.yes, (dialogInterface, i) -> selectUserFlair(userFlair))
 | 
			
		||||
                            .setNegativeButton(R.string.no, null)
 | 
			
		||||
@@ -181,9 +181,9 @@ public class SelectUserFlairActivity extends BaseActivity implements ActivityToo
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void success() {
 | 
			
		||||
                        if (userFlair == null) {
 | 
			
		||||
                            Toast.makeText(SelectUserFlairActivity.this, "", Toast.LENGTH_SHORT).show();
 | 
			
		||||
                            Toast.makeText(SelectUserFlairActivity.this, R.string.clear_user_flair_success, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                        } else {
 | 
			
		||||
                            Toast.makeText(SelectUserFlairActivity.this, "", Toast.LENGTH_SHORT).show();
 | 
			
		||||
                            Toast.makeText(SelectUserFlairActivity.this, R.string.select_user_flair_success, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                        }
 | 
			
		||||
                        finish();
 | 
			
		||||
                    }
 | 
			
		||||
@@ -192,9 +192,9 @@ public class SelectUserFlairActivity extends BaseActivity implements ActivityToo
 | 
			
		||||
                    public void failed(String errorMessage) {
 | 
			
		||||
                        if (errorMessage == null || errorMessage.equals("")) {
 | 
			
		||||
                            if (userFlair == null) {
 | 
			
		||||
                                Snackbar.make(coordinatorLayout, "", Snackbar.LENGTH_SHORT).show();
 | 
			
		||||
                                Snackbar.make(coordinatorLayout, R.string.clear_user_flair_success, Snackbar.LENGTH_SHORT).show();
 | 
			
		||||
                            } else {
 | 
			
		||||
                                Snackbar.make(coordinatorLayout, "", Snackbar.LENGTH_SHORT).show();
 | 
			
		||||
                                Snackbar.make(coordinatorLayout, R.string.select_user_flair_success, Snackbar.LENGTH_SHORT).show();
 | 
			
		||||
                            }
 | 
			
		||||
                        } else {
 | 
			
		||||
                            Snackbar.make(coordinatorLayout, errorMessage, Snackbar.LENGTH_SHORT).show();
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,7 @@ import com.google.android.material.appbar.CollapsingToolbarLayout;
 | 
			
		||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
 | 
			
		||||
import javax.inject.Inject;
 | 
			
		||||
import javax.inject.Named;
 | 
			
		||||
@@ -28,10 +29,10 @@ import eu.toldi.infinityforlemmy.ActivityToolbarInterface;
 | 
			
		||||
import eu.toldi.infinityforlemmy.Infinity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.R;
 | 
			
		||||
import eu.toldi.infinityforlemmy.adapters.SelectedSubredditsRecyclerViewAdapter;
 | 
			
		||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.SelectSubredditsOrUsersOptionsBottomSheetFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.LinearLayoutManagerBugFixed;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.slidr.Slidr;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subreddit.SubredditWithSelection;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
 | 
			
		||||
 | 
			
		||||
public class SelectedSubredditsAndUsersActivity extends BaseActivity implements ActivityToolbarInterface {
 | 
			
		||||
@@ -61,7 +62,7 @@ public class SelectedSubredditsAndUsersActivity extends BaseActivity implements
 | 
			
		||||
    CustomThemeWrapper mCustomThemeWrapper;
 | 
			
		||||
    private LinearLayoutManagerBugFixed linearLayoutManager;
 | 
			
		||||
    private SelectedSubredditsRecyclerViewAdapter adapter;
 | 
			
		||||
    private ArrayList<SubredditWithSelection> subreddits;
 | 
			
		||||
    private ArrayList<String> subreddits;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onCreate(Bundle savedInstanceState) {
 | 
			
		||||
@@ -85,11 +86,12 @@ public class SelectedSubredditsAndUsersActivity extends BaseActivity implements
 | 
			
		||||
        setToolbarGoToTop(toolbar);
 | 
			
		||||
 | 
			
		||||
        if (savedInstanceState != null) {
 | 
			
		||||
            subreddits = savedInstanceState.getParcelableArrayList(SELECTED_SUBREDDITS_STATE);
 | 
			
		||||
            subreddits = savedInstanceState.getStringArrayList(SELECTED_SUBREDDITS_STATE);
 | 
			
		||||
        } else {
 | 
			
		||||
            subreddits = getIntent().getParcelableArrayListExtra(EXTRA_SELECTED_SUBREDDITS);
 | 
			
		||||
            subreddits = getIntent().getStringArrayListExtra(EXTRA_SELECTED_SUBREDDITS);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Collections.sort(subreddits);
 | 
			
		||||
 | 
			
		||||
        adapter = new SelectedSubredditsRecyclerViewAdapter(this, mCustomThemeWrapper, subreddits);
 | 
			
		||||
        linearLayoutManager = new LinearLayoutManagerBugFixed(this);
 | 
			
		||||
@@ -108,7 +110,8 @@ public class SelectedSubredditsAndUsersActivity extends BaseActivity implements
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        fab.setOnClickListener(view -> {
 | 
			
		||||
            selectSubreddits();
 | 
			
		||||
            SelectSubredditsOrUsersOptionsBottomSheetFragment selectSubredditsOrUsersOptionsBottomSheetFragment = new SelectSubredditsOrUsersOptionsBottomSheetFragment();
 | 
			
		||||
            selectSubredditsOrUsersOptionsBottomSheetFragment.show(getSupportFragmentManager(), selectSubredditsOrUsersOptionsBottomSheetFragment.getTag());
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -155,7 +158,7 @@ public class SelectedSubredditsAndUsersActivity extends BaseActivity implements
 | 
			
		||||
                    if (subreddits == null) {
 | 
			
		||||
                        subreddits = new ArrayList<>();
 | 
			
		||||
                    }
 | 
			
		||||
                    subreddits = data.getParcelableArrayListExtra(SubredditMultiselectionActivity.EXTRA_RETURN_SELECTED_SUBREDDITS);
 | 
			
		||||
                    subreddits = data.getStringArrayListExtra(SubredditMultiselectionActivity.EXTRA_RETURN_SELECTED_SUBREDDITS);
 | 
			
		||||
                    adapter.addSubreddits(subreddits);
 | 
			
		||||
                }
 | 
			
		||||
            } else if (requestCode == USER_SELECTION_REQUEST_CODE) {
 | 
			
		||||
@@ -173,7 +176,7 @@ public class SelectedSubredditsAndUsersActivity extends BaseActivity implements
 | 
			
		||||
    protected void onSaveInstanceState(@NonNull Bundle outState) {
 | 
			
		||||
        super.onSaveInstanceState(outState);
 | 
			
		||||
        if (adapter != null) {
 | 
			
		||||
            outState.putParcelableArrayList(SELECTED_SUBREDDITS_STATE, adapter.getSubreddits());
 | 
			
		||||
            outState.putStringArrayList(SELECTED_SUBREDDITS_STATE, adapter.getSubreddits());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -81,7 +81,7 @@ public class SettingsActivity extends BaseActivity implements
 | 
			
		||||
 | 
			
		||||
        setSupportActionBar(binding.toolbarSettingsActivity);
 | 
			
		||||
 | 
			
		||||
        mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_QUALIFIED_NAME, null);
 | 
			
		||||
        mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_NAME, null);
 | 
			
		||||
 | 
			
		||||
        if (savedInstanceState == null) {
 | 
			
		||||
            getSupportFragmentManager()
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,7 @@ import com.google.android.material.button.MaterialButton;
 | 
			
		||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 | 
			
		||||
import com.google.android.material.materialswitch.MaterialSwitch;
 | 
			
		||||
import com.google.android.material.snackbar.Snackbar;
 | 
			
		||||
import eu.toldi.infinityforlemmy.CustomTextView;
 | 
			
		||||
import com.libRG.CustomTextView;
 | 
			
		||||
 | 
			
		||||
import org.greenrobot.eventbus.EventBus;
 | 
			
		||||
import org.greenrobot.eventbus.Subscribe;
 | 
			
		||||
@@ -71,7 +71,7 @@ import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
 | 
			
		||||
import pl.droidsonroids.gif.GifImageView;
 | 
			
		||||
import retrofit2.Retrofit;
 | 
			
		||||
 | 
			
		||||
public class SubmitCrosspostActivity extends BaseActivity implements
 | 
			
		||||
public class SubmitCrosspostActivity extends BaseActivity implements FlairBottomSheetFragment.FlairSelectionCallback,
 | 
			
		||||
        AccountChooserBottomSheetFragment.AccountChooserListener {
 | 
			
		||||
 | 
			
		||||
    public static final String EXTRA_POST = "EP";
 | 
			
		||||
@@ -110,6 +110,10 @@ public class SubmitCrosspostActivity extends BaseActivity implements
 | 
			
		||||
    MaterialButton rulesButton;
 | 
			
		||||
    @BindView(R.id.divider_1_submit_crosspost_activity)
 | 
			
		||||
    View divider1;
 | 
			
		||||
    @BindView(R.id.flair_custom_text_view_submit_crosspost_activity)
 | 
			
		||||
    CustomTextView flairTextView;
 | 
			
		||||
    @BindView(R.id.spoiler_custom_text_view_submit_crosspost_activity)
 | 
			
		||||
    CustomTextView spoilerTextView;
 | 
			
		||||
    @BindView(R.id.nsfw_custom_text_view_submit_crosspost_activity)
 | 
			
		||||
    CustomTextView nsfwTextView;
 | 
			
		||||
    @BindView(R.id.divider_2_submit_crosspost_activity)
 | 
			
		||||
@@ -238,6 +242,7 @@ public class SubmitCrosspostActivity extends BaseActivity implements
 | 
			
		||||
            if (subredditName != null) {
 | 
			
		||||
                subredditNameTextView.setTextColor(primaryTextColor);
 | 
			
		||||
                subredditNameTextView.setText(subredditName);
 | 
			
		||||
                flairTextView.setVisibility(View.VISIBLE);
 | 
			
		||||
                if (!loadSubredditIconSuccessful) {
 | 
			
		||||
                    loadSubredditIcon();
 | 
			
		||||
                }
 | 
			
		||||
@@ -248,6 +253,17 @@ public class SubmitCrosspostActivity extends BaseActivity implements
 | 
			
		||||
                mPostingSnackbar.show();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (flair != null) {
 | 
			
		||||
                flairTextView.setText(flair.getText());
 | 
			
		||||
                flairTextView.setBackgroundColor(flairBackgroundColor);
 | 
			
		||||
                flairTextView.setBorderColor(flairBackgroundColor);
 | 
			
		||||
                flairTextView.setTextColor(flairTextColor);
 | 
			
		||||
            }
 | 
			
		||||
            if (isSpoiler) {
 | 
			
		||||
                spoilerTextView.setBackgroundColor(spoilerBackgroundColor);
 | 
			
		||||
                spoilerTextView.setBorderColor(spoilerBackgroundColor);
 | 
			
		||||
                spoilerTextView.setTextColor(spoilerTextColor);
 | 
			
		||||
            }
 | 
			
		||||
            if (isNSFW) {
 | 
			
		||||
                nsfwTextView.setBackgroundColor(nsfwBackgroundColor);
 | 
			
		||||
                nsfwTextView.setBorderColor(nsfwBackgroundColor);
 | 
			
		||||
@@ -271,14 +287,13 @@ public class SubmitCrosspostActivity extends BaseActivity implements
 | 
			
		||||
            titleEditText.setText(post.getTitle());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (post.getPostType() == Post.TEXT_TYPE || post.getPostType() == Post.LINK_TYPE || post.getPostType() == Post.NO_PREVIEW_LINK_TYPE) {
 | 
			
		||||
        if (post.getPostType() == Post.TEXT_TYPE) {
 | 
			
		||||
            contentTextView.setVisibility(View.VISIBLE);
 | 
			
		||||
            contentTextView.setText(generateCrossPostText(post));
 | 
			
		||||
            contentTextView.setText(post.getSelfTextPlain());
 | 
			
		||||
        } else if (post.getPostType() == Post.LINK_TYPE || post.getPostType() == Post.NO_PREVIEW_LINK_TYPE) {
 | 
			
		||||
            contentTextView.setVisibility(View.VISIBLE);
 | 
			
		||||
            contentTextView.setText(post.getUrl());
 | 
			
		||||
        } else {
 | 
			
		||||
            if (post.getSelfTextPlain() != null && !post.getSelfTextPlain().equals("")) {
 | 
			
		||||
                contentTextView.setVisibility(View.VISIBLE);
 | 
			
		||||
                contentTextView.setText(generateCrossPostText(post));
 | 
			
		||||
            }
 | 
			
		||||
            Post.Preview preview = getPreview(post);
 | 
			
		||||
            if (preview != null) {
 | 
			
		||||
                frameLayout.setVisibility(View.VISIBLE);
 | 
			
		||||
@@ -333,6 +348,39 @@ public class SubmitCrosspostActivity extends BaseActivity implements
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        flairTextView.setOnClickListener(view -> {
 | 
			
		||||
            if (flair == null) {
 | 
			
		||||
                flairSelectionBottomSheetFragment = new FlairBottomSheetFragment();
 | 
			
		||||
                Bundle bundle = new Bundle();
 | 
			
		||||
                bundle.putString(FlairBottomSheetFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
 | 
			
		||||
                if (subredditIsUser) {
 | 
			
		||||
                    bundle.putString(FlairBottomSheetFragment.EXTRA_SUBREDDIT_NAME, "u_" + subredditName);
 | 
			
		||||
                } else {
 | 
			
		||||
                    bundle.putString(FlairBottomSheetFragment.EXTRA_SUBREDDIT_NAME, subredditName);
 | 
			
		||||
                }
 | 
			
		||||
                flairSelectionBottomSheetFragment.setArguments(bundle);
 | 
			
		||||
                flairSelectionBottomSheetFragment.show(getSupportFragmentManager(), flairSelectionBottomSheetFragment.getTag());
 | 
			
		||||
            } else {
 | 
			
		||||
                flairTextView.setBackgroundColor(resources.getColor(android.R.color.transparent));
 | 
			
		||||
                flairTextView.setTextColor(primaryTextColor);
 | 
			
		||||
                flairTextView.setText(getString(R.string.flair));
 | 
			
		||||
                flair = null;
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        spoilerTextView.setOnClickListener(view -> {
 | 
			
		||||
            if (!isSpoiler) {
 | 
			
		||||
                spoilerTextView.setBackgroundColor(spoilerBackgroundColor);
 | 
			
		||||
                spoilerTextView.setBorderColor(spoilerBackgroundColor);
 | 
			
		||||
                spoilerTextView.setTextColor(spoilerTextColor);
 | 
			
		||||
                isSpoiler = true;
 | 
			
		||||
            } else {
 | 
			
		||||
                spoilerTextView.setBackgroundColor(resources.getColor(android.R.color.transparent));
 | 
			
		||||
                spoilerTextView.setTextColor(primaryTextColor);
 | 
			
		||||
                isSpoiler = false;
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        nsfwTextView.setOnClickListener(view -> {
 | 
			
		||||
            if (!isNSFW) {
 | 
			
		||||
                nsfwTextView.setBackgroundColor(nsfwBackgroundColor);
 | 
			
		||||
@@ -412,6 +460,8 @@ public class SubmitCrosspostActivity extends BaseActivity implements
 | 
			
		||||
        spoilerTextColor = mCustomThemeWrapper.getSpoilerTextColor();
 | 
			
		||||
        nsfwBackgroundColor = mCustomThemeWrapper.getNsfwBackgroundColor();
 | 
			
		||||
        nsfwTextColor = mCustomThemeWrapper.getNsfwTextColor();
 | 
			
		||||
        flairTextView.setTextColor(primaryTextColor);
 | 
			
		||||
        spoilerTextView.setTextColor(primaryTextColor);
 | 
			
		||||
        nsfwTextView.setTextColor(primaryTextColor);
 | 
			
		||||
        titleEditText.setTextColor(primaryTextColor);
 | 
			
		||||
        titleEditText.setHintTextColor(secondaryTextColor);
 | 
			
		||||
@@ -423,6 +473,8 @@ public class SubmitCrosspostActivity extends BaseActivity implements
 | 
			
		||||
            subredditNameTextView.setTypeface(typeface);
 | 
			
		||||
            rulesButton.setTypeface(typeface);
 | 
			
		||||
            receivePostReplyNotificationsTextView.setTypeface(typeface);
 | 
			
		||||
            flairTextView.setTypeface(typeface);
 | 
			
		||||
            spoilerTextView.setTypeface(typeface);
 | 
			
		||||
            nsfwTextView.setTypeface(typeface);
 | 
			
		||||
            titleEditText.setTypeface(typeface);
 | 
			
		||||
        }
 | 
			
		||||
@@ -509,19 +561,22 @@ public class SubmitCrosspostActivity extends BaseActivity implements
 | 
			
		||||
 | 
			
		||||
            mPostingSnackbar.show();
 | 
			
		||||
 | 
			
		||||
            String subredditName = subredditNameTextView.getText().toString();
 | 
			
		||||
 | 
			
		||||
            String subredditName;
 | 
			
		||||
            if (subredditIsUser) {
 | 
			
		||||
                subredditName = "u_" + subredditNameTextView.getText().toString();
 | 
			
		||||
            } else {
 | 
			
		||||
                subredditName = subredditNameTextView.getText().toString();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Intent intent = new Intent(this, SubmitPostService.class);
 | 
			
		||||
            intent.putExtra(SubmitPostService.EXTRA_ACCOUNT, selectedAccount);
 | 
			
		||||
            intent.putExtra(SubmitPostService.EXTRA_SUBREDDIT_NAME, communityData.getId());
 | 
			
		||||
            intent.putExtra(SubmitPostService.EXTRA_TITLE, titleEditText.getText().toString());
 | 
			
		||||
 | 
			
		||||
            intent.putExtra(SubmitPostService.EXTRA_BODY, generateCrossPostText(post));
 | 
			
		||||
            if (post.getUrl() != null && !post.getUrl().equals("")) {
 | 
			
		||||
                intent.putExtra(SubmitPostService.EXTRA_URL, post.getUrl());
 | 
			
		||||
            if (post.isCrosspost()) {
 | 
			
		||||
                intent.putExtra(SubmitPostService.EXTRA_BODY, "t3_" + post.getCrosspostParentId());
 | 
			
		||||
            } else {
 | 
			
		||||
                intent.putExtra(SubmitPostService.EXTRA_BODY, post.getFullName());
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            intent.putExtra(SubmitPostService.EXTRA_KIND, APIUtils.KIND_CROSSPOST);
 | 
			
		||||
            intent.putExtra(SubmitPostService.EXTRA_FLAIR, flair);
 | 
			
		||||
            intent.putExtra(SubmitPostService.EXTRA_IS_SPOILER, isSpoiler);
 | 
			
		||||
@@ -580,6 +635,10 @@ public class SubmitCrosspostActivity extends BaseActivity implements
 | 
			
		||||
                subredditNameTextView.setText(subredditName);
 | 
			
		||||
                displaySubredditIcon();
 | 
			
		||||
 | 
			
		||||
                flairTextView.setVisibility(View.VISIBLE);
 | 
			
		||||
                flairTextView.setBackgroundColor(resources.getColor(android.R.color.transparent));
 | 
			
		||||
                flairTextView.setTextColor(primaryTextColor);
 | 
			
		||||
                flairTextView.setText(getString(R.string.flair));
 | 
			
		||||
                flair = null;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -591,6 +650,14 @@ public class SubmitCrosspostActivity extends BaseActivity implements
 | 
			
		||||
        super.onDestroy();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void flairSelected(Flair flair) {
 | 
			
		||||
        this.flair = flair;
 | 
			
		||||
        flairTextView.setText(flair.getText());
 | 
			
		||||
        flairTextView.setBackgroundColor(flairBackgroundColor);
 | 
			
		||||
        flairTextView.setBorderColor(flairBackgroundColor);
 | 
			
		||||
        flairTextView.setTextColor(flairTextColor);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onAccountSelected(Account account) {
 | 
			
		||||
@@ -632,15 +699,4 @@ public class SubmitCrosspostActivity extends BaseActivity implements
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static String generateCrossPostText(Post post) {
 | 
			
		||||
        StringBuilder stringBuilder = new StringBuilder();
 | 
			
		||||
        stringBuilder.append("cross-posted from: ").append(post.getPermalink()).append("\n");
 | 
			
		||||
        String[] lines = post.getSelfTextPlain().split("\n");
 | 
			
		||||
        for (String line : lines) {
 | 
			
		||||
            stringBuilder.append("> ").append(line).append("\n");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return stringBuilder.toString();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -37,14 +37,13 @@ import eu.toldi.infinityforlemmy.ActivityToolbarInterface;
 | 
			
		||||
import eu.toldi.infinityforlemmy.Infinity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.R;
 | 
			
		||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
 | 
			
		||||
import eu.toldi.infinityforlemmy.RetrofitHolder;
 | 
			
		||||
import eu.toldi.infinityforlemmy.adapters.SubredditMultiselectionRecyclerViewAdapter;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.LinearLayoutManagerBugFixed;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.slidr.Slidr;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subreddit.SubredditWithSelection;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subscribedsubreddit.SubscribedSubredditViewModel;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
 | 
			
		||||
import retrofit2.Retrofit;
 | 
			
		||||
 | 
			
		||||
public class SubredditMultiselectionActivity extends BaseActivity implements ActivityToolbarInterface {
 | 
			
		||||
 | 
			
		||||
@@ -71,8 +70,8 @@ public class SubredditMultiselectionActivity extends BaseActivity implements Act
 | 
			
		||||
    @BindView(R.id.error_text_view_subscribed_subreddits_multiselection_activity)
 | 
			
		||||
    TextView mErrorTextView;
 | 
			
		||||
    @Inject
 | 
			
		||||
    @Named("no_oauth")
 | 
			
		||||
    RetrofitHolder mRetrofit;
 | 
			
		||||
    @Named("oauth")
 | 
			
		||||
    Retrofit mOauthRetrofit;
 | 
			
		||||
    @Inject
 | 
			
		||||
    RedditDataRoomDatabase mRedditDataRoomDatabase;
 | 
			
		||||
    @Inject
 | 
			
		||||
@@ -132,7 +131,7 @@ public class SubredditMultiselectionActivity extends BaseActivity implements Act
 | 
			
		||||
 | 
			
		||||
        mSwipeRefreshLayout.setEnabled(false);
 | 
			
		||||
 | 
			
		||||
        mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_QUALIFIED_NAME, "-");
 | 
			
		||||
        mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_NAME, "-");
 | 
			
		||||
 | 
			
		||||
        bindView();
 | 
			
		||||
    }
 | 
			
		||||
@@ -151,7 +150,7 @@ public class SubredditMultiselectionActivity extends BaseActivity implements Act
 | 
			
		||||
            if (subscribedSubredditData == null || subscribedSubredditData.size() == 0) {
 | 
			
		||||
                mRecyclerView.setVisibility(View.GONE);
 | 
			
		||||
                mLinearLayout.setVisibility(View.VISIBLE);
 | 
			
		||||
                mGlide.load(R.mipmap.ic_launcher_round).into(mImageView);
 | 
			
		||||
                mGlide.load(R.drawable.error_image).into(mImageView);
 | 
			
		||||
            } else {
 | 
			
		||||
                mLinearLayout.setVisibility(View.GONE);
 | 
			
		||||
                mRecyclerView.setVisibility(View.VISIBLE);
 | 
			
		||||
@@ -178,7 +177,7 @@ public class SubredditMultiselectionActivity extends BaseActivity implements Act
 | 
			
		||||
        } else if (itemId == R.id.action_save_subreddit_multiselection_activity) {
 | 
			
		||||
            if (mAdapter != null) {
 | 
			
		||||
                Intent returnIntent = new Intent();
 | 
			
		||||
                returnIntent.putExtra(EXTRA_RETURN_SELECTED_SUBREDDITS,
 | 
			
		||||
                returnIntent.putStringArrayListExtra(EXTRA_RETURN_SELECTED_SUBREDDITS,
 | 
			
		||||
                        mAdapter.getAllSelectedSubreddits());
 | 
			
		||||
                setResult(RESULT_OK, returnIntent);
 | 
			
		||||
            }
 | 
			
		||||
@@ -199,12 +198,12 @@ public class SubredditMultiselectionActivity extends BaseActivity implements Act
 | 
			
		||||
        super.onActivityResult(requestCode, resultCode, data);
 | 
			
		||||
        if (requestCode == SUBREDDIT_SEARCH_REQUEST_CODE && resultCode == RESULT_OK && data != null && mAdapter != null) {
 | 
			
		||||
            Intent returnIntent = new Intent();
 | 
			
		||||
            ArrayList<SubredditWithSelection> selectedSubreddits = mAdapter.getAllSelectedSubreddits();
 | 
			
		||||
            ArrayList<SubredditWithSelection> searchedSubreddits = data.getParcelableArrayListExtra(SearchActivity.RETURN_EXTRA_SELECTED_SUBREDDIT_NAMES);
 | 
			
		||||
            ArrayList<String> selectedSubreddits = mAdapter.getAllSelectedSubreddits();
 | 
			
		||||
            ArrayList<String> searchedSubreddits = data.getStringArrayListExtra(SearchActivity.RETURN_EXTRA_SELECTED_SUBREDDIT_NAMES);
 | 
			
		||||
            if (searchedSubreddits != null) {
 | 
			
		||||
                selectedSubreddits.addAll(searchedSubreddits);
 | 
			
		||||
            }
 | 
			
		||||
            returnIntent.putParcelableArrayListExtra(EXTRA_RETURN_SELECTED_SUBREDDITS, selectedSubreddits);
 | 
			
		||||
            returnIntent.putStringArrayListExtra(EXTRA_RETURN_SELECTED_SUBREDDITS, selectedSubreddits);
 | 
			
		||||
            setResult(RESULT_OK, returnIntent);
 | 
			
		||||
            finish();
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -63,6 +63,7 @@ import eu.toldi.infinityforlemmy.events.SwitchAccountEvent;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.FollowedUsersListingFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.MultiRedditListingFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.SubscribedSubredditsListingFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.multireddit.DeleteMultiReddit;
 | 
			
		||||
import eu.toldi.infinityforlemmy.multireddit.FetchMyMultiReddits;
 | 
			
		||||
import eu.toldi.infinityforlemmy.multireddit.MultiReddit;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subreddit.SubredditData;
 | 
			
		||||
@@ -111,9 +112,6 @@ public class SubscribedThingListingActivity extends BaseActivity implements Acti
 | 
			
		||||
    @Named("current_account")
 | 
			
		||||
    SharedPreferences mCurrentAccountSharedPreferences;
 | 
			
		||||
    @Inject
 | 
			
		||||
    @Named("internal")
 | 
			
		||||
    SharedPreferences mInternalSharedPreferences;
 | 
			
		||||
    @Inject
 | 
			
		||||
    CustomThemeWrapper mCustomThemeWrapper;
 | 
			
		||||
    @Inject
 | 
			
		||||
    Executor mExecutor;
 | 
			
		||||
@@ -235,7 +233,7 @@ public class SubscribedThingListingActivity extends BaseActivity implements Acti
 | 
			
		||||
        sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
 | 
			
		||||
        viewPager.setAdapter(sectionsPagerAdapter);
 | 
			
		||||
        viewPager.setOffscreenPageLimit(1);
 | 
			
		||||
        if (viewPager.getCurrentItem() != 1) {
 | 
			
		||||
        if (viewPager.getCurrentItem() != 2) {
 | 
			
		||||
            fab.hide();
 | 
			
		||||
        }
 | 
			
		||||
        viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
 | 
			
		||||
@@ -246,7 +244,7 @@ public class SubscribedThingListingActivity extends BaseActivity implements Acti
 | 
			
		||||
                    fab.hide();
 | 
			
		||||
                } else {
 | 
			
		||||
                    lockSwipeRightToGoBack();
 | 
			
		||||
                    if (position != 1) {
 | 
			
		||||
                    if (position != 2) {
 | 
			
		||||
                        fab.hide();
 | 
			
		||||
                    } else {
 | 
			
		||||
                        fab.show();
 | 
			
		||||
@@ -257,7 +255,7 @@ public class SubscribedThingListingActivity extends BaseActivity implements Acti
 | 
			
		||||
        tabLayout.setupWithViewPager(viewPager);
 | 
			
		||||
 | 
			
		||||
        if (showMultiReddits) {
 | 
			
		||||
            viewPager.setCurrentItem(1, false);
 | 
			
		||||
            viewPager.setCurrentItem(2, false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        loadSubscriptions(false);
 | 
			
		||||
@@ -325,10 +323,6 @@ public class SubscribedThingListingActivity extends BaseActivity implements Acti
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void loadSubscriptions(boolean forceLoad) {
 | 
			
		||||
        if (!forceLoad && System.currentTimeMillis() - mInternalSharedPreferences.getLong(SharedPreferencesUtils.SUBSCRIBED_THINGS_SYNC_TIME, 0L) < 24 * 60 * 60 * 1000) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (mAccessToken != null && !(!forceLoad && mInsertSuccess)) {
 | 
			
		||||
            FetchSubscribedThing.fetchSubscribedThing(mRetrofit.getRetrofit(), mAccessToken, mAccountQualifiedName, null,
 | 
			
		||||
                    new ArrayList<>(), new ArrayList<>(),
 | 
			
		||||
@@ -338,7 +332,6 @@ public class SubscribedThingListingActivity extends BaseActivity implements Acti
 | 
			
		||||
                        public void onFetchSubscribedThingSuccess(ArrayList<SubscribedSubredditData> subscribedSubredditData,
 | 
			
		||||
                                                                  ArrayList<SubscribedUserData> subscribedUserData,
 | 
			
		||||
                                                                  ArrayList<SubredditData> subredditData) {
 | 
			
		||||
                            mInternalSharedPreferences.edit().putLong(SharedPreferencesUtils.SUBSCRIBED_THINGS_SYNC_TIME, System.currentTimeMillis()).apply();
 | 
			
		||||
                            InsertSubscribedThings.insertSubscribedThings(
 | 
			
		||||
                                    mExecutor,
 | 
			
		||||
                                    new Handler(),
 | 
			
		||||
@@ -385,7 +378,7 @@ public class SubscribedThingListingActivity extends BaseActivity implements Acti
 | 
			
		||||
            FetchMyMultiReddits.fetchMyMultiReddits(mOauthRetrofit, mAccessToken, new FetchMyMultiReddits.FetchMyMultiRedditsListener() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void success(ArrayList<MultiReddit> multiReddits) {
 | 
			
		||||
                    InsertMultireddit.insertMultireddits(mExecutor, new Handler(), mRedditDataRoomDatabase, multiReddits, mAccountQualifiedName, () -> {
 | 
			
		||||
                    InsertMultireddit.insertMultireddits(mExecutor, new Handler(), mRedditDataRoomDatabase, multiReddits, mAccountName, () -> {
 | 
			
		||||
                        mInsertMultiredditSuccess = true;
 | 
			
		||||
                        sectionsPagerAdapter.stopMultiRedditRefreshProgressbar();
 | 
			
		||||
                    });
 | 
			
		||||
@@ -407,11 +400,27 @@ public class SubscribedThingListingActivity extends BaseActivity implements Acti
 | 
			
		||||
                .setMessage(R.string.delete_multi_reddit_dialog_message)
 | 
			
		||||
                .setPositiveButton(R.string.delete, (dialogInterface, i)
 | 
			
		||||
                        -> {
 | 
			
		||||
                    if (mAccessToken == null) {
 | 
			
		||||
                        DeleteMultiredditInDatabase.deleteMultiredditInDatabase(mExecutor, new Handler(), mRedditDataRoomDatabase, mAccountName, multiReddit.getPath(),
 | 
			
		||||
                                () -> Toast.makeText(SubscribedThingListingActivity.this,
 | 
			
		||||
                                        R.string.delete_multi_reddit_success, Toast.LENGTH_SHORT).show());
 | 
			
		||||
                    } else {
 | 
			
		||||
                        DeleteMultiReddit.deleteMultiReddit(mExecutor, new Handler(), mOauthRetrofit, mRedditDataRoomDatabase,
 | 
			
		||||
                                mAccessToken, mAccountName, multiReddit.getPath(), new DeleteMultiReddit.DeleteMultiRedditListener() {
 | 
			
		||||
                                    @Override
 | 
			
		||||
                                    public void success() {
 | 
			
		||||
                                        Toast.makeText(SubscribedThingListingActivity.this,
 | 
			
		||||
                                                R.string.delete_multi_reddit_success, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                        //loadMultiReddits();
 | 
			
		||||
                                    }
 | 
			
		||||
 | 
			
		||||
                    DeleteMultiredditInDatabase.deleteMultiredditInDatabase(mExecutor, new Handler(), mRedditDataRoomDatabase, mAccountQualifiedName, multiReddit.getPath(),
 | 
			
		||||
                            () -> Toast.makeText(SubscribedThingListingActivity.this,
 | 
			
		||||
                                    R.string.delete_multi_reddit_success, Toast.LENGTH_SHORT).show());
 | 
			
		||||
 | 
			
		||||
                                    @Override
 | 
			
		||||
                                    public void failed() {
 | 
			
		||||
                                        Toast.makeText(SubscribedThingListingActivity.this,
 | 
			
		||||
                                                R.string.delete_multi_reddit_failed, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                    }
 | 
			
		||||
                                });
 | 
			
		||||
                    }
 | 
			
		||||
                })
 | 
			
		||||
                .setNegativeButton(R.string.cancel, null)
 | 
			
		||||
                .show();
 | 
			
		||||
@@ -467,7 +476,7 @@ public class SubscribedThingListingActivity extends BaseActivity implements Acti
 | 
			
		||||
        @Override
 | 
			
		||||
        public Fragment getItem(int position) {
 | 
			
		||||
            switch (position) {
 | 
			
		||||
 | 
			
		||||
                default:
 | 
			
		||||
                case 0: {
 | 
			
		||||
                    SubscribedSubredditsListingFragment fragment = new SubscribedSubredditsListingFragment();
 | 
			
		||||
                    Bundle bundle = new Bundle();
 | 
			
		||||
@@ -478,20 +487,12 @@ public class SubscribedThingListingActivity extends BaseActivity implements Acti
 | 
			
		||||
                    fragment.setArguments(bundle);
 | 
			
		||||
                    return fragment;
 | 
			
		||||
                }
 | 
			
		||||
                default: {
 | 
			
		||||
                    MultiRedditListingFragment fragment = new MultiRedditListingFragment();
 | 
			
		||||
                    Bundle bundle = new Bundle();
 | 
			
		||||
                    bundle.putString(MultiRedditListingFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
 | 
			
		||||
                    bundle.putString(MultiRedditListingFragment.EXTRA_ACCOUNT_NAME, mAccountName == null ? "-" : mAccountQualifiedName);
 | 
			
		||||
                    fragment.setArguments(bundle);
 | 
			
		||||
                    return fragment;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public int getCount() {
 | 
			
		||||
            return 2;
 | 
			
		||||
            return 1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
@@ -500,6 +501,8 @@ public class SubscribedThingListingActivity extends BaseActivity implements Acti
 | 
			
		||||
                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));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@@ -512,6 +515,8 @@ public class SubscribedThingListingActivity extends BaseActivity implements Acti
 | 
			
		||||
            Fragment fragment = (Fragment) super.instantiateItem(container, position);
 | 
			
		||||
            if (position == 0) {
 | 
			
		||||
                subscribedSubredditsListingFragment = (SubscribedSubredditsListingFragment) fragment;
 | 
			
		||||
            } else if (position == 1) {
 | 
			
		||||
                followedUsersListingFragment = (FollowedUsersListingFragment) fragment;
 | 
			
		||||
            } else {
 | 
			
		||||
                multiRedditListingFragment = (MultiRedditListingFragment) fragment;
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -278,7 +278,7 @@ public class TrendingActivity extends BaseActivity {
 | 
			
		||||
 | 
			
		||||
    private void showErrorView(int stringId) {
 | 
			
		||||
        errorLinearLayout.setVisibility(View.VISIBLE);
 | 
			
		||||
        mGlide.load(R.mipmap.ic_launcher_round).into(errorImageView);
 | 
			
		||||
        mGlide.load(R.drawable.error_image).into(errorImageView);
 | 
			
		||||
        errorTextView.setText(stringId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -62,8 +62,10 @@ import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.NavigationWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.slidr.Slidr;
 | 
			
		||||
import eu.toldi.infinityforlemmy.events.GoBackToMainPageEvent;
 | 
			
		||||
import eu.toldi.infinityforlemmy.events.RefreshMultiRedditsEvent;
 | 
			
		||||
import eu.toldi.infinityforlemmy.events.SwitchAccountEvent;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.PostFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.multireddit.DeleteMultiReddit;
 | 
			
		||||
import eu.toldi.infinityforlemmy.multireddit.MultiReddit;
 | 
			
		||||
import eu.toldi.infinityforlemmy.post.MarkPostAsRead;
 | 
			
		||||
import eu.toldi.infinityforlemmy.post.Post;
 | 
			
		||||
@@ -428,7 +430,7 @@ public class ViewMultiRedditDetailActivity extends BaseActivity implements SortT
 | 
			
		||||
        bundle.putString(PostFragment.EXTRA_NAME, multiPath);
 | 
			
		||||
        bundle.putInt(PostFragment.EXTRA_POST_TYPE, mAccessToken == null ? PostPagingSource.TYPE_ANONYMOUS_MULTIREDDIT : PostPagingSource.TYPE_MULTI_REDDIT);
 | 
			
		||||
        bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
 | 
			
		||||
        bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountQualifiedName);
 | 
			
		||||
        bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountName);
 | 
			
		||||
        mFragment.setArguments(bundle);
 | 
			
		||||
        getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_view_multi_reddit_detail_activity, mFragment).commit();
 | 
			
		||||
    }
 | 
			
		||||
@@ -590,7 +592,7 @@ public class ViewMultiRedditDetailActivity extends BaseActivity implements SortT
 | 
			
		||||
 | 
			
		||||
    private void showSortTypeBottomSheetFragment() {
 | 
			
		||||
        if (mFragment instanceof PostFragment) {
 | 
			
		||||
            SortTypeBottomSheetFragment sortTypeBottomSheetFragment = SortTypeBottomSheetFragment.getNewInstance(SortTypeBottomSheetFragment.PAGE_TYPE_MULTICOMMUNITY, ((PostFragment) mFragment).getSortType());
 | 
			
		||||
            SortTypeBottomSheetFragment sortTypeBottomSheetFragment = SortTypeBottomSheetFragment.getNewInstance(true, ((PostFragment) mFragment).getSortType());
 | 
			
		||||
            sortTypeBottomSheetFragment.show(getSupportFragmentManager(), sortTypeBottomSheetFragment.getTag());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -676,7 +678,7 @@ public class ViewMultiRedditDetailActivity extends BaseActivity implements SortT
 | 
			
		||||
                        -> {
 | 
			
		||||
                    Utils.hideKeyboard(this);
 | 
			
		||||
                    Intent subredditIntent = new Intent(this, ViewSubredditDetailActivity.class);
 | 
			
		||||
                    subredditIntent.putExtra(ViewSubredditDetailActivity.EXTRA_COMMUNITY_FULL_NAME_KEY, thingEditText.getText().toString());
 | 
			
		||||
                    subredditIntent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, thingEditText.getText().toString());
 | 
			
		||||
                    startActivity(subredditIntent);
 | 
			
		||||
                })
 | 
			
		||||
                .setNegativeButton(R.string.cancel, (dialogInterface, i) -> {
 | 
			
		||||
@@ -697,7 +699,7 @@ public class ViewMultiRedditDetailActivity extends BaseActivity implements SortT
 | 
			
		||||
            if (i == EditorInfo.IME_ACTION_DONE) {
 | 
			
		||||
                Utils.hideKeyboard(this);
 | 
			
		||||
                Intent userIntent = new Intent(this, ViewUserDetailActivity.class);
 | 
			
		||||
                userIntent.putExtra(ViewUserDetailActivity.EXTRA_QUALIFIED_USER_NAME_KEY, thingEditText.getText().toString());
 | 
			
		||||
                userIntent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, thingEditText.getText().toString());
 | 
			
		||||
                startActivity(userIntent);
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
@@ -762,7 +764,6 @@ public class ViewMultiRedditDetailActivity extends BaseActivity implements SortT
 | 
			
		||||
            Intent editIntent = new Intent(this, EditMultiRedditActivity.class);
 | 
			
		||||
            editIntent.putExtra(EditMultiRedditActivity.EXTRA_MULTI_PATH, multiPath);
 | 
			
		||||
            startActivity(editIntent);
 | 
			
		||||
            finish();
 | 
			
		||||
            return true;
 | 
			
		||||
        } else if (itemId == R.id.action_delete_view_multi_reddit_detail_activity) {
 | 
			
		||||
            new MaterialAlertDialogBuilder(this, R.style.MaterialAlertDialogTheme)
 | 
			
		||||
@@ -770,13 +771,30 @@ public class ViewMultiRedditDetailActivity extends BaseActivity implements SortT
 | 
			
		||||
                    .setMessage(R.string.delete_multi_reddit_dialog_message)
 | 
			
		||||
                    .setPositiveButton(R.string.delete, (dialogInterface, i)
 | 
			
		||||
                            -> {
 | 
			
		||||
                        if (mAccessToken == null) {
 | 
			
		||||
                            DeleteMultiredditInDatabase.deleteMultiredditInDatabase(mExecutor, new Handler(), mRedditDataRoomDatabase, mAccountName, multiPath,
 | 
			
		||||
                                    () -> {
 | 
			
		||||
                                        Toast.makeText(this, R.string.delete_multi_reddit_success, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                        finish();
 | 
			
		||||
                                    });
 | 
			
		||||
                        } else {
 | 
			
		||||
                            DeleteMultiReddit.deleteMultiReddit(mExecutor, new Handler(), mOauthRetrofit, mRedditDataRoomDatabase,
 | 
			
		||||
                                    mAccessToken, mAccountName, multiPath, new DeleteMultiReddit.DeleteMultiRedditListener() {
 | 
			
		||||
                                        @Override
 | 
			
		||||
                                        public void success() {
 | 
			
		||||
                                            Toast.makeText(ViewMultiRedditDetailActivity.this,
 | 
			
		||||
                                                    R.string.delete_multi_reddit_success, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                            EventBus.getDefault().post(new RefreshMultiRedditsEvent());
 | 
			
		||||
                                            finish();
 | 
			
		||||
                                        }
 | 
			
		||||
 | 
			
		||||
                        DeleteMultiredditInDatabase.deleteMultiredditInDatabase(mExecutor, new Handler(), mRedditDataRoomDatabase, mAccountName, multiPath,
 | 
			
		||||
                                () -> {
 | 
			
		||||
                                    Toast.makeText(this, R.string.delete_multi_reddit_success, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                    finish();
 | 
			
		||||
                                });
 | 
			
		||||
 | 
			
		||||
                                        @Override
 | 
			
		||||
                                        public void failed() {
 | 
			
		||||
                                            Toast.makeText(ViewMultiRedditDetailActivity.this,
 | 
			
		||||
                                                    R.string.delete_multi_reddit_failed, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                        }
 | 
			
		||||
                                    });
 | 
			
		||||
                        }
 | 
			
		||||
                    })
 | 
			
		||||
                    .setNegativeButton(R.string.cancel, null)
 | 
			
		||||
                    .show();
 | 
			
		||||
 
 | 
			
		||||
@@ -557,7 +557,7 @@ public class ViewPostDetailActivity extends BaseActivity implements SortTypeSele
 | 
			
		||||
                        // TODO: Implement anonymous front page
 | 
			
		||||
 | 
			
		||||
                    default:
 | 
			
		||||
                        String type = (subredditName == null) ? "Subscribed" : (subredditName.equals("all")) ? "All" : "Local";
 | 
			
		||||
                        String type = (subredditName.equals("all")) ? "All" : (subredditName.equals("local")) ? "Local" : "Subscribed";
 | 
			
		||||
                        call = api.getPosts(type, sortType.value, nextPage, 25, null, null, false, mAccessToken);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +1,9 @@
 | 
			
		||||
package eu.toldi.infinityforlemmy.activities;
 | 
			
		||||
 | 
			
		||||
import static android.graphics.BitmapFactory.decodeResource;
 | 
			
		||||
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.content.SharedPreferences;
 | 
			
		||||
import android.content.res.ColorStateList;
 | 
			
		||||
import android.graphics.Bitmap;
 | 
			
		||||
import android.graphics.PorterDuff;
 | 
			
		||||
import android.graphics.drawable.Drawable;
 | 
			
		||||
import android.net.Uri;
 | 
			
		||||
import android.os.Build;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
@@ -44,8 +40,6 @@ import androidx.viewpager2.widget.ViewPager2;
 | 
			
		||||
import com.bumptech.glide.Glide;
 | 
			
		||||
import com.bumptech.glide.RequestManager;
 | 
			
		||||
import com.bumptech.glide.request.RequestOptions;
 | 
			
		||||
import com.bumptech.glide.request.target.CustomTarget;
 | 
			
		||||
import com.bumptech.glide.request.transition.Transition;
 | 
			
		||||
import com.evernote.android.state.State;
 | 
			
		||||
import com.google.android.material.appbar.AppBarLayout;
 | 
			
		||||
import com.google.android.material.appbar.CollapsingToolbarLayout;
 | 
			
		||||
@@ -110,7 +104,6 @@ import eu.toldi.infinityforlemmy.post.MarkPostAsRead;
 | 
			
		||||
import eu.toldi.infinityforlemmy.post.Post;
 | 
			
		||||
import eu.toldi.infinityforlemmy.post.PostPagingSource;
 | 
			
		||||
import eu.toldi.infinityforlemmy.readpost.InsertReadPost;
 | 
			
		||||
import eu.toldi.infinityforlemmy.shortcut.ShortcutManager;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subreddit.CommunitySubscription;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subreddit.FetchSubredditData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subreddit.ParseSubredditData;
 | 
			
		||||
@@ -267,14 +260,10 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
 | 
			
		||||
    private int subscribedColor;
 | 
			
		||||
    private int fabOption;
 | 
			
		||||
    private MaterialAlertDialogBuilder nsfwWarningBuilder;
 | 
			
		||||
    private Bitmap subredditIconBitmap;
 | 
			
		||||
 | 
			
		||||
    private boolean showStatistics;
 | 
			
		||||
 | 
			
		||||
    private boolean disableImagePreview;
 | 
			
		||||
 | 
			
		||||
    private boolean hideSubredditDescription;
 | 
			
		||||
    private boolean isKbinMagazine = false;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onCreate(Bundle savedInstanceState) {
 | 
			
		||||
@@ -288,7 +277,6 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
 | 
			
		||||
 | 
			
		||||
        hideFab = mSharedPreferences.getBoolean(SharedPreferencesUtils.HIDE_FAB_IN_POST_FEED, false);
 | 
			
		||||
        showStatistics = mSharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_STATISTICS, true);
 | 
			
		||||
        disableImagePreview = mSharedPreferences.getBoolean(SharedPreferencesUtils.DISABLE_IMAGE_PREVIEW, false);
 | 
			
		||||
        showBottomAppBar = mSharedPreferences.getBoolean(SharedPreferencesUtils.BOTTOM_APP_BAR_KEY, false);
 | 
			
		||||
        navigationWrapper = new NavigationWrapper(findViewById(R.id.bottom_app_bar_bottom_app_bar), findViewById(R.id.linear_layout_bottom_app_bar),
 | 
			
		||||
                findViewById(R.id.option_1_bottom_app_bar), findViewById(R.id.option_2_bottom_app_bar),
 | 
			
		||||
@@ -392,14 +380,6 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
 | 
			
		||||
        mAccountName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_NAME, null);
 | 
			
		||||
        mAccountQualifiedName = mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_QUALIFIED_NAME, null);
 | 
			
		||||
 | 
			
		||||
        if (mAccessToken != null) {
 | 
			
		||||
            mRetrofit.setAccessToken(mAccessToken);
 | 
			
		||||
        }
 | 
			
		||||
        String instance = (mAccessToken == null) ? mSharedPreferences.getString(SharedPreferencesUtils.ANONYMOUS_ACCOUNT_INSTANCE, APIUtils.API_BASE_URI) : mCurrentAccountSharedPreferences.getString(SharedPreferencesUtils.ACCOUNT_INSTANCE, null);
 | 
			
		||||
        if (instance != null) {
 | 
			
		||||
            mRetrofit.setBaseURL(instance);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (savedInstanceState == null) {
 | 
			
		||||
            mMessageFullname = getIntent().getIntExtra(EXTRA_MESSAGE_FULLNAME, 0);
 | 
			
		||||
            mNewAccountName = getIntent().getStringExtra(EXTRA_NEW_ACCOUNT_NAME);
 | 
			
		||||
@@ -558,7 +538,7 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
 | 
			
		||||
            return true;
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        Markwon markwon = MarkdownUtils.createDescriptionMarkwon(this, miscPlugin, onLinkLongClickListener, mSharedPreferences.getBoolean(SharedPreferencesUtils.DISABLE_IMAGE_PREVIEW, false));
 | 
			
		||||
        Markwon markwon = MarkdownUtils.createDescriptionMarkwon(this, miscPlugin, onLinkLongClickListener);
 | 
			
		||||
 | 
			
		||||
        descriptionTextView.setOnLongClickListener(view -> {
 | 
			
		||||
            if (description != null && !description.equals("") && descriptionTextView.getSelectionStart() == -1 && descriptionTextView.getSelectionEnd() == -1) {
 | 
			
		||||
@@ -566,14 +546,10 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
 | 
			
		||||
            }
 | 
			
		||||
            return true;
 | 
			
		||||
        });
 | 
			
		||||
        String actorID = (!isKbinMagazine) ? LemmyUtils.qualifiedCommunityName2ActorId(qualifiedName) : LemmyUtils.qualifiedMagazineName2ActorId(qualifiedName);
 | 
			
		||||
        mSubredditViewModel = new ViewModelProvider(this,
 | 
			
		||||
                new SubredditViewModel.Factory(getApplication(), mRedditDataRoomDatabase, actorID))
 | 
			
		||||
                .get(SubredditViewModel.class);
 | 
			
		||||
        addObserverToLiveData();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void addObserverToLiveData() {
 | 
			
		||||
        mSubredditViewModel = new ViewModelProvider(this,
 | 
			
		||||
                new SubredditViewModel.Factory(getApplication(), mRedditDataRoomDatabase, LemmyUtils.qualifiedCommunityName2ActorId(qualifiedName)))
 | 
			
		||||
                .get(SubredditViewModel.class);
 | 
			
		||||
        mSubredditViewModel.getSubredditLiveData().observe(this, subredditData -> {
 | 
			
		||||
            if (subredditData != null) {
 | 
			
		||||
                isNsfwSubreddit = subredditData.isNSFW();
 | 
			
		||||
@@ -599,23 +575,11 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
 | 
			
		||||
                            .into(iconGifImageView);
 | 
			
		||||
                    iconGifImageView.setOnClickListener(null);
 | 
			
		||||
                } else {
 | 
			
		||||
                    glide.asBitmap()
 | 
			
		||||
                            .load(subredditData.getIconUrl())
 | 
			
		||||
                    glide.load(subredditData.getIconUrl())
 | 
			
		||||
                            .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(216, 0)))
 | 
			
		||||
                            .error(glide.load(R.drawable.subreddit_default_icon)
 | 
			
		||||
                                    .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(216, 0))))
 | 
			
		||||
                            .into(new CustomTarget<Bitmap>() {
 | 
			
		||||
                                @Override
 | 
			
		||||
                                public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
 | 
			
		||||
                                    subredditIconBitmap = resource;
 | 
			
		||||
                                    iconGifImageView.setImageBitmap(resource);
 | 
			
		||||
                                }
 | 
			
		||||
 | 
			
		||||
                                @Override
 | 
			
		||||
                                public void onLoadCleared(@Nullable Drawable placeholder) {
 | 
			
		||||
                                    subredditIconBitmap = null;
 | 
			
		||||
                                }
 | 
			
		||||
                            });
 | 
			
		||||
                            .into(iconGifImageView);
 | 
			
		||||
                    iconGifImageView.setOnClickListener(view -> {
 | 
			
		||||
                        Intent intent = new Intent(ViewSubredditDetailActivity.this, ViewImageOrGifActivity.class);
 | 
			
		||||
                        intent.putExtra(ViewImageOrGifActivity.EXTRA_IMAGE_URL_KEY, subredditData.getIconUrl());
 | 
			
		||||
@@ -781,14 +745,6 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
 | 
			
		||||
                        communityName = communityData.getTitle();
 | 
			
		||||
                    }
 | 
			
		||||
                    mCommunityStats = communityData.getCommunityStats();
 | 
			
		||||
                    if (communityData.getActorId().contains("/m/")) {
 | 
			
		||||
                        isKbinMagazine = true;
 | 
			
		||||
                        if (mSubredditViewModel != null) {
 | 
			
		||||
                            // Remove current observer
 | 
			
		||||
                            mSubredditViewModel.getSubredditLiveData().removeObservers(ViewSubredditDetailActivity.this);
 | 
			
		||||
                            addObserverToLiveData();
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    setupVisibleElements();
 | 
			
		||||
                    communityId = communityData.getId();
 | 
			
		||||
                    ViewSubredditDetailActivity.this.communityData = communityData;
 | 
			
		||||
@@ -1192,7 +1148,7 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        viewPager2.setAdapter(sectionsPagerAdapter);
 | 
			
		||||
        viewPager2.setOffscreenPageLimit(ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT);
 | 
			
		||||
        viewPager2.setOffscreenPageLimit(2);
 | 
			
		||||
        viewPager2.setUserInputEnabled(!mSharedPreferences.getBoolean(SharedPreferencesUtils.DISABLE_SWIPING_BETWEEN_TABS, false));
 | 
			
		||||
        new TabLayoutMediator(tabLayout, viewPager2, (tab, position) -> {
 | 
			
		||||
            switch (position) {
 | 
			
		||||
@@ -1214,7 +1170,7 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
 | 
			
		||||
    private void displaySortTypeBottomSheetFragment() {
 | 
			
		||||
        Fragment fragment = fragmentManager.findFragmentByTag("f0");
 | 
			
		||||
        if (fragment instanceof PostFragment) {
 | 
			
		||||
            SortTypeBottomSheetFragment sortTypeBottomSheetFragment = SortTypeBottomSheetFragment.getNewInstance(SortTypeBottomSheetFragment.PAGE_TYPE_COMMUNITY, ((PostFragment) fragment).getSortType());
 | 
			
		||||
            SortTypeBottomSheetFragment sortTypeBottomSheetFragment = SortTypeBottomSheetFragment.getNewInstance(true, ((PostFragment) fragment).getSortType());
 | 
			
		||||
            sortTypeBottomSheetFragment.show(fragmentManager, sortTypeBottomSheetFragment.getTag());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -1318,15 +1274,6 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
            return true;
 | 
			
		||||
        } else if (itemId == R.id.action_add_to_home_screen_view_subreddit_detail_activity) {
 | 
			
		||||
            Bitmap icon = subredditIconBitmap == null ? decodeResource(getResources(), R.drawable.subreddit_default_icon) : subredditIconBitmap;
 | 
			
		||||
            return ShortcutManager.requestPinShortcut(this, qualifiedName, icon);
 | 
			
		||||
        } else if (itemId == R.id.action_view_instance_view_subreddit_detail_activity) {
 | 
			
		||||
            String instance = communityData.getActorId().split("/")[2];
 | 
			
		||||
            Intent intent = new Intent(this,InstanceInfoActivity.class);
 | 
			
		||||
            intent.putExtra(InstanceInfoActivity.EXTRA_INSTANCE_DOMAIN, instance);
 | 
			
		||||
            intent.putExtra(InstanceInfoActivity.EXTRA_INSTANCE_ID, communityData.getInstanceId());
 | 
			
		||||
            startActivity(intent);
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
@@ -1751,7 +1698,7 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_NAME, qualifiedName);
 | 
			
		||||
                bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostPagingSource.TYPE_SUBREDDIT);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountQualifiedName);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountName);
 | 
			
		||||
                fragment.setArguments(bundle);
 | 
			
		||||
                return fragment;
 | 
			
		||||
            }
 | 
			
		||||
@@ -1761,7 +1708,6 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
 | 
			
		||||
            bundle.putString(SidebarFragment.EXTRA_SUBREDDIT_NAME, communityName);
 | 
			
		||||
            bundle.putString(SidebarFragment.EXTRA_COMMUNITY_QUALIFIED_NAME, qualifiedName);
 | 
			
		||||
            bundle.putBoolean(SidebarFragment.EXTRA_SHOW_STATISTICS, !showStatistics);
 | 
			
		||||
            bundle.putBoolean(SidebarFragment.EXTRA_DISABLE_IMAGE_PREVIEW, disableImagePreview);
 | 
			
		||||
            fragment.setArguments(bundle);
 | 
			
		||||
            return fragment;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -83,7 +83,6 @@ 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.blockedinstances.BlockedInstanceData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.CopyTextBottomSheetFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.FABMoreOptionsBottomSheetFragment;
 | 
			
		||||
@@ -189,11 +188,21 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
 | 
			
		||||
    @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.upvote_count_posts_icon_image_view_view_user_detail_activity)
 | 
			
		||||
    ImageView postUpvoteCountIconImageView;
 | 
			
		||||
    @BindView(R.id.upvote_count_comments_icon_image_view_view_user_detail_activity)
 | 
			
		||||
    ImageView commentUpvoteCountIconImageView;
 | 
			
		||||
    @BindView(R.id.account_created_cake_icon_image_view_view_user_detail_activity)
 | 
			
		||||
    ImageView accountCreatedCakeIconImageView;
 | 
			
		||||
 | 
			
		||||
@@ -252,6 +261,7 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
 | 
			
		||||
    private String description;
 | 
			
		||||
 | 
			
		||||
    private boolean showStatistics;
 | 
			
		||||
    private boolean showScore;
 | 
			
		||||
    private boolean subscriptionReady = false;
 | 
			
		||||
    private boolean mFetchUserInfoSuccess = false;
 | 
			
		||||
    private int expandedTabTextColor;
 | 
			
		||||
@@ -317,6 +327,7 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
 | 
			
		||||
        lockBottomAppBar = mSharedPreferences.getBoolean(SharedPreferencesUtils.LOCK_BOTTOM_APP_BAR, false);
 | 
			
		||||
 | 
			
		||||
        showStatistics = mSharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_STATISTICS, true);
 | 
			
		||||
        showScore = mSharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_POST_AND_COMMENT_SCORE, true);
 | 
			
		||||
 | 
			
		||||
        if (savedInstanceState == null) {
 | 
			
		||||
            mMessageId = getIntent().getIntExtra(EXTRA_MESSAGE_FULLNAME, 0);
 | 
			
		||||
@@ -461,7 +472,7 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
 | 
			
		||||
            urlMenuBottomSheetFragment.show(getSupportFragmentManager(), null);
 | 
			
		||||
            return true;
 | 
			
		||||
        };
 | 
			
		||||
        Markwon markwon = MarkdownUtils.createDescriptionMarkwon(this, miscPlugin, onLinkLongClickListener, mSharedPreferences.getBoolean(SharedPreferencesUtils.DISABLE_IMAGE_PREVIEW, false));
 | 
			
		||||
        Markwon markwon = MarkdownUtils.createDescriptionMarkwon(this, miscPlugin, onLinkLongClickListener);
 | 
			
		||||
 | 
			
		||||
        descriptionTextView.setOnLongClickListener(view -> {
 | 
			
		||||
            if (description != null && !description.equals("") && descriptionTextView.getSelectionStart() == -1 && descriptionTextView.getSelectionEnd() == -1) {
 | 
			
		||||
@@ -619,8 +630,17 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
 | 
			
		||||
                UserStats userStats = mUserData.getStats();
 | 
			
		||||
                if (userStats != null && showStatistics) {
 | 
			
		||||
                    userStatisticsBlock.setVisibility(View.VISIBLE);
 | 
			
		||||
                    postCountTextView.setText(getString(R.string.post_count_detail, userStats.getPostCount()));
 | 
			
		||||
                    commentCountTextView.setText(getString(R.string.comment_count_detail, userStats.getCommentCount()));
 | 
			
		||||
                    postCountTextView.setText(String.valueOf(userStats.getPostCount()));
 | 
			
		||||
                    commentCountTextView.setText(String.valueOf(userStats.getCommentCount()));
 | 
			
		||||
                    if (showScore) {
 | 
			
		||||
                        upvoteCountPostTextView.setText(String.valueOf(userStats.getPostScore()));
 | 
			
		||||
                        upvoteCountCommentTextView.setText(String.valueOf(userStats.getCommentScore()));
 | 
			
		||||
                    } else {
 | 
			
		||||
                        upvoteCountPostTextView.setVisibility(View.GONE);
 | 
			
		||||
                        upvoteCountCommentTextView.setVisibility(View.GONE);
 | 
			
		||||
                        postUpvoteCountIconImageView.setVisibility(View.GONE);
 | 
			
		||||
                        commentUpvoteCountIconImageView.setVisibility(View.GONE);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (userData.getDescription() == null || userData.getDescription().equals("")) {
 | 
			
		||||
@@ -690,7 +710,9 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
 | 
			
		||||
        subscribedColor = mCustomThemeWrapper.getSubscribed();
 | 
			
		||||
        userNameTextView.setTextColor(mCustomThemeWrapper.getUsername());
 | 
			
		||||
        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);
 | 
			
		||||
@@ -703,7 +725,9 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
 | 
			
		||||
        if (typeface != null) {
 | 
			
		||||
            userNameTextView.setTypeface(typeface);
 | 
			
		||||
            postCountTextView.setTypeface(typeface);
 | 
			
		||||
            upvoteCountPostTextView.setTypeface(typeface);
 | 
			
		||||
            commentCountTextView.setTypeface(typeface);
 | 
			
		||||
            upvoteCountCommentTextView.setTypeface(typeface);
 | 
			
		||||
            cakedayTextView.setTypeface(typeface);
 | 
			
		||||
            subscribeUserChip.setTypeface(typeface);
 | 
			
		||||
            descriptionTextView.setTypeface(typeface);
 | 
			
		||||
@@ -737,7 +761,7 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
 | 
			
		||||
    private void initializeViewPager() {
 | 
			
		||||
        sectionsPagerAdapter = new SectionsPagerAdapter(this);
 | 
			
		||||
        viewPager2.setAdapter(sectionsPagerAdapter);
 | 
			
		||||
        viewPager2.setOffscreenPageLimit(ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT);
 | 
			
		||||
        viewPager2.setOffscreenPageLimit(2);
 | 
			
		||||
        viewPager2.setUserInputEnabled(!mSharedPreferences.getBoolean(SharedPreferencesUtils.DISABLE_SWIPING_BETWEEN_TABS, false));
 | 
			
		||||
        new TabLayoutMediator(tabLayout, viewPager2, (tab, position) -> {
 | 
			
		||||
            switch (position) {
 | 
			
		||||
@@ -1155,7 +1179,7 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
 | 
			
		||||
                    FetchBlockedThings.fetchBlockedThings(mRetrofit.getRetrofit(), mAccessToken, mAccountQualifiedName, new FetchBlockedThings.FetchBlockedThingsListener() {
 | 
			
		||||
 | 
			
		||||
                        @Override
 | 
			
		||||
                        public void onFetchBlockedThingsSuccess(List<BlockedUserData> blockedUsers, List<BlockedCommunityData> blockedCommunities, List<BlockedInstanceData> blockedInstances) {
 | 
			
		||||
                        public void onFetchBlockedThingsSuccess(List<BlockedUserData> blockedUsers, List<BlockedCommunityData> blockedCommunities) {
 | 
			
		||||
                            for (BlockedUserData blockedUserData : blockedUsers) {
 | 
			
		||||
                                if (blockedUserData.getQualifiedName().equals(qualifiedName)) {
 | 
			
		||||
                                    isBlocked = true;
 | 
			
		||||
@@ -1209,6 +1233,7 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
 | 
			
		||||
        getMenuInflater().inflate(R.menu.view_user_detail_activity, menu);
 | 
			
		||||
        if (username.equals(mAccountName)) {
 | 
			
		||||
            menu.findItem(R.id.action_send_private_message_view_user_detail_activity).setVisible(false);
 | 
			
		||||
            menu.findItem(R.id.action_report_view_user_detail_activity).setVisible(false);
 | 
			
		||||
            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);
 | 
			
		||||
@@ -1274,6 +1299,11 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
 | 
			
		||||
            intent.putExtra(PostFilterPreferenceActivity.EXTRA_USER_NAME, username);
 | 
			
		||||
            startActivity(intent);
 | 
			
		||||
            return true;
 | 
			
		||||
        } else if (itemId == R.id.action_report_view_user_detail_activity) {
 | 
			
		||||
            Intent reportIntent = new Intent(this, LinkResolverActivity.class);
 | 
			
		||||
            reportIntent.setData(Uri.parse("https://www.reddithelp.com/en/categories/rules-reporting/account-and-community-restrictions/what-should-i-do-if-i-see-something-i"));
 | 
			
		||||
            startActivity(reportIntent);
 | 
			
		||||
            return true;
 | 
			
		||||
        } else if (itemId == R.id.action_block_user_view_user_detail_activity) {
 | 
			
		||||
            if (mAccessToken == null) {
 | 
			
		||||
                Toast.makeText(this, R.string.login_first, Toast.LENGTH_SHORT).show();
 | 
			
		||||
@@ -1323,12 +1353,6 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
 | 
			
		||||
                    Toast.makeText(ViewUserDetailActivity.this, R.string.unblock_user_failed, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        } else if (itemId == R.id.action_view_instance_view_user_detail_activity) {
 | 
			
		||||
            String instance = mUserData.getActorId().split("/")[2];
 | 
			
		||||
            Intent intent = new Intent(this, InstanceInfoActivity.class);
 | 
			
		||||
            intent.putExtra(InstanceInfoActivity.EXTRA_INSTANCE_DOMAIN, instance);
 | 
			
		||||
            intent.putExtra(InstanceInfoActivity.EXTRA_INSTANCE_ID, mUserData.getInstanceId());
 | 
			
		||||
            startActivity(intent);
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
@@ -1765,7 +1789,7 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_USER_NAME, qualifiedName);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_USER_WHERE, PostPagingSource.USER_WHERE_SUBMITTED);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountQualifiedName);
 | 
			
		||||
                bundle.putString(PostFragment.EXTRA_ACCOUNT_NAME, mAccountName);
 | 
			
		||||
                fragment.setArguments(bundle);
 | 
			
		||||
                return fragment;
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -23,11 +23,14 @@ import android.os.Build;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.os.Handler;
 | 
			
		||||
import android.provider.Settings;
 | 
			
		||||
import android.text.Html;
 | 
			
		||||
import android.view.Menu;
 | 
			
		||||
import android.view.MenuItem;
 | 
			
		||||
import android.view.OrientationEventListener;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.view.ViewGroup;
 | 
			
		||||
import android.widget.ImageButton;
 | 
			
		||||
import android.widget.ImageView;
 | 
			
		||||
import android.widget.LinearLayout;
 | 
			
		||||
import android.widget.ProgressBar;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
@@ -67,7 +70,7 @@ import com.google.android.exoplayer2.upstream.cache.SimpleCache;
 | 
			
		||||
import com.google.android.exoplayer2.util.MimeTypes;
 | 
			
		||||
import com.google.android.exoplayer2.video.VideoSize;
 | 
			
		||||
import com.google.android.material.bottomappbar.BottomAppBar;
 | 
			
		||||
import com.google.android.material.button.MaterialButton;
 | 
			
		||||
import com.google.android.material.snackbar.Snackbar;
 | 
			
		||||
import com.google.common.collect.ImmutableList;
 | 
			
		||||
import com.otaliastudios.zoom.ZoomEngine;
 | 
			
		||||
import com.otaliastudios.zoom.ZoomSurfaceView;
 | 
			
		||||
@@ -87,7 +90,7 @@ import app.futured.hauler.LockableNestedScrollView;
 | 
			
		||||
import butterknife.BindView;
 | 
			
		||||
import butterknife.ButterKnife;
 | 
			
		||||
import eu.toldi.infinityforlemmy.CustomFontReceiver;
 | 
			
		||||
import eu.toldi.infinityforlemmy.FetchRedgifsVideoLinks;
 | 
			
		||||
import eu.toldi.infinityforlemmy.FetchGfycatOrRedgifsVideoLinks;
 | 
			
		||||
import eu.toldi.infinityforlemmy.FetchStreamableVideo;
 | 
			
		||||
import eu.toldi.infinityforlemmy.Infinity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.R;
 | 
			
		||||
@@ -129,10 +132,10 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe
 | 
			
		||||
    public static final String EXTRA_VIDEO_DOWNLOAD_URL = "EVDU";
 | 
			
		||||
    public static final String EXTRA_SUBREDDIT = "ES";
 | 
			
		||||
    public static final String EXTRA_ID = "EI";
 | 
			
		||||
    public static final String EXTRA_POST = "EP";
 | 
			
		||||
    public static final String EXTRA_POST_TITLE = "EPT";
 | 
			
		||||
    public static final String EXTRA_PROGRESS_SECONDS = "EPS";
 | 
			
		||||
    public static final String EXTRA_VIDEO_TYPE = "EVT";
 | 
			
		||||
    public static final String EXTRA_REDGIFS_ID = "ERI";
 | 
			
		||||
    public static final String EXTRA_GFYCAT_ID = "EGI";
 | 
			
		||||
    public static final String EXTRA_V_REDD_IT_URL = "EVRIU";
 | 
			
		||||
    public static final String EXTRA_STREAMABLE_SHORT_CODE = "ESSC";
 | 
			
		||||
    public static final String EXTRA_IS_NSFW = "EIN";
 | 
			
		||||
@@ -141,6 +144,7 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe
 | 
			
		||||
    public static final int VIDEO_TYPE_V_REDD_IT = 4;
 | 
			
		||||
    public static final int VIDEO_TYPE_DIRECT = 3;
 | 
			
		||||
    public static final int VIDEO_TYPE_REDGIFS = 2;
 | 
			
		||||
    public static final int VIDEO_TYPE_GFYCAT = 1;
 | 
			
		||||
    private static final int VIDEO_TYPE_NORMAL = 0;
 | 
			
		||||
    private static final int PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 0;
 | 
			
		||||
 | 
			
		||||
@@ -159,19 +163,17 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe
 | 
			
		||||
    @BindView(R.id.progress_bar_view_video_activity)
 | 
			
		||||
    ProgressBar progressBar;
 | 
			
		||||
    @BindView(R.id.mute_exo_playback_control_view)
 | 
			
		||||
    MaterialButton muteButton;
 | 
			
		||||
    ImageButton muteButton;
 | 
			
		||||
    @BindView(R.id.hd_exo_playback_control_view)
 | 
			
		||||
    MaterialButton hdButton;
 | 
			
		||||
    ImageButton hdButton;
 | 
			
		||||
    @BindView(R.id.bottom_navigation_exo_playback_control_view)
 | 
			
		||||
    BottomAppBar bottomAppBar;
 | 
			
		||||
    @BindView(R.id.title_text_view_exo_playback_control_view)
 | 
			
		||||
    TextView titleTextView;
 | 
			
		||||
    @BindView(R.id.back_button_exo_playback_control_view)
 | 
			
		||||
    MaterialButton backButton;
 | 
			
		||||
    @BindView(R.id.download_image_view_exo_playback_control_view)
 | 
			
		||||
    MaterialButton downloadButton;
 | 
			
		||||
    ImageView downloadImageView;
 | 
			
		||||
    @BindView(R.id.playback_speed_image_view_exo_playback_control_view)
 | 
			
		||||
    MaterialButton playbackSpeedButton;
 | 
			
		||||
    ImageView playbackSpeedImageView;
 | 
			
		||||
    @BindView(R.id.lockable_nested_scroll_view_view_video_activity)
 | 
			
		||||
    LockableNestedScrollView nestedScrollView;
 | 
			
		||||
 | 
			
		||||
@@ -202,6 +204,10 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe
 | 
			
		||||
    @Named("no_oauth")
 | 
			
		||||
    RetrofitHolder retrofit;
 | 
			
		||||
 | 
			
		||||
    @Inject
 | 
			
		||||
    @Named("gfycat")
 | 
			
		||||
    Retrofit gfycatRetrofit;
 | 
			
		||||
 | 
			
		||||
    @Inject
 | 
			
		||||
    @Named("redgifs")
 | 
			
		||||
    Retrofit redgifsRetrofit;
 | 
			
		||||
@@ -295,12 +301,6 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe
 | 
			
		||||
        ButterKnife.bind(this);
 | 
			
		||||
        setVolumeControlStream(AudioManager.STREAM_MUSIC);
 | 
			
		||||
 | 
			
		||||
        setTitle(" ");
 | 
			
		||||
 | 
			
		||||
        if (typeface != null) {
 | 
			
		||||
            titleTextView.setTypeface(typeface);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Resources resources = getResources();
 | 
			
		||||
 | 
			
		||||
        getWindow().getDecorView().setSystemUiVisibility(
 | 
			
		||||
@@ -312,11 +312,7 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe
 | 
			
		||||
        if (useBottomAppBar) {
 | 
			
		||||
            getSupportActionBar().hide();
 | 
			
		||||
            bottomAppBar.setVisibility(View.VISIBLE);
 | 
			
		||||
            backButton.setOnClickListener(view -> {
 | 
			
		||||
                finish();
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            downloadButton.setOnClickListener(view -> {
 | 
			
		||||
            downloadImageView.setOnClickListener(view -> {
 | 
			
		||||
                if (isDownloading) {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
@@ -330,8 +326,12 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe
 | 
			
		||||
                requestPermissionAndDownload();
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            playbackSpeedButton.setOnClickListener(view -> {
 | 
			
		||||
                changePlaybackSpeed();
 | 
			
		||||
            playbackSpeedImageView.setOnClickListener(view -> {
 | 
			
		||||
                PlaybackSpeedBottomSheetFragment playbackSpeedBottomSheetFragment = new PlaybackSpeedBottomSheetFragment();
 | 
			
		||||
                Bundle bundle = new Bundle();
 | 
			
		||||
                bundle.putInt(PlaybackSpeedBottomSheetFragment.EXTRA_PLAYBACK_SPEED, playbackSpeed);
 | 
			
		||||
                playbackSpeedBottomSheetFragment.setArguments(bundle);
 | 
			
		||||
                playbackSpeedBottomSheetFragment.show(getSupportFragmentManager(), playbackSpeedBottomSheetFragment.getTag());
 | 
			
		||||
            });
 | 
			
		||||
        } else {
 | 
			
		||||
            ActionBar actionBar = getSupportActionBar();
 | 
			
		||||
@@ -402,15 +402,12 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe
 | 
			
		||||
                        };
 | 
			
		||||
                        orientationEventListener.enable();
 | 
			
		||||
                    }
 | 
			
		||||
                } catch (Exception ignore) {
 | 
			
		||||
                }
 | 
			
		||||
                } catch (Exception ignore) {}
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Post post = intent.getParcelableExtra(EXTRA_POST);
 | 
			
		||||
        if (post != null) {
 | 
			
		||||
            titleTextView.setText(post.getTitle());
 | 
			
		||||
        }
 | 
			
		||||
        String postTitle = intent.getStringExtra(EXTRA_POST_TITLE);
 | 
			
		||||
        setSmallTitle(postTitle);
 | 
			
		||||
 | 
			
		||||
        trackSelector = new DefaultTrackSelector(this);
 | 
			
		||||
        if (videoType == VIDEO_TYPE_NORMAL && isDataSavingMode && dataSavingModeDefaultResolution > 0) {
 | 
			
		||||
@@ -542,21 +539,29 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe
 | 
			
		||||
            }
 | 
			
		||||
        } else if (videoType == VIDEO_TYPE_V_REDD_IT) {
 | 
			
		||||
            loadVReddItVideo(savedInstanceState);
 | 
			
		||||
        } else if (videoType == VIDEO_TYPE_REDGIFS) {
 | 
			
		||||
        } else if (videoType == VIDEO_TYPE_GFYCAT || videoType == VIDEO_TYPE_REDGIFS) {
 | 
			
		||||
            if (savedInstanceState != null) {
 | 
			
		||||
                videoDownloadUrl = savedInstanceState.getString(VIDEO_DOWNLOAD_URL_STATE);
 | 
			
		||||
            } else {
 | 
			
		||||
                videoDownloadUrl = intent.getStringExtra(EXTRA_VIDEO_DOWNLOAD_URL);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            String redgifsId = intent.getStringExtra(EXTRA_REDGIFS_ID);
 | 
			
		||||
            if (redgifsId != null && redgifsId.contains("-")) {
 | 
			
		||||
                redgifsId = redgifsId.substring(0, redgifsId.indexOf('-'));
 | 
			
		||||
            String gfycatId = intent.getStringExtra(EXTRA_GFYCAT_ID);
 | 
			
		||||
            if (gfycatId != null && gfycatId.contains("-")) {
 | 
			
		||||
                gfycatId = gfycatId.substring(0, gfycatId.indexOf('-'));
 | 
			
		||||
            }
 | 
			
		||||
            if (videoType == VIDEO_TYPE_GFYCAT) {
 | 
			
		||||
                videoFileName = "Gfycat-" + gfycatId + ".mp4";
 | 
			
		||||
            } else {
 | 
			
		||||
                videoFileName = "Redgifs-" + gfycatId + ".mp4";
 | 
			
		||||
            }
 | 
			
		||||
            videoFileName = "Redgifs-" + redgifsId + ".mp4";
 | 
			
		||||
 | 
			
		||||
            if (mVideoUri == null) {
 | 
			
		||||
                loadRedgifsVideo(redgifsId, savedInstanceState);
 | 
			
		||||
                if (videoType == VIDEO_TYPE_GFYCAT) {
 | 
			
		||||
                    loadGfycatOrRedgifsVideo(gfycatRetrofit, gfycatId, true, savedInstanceState, true);
 | 
			
		||||
                } else {
 | 
			
		||||
                    loadGfycatOrRedgifsVideo(redgifsRetrofit, gfycatId, false, savedInstanceState, false);
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                dataSourceFactory = new CacheDataSource.Factory().setCache(mSimpleCache)
 | 
			
		||||
                        .setUpstreamDataSourceFactory(new DefaultHttpDataSource.Factory().setAllowCrossProtocolRedirects(true).setUserAgent(APIUtils.USER_AGENT));
 | 
			
		||||
@@ -593,6 +598,20 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void setSmallTitle(String title) {
 | 
			
		||||
        if (title != null) {
 | 
			
		||||
            if (useBottomAppBar) {
 | 
			
		||||
                titleTextView.setText(Html.fromHtml(String.format("<font color=\"#FFFFFF\"><small>%s</small></font>", title)));
 | 
			
		||||
            } else {
 | 
			
		||||
                setTitle(Utils.getTabTextWithCustomFont(typeface, Html.fromHtml(String.format("<font color=\"#FFFFFF\"><small>%s</small></font>", title))));
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            if (!useBottomAppBar) {
 | 
			
		||||
                setTitle("");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void preparePlayer(Bundle savedInstanceState) {
 | 
			
		||||
        if (mSharedPreferences.getBoolean(SharedPreferencesUtils.LOOP_VIDEO, true)) {
 | 
			
		||||
            player.setRepeatMode(Player.REPEAT_MODE_ALL);
 | 
			
		||||
@@ -612,17 +631,17 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe
 | 
			
		||||
            isMute = savedInstanceState.getBoolean(IS_MUTE_STATE);
 | 
			
		||||
            if (isMute) {
 | 
			
		||||
                player.setVolume(0f);
 | 
			
		||||
                muteButton.setIconResource(R.drawable.ic_mute_24dp);
 | 
			
		||||
                muteButton.setImageResource(R.drawable.ic_mute_24dp);
 | 
			
		||||
            } else {
 | 
			
		||||
                player.setVolume(1f);
 | 
			
		||||
                muteButton.setIconResource(R.drawable.ic_unmute_24dp);
 | 
			
		||||
                muteButton.setImageResource(R.drawable.ic_unmute_24dp);
 | 
			
		||||
            }
 | 
			
		||||
        } else if (muteVideo) {
 | 
			
		||||
            isMute = true;
 | 
			
		||||
            player.setVolume(0f);
 | 
			
		||||
            muteButton.setIconResource(R.drawable.ic_mute_24dp);
 | 
			
		||||
            muteButton.setImageResource(R.drawable.ic_mute_24dp);
 | 
			
		||||
        } else {
 | 
			
		||||
            muteButton.setIconResource(R.drawable.ic_unmute_24dp);
 | 
			
		||||
            muteButton.setImageResource(R.drawable.ic_unmute_24dp);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        player.addListener(new Player.Listener() {
 | 
			
		||||
@@ -666,11 +685,11 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe
 | 
			
		||||
                                    if (isMute) {
 | 
			
		||||
                                        isMute = false;
 | 
			
		||||
                                        player.setVolume(1f);
 | 
			
		||||
                                        muteButton.setIconResource(R.drawable.ic_unmute_24dp);
 | 
			
		||||
                                        muteButton.setImageResource(R.drawable.ic_unmute_24dp);
 | 
			
		||||
                                    } else {
 | 
			
		||||
                                        isMute = true;
 | 
			
		||||
                                        player.setVolume(0f);
 | 
			
		||||
                                        muteButton.setIconResource(R.drawable.ic_mute_24dp);
 | 
			
		||||
                                        muteButton.setImageResource(R.drawable.ic_mute_24dp);
 | 
			
		||||
                                    }
 | 
			
		||||
                                });
 | 
			
		||||
                            }
 | 
			
		||||
@@ -683,14 +702,6 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void changePlaybackSpeed() {
 | 
			
		||||
        PlaybackSpeedBottomSheetFragment playbackSpeedBottomSheetFragment = new PlaybackSpeedBottomSheetFragment();
 | 
			
		||||
        Bundle bundle = new Bundle();
 | 
			
		||||
        bundle.putInt(PlaybackSpeedBottomSheetFragment.EXTRA_PLAYBACK_SPEED, playbackSpeed);
 | 
			
		||||
        playbackSpeedBottomSheetFragment.setArguments(bundle);
 | 
			
		||||
        playbackSpeedBottomSheetFragment.show(getSupportFragmentManager(), playbackSpeedBottomSheetFragment.getTag());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private int inferPrimaryTrackType(Format format) {
 | 
			
		||||
        int trackType = MimeTypes.getTrackType(format.sampleMimeType);
 | 
			
		||||
        if (trackType != C.TRACK_TYPE_UNKNOWN) {
 | 
			
		||||
@@ -711,28 +722,61 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe
 | 
			
		||||
        return C.TRACK_TYPE_UNKNOWN;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void loadRedgifsVideo(String redgifsId, Bundle savedInstanceState) {
 | 
			
		||||
    private void loadGfycatOrRedgifsVideo(Retrofit retrofit, String gfycatId, boolean isGfycatVideo,
 | 
			
		||||
                                          Bundle savedInstanceState, boolean needErrorHandling) {
 | 
			
		||||
        progressBar.setVisibility(View.VISIBLE);
 | 
			
		||||
        FetchRedgifsVideoLinks.fetchRedgifsVideoLinks(mExecutor, new Handler(), redgifsRetrofit,
 | 
			
		||||
                redgifsId, new FetchRedgifsVideoLinks.FetchRedgifsVideoLinksListener() {
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void success(String webm, String mp4) {
 | 
			
		||||
                        progressBar.setVisibility(View.GONE);
 | 
			
		||||
                        mVideoUri = Uri.parse(webm);
 | 
			
		||||
                        videoDownloadUrl = mp4;
 | 
			
		||||
                        dataSourceFactory = new CacheDataSource.Factory().setCache(mSimpleCache)
 | 
			
		||||
                                .setUpstreamDataSourceFactory(new DefaultHttpDataSource.Factory().setAllowCrossProtocolRedirects(true).setUserAgent(APIUtils.USER_AGENT));
 | 
			
		||||
                        preparePlayer(savedInstanceState);
 | 
			
		||||
                        player.prepare();
 | 
			
		||||
                        player.setMediaSource(new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(mVideoUri)));
 | 
			
		||||
                    }
 | 
			
		||||
        if (isGfycatVideo) {
 | 
			
		||||
            FetchGfycatOrRedgifsVideoLinks.fetchGfycatVideoLinks(mExecutor, new Handler(), retrofit, gfycatId,
 | 
			
		||||
                    new FetchGfycatOrRedgifsVideoLinks.FetchGfycatOrRedgifsVideoLinksListener() {
 | 
			
		||||
                        @Override
 | 
			
		||||
                        public void success(String webm, String mp4) {
 | 
			
		||||
                            progressBar.setVisibility(View.GONE);
 | 
			
		||||
                            mVideoUri = Uri.parse(webm);
 | 
			
		||||
                            videoDownloadUrl = mp4;
 | 
			
		||||
                            dataSourceFactory = new CacheDataSource.Factory().setCache(mSimpleCache)
 | 
			
		||||
                                    .setUpstreamDataSourceFactory(new DefaultHttpDataSource.Factory().setAllowCrossProtocolRedirects(true).setUserAgent(APIUtils.USER_AGENT));
 | 
			
		||||
                            preparePlayer(savedInstanceState);
 | 
			
		||||
                            player.prepare();
 | 
			
		||||
                            player.setMediaSource(new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(mVideoUri)));
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void failed(int errorCode) {
 | 
			
		||||
                        progressBar.setVisibility(View.GONE);
 | 
			
		||||
                        Toast.makeText(ViewVideoActivity.this, R.string.fetch_redgifs_video_failed, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
                        @Override
 | 
			
		||||
                        public void failed(int errorCode) {
 | 
			
		||||
                            if (errorCode == 404 && needErrorHandling) {
 | 
			
		||||
                                if (mSharedPreferences.getBoolean(SharedPreferencesUtils.AUTOMATICALLY_TRY_REDGIFS, true)) {
 | 
			
		||||
                                    loadGfycatOrRedgifsVideo(redgifsRetrofit, gfycatId, false, savedInstanceState, false);
 | 
			
		||||
                                } else {
 | 
			
		||||
                                    Snackbar.make(coordinatorLayout, R.string.load_video_in_redgifs, Snackbar.LENGTH_INDEFINITE).setAction(R.string.yes,
 | 
			
		||||
                                            view -> loadGfycatOrRedgifsVideo(redgifsRetrofit, gfycatId, false, savedInstanceState, false)).show();
 | 
			
		||||
                                }
 | 
			
		||||
                            } else {
 | 
			
		||||
                                progressBar.setVisibility(View.GONE);
 | 
			
		||||
                                Toast.makeText(ViewVideoActivity.this, R.string.fetch_gfycat_video_failed, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
        } else {
 | 
			
		||||
            FetchGfycatOrRedgifsVideoLinks.fetchRedgifsVideoLinks(mExecutor, new Handler(), redgifsRetrofit,
 | 
			
		||||
                    gfycatId, new FetchGfycatOrRedgifsVideoLinks.FetchGfycatOrRedgifsVideoLinksListener() {
 | 
			
		||||
                        @Override
 | 
			
		||||
                        public void success(String webm, String mp4) {
 | 
			
		||||
                            progressBar.setVisibility(View.GONE);
 | 
			
		||||
                            mVideoUri = Uri.parse(webm);
 | 
			
		||||
                            videoDownloadUrl = mp4;
 | 
			
		||||
                            dataSourceFactory = new CacheDataSource.Factory().setCache(mSimpleCache)
 | 
			
		||||
                                    .setUpstreamDataSourceFactory(new DefaultHttpDataSource.Factory().setAllowCrossProtocolRedirects(true).setUserAgent(APIUtils.USER_AGENT));
 | 
			
		||||
                            preparePlayer(savedInstanceState);
 | 
			
		||||
                            player.prepare();
 | 
			
		||||
                            player.setMediaSource(new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(mVideoUri)));
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        @Override
 | 
			
		||||
                        public void failed(int errorCode) {
 | 
			
		||||
                            progressBar.setVisibility(View.GONE);
 | 
			
		||||
                            Toast.makeText(ViewVideoActivity.this, R.string.fetch_redgifs_video_failed, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void loadVReddItVideo(Bundle savedInstanceState) {
 | 
			
		||||
@@ -750,14 +794,30 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe
 | 
			
		||||
                            postEnricher, new FetchPost.FetchPostListener() {
 | 
			
		||||
                                @Override
 | 
			
		||||
                                public void fetchPostSuccess(Post post) {
 | 
			
		||||
                                    if (post.isRedgifs()) {
 | 
			
		||||
                                        videoType = VIDEO_TYPE_REDGIFS;
 | 
			
		||||
                                        String redgifsId = post.getRedgifsId();
 | 
			
		||||
                                        if (redgifsId != null && redgifsId.contains("-")) {
 | 
			
		||||
                                            redgifsId = redgifsId.substring(0, redgifsId.indexOf('-'));
 | 
			
		||||
                                    if (post.isGfycat()) {
 | 
			
		||||
                                        videoType = VIDEO_TYPE_GFYCAT;
 | 
			
		||||
                                        String gfycatId = post.getGfycatId();
 | 
			
		||||
                                        if (gfycatId != null && gfycatId.contains("-")) {
 | 
			
		||||
                                            gfycatId = gfycatId.substring(0, gfycatId.indexOf('-'));
 | 
			
		||||
                                        }
 | 
			
		||||
                                        videoFileName = "Redgifs-" + redgifsId + ".mp4";
 | 
			
		||||
                                        loadRedgifsVideo(redgifsId, savedInstanceState);
 | 
			
		||||
                                        if (videoType == VIDEO_TYPE_GFYCAT) {
 | 
			
		||||
                                            videoFileName = "Gfycat-" + gfycatId + ".mp4";
 | 
			
		||||
                                        } else {
 | 
			
		||||
                                            videoFileName = "Redgifs-" + gfycatId + ".mp4";
 | 
			
		||||
                                        }
 | 
			
		||||
                                        loadGfycatOrRedgifsVideo(gfycatRetrofit, gfycatId, true, savedInstanceState, true);
 | 
			
		||||
                                    } else if (post.isRedgifs()) {
 | 
			
		||||
                                        videoType = VIDEO_TYPE_REDGIFS;
 | 
			
		||||
                                        String gfycatId = post.getGfycatId();
 | 
			
		||||
                                        if (gfycatId != null && gfycatId.contains("-")) {
 | 
			
		||||
                                            gfycatId = gfycatId.substring(0, gfycatId.indexOf('-'));
 | 
			
		||||
                                        }
 | 
			
		||||
                                        if (videoType == VIDEO_TYPE_GFYCAT) {
 | 
			
		||||
                                            videoFileName = "Gfycat-" + gfycatId + ".mp4";
 | 
			
		||||
                                        } else {
 | 
			
		||||
                                            videoFileName = "Redgifs-" + gfycatId + ".mp4";
 | 
			
		||||
                                        }
 | 
			
		||||
                                        loadGfycatOrRedgifsVideo(redgifsRetrofit, gfycatId, false, savedInstanceState, false);
 | 
			
		||||
                                    } else if (post.isStreamable()) {
 | 
			
		||||
                                        videoType = VIDEO_TYPE_STREAMABLE;
 | 
			
		||||
                                        String shortCode = post.getStreamableShortCode();
 | 
			
		||||
@@ -824,7 +884,7 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe
 | 
			
		||||
                            Toast.makeText(ViewVideoActivity.this, R.string.fetch_streamable_video_failed, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                            return;
 | 
			
		||||
                        }
 | 
			
		||||
                        titleTextView.setText(streamableVideo.title);
 | 
			
		||||
                        setSmallTitle(streamableVideo.title);
 | 
			
		||||
                        progressBar.setVisibility(View.GONE);
 | 
			
		||||
                        videoDownloadUrl = streamableVideo.mp4 == null ? streamableVideo.mp4Mobile.url : streamableVideo.mp4.url;
 | 
			
		||||
                        mVideoUri = Uri.parse(videoDownloadUrl);
 | 
			
		||||
@@ -879,7 +939,11 @@ public class ViewVideoActivity extends AppCompatActivity implements CustomFontRe
 | 
			
		||||
            requestPermissionAndDownload();
 | 
			
		||||
            return true;
 | 
			
		||||
        } else if (itemId == R.id.action_playback_speed_view_video_activity) {
 | 
			
		||||
            changePlaybackSpeed();
 | 
			
		||||
            PlaybackSpeedBottomSheetFragment playbackSpeedBottomSheetFragment = new PlaybackSpeedBottomSheetFragment();
 | 
			
		||||
            Bundle bundle = new Bundle();
 | 
			
		||||
            bundle.putInt(PlaybackSpeedBottomSheetFragment.EXTRA_PLAYBACK_SPEED, playbackSpeed);
 | 
			
		||||
            playbackSpeedBottomSheetFragment.setArguments(bundle);
 | 
			
		||||
            playbackSpeedBottomSheetFragment.show(getSupportFragmentManager(), playbackSpeedBottomSheetFragment.getTag());
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -176,7 +176,7 @@ public class WikiActivity extends BaseActivity {
 | 
			
		||||
            return true;
 | 
			
		||||
        };
 | 
			
		||||
        markwon = MarkdownUtils.createFullRedditMarkwon(this,
 | 
			
		||||
                miscPlugin, markdownColor, spoilerBackgroundColor, mGlide, onLinkLongClickListener, mSharedPreferences.getBoolean(SharedPreferencesUtils.DISABLE_IMAGE_PREVIEW, false));
 | 
			
		||||
                miscPlugin, markdownColor, spoilerBackgroundColor, onLinkLongClickListener);
 | 
			
		||||
 | 
			
		||||
        markwonAdapter = MarkdownUtils.createTablesAdapter();
 | 
			
		||||
        LinearLayoutManagerBugFixed linearLayoutManager = new SwipeLockLinearLayoutManager(this, new SwipeLockInterface() {
 | 
			
		||||
@@ -259,7 +259,7 @@ public class WikiActivity extends BaseActivity {
 | 
			
		||||
        swipeRefreshLayout.setRefreshing(false);
 | 
			
		||||
        mFetchWikiInfoLinearLayout.setVisibility(View.VISIBLE);
 | 
			
		||||
        mFetchWikiInfoTextView.setText(stringResId);
 | 
			
		||||
        mGlide.load(R.mipmap.ic_launcher_round).into(mFetchWikiInfoImageView);
 | 
			
		||||
        mGlide.load(R.drawable.error_image).into(mFetchWikiInfoImageView);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -1,279 +0,0 @@
 | 
			
		||||
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.InstanceInfoActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.blockedinstances.BlockedInstanceData;
 | 
			
		||||
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 BlockedInstancesRecyclerViewAdapter 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<BlockedInstanceData> mBlockedInstanceData;
 | 
			
		||||
    private List<BlockedInstanceData> mFavoriteBlockedInstanceData;
 | 
			
		||||
    private RequestManager glide;
 | 
			
		||||
    private ItemClickListener itemClickListener;
 | 
			
		||||
 | 
			
		||||
    private String accessToken;
 | 
			
		||||
    private String instancename;
 | 
			
		||||
    private String instanceIconUrl;
 | 
			
		||||
    private boolean hasClearSelectionRow;
 | 
			
		||||
 | 
			
		||||
    private int primaryTextColor;
 | 
			
		||||
    private int secondaryTextColor;
 | 
			
		||||
 | 
			
		||||
    public BlockedInstancesRecyclerViewAdapter(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 BlockedInstancesRecyclerViewAdapter(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 (mFavoriteBlockedInstanceData != null && mFavoriteBlockedInstanceData.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 == mFavoriteBlockedInstanceData.size() + 2) {
 | 
			
		||||
                    return VIEW_TYPE_SUBREDDIT_DIVIDER;
 | 
			
		||||
                } else if (position <= mFavoriteBlockedInstanceData.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 == mFavoriteBlockedInstanceData.size() + 3) {
 | 
			
		||||
                    return VIEW_TYPE_SUBREDDIT_DIVIDER;
 | 
			
		||||
                } else if (position <= mFavoriteBlockedInstanceData.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 == mFavoriteBlockedInstanceData.size() + 1) {
 | 
			
		||||
                    return VIEW_TYPE_SUBREDDIT_DIVIDER;
 | 
			
		||||
                } else if (position <= mFavoriteBlockedInstanceData.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) {
 | 
			
		||||
        return new InstanceViewHolder(LayoutInflater.from(viewGroup.getContext())
 | 
			
		||||
                .inflate(R.layout.item_subscribed_thing, viewGroup, false));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, int i) {
 | 
			
		||||
 | 
			
		||||
        String name;
 | 
			
		||||
        String iconUrl;
 | 
			
		||||
 | 
			
		||||
        if (hasClearSelectionRow && viewHolder.getBindingAdapterPosition() == 0) {
 | 
			
		||||
            ((InstanceViewHolder) viewHolder).subredditNameTextView.setText(R.string.all_communities);
 | 
			
		||||
            viewHolder.itemView.setOnClickListener(view -> itemClickListener.onClick(null));
 | 
			
		||||
            return;
 | 
			
		||||
        } else {
 | 
			
		||||
            int offset = hasClearSelectionRow ? 1 : 0;
 | 
			
		||||
            BlockedInstanceData instanceData = mBlockedInstanceData.get(viewHolder.getBindingAdapterPosition() - offset);
 | 
			
		||||
            String domain = mBlockedInstanceData.get(viewHolder.getBindingAdapterPosition() - offset).getDomain();
 | 
			
		||||
            String instanceName = mBlockedInstanceData.get(viewHolder.getBindingAdapterPosition() - offset).getName();
 | 
			
		||||
            name = instanceName != null ? instanceName + " (" + domain + ")" : domain;
 | 
			
		||||
            iconUrl = mBlockedInstanceData.get(viewHolder.getBindingAdapterPosition() - offset).getIcon();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        ((InstanceViewHolder) viewHolder).itemView.setOnClickListener(view -> {
 | 
			
		||||
            if (mBlockedInstanceData != null) {
 | 
			
		||||
                BlockedInstanceData instanceData = mBlockedInstanceData.get(viewHolder.getBindingAdapterPosition());
 | 
			
		||||
                Intent intent = new Intent(mActivity, InstanceInfoActivity.class);
 | 
			
		||||
                intent.putExtra(InstanceInfoActivity.EXTRA_INSTANCE_DOMAIN, instanceData.getDomain());
 | 
			
		||||
                intent.putExtra(InstanceInfoActivity.EXTRA_INSTANCE_ID, instanceData.getId());
 | 
			
		||||
                mActivity.startActivity(intent);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        if (iconUrl == null || iconUrl.equals("")) {
 | 
			
		||||
            ((InstanceViewHolder) viewHolder).iconGifImageView.setVisibility(View.GONE);
 | 
			
		||||
        } else {
 | 
			
		||||
            ((InstanceViewHolder) viewHolder).iconGifImageView.setVisibility(View.VISIBLE);
 | 
			
		||||
            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(((InstanceViewHolder) viewHolder).iconGifImageView);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        ((InstanceViewHolder) viewHolder).subredditNameTextView.setText(name);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getItemCount() {
 | 
			
		||||
        if (mBlockedInstanceData != null) {
 | 
			
		||||
 | 
			
		||||
            if (itemClickListener != null) {
 | 
			
		||||
                return mBlockedInstanceData.size() > 0 ? mBlockedInstanceData.size() + ((hasClearSelectionRow) ? 1 : 0) : 0;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return mBlockedInstanceData.size();
 | 
			
		||||
        }
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
 | 
			
		||||
        glide.clear(((InstanceViewHolder) holder).iconGifImageView);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void blockedInstances(List<BlockedInstanceData> subscribedSubreddits) {
 | 
			
		||||
        mBlockedInstanceData = subscribedSubreddits;
 | 
			
		||||
        notifyDataSetChanged();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setFavoriteSubscribedSubreddits(List<BlockedInstanceData> favoriteBlockedInstanceData) {
 | 
			
		||||
        mFavoriteBlockedInstanceData = favoriteBlockedInstanceData;
 | 
			
		||||
        notifyDataSetChanged();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void addInstance(String instancename, String instanceIconUrl) {
 | 
			
		||||
        this.instancename = instancename;
 | 
			
		||||
        this.instanceIconUrl = instanceIconUrl;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @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 = (mFavoriteBlockedInstanceData != null && mFavoriteBlockedInstanceData.size() > 0) ?
 | 
			
		||||
                                    mFavoriteBlockedInstanceData.size() + 4 : 0;
 | 
			
		||||
                        } else {
 | 
			
		||||
                            offset = (mFavoriteBlockedInstanceData != null && mFavoriteBlockedInstanceData.size() > 0) ?
 | 
			
		||||
                                    mFavoriteBlockedInstanceData.size() + 3 : 0;
 | 
			
		||||
                        }
 | 
			
		||||
                    } else {
 | 
			
		||||
                        offset = (mFavoriteBlockedInstanceData != null && mFavoriteBlockedInstanceData.size() > 0) ?
 | 
			
		||||
                                mFavoriteBlockedInstanceData.size() + 2 : 0;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    return mBlockedInstanceData.get(position - offset).getDomain().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 mFavoriteBlockedInstanceData.get(position - offset).getDomain().substring(0, 1).toUpperCase();
 | 
			
		||||
            default:
 | 
			
		||||
                return "";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public interface ItemClickListener {
 | 
			
		||||
        void onClick(BlockedInstanceData subredditData);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class InstanceViewHolder 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;
 | 
			
		||||
 | 
			
		||||
        @BindView(R.id.thing_instance_text_view_item_subscribed_thing)
 | 
			
		||||
        TextView instanceInstanceTextView;
 | 
			
		||||
 | 
			
		||||
        InstanceViewHolder(View itemView) {
 | 
			
		||||
            super(itemView);
 | 
			
		||||
            ButterKnife.bind(this, itemView);
 | 
			
		||||
            if (mActivity.typeface != null) {
 | 
			
		||||
                subredditNameTextView.setTypeface(mActivity.typeface);
 | 
			
		||||
            }
 | 
			
		||||
            subredditNameTextView.setTextColor(primaryTextColor);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,76 +0,0 @@
 | 
			
		||||
package eu.toldi.infinityforlemmy.adapters;
 | 
			
		||||
 | 
			
		||||
import android.view.LayoutInflater;
 | 
			
		||||
import android.view.ViewGroup;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
import android.widget.Toast;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import eu.toldi.infinityforlemmy.R;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.BaseActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.commentfilter.CommentFilterUsage;
 | 
			
		||||
import eu.toldi.infinityforlemmy.databinding.ItemCommentFilterUsageEmbeddedBinding;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
public class CommentFilterUsageEmbeddedRecyclerViewAdapter extends RecyclerView.Adapter<CommentFilterUsageEmbeddedRecyclerViewAdapter.EntryViewHolder> {
 | 
			
		||||
    private BaseActivity baseActivity;
 | 
			
		||||
    private List<CommentFilterUsage> commentFilterUsageList;
 | 
			
		||||
 | 
			
		||||
    public CommentFilterUsageEmbeddedRecyclerViewAdapter(BaseActivity baseActivity) {
 | 
			
		||||
        this.baseActivity = baseActivity;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    public EntryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
 | 
			
		||||
        return new EntryViewHolder(ItemCommentFilterUsageEmbeddedBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onBindViewHolder(@NonNull EntryViewHolder holder, int position) {
 | 
			
		||||
        if (commentFilterUsageList == null || commentFilterUsageList.isEmpty()) {
 | 
			
		||||
            holder.textView.setText(R.string.comment_filter_applied_to_all_subreddits);
 | 
			
		||||
        } else if (holder.getBindingAdapterPosition() > 4) {
 | 
			
		||||
            holder.textView.setText(baseActivity.getString(R.string.comment_filter_usage_embedded_more_count, commentFilterUsageList.size() - 5));
 | 
			
		||||
        } else {
 | 
			
		||||
            CommentFilterUsage commentFilterUsage = commentFilterUsageList.get(holder.getBindingAdapterPosition());
 | 
			
		||||
            switch (commentFilterUsage.usage) {
 | 
			
		||||
                case CommentFilterUsage.SUBREDDIT_TYPE:
 | 
			
		||||
                    holder.textView.setText("r/" + commentFilterUsage.nameOfUsage);
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getItemCount() {
 | 
			
		||||
        return commentFilterUsageList == null || commentFilterUsageList.isEmpty() ? 1 : (commentFilterUsageList.size() > 5 ? 6 : commentFilterUsageList.size());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setCommentFilterUsageList(List<CommentFilterUsage> commentFilterUsageList) {
 | 
			
		||||
        this.commentFilterUsageList = commentFilterUsageList;
 | 
			
		||||
        notifyDataSetChanged();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class EntryViewHolder extends RecyclerView.ViewHolder {
 | 
			
		||||
        TextView textView;
 | 
			
		||||
 | 
			
		||||
        public EntryViewHolder(@NonNull ItemCommentFilterUsageEmbeddedBinding binding) {
 | 
			
		||||
            super(binding.getRoot());
 | 
			
		||||
            textView = binding.getRoot();
 | 
			
		||||
            textView.setTextColor(baseActivity.customThemeWrapper.getSecondaryTextColor());
 | 
			
		||||
 | 
			
		||||
            if (baseActivity.typeface != null) {
 | 
			
		||||
                textView.setTypeface(baseActivity.typeface);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            textView.setOnClickListener(view -> {
 | 
			
		||||
                Toast.makeText(baseActivity, textView.getText(), Toast.LENGTH_SHORT).show();
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,80 +0,0 @@
 | 
			
		||||
package eu.toldi.infinityforlemmy.adapters;
 | 
			
		||||
 | 
			
		||||
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 java.util.List;
 | 
			
		||||
 | 
			
		||||
import eu.toldi.infinityforlemmy.R;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.BaseActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.commentfilter.CommentFilterUsage;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
public class CommentFilterUsageRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
 | 
			
		||||
    private List<CommentFilterUsage> commentFilterUsages;
 | 
			
		||||
    private BaseActivity activity;
 | 
			
		||||
    private CustomThemeWrapper customThemeWrapper;
 | 
			
		||||
    private CommentFilterUsageRecyclerViewAdapter.OnItemClickListener onItemClickListener;
 | 
			
		||||
 | 
			
		||||
    public interface OnItemClickListener {
 | 
			
		||||
        void onClick(CommentFilterUsage commentFilterUsage);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public CommentFilterUsageRecyclerViewAdapter(BaseActivity activity, CustomThemeWrapper customThemeWrapper,
 | 
			
		||||
                                                 CommentFilterUsageRecyclerViewAdapter.OnItemClickListener onItemClickListener) {
 | 
			
		||||
        this.activity = activity;
 | 
			
		||||
        this.customThemeWrapper = customThemeWrapper;
 | 
			
		||||
        this.onItemClickListener = onItemClickListener;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
 | 
			
		||||
        return new CommentFilterUsageRecyclerViewAdapter.CommentFilterUsageViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_post_filter_usage, parent, false));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
 | 
			
		||||
        CommentFilterUsage commentFilterUsage = commentFilterUsages.get(position);
 | 
			
		||||
        switch (commentFilterUsage.usage) {
 | 
			
		||||
            case CommentFilterUsage.SUBREDDIT_TYPE:
 | 
			
		||||
                ((CommentFilterUsageRecyclerViewAdapter.CommentFilterUsageViewHolder) holder).usageTextView.setText(activity.getString(R.string.post_filter_usage_community, commentFilterUsage.nameOfUsage));
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getItemCount() {
 | 
			
		||||
        return commentFilterUsages == null ? 0 : commentFilterUsages.size();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setCommentFilterUsages(List<CommentFilterUsage> commentFilterUsages) {
 | 
			
		||||
        this.commentFilterUsages = commentFilterUsages;
 | 
			
		||||
        notifyDataSetChanged();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private class CommentFilterUsageViewHolder extends RecyclerView.ViewHolder {
 | 
			
		||||
        TextView usageTextView;
 | 
			
		||||
 | 
			
		||||
        public CommentFilterUsageViewHolder(@NonNull View itemView) {
 | 
			
		||||
            super(itemView);
 | 
			
		||||
            usageTextView = (TextView) itemView;
 | 
			
		||||
 | 
			
		||||
            usageTextView.setTextColor(customThemeWrapper.getPrimaryTextColor());
 | 
			
		||||
 | 
			
		||||
            if (activity.typeface != null) {
 | 
			
		||||
                usageTextView.setTypeface(activity.typeface);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            usageTextView.setOnClickListener(view -> {
 | 
			
		||||
                onItemClickListener.onClick(commentFilterUsages.get(getBindingAdapterPosition()));
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,81 +0,0 @@
 | 
			
		||||
package eu.toldi.infinityforlemmy.adapters;
 | 
			
		||||
 | 
			
		||||
import android.view.LayoutInflater;
 | 
			
		||||
import android.view.ViewGroup;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.BaseActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.commentfilter.CommentFilter;
 | 
			
		||||
import eu.toldi.infinityforlemmy.commentfilter.CommentFilterWithUsage;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.LinearLayoutManagerBugFixed;
 | 
			
		||||
import eu.toldi.infinityforlemmy.databinding.ItemCommentFilterWithUsageBinding;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
public class CommentFilterWithUsageRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
 | 
			
		||||
    private BaseActivity activity;
 | 
			
		||||
    private final OnItemClickListener onItemClickListener;
 | 
			
		||||
    private List<CommentFilterWithUsage> commentFilterWithUsageList;
 | 
			
		||||
    private RecyclerView.RecycledViewPool recycledViewPool;
 | 
			
		||||
 | 
			
		||||
    public interface OnItemClickListener {
 | 
			
		||||
        void onItemClick(CommentFilter commentFilter);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public CommentFilterWithUsageRecyclerViewAdapter(BaseActivity activity, OnItemClickListener onItemClickListener) {
 | 
			
		||||
        this.activity = activity;
 | 
			
		||||
        this.recycledViewPool = new RecyclerView.RecycledViewPool();
 | 
			
		||||
        this.onItemClickListener = onItemClickListener;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
 | 
			
		||||
        return new CommentFilterViewHolder(ItemCommentFilterWithUsageBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
 | 
			
		||||
        if (holder instanceof CommentFilterViewHolder) {
 | 
			
		||||
            ((CommentFilterViewHolder) holder).binding.commentFilterNameTextViewItemCommentFilter.setText(commentFilterWithUsageList.get(position).commentFilter.name);
 | 
			
		||||
            ((CommentFilterViewHolder) holder).adapter.setCommentFilterUsageList(commentFilterWithUsageList.get(position).commentFilterUsageList);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getItemCount() {
 | 
			
		||||
        return commentFilterWithUsageList == null ? 0 : commentFilterWithUsageList.size();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setCommentFilterWithUsageList(List<CommentFilterWithUsage> commentFilterWithUsageList) {
 | 
			
		||||
        this.commentFilterWithUsageList = commentFilterWithUsageList;
 | 
			
		||||
        notifyDataSetChanged();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private class CommentFilterViewHolder extends RecyclerView.ViewHolder {
 | 
			
		||||
        ItemCommentFilterWithUsageBinding binding;
 | 
			
		||||
        CommentFilterUsageEmbeddedRecyclerViewAdapter adapter;
 | 
			
		||||
 | 
			
		||||
        public CommentFilterViewHolder(@NonNull ItemCommentFilterWithUsageBinding binding) {
 | 
			
		||||
            super(binding.getRoot());
 | 
			
		||||
            this.binding = binding;
 | 
			
		||||
            binding.commentFilterNameTextViewItemCommentFilter.setTextColor(activity.customThemeWrapper.getPrimaryTextColor());
 | 
			
		||||
 | 
			
		||||
            if (activity.typeface != null) {
 | 
			
		||||
                binding.commentFilterNameTextViewItemCommentFilter.setTypeface(activity.typeface);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            binding.getRoot().setOnClickListener(view -> {
 | 
			
		||||
                onItemClickListener.onItemClick(commentFilterWithUsageList.get(getBindingAdapterPosition()).commentFilter);
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            binding.commentFilterUsageRecyclerViewItemCommentFilter.setRecycledViewPool(recycledViewPool);
 | 
			
		||||
            binding.commentFilterUsageRecyclerViewItemCommentFilter.setLayoutManager(new LinearLayoutManagerBugFixed(activity));
 | 
			
		||||
            adapter = new CommentFilterUsageEmbeddedRecyclerViewAdapter(activity);
 | 
			
		||||
            binding.commentFilterUsageRecyclerViewItemCommentFilter.setAdapter(adapter);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -4,6 +4,7 @@ import android.content.Intent;
 | 
			
		||||
import android.content.SharedPreferences;
 | 
			
		||||
import android.content.res.ColorStateList;
 | 
			
		||||
import android.graphics.Color;
 | 
			
		||||
import android.graphics.PorterDuff;
 | 
			
		||||
import android.net.Uri;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.text.Spanned;
 | 
			
		||||
@@ -11,6 +12,7 @@ import android.view.LayoutInflater;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.view.ViewGroup;
 | 
			
		||||
import android.widget.Button;
 | 
			
		||||
import android.widget.ImageView;
 | 
			
		||||
import android.widget.LinearLayout;
 | 
			
		||||
import android.widget.ProgressBar;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
@@ -24,9 +26,6 @@ import androidx.recyclerview.widget.DiffUtil;
 | 
			
		||||
import androidx.recyclerview.widget.ItemTouchHelper;
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView;
 | 
			
		||||
 | 
			
		||||
import com.bumptech.glide.Glide;
 | 
			
		||||
import com.google.android.material.button.MaterialButton;
 | 
			
		||||
 | 
			
		||||
import java.util.Locale;
 | 
			
		||||
 | 
			
		||||
import butterknife.BindView;
 | 
			
		||||
@@ -50,7 +49,6 @@ import eu.toldi.infinityforlemmy.customviews.LinearLayoutManagerBugFixed;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.SpoilerOnClickTextView;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.SwipeLockInterface;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.SwipeLockLinearLayoutManager;
 | 
			
		||||
import eu.toldi.infinityforlemmy.databinding.ItemCommentBinding;
 | 
			
		||||
import eu.toldi.infinityforlemmy.markdown.MarkdownUtils;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.APIUtils;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
 | 
			
		||||
@@ -171,7 +169,7 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
 | 
			
		||||
            return true;
 | 
			
		||||
        };
 | 
			
		||||
        mMarkwon = MarkdownUtils.createFullRedditMarkwon(mActivity,
 | 
			
		||||
                miscPlugin, mCommentColor, commentSpoilerBackgroundColor, Glide.with(mActivity.getApplication()), onLinkLongClickListener, sharedPreferences.getBoolean(SharedPreferencesUtils.DISABLE_IMAGE_PREVIEW, false));
 | 
			
		||||
                miscPlugin, mCommentColor, commentSpoilerBackgroundColor, onLinkLongClickListener);
 | 
			
		||||
        recycledViewPool = new RecyclerView.RecycledViewPool();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -179,7 +177,7 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
 | 
			
		||||
    @Override
 | 
			
		||||
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
 | 
			
		||||
        if (viewType == VIEW_TYPE_DATA) {
 | 
			
		||||
            return new CommentViewHolder(ItemCommentBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
 | 
			
		||||
            return new CommentViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_comment, parent, false));
 | 
			
		||||
        } else if (viewType == VIEW_TYPE_ERROR) {
 | 
			
		||||
            return new ErrorViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_footer_error, parent, false));
 | 
			
		||||
        } else {
 | 
			
		||||
@@ -189,24 +187,24 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
 | 
			
		||||
        if (holder instanceof CommentBaseViewHolder) {
 | 
			
		||||
        if (holder instanceof CommentViewHolder) {
 | 
			
		||||
            Comment comment = getItem(holder.getBindingAdapterPosition());
 | 
			
		||||
            if (comment != null) {
 | 
			
		||||
                String name = comment.getCommunityQualifiedName();
 | 
			
		||||
                ((CommentBaseViewHolder) holder).authorTextView.setText(name);
 | 
			
		||||
                ((CommentBaseViewHolder) holder).authorTextView.setTextColor(mSubredditColor);
 | 
			
		||||
                ((CommentViewHolder) holder).authorTextView.setText(name);
 | 
			
		||||
                ((CommentViewHolder) holder).authorTextView.setTextColor(mSubredditColor);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                if (mShowElapsedTime) {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).commentTimeTextView.setText(
 | 
			
		||||
                    ((CommentViewHolder) holder).commentTimeTextView.setText(
 | 
			
		||||
                            Utils.getElapsedTime(mActivity, comment.getCommentTimeMillis()));
 | 
			
		||||
                } else {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).commentTimeTextView.setText(Utils.getFormattedTime(mLocale, comment.getCommentTimeMillis(), mTimeFormatPattern));
 | 
			
		||||
                    ((CommentViewHolder) holder).commentTimeTextView.setText(Utils.getFormattedTime(mLocale, comment.getCommentTimeMillis(), mTimeFormatPattern));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                ((CommentViewHolder) holder).markwonAdapter.setMarkdown(mMarkwon, comment.getCommentMarkdown());
 | 
			
		||||
                // noinspection NotifyDataSetChanged
 | 
			
		||||
                ((CommentBaseViewHolder) holder).markwonAdapter.notifyDataSetChanged();
 | 
			
		||||
                ((CommentViewHolder) holder).markwonAdapter.notifyDataSetChanged();
 | 
			
		||||
 | 
			
		||||
                String commentText = Utils.getNVotes(mShowAbsoluteNumberOfVotes,
 | 
			
		||||
                        comment.getScore() + comment.getVoteType());
 | 
			
		||||
@@ -215,21 +213,21 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
 | 
			
		||||
 | 
			
		||||
                switch (comment.getVoteType()) {
 | 
			
		||||
                    case Comment.VOTE_TYPE_UPVOTE:
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).upvoteButton.setIconResource(R.drawable.ic_upvote_filled_24dp);
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).upvoteButton.setIconTint(ColorStateList.valueOf(mUpvotedColor));
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).scoreTextView.setTextColor(mUpvotedColor);
 | 
			
		||||
                        ((CommentViewHolder) holder).upvoteButton
 | 
			
		||||
                                .setColorFilter(mUpvotedColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                        ((CommentViewHolder) holder).scoreTextView.setTextColor(mUpvotedColor);
 | 
			
		||||
                        break;
 | 
			
		||||
                    case Comment.VOTE_TYPE_DOWNVOTE:
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).downvoteButton.setIconResource(R.drawable.ic_downvote_filled_24dp);
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).downvoteButton.setIconTint(ColorStateList.valueOf(mDownvotedColor));
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).scoreTextView.setTextColor(mDownvotedColor);
 | 
			
		||||
                        ((CommentViewHolder) holder).downvoteButton
 | 
			
		||||
                                .setColorFilter(mDownvotedColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                        ((CommentViewHolder) holder).scoreTextView.setTextColor(mDownvotedColor);
 | 
			
		||||
                        break;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (comment.isSaved()) {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).saveButton.setIconResource(R.drawable.ic_bookmark_grey_24dp);
 | 
			
		||||
                    ((CommentViewHolder) holder).saveButton.setImageResource(R.drawable.ic_bookmark_grey_24dp);
 | 
			
		||||
                } else {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).saveButton.setIconResource(R.drawable.ic_bookmark_border_grey_24dp);
 | 
			
		||||
                    ((CommentViewHolder) holder).saveButton.setImageResource(R.drawable.ic_bookmark_border_grey_24dp);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -251,16 +249,14 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
 | 
			
		||||
        if (holder instanceof CommentBaseViewHolder) {
 | 
			
		||||
            ((CommentBaseViewHolder) holder).authorFlairTextView.setText("");
 | 
			
		||||
            ((CommentBaseViewHolder) holder).authorFlairTextView.setVisibility(View.GONE);
 | 
			
		||||
            ((CommentBaseViewHolder) holder).awardsTextView.setText("");
 | 
			
		||||
            ((CommentBaseViewHolder) holder).awardsTextView.setVisibility(View.GONE);
 | 
			
		||||
            ((CommentBaseViewHolder) holder).upvoteButton.setIconResource(R.drawable.ic_upvote_24dp);
 | 
			
		||||
            ((CommentBaseViewHolder) holder).upvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
            ((CommentBaseViewHolder) holder).scoreTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
            ((CommentBaseViewHolder) holder).downvoteButton.setIconResource(R.drawable.ic_downvote_24dp);
 | 
			
		||||
            ((CommentBaseViewHolder) holder).downvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
        if (holder instanceof CommentViewHolder) {
 | 
			
		||||
            ((CommentViewHolder) holder).authorFlairTextView.setText("");
 | 
			
		||||
            ((CommentViewHolder) holder).authorFlairTextView.setVisibility(View.GONE);
 | 
			
		||||
            ((CommentViewHolder) holder).awardsTextView.setText("");
 | 
			
		||||
            ((CommentViewHolder) holder).awardsTextView.setVisibility(View.GONE);
 | 
			
		||||
            ((CommentViewHolder) holder).upvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
            ((CommentViewHolder) holder).downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
            ((CommentViewHolder) holder).scoreTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -293,18 +289,18 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void onItemSwipe(RecyclerView.ViewHolder viewHolder, int direction, int swipeLeftAction, int swipeRightAction) {
 | 
			
		||||
        if (viewHolder instanceof CommentBaseViewHolder) {
 | 
			
		||||
        if (viewHolder instanceof CommentViewHolder) {
 | 
			
		||||
            if (direction == ItemTouchHelper.LEFT || direction == ItemTouchHelper.START) {
 | 
			
		||||
                if (swipeLeftAction == SharedPreferencesUtils.SWIPE_ACITON_UPVOTE) {
 | 
			
		||||
                    ((CommentBaseViewHolder) viewHolder).upvoteButton.performClick();
 | 
			
		||||
                    ((CommentViewHolder) viewHolder).upvoteButton.performClick();
 | 
			
		||||
                } else if (swipeLeftAction == SharedPreferencesUtils.SWIPE_ACITON_DOWNVOTE) {
 | 
			
		||||
                    ((CommentBaseViewHolder) viewHolder).downvoteButton.performClick();
 | 
			
		||||
                    ((CommentViewHolder) viewHolder).downvoteButton.performClick();
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                if (swipeRightAction == SharedPreferencesUtils.SWIPE_ACITON_UPVOTE) {
 | 
			
		||||
                    ((CommentBaseViewHolder) viewHolder).upvoteButton.performClick();
 | 
			
		||||
                    ((CommentViewHolder) viewHolder).upvoteButton.performClick();
 | 
			
		||||
                } else if (swipeRightAction == SharedPreferencesUtils.SWIPE_ACITON_DOWNVOTE) {
 | 
			
		||||
                    ((CommentBaseViewHolder) viewHolder).downvoteButton.performClick();
 | 
			
		||||
                    ((CommentViewHolder) viewHolder).downvoteButton.performClick();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -322,60 +318,46 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
 | 
			
		||||
        void retryLoadingMore();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class CommentBaseViewHolder extends RecyclerView.ViewHolder {
 | 
			
		||||
    public class CommentViewHolder extends RecyclerView.ViewHolder {
 | 
			
		||||
        @BindView(R.id.vertical_block_indentation_item_comment)
 | 
			
		||||
        CommentIndentationView commentIndentationView;
 | 
			
		||||
        @BindView(R.id.linear_layout_item_comment)
 | 
			
		||||
        LinearLayout linearLayout;
 | 
			
		||||
        @BindView(R.id.author_text_view_item_post_comment)
 | 
			
		||||
        TextView authorTextView;
 | 
			
		||||
        @BindView(R.id.author_flair_text_view_item_post_comment)
 | 
			
		||||
        TextView authorFlairTextView;
 | 
			
		||||
        @BindView(R.id.comment_time_text_view_item_post_comment)
 | 
			
		||||
        TextView commentTimeTextView;
 | 
			
		||||
        @BindView(R.id.awards_text_view_item_comment)
 | 
			
		||||
        TextView awardsTextView;
 | 
			
		||||
        @BindView(R.id.comment_markdown_view_item_post_comment)
 | 
			
		||||
        RecyclerView commentMarkdownView;
 | 
			
		||||
        @BindView(R.id.bottom_constraint_layout_item_post_comment)
 | 
			
		||||
        ConstraintLayout bottomConstraintLayout;
 | 
			
		||||
        MaterialButton upvoteButton;
 | 
			
		||||
        @BindView(R.id.up_vote_button_item_post_comment)
 | 
			
		||||
        ImageView upvoteButton;
 | 
			
		||||
        @BindView(R.id.score_text_view_item_post_comment)
 | 
			
		||||
        TextView scoreTextView;
 | 
			
		||||
        MaterialButton downvoteButton;
 | 
			
		||||
        @BindView(R.id.down_vote_button_item_post_comment)
 | 
			
		||||
        ImageView downvoteButton;
 | 
			
		||||
        @BindView(R.id.placeholder_item_post_comment)
 | 
			
		||||
        View placeholder;
 | 
			
		||||
        MaterialButton moreButton;
 | 
			
		||||
        MaterialButton saveButton;
 | 
			
		||||
        MaterialButton replyButton;
 | 
			
		||||
        @BindView(R.id.more_button_item_post_comment)
 | 
			
		||||
        ImageView moreButton;
 | 
			
		||||
        @BindView(R.id.save_button_item_post_comment)
 | 
			
		||||
        ImageView saveButton;
 | 
			
		||||
        @BindView(R.id.expand_button_item_post_comment)
 | 
			
		||||
        TextView expandButton;
 | 
			
		||||
        @BindView(R.id.reply_button_item_post_comment)
 | 
			
		||||
        ImageView replyButton;
 | 
			
		||||
        @BindView(R.id.divider_item_comment)
 | 
			
		||||
        View commentDivider;
 | 
			
		||||
        CustomMarkwonAdapter markwonAdapter;
 | 
			
		||||
 | 
			
		||||
        CommentBaseViewHolder(@NonNull View itemView) {
 | 
			
		||||
        CommentViewHolder(View itemView) {
 | 
			
		||||
            super(itemView);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        void setBaseView(LinearLayout linearLayout,
 | 
			
		||||
                         TextView authorTextView,
 | 
			
		||||
                         TextView authorFlairTextView,
 | 
			
		||||
                         TextView commentTimeTextView,
 | 
			
		||||
                         TextView awardsTextView,
 | 
			
		||||
                         RecyclerView commentMarkdownView,
 | 
			
		||||
                         ConstraintLayout bottomConstraintLayout,
 | 
			
		||||
                         MaterialButton upvoteButton,
 | 
			
		||||
                         TextView scoreTextView,
 | 
			
		||||
                         MaterialButton downvoteButton,
 | 
			
		||||
                         View placeholder,
 | 
			
		||||
                         MaterialButton moreButton,
 | 
			
		||||
                         MaterialButton saveButton,
 | 
			
		||||
                         TextView expandButton,
 | 
			
		||||
                         MaterialButton replyButton,
 | 
			
		||||
                         CommentIndentationView commentIndentationView,
 | 
			
		||||
                         View commentDivider) {
 | 
			
		||||
            this.linearLayout = linearLayout;
 | 
			
		||||
            this.authorTextView = authorTextView;
 | 
			
		||||
            this.authorFlairTextView = authorFlairTextView;
 | 
			
		||||
            this.commentTimeTextView = commentTimeTextView;
 | 
			
		||||
            this.awardsTextView = awardsTextView;
 | 
			
		||||
            this.commentMarkdownView = commentMarkdownView;
 | 
			
		||||
            this.bottomConstraintLayout = bottomConstraintLayout;
 | 
			
		||||
            this.upvoteButton = upvoteButton;
 | 
			
		||||
            this.scoreTextView = scoreTextView;
 | 
			
		||||
            this.downvoteButton = downvoteButton;
 | 
			
		||||
            this.placeholder = placeholder;
 | 
			
		||||
            this.moreButton = moreButton;
 | 
			
		||||
            this.saveButton = saveButton;
 | 
			
		||||
            this.replyButton = replyButton;
 | 
			
		||||
            this.commentDivider = commentDivider;
 | 
			
		||||
            ButterKnife.bind(this, itemView);
 | 
			
		||||
 | 
			
		||||
            replyButton.setVisibility(View.GONE);
 | 
			
		||||
 | 
			
		||||
@@ -431,19 +413,19 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
 | 
			
		||||
                authorFlairTextView.setTypeface(mActivity.typeface);
 | 
			
		||||
                commentTimeTextView.setTypeface(mActivity.typeface);
 | 
			
		||||
                awardsTextView.setTypeface(mActivity.typeface);
 | 
			
		||||
                upvoteButton.setTypeface(mActivity.typeface);
 | 
			
		||||
                scoreTextView.setTypeface(mActivity.typeface);
 | 
			
		||||
            }
 | 
			
		||||
            itemView.setBackgroundColor(mCommentBackgroundColor);
 | 
			
		||||
            authorTextView.setTextColor(mUsernameColor);
 | 
			
		||||
            authorFlairTextView.setTextColor(mAuthorFlairColor);
 | 
			
		||||
            commentTimeTextView.setTextColor(mSecondaryTextColor);
 | 
			
		||||
            awardsTextView.setTextColor(mSecondaryTextColor);
 | 
			
		||||
            upvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
            upvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
            scoreTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
            downvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
            moreButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
            saveButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
            replyButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
            downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
            moreButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
            saveButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
            replyButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
            commentDivider.setBackgroundColor(mDividerColor);
 | 
			
		||||
 | 
			
		||||
            authorTextView.setOnClickListener(view -> {
 | 
			
		||||
@@ -535,22 +517,20 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
 | 
			
		||||
                    int previousVoteType = comment.getVoteType();
 | 
			
		||||
                    int newVoteType;
 | 
			
		||||
 | 
			
		||||
                    downvoteButton.setIconResource(R.drawable.ic_downvote_24dp);
 | 
			
		||||
                    downvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
                    downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
 | 
			
		||||
                    if (previousVoteType != Comment.VOTE_TYPE_UPVOTE) {
 | 
			
		||||
                        //Not upvoted before
 | 
			
		||||
                        comment.setVoteType(Comment.VOTE_TYPE_UPVOTE);
 | 
			
		||||
                        newVoteType = Integer.parseInt(APIUtils.DIR_UPVOTE);
 | 
			
		||||
                        upvoteButton.setIconResource(R.drawable.ic_upvote_filled_24dp);
 | 
			
		||||
                        upvoteButton.setIconTint(ColorStateList.valueOf(mUpvotedColor));
 | 
			
		||||
                        upvoteButton
 | 
			
		||||
                                .setColorFilter(mUpvotedColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                        scoreTextView.setTextColor(mUpvotedColor);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        //Upvoted before
 | 
			
		||||
                        comment.setVoteType(Comment.VOTE_TYPE_NO_VOTE);
 | 
			
		||||
                        newVoteType = Integer.parseInt(APIUtils.DIR_UNVOTE);
 | 
			
		||||
                        upvoteButton.setIconResource(R.drawable.ic_upvote_24dp);
 | 
			
		||||
                        upvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
                        upvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                        scoreTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
@@ -559,32 +539,30 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
 | 
			
		||||
                            comment.getScore() + comment.getVoteType()));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                    VoteThing.voteComment(mActivity, retrofit, mAccessToken, new VoteThing.VoteThingListener() {
 | 
			
		||||
                    VoteThing.votePost(mActivity, retrofit, mAccessToken, new VoteThing.VoteThingListener() {
 | 
			
		||||
                        @Override
 | 
			
		||||
                        public void onVoteThingSuccess(int position1) {
 | 
			
		||||
                            int currentPosition = getBindingAdapterPosition();
 | 
			
		||||
                            if (newVoteType == Integer.parseInt(APIUtils.DIR_UPVOTE)) {
 | 
			
		||||
                                comment.setVoteType(Comment.VOTE_TYPE_UPVOTE);
 | 
			
		||||
                                if (currentPosition == position) {
 | 
			
		||||
                                    upvoteButton.setIconResource(R.drawable.ic_upvote_filled_24dp);
 | 
			
		||||
                                    upvoteButton.setIconTint(ColorStateList.valueOf(mUpvotedColor));
 | 
			
		||||
                                    upvoteButton.setColorFilter(mUpvotedColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                                    scoreTextView.setTextColor(mUpvotedColor);
 | 
			
		||||
                                }
 | 
			
		||||
                            } else {
 | 
			
		||||
                                comment.setVoteType(Comment.VOTE_TYPE_NO_VOTE);
 | 
			
		||||
                                if (currentPosition == position) {
 | 
			
		||||
                                    upvoteButton.setIconResource(R.drawable.ic_upvote_24dp);
 | 
			
		||||
                                    upvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
                                    upvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                                    scoreTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            if (currentPosition == position) {
 | 
			
		||||
                                downvoteButton.setIconResource(R.drawable.ic_downvote_24dp);
 | 
			
		||||
                                downvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
                                downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
 | 
			
		||||
                                scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
 | 
			
		||||
                                        comment.getScore() + comment.getVoteType()));
 | 
			
		||||
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
@@ -595,10 +573,6 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            scoreTextView.setOnClickListener(view -> {
 | 
			
		||||
                upvoteButton.performClick();
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            downvoteButton.setOnClickListener(view -> {
 | 
			
		||||
                if (mAccessToken == null) {
 | 
			
		||||
                    Toast.makeText(mActivity, R.string.login_first, Toast.LENGTH_SHORT).show();
 | 
			
		||||
@@ -614,22 +588,19 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
 | 
			
		||||
                    int previousVoteType = comment.getVoteType();
 | 
			
		||||
                    int newVoteType;
 | 
			
		||||
 | 
			
		||||
                    upvoteButton.setIconResource(R.drawable.ic_upvote_24dp);
 | 
			
		||||
                    upvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
                    upvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
 | 
			
		||||
                    if (previousVoteType != Comment.VOTE_TYPE_DOWNVOTE) {
 | 
			
		||||
                        //Not downvoted before
 | 
			
		||||
                        comment.setVoteType(Comment.VOTE_TYPE_DOWNVOTE);
 | 
			
		||||
                        newVoteType = Integer.parseInt(APIUtils.DIR_DOWNVOTE);
 | 
			
		||||
                        downvoteButton.setIconResource(R.drawable.ic_downvote_filled_24dp);
 | 
			
		||||
                        downvoteButton.setIconTint(ColorStateList.valueOf(mDownvotedColor));
 | 
			
		||||
                        downvoteButton.setColorFilter(mDownvotedColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                        scoreTextView.setTextColor(mDownvotedColor);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        //Downvoted before
 | 
			
		||||
                        comment.setVoteType(Comment.VOTE_TYPE_NO_VOTE);
 | 
			
		||||
                        newVoteType = Integer.parseInt(APIUtils.DIR_UNVOTE);
 | 
			
		||||
                        downvoteButton.setIconResource(R.drawable.ic_downvote_24dp);
 | 
			
		||||
                        downvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
                        downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                        scoreTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
@@ -638,31 +609,29 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
 | 
			
		||||
                            comment.getScore() + comment.getVoteType()));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                    VoteThing.voteComment(mActivity, retrofit, mAccessToken, new VoteThing.VoteThingListener() {
 | 
			
		||||
                    VoteThing.votePost(mActivity, retrofit, mAccessToken, new VoteThing.VoteThingListener() {
 | 
			
		||||
                        @Override
 | 
			
		||||
                        public void onVoteThingSuccess(int position1) {
 | 
			
		||||
                            int currentPosition = getBindingAdapterPosition();
 | 
			
		||||
                            if (newVoteType == Integer.parseInt(APIUtils.DIR_DOWNVOTE)) {
 | 
			
		||||
                                comment.setVoteType(Comment.VOTE_TYPE_DOWNVOTE);
 | 
			
		||||
                                if (currentPosition == position) {
 | 
			
		||||
                                    downvoteButton.setIconResource(R.drawable.ic_downvote_filled_24dp);
 | 
			
		||||
                                    downvoteButton.setIconTint(ColorStateList.valueOf(mDownvotedColor));
 | 
			
		||||
                                    downvoteButton.setColorFilter(mDownvotedColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                                    scoreTextView.setTextColor(mDownvotedColor);
 | 
			
		||||
                                }
 | 
			
		||||
                            } else {
 | 
			
		||||
                                comment.setVoteType(Comment.VOTE_TYPE_NO_VOTE);
 | 
			
		||||
                                if (currentPosition == position) {
 | 
			
		||||
                                    downvoteButton.setIconResource(R.drawable.ic_downvote_24dp);
 | 
			
		||||
                                    downvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
                                    downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                                    scoreTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            if (currentPosition == position) {
 | 
			
		||||
                                upvoteButton.setIconResource(R.drawable.ic_upvote_24dp);
 | 
			
		||||
                                upvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
                                upvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                                scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
 | 
			
		||||
                                        comment.getScore() + comment.getVoteType()));
 | 
			
		||||
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
@@ -688,7 +657,7 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
 | 
			
		||||
                            public void success() {
 | 
			
		||||
                                comment.setSaved(false);
 | 
			
		||||
                                if (getBindingAdapterPosition() == position) {
 | 
			
		||||
                                    saveButton.setIconResource(R.drawable.ic_bookmark_border_grey_24dp);
 | 
			
		||||
                                    saveButton.setImageResource(R.drawable.ic_bookmark_border_grey_24dp);
 | 
			
		||||
                                }
 | 
			
		||||
                                Toast.makeText(mActivity, R.string.comment_unsaved_success, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                            }
 | 
			
		||||
@@ -697,7 +666,7 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
 | 
			
		||||
                            public void failed() {
 | 
			
		||||
                                comment.setSaved(true);
 | 
			
		||||
                                if (getBindingAdapterPosition() == position) {
 | 
			
		||||
                                    saveButton.setIconResource(R.drawable.ic_bookmark_grey_24dp);
 | 
			
		||||
                                    saveButton.setImageResource(R.drawable.ic_bookmark_grey_24dp);
 | 
			
		||||
                                }
 | 
			
		||||
                                Toast.makeText(mActivity, R.string.comment_unsaved_failed, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                            }
 | 
			
		||||
@@ -709,7 +678,7 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
 | 
			
		||||
                            public void success() {
 | 
			
		||||
                                comment.setSaved(true);
 | 
			
		||||
                                if (getBindingAdapterPosition() == position) {
 | 
			
		||||
                                    saveButton.setIconResource(R.drawable.ic_bookmark_grey_24dp);
 | 
			
		||||
                                    saveButton.setImageResource(R.drawable.ic_bookmark_grey_24dp);
 | 
			
		||||
                                }
 | 
			
		||||
                                Toast.makeText(mActivity, R.string.comment_saved_success, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                            }
 | 
			
		||||
@@ -718,7 +687,7 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
 | 
			
		||||
                            public void failed() {
 | 
			
		||||
                                comment.setSaved(false);
 | 
			
		||||
                                if (getBindingAdapterPosition() == position) {
 | 
			
		||||
                                    saveButton.setIconResource(R.drawable.ic_bookmark_border_grey_24dp);
 | 
			
		||||
                                    saveButton.setImageResource(R.drawable.ic_bookmark_border_grey_24dp);
 | 
			
		||||
                                }
 | 
			
		||||
                                Toast.makeText(mActivity, R.string.comment_saved_failed, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                            }
 | 
			
		||||
@@ -729,32 +698,6 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class CommentViewHolder extends CommentBaseViewHolder {
 | 
			
		||||
        ItemCommentBinding binding;
 | 
			
		||||
 | 
			
		||||
        CommentViewHolder(ItemCommentBinding binding) {
 | 
			
		||||
            super(binding.getRoot());
 | 
			
		||||
            this.binding = binding;
 | 
			
		||||
            setBaseView(binding.linearLayoutItemComment,
 | 
			
		||||
                    binding.authorTextViewItemPostComment,
 | 
			
		||||
                    binding.authorFlairTextViewItemPostComment,
 | 
			
		||||
                    binding.commentTimeTextViewItemPostComment,
 | 
			
		||||
                    binding.awardsTextViewItemComment,
 | 
			
		||||
                    binding.commentMarkdownViewItemPostComment,
 | 
			
		||||
                    binding.bottomConstraintLayoutItemPostComment,
 | 
			
		||||
                    binding.upvoteButtonItemPostComment,
 | 
			
		||||
                    binding.scoreTextViewItemPostComment,
 | 
			
		||||
                    binding.downvoteButtonItemPostComment,
 | 
			
		||||
                    binding.placeholderItemPostComment,
 | 
			
		||||
                    binding.moreButtonItemPostComment,
 | 
			
		||||
                    binding.saveButtonItemPostComment,
 | 
			
		||||
                    binding.expandButtonItemPostComment,
 | 
			
		||||
                    binding.replyButtonItemPostComment,
 | 
			
		||||
                    binding.verticalBlockIndentationItemComment,
 | 
			
		||||
                    binding.dividerItemComment);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class ErrorViewHolder extends RecyclerView.ViewHolder {
 | 
			
		||||
        @BindView(R.id.error_text_view_item_footer_error)
 | 
			
		||||
        TextView errorTextView;
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ import android.content.Intent;
 | 
			
		||||
import android.content.SharedPreferences;
 | 
			
		||||
import android.content.res.ColorStateList;
 | 
			
		||||
import android.graphics.Color;
 | 
			
		||||
import android.graphics.PorterDuff;
 | 
			
		||||
import android.graphics.drawable.Drawable;
 | 
			
		||||
import android.net.Uri;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
@@ -30,7 +31,6 @@ import androidx.recyclerview.widget.RecyclerView;
 | 
			
		||||
import com.bumptech.glide.Glide;
 | 
			
		||||
import com.bumptech.glide.RequestManager;
 | 
			
		||||
import com.bumptech.glide.request.RequestOptions;
 | 
			
		||||
import com.google.android.material.button.MaterialButton;
 | 
			
		||||
import com.lsjwzh.widget.materialloadingprogressbar.CircleProgressBar;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
@@ -43,7 +43,6 @@ import java.util.regex.Pattern;
 | 
			
		||||
 | 
			
		||||
import butterknife.BindView;
 | 
			
		||||
import butterknife.ButterKnife;
 | 
			
		||||
import eu.toldi.infinityforlemmy.DualBadgeDrawable;
 | 
			
		||||
import eu.toldi.infinityforlemmy.R;
 | 
			
		||||
import eu.toldi.infinityforlemmy.RetrofitHolder;
 | 
			
		||||
import eu.toldi.infinityforlemmy.SaveComment;
 | 
			
		||||
@@ -59,7 +58,6 @@ import eu.toldi.infinityforlemmy.bottomsheetfragments.CommentMoreBottomSheetFrag
 | 
			
		||||
import eu.toldi.infinityforlemmy.bottomsheetfragments.UrlMenuBottomSheetFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.comment.Comment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.comment.FetchComment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.commentfilter.CommentFilter;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.CommentIndentationView;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.CustomMarkwonAdapter;
 | 
			
		||||
@@ -67,7 +65,6 @@ import eu.toldi.infinityforlemmy.customviews.LinearLayoutManagerBugFixed;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.SpoilerOnClickTextView;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.SwipeLockInterface;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.SwipeLockLinearLayoutManager;
 | 
			
		||||
import eu.toldi.infinityforlemmy.databinding.ItemCommentBinding;
 | 
			
		||||
import eu.toldi.infinityforlemmy.fragments.ViewPostDetailFragment;
 | 
			
		||||
import eu.toldi.infinityforlemmy.markdown.MarkdownUtils;
 | 
			
		||||
import eu.toldi.infinityforlemmy.post.Post;
 | 
			
		||||
@@ -156,7 +153,6 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
    private int mUsernameColor;
 | 
			
		||||
    private int mSubmitterColor;
 | 
			
		||||
    private int mModeratorColor;
 | 
			
		||||
    private int mAdminColor;
 | 
			
		||||
    private int mCurrentUserColor;
 | 
			
		||||
    private int mAuthorFlairTextColor;
 | 
			
		||||
    private int mUpvotedColor;
 | 
			
		||||
@@ -164,6 +160,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
    private int mSingleCommentThreadBackgroundColor;
 | 
			
		||||
    private int mVoteAndReplyUnavailableVoteButtonColor;
 | 
			
		||||
    private int mButtonTextColor;
 | 
			
		||||
    private int mPostIconAndInfoColor;
 | 
			
		||||
    private int mCommentIconAndInfoColor;
 | 
			
		||||
    private int mFullyCollapsedCommentBackgroundColor;
 | 
			
		||||
    private int mAwardedCommentBackgroundColor;
 | 
			
		||||
@@ -223,7 +220,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
            return true;
 | 
			
		||||
        };
 | 
			
		||||
        mCommentMarkwon = MarkdownUtils.createFullRedditMarkwon(mActivity,
 | 
			
		||||
                miscPlugin, mCommentTextColor, commentSpoilerBackgroundColor, mGlide, onLinkLongClickListener, sharedPreferences.getBoolean(SharedPreferencesUtils.DISABLE_IMAGE_PREVIEW, false));
 | 
			
		||||
                miscPlugin, mCommentTextColor, commentSpoilerBackgroundColor, onLinkLongClickListener);
 | 
			
		||||
        recycledViewPool = new RecyclerView.RecycledViewPool();
 | 
			
		||||
        mAccessToken = accessToken;
 | 
			
		||||
        mAccountQualifiedName = accountName;
 | 
			
		||||
@@ -273,7 +270,6 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
        mCommentBackgroundColor = customThemeWrapper.getCommentBackgroundColor();
 | 
			
		||||
        mSubmitterColor = customThemeWrapper.getSubmitter();
 | 
			
		||||
        mModeratorColor = customThemeWrapper.getModerator();
 | 
			
		||||
        mAdminColor = customThemeWrapper.getAdmin();
 | 
			
		||||
        mCurrentUserColor = customThemeWrapper.getCurrentUser();
 | 
			
		||||
        mAuthorFlairTextColor = customThemeWrapper.getAuthorFlairTextColor();
 | 
			
		||||
        mUsernameColor = customThemeWrapper.getUsername();
 | 
			
		||||
@@ -282,6 +278,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
        mSingleCommentThreadBackgroundColor = customThemeWrapper.getSingleCommentThreadBackgroundColor();
 | 
			
		||||
        mVoteAndReplyUnavailableVoteButtonColor = customThemeWrapper.getVoteAndReplyUnavailableButtonColor();
 | 
			
		||||
        mButtonTextColor = customThemeWrapper.getButtonTextColor();
 | 
			
		||||
        mPostIconAndInfoColor = customThemeWrapper.getPostIconAndInfoColor();
 | 
			
		||||
        mCommentIconAndInfoColor = customThemeWrapper.getCommentIconAndInfoColor();
 | 
			
		||||
        mFullyCollapsedCommentBackgroundColor = customThemeWrapper.getFullyCollapsedCommentBackgroundColor();
 | 
			
		||||
        mAwardedCommentBackgroundColor = customThemeWrapper.getAwardedCommentBackgroundColor();
 | 
			
		||||
@@ -363,7 +360,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
            case VIEW_TYPE_NO_COMMENT_PLACEHOLDER:
 | 
			
		||||
                return new NoCommentViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_no_comment_placeholder, parent, false));
 | 
			
		||||
            case VIEW_TYPE_COMMENT:
 | 
			
		||||
                return new CommentViewHolder(ItemCommentBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
 | 
			
		||||
                return new CommentViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_comment, parent, false));
 | 
			
		||||
            case VIEW_TYPE_COMMENT_FULLY_COLLAPSED:
 | 
			
		||||
                return new CommentFullyCollapsedViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_comment_fully_collapsed, parent, false));
 | 
			
		||||
            case VIEW_TYPE_LOAD_MORE_CHILD_COMMENTS:
 | 
			
		||||
@@ -379,7 +376,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
 | 
			
		||||
        if (holder instanceof CommentBaseViewHolder) {
 | 
			
		||||
        if (holder instanceof CommentViewHolder) {
 | 
			
		||||
            Comment comment = getCurrentComment(position);
 | 
			
		||||
            if (comment != null) {
 | 
			
		||||
                if (mIsSingleCommentThreadMode && comment.getId() == mSingleCommentId) {
 | 
			
		||||
@@ -387,35 +384,23 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
                }
 | 
			
		||||
                String authorDisplayName = (mShowUserDisplayName) ? comment.getAuthorName() : comment.getAuthor().getUsername();
 | 
			
		||||
                String authorInstance = (mHideUserInstance) ? "" : "@" + comment.getAuthor().getQualifiedName().split(Pattern.quote("@"))[1];
 | 
			
		||||
                ((CommentBaseViewHolder) holder).authorTextView.setText(authorDisplayName + authorInstance);
 | 
			
		||||
                ((CommentViewHolder) holder).authorTextView.setText(authorDisplayName + authorInstance);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                if (comment.isSubmitter()) {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).authorTextView.setTextColor(mSubmitterColor);
 | 
			
		||||
                    ((CommentViewHolder) holder).authorTextView.setTextColor(mSubmitterColor);
 | 
			
		||||
                    Drawable submitterDrawable = Utils.getTintedDrawable(mActivity, R.drawable.ic_mic_14dp, mSubmitterColor);
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).authorTextView.setCompoundDrawablesWithIntrinsicBounds(
 | 
			
		||||
                    ((CommentViewHolder) holder).authorTextView.setCompoundDrawablesWithIntrinsicBounds(
 | 
			
		||||
                            submitterDrawable, null, null, null);
 | 
			
		||||
                } else if (comment.isModerator() && comment.isAdmin()) {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).authorTextView.setTextColor(mModeratorColor);
 | 
			
		||||
                    Drawable moderatorDrawable = Utils.getTintedDrawable(mActivity, R.drawable.ic_verified_user_14dp, mModeratorColor);
 | 
			
		||||
                    Drawable adminDrawable = Utils.getTintedDrawable(mActivity, R.drawable.ic_verified_user_14dp, mAdminColor);
 | 
			
		||||
                    Drawable dualDrawable = new DualBadgeDrawable(adminDrawable, moderatorDrawable);
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).authorTextView.setCompoundDrawablesWithIntrinsicBounds(
 | 
			
		||||
                            dualDrawable, null, null, null);
 | 
			
		||||
                } else if (comment.isModerator()) {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).authorTextView.setTextColor(mModeratorColor);
 | 
			
		||||
                    ((CommentViewHolder) holder).authorTextView.setTextColor(mModeratorColor);
 | 
			
		||||
                    Drawable moderatorDrawable = Utils.getTintedDrawable(mActivity, R.drawable.ic_verified_user_14dp, mModeratorColor);
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).authorTextView.setCompoundDrawablesWithIntrinsicBounds(
 | 
			
		||||
                    ((CommentViewHolder) holder).authorTextView.setCompoundDrawablesWithIntrinsicBounds(
 | 
			
		||||
                            moderatorDrawable, null, null, null);
 | 
			
		||||
                } else if (comment.isAdmin()) {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).authorTextView.setTextColor(mAdminColor);
 | 
			
		||||
                    Drawable adminDrawable = Utils.getTintedDrawable(mActivity, R.drawable.ic_verified_user_14dp, mAdminColor);
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).authorTextView.setCompoundDrawablesWithIntrinsicBounds(
 | 
			
		||||
                            adminDrawable, null, null, null);
 | 
			
		||||
                } else if (comment.getAuthorQualifiedName().equals(mAccountQualifiedName)) {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).authorTextView.setTextColor(mCurrentUserColor);
 | 
			
		||||
                    ((CommentViewHolder) holder).authorTextView.setTextColor(mCurrentUserColor);
 | 
			
		||||
                    Drawable currentUserDrawable = Utils.getTintedDrawable(mActivity, R.drawable.ic_current_user_14dp, mCurrentUserColor);
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).authorTextView.setCompoundDrawablesWithIntrinsicBounds(
 | 
			
		||||
                    ((CommentViewHolder) holder).authorTextView.setCompoundDrawablesWithIntrinsicBounds(
 | 
			
		||||
                            currentUserDrawable, null, null, null);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
@@ -431,7 +416,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
                                    .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
 | 
			
		||||
                                    .error(mGlide.load(R.drawable.subreddit_default_icon)
 | 
			
		||||
                                            .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))))
 | 
			
		||||
                                    .into(((CommentBaseViewHolder) holder).authorIconImageView);
 | 
			
		||||
                                    .into(((CommentViewHolder) holder).authorIconImageView);
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
                } else {
 | 
			
		||||
@@ -439,39 +424,33 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
                            .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
 | 
			
		||||
                            .error(mGlide.load(R.drawable.subreddit_default_icon)
 | 
			
		||||
                                    .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))))
 | 
			
		||||
                            .into(((CommentBaseViewHolder) holder).authorIconImageView);
 | 
			
		||||
                            .into(((CommentViewHolder) holder).authorIconImageView);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (mShowElapsedTime) {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).commentTimeTextView.setText(
 | 
			
		||||
                    ((CommentViewHolder) holder).commentTimeTextView.setText(
 | 
			
		||||
                            Utils.getElapsedTime(mActivity, comment.getCommentTimeMillis()));
 | 
			
		||||
                } else {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).commentTimeTextView.setText(Utils.getFormattedTime(mLocale, comment.getCommentTimeMillis(), mTimeFormatPattern));
 | 
			
		||||
                    ((CommentViewHolder) holder).commentTimeTextView.setText(Utils.getFormattedTime(mLocale, comment.getCommentTimeMillis(), mTimeFormatPattern));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (mCommentToolbarHidden) {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).bottomConstraintLayout.getLayoutParams().height = 0;
 | 
			
		||||
                    ((CommentViewHolder) holder).bottomConstraintLayout.getLayoutParams().height = 0;
 | 
			
		||||
                    if (!mHideTheNumberOfVotes) {
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).topScoreTextView.setVisibility(View.VISIBLE);
 | 
			
		||||
                        ((CommentViewHolder) holder).topScoreTextView.setVisibility(View.VISIBLE);
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).bottomConstraintLayout.getLayoutParams().height = LinearLayout.LayoutParams.WRAP_CONTENT;
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).topScoreTextView.setVisibility(View.GONE);
 | 
			
		||||
                }
 | 
			
		||||
                String text = comment.getCommentMarkdown();
 | 
			
		||||
                if (comment.isRemoved()) {
 | 
			
		||||
                    text = "*"+mActivity.getString(R.string.removed_by_moderator)+"*";
 | 
			
		||||
                } else if (comment.isDeleted()) {
 | 
			
		||||
                    text = "*"+mActivity.getString(R.string.deleted_by_creator)+"*";
 | 
			
		||||
                    ((CommentViewHolder) holder).bottomConstraintLayout.getLayoutParams().height = LinearLayout.LayoutParams.WRAP_CONTENT;
 | 
			
		||||
                    ((CommentViewHolder) holder).topScoreTextView.setVisibility(View.GONE);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                ((CommentBaseViewHolder) holder).mMarkwonAdapter.setMarkdown(mCommentMarkwon,text);
 | 
			
		||||
                ((CommentViewHolder) holder).mMarkwonAdapter.setMarkdown(mCommentMarkwon, comment.getCommentMarkdown());
 | 
			
		||||
                // noinspection NotifyDataSetChanged
 | 
			
		||||
                ((CommentBaseViewHolder) holder).mMarkwonAdapter.notifyDataSetChanged();
 | 
			
		||||
                ((CommentViewHolder) holder).mMarkwonAdapter.notifyDataSetChanged();
 | 
			
		||||
                if (mHideDownvotes) {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).downvoteButton.setVisibility(View.GONE);
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).downvoteTextView.setVisibility(View.GONE);
 | 
			
		||||
                    ((CommentViewHolder) holder).downvoteButton.setVisibility(View.GONE);
 | 
			
		||||
                    ((CommentViewHolder) holder).downvoteTextView.setVisibility(View.GONE);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (!mHideTheNumberOfVotes) {
 | 
			
		||||
@@ -487,89 +466,96 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
                    if (mSeperateUpandDownvote) {
 | 
			
		||||
                        int upvotes = (comment.getVoteType() == 1) ? comment.getUpvotes() + 1 : comment.getUpvotes();
 | 
			
		||||
                        int downvotes = (comment.getVoteType() == -1) ? comment.getDownvotes() + 1 : comment.getDownvotes();
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).downvoteTextView.setVisibility(View.VISIBLE);
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, upvotes));
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).downvoteTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes, downvotes));
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).scoreTextView.setGravity(Gravity.START);
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).scoreTextView.getLayoutParams().width = (int) (32 * mActivity.getResources().getDisplayMetrics().density);
 | 
			
		||||
                        ((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);
 | 
			
		||||
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).scoreTextView.setPadding(0, 0, 6, 0);
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).downvoteButton.setPadding(24, 0, 12, 0);
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).upvoteButton.setPadding(24, 0, 12, 0);
 | 
			
		||||
                        ((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 {
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).scoreTextView.setText(commentText);
 | 
			
		||||
                        ((CommentViewHolder) holder).scoreTextView.setText(commentText);
 | 
			
		||||
                    }
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).topScoreTextView.setText(topScoreText);
 | 
			
		||||
                    ((CommentViewHolder) holder).topScoreTextView.setText(topScoreText);
 | 
			
		||||
                } else {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).scoreTextView.setText(mActivity.getString(R.string.vote));
 | 
			
		||||
                    ((CommentViewHolder) holder).scoreTextView.setText(mActivity.getString(R.string.vote));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (comment.isEdited()) {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).editedTextView.setVisibility(View.VISIBLE);
 | 
			
		||||
                    ((CommentViewHolder) holder).editedTextView.setVisibility(View.VISIBLE);
 | 
			
		||||
                } else {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).editedTextView.setVisibility(View.GONE);
 | 
			
		||||
                    ((CommentViewHolder) holder).editedTextView.setVisibility(View.GONE);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                ((CommentBaseViewHolder) holder).commentIndentationView.setShowOnlyOneDivider(mShowOnlyOneCommentLevelIndicator);
 | 
			
		||||
                ((CommentBaseViewHolder) holder).commentIndentationView.setLevelAndColors(comment.getDepth(), verticalBlockColors);
 | 
			
		||||
                ((CommentViewHolder) holder).commentIndentationView.setShowOnlyOneDivider(mShowOnlyOneCommentLevelIndicator);
 | 
			
		||||
                ((CommentViewHolder) holder).commentIndentationView.setLevelAndColors(comment.getDepth(), verticalBlockColors);
 | 
			
		||||
                if (comment.getDepth() >= mDepthThreshold) {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).saveButton.setVisibility(View.GONE);
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).replyButton.setVisibility(View.GONE);
 | 
			
		||||
                    ((CommentViewHolder) holder).saveButton.setVisibility(View.GONE);
 | 
			
		||||
                    ((CommentViewHolder) holder).replyButton.setVisibility(View.GONE);
 | 
			
		||||
                } else {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).saveButton.setVisibility(View.VISIBLE);
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).replyButton.setVisibility(View.VISIBLE);
 | 
			
		||||
                    ((CommentViewHolder) holder).saveButton.setVisibility(View.VISIBLE);
 | 
			
		||||
                    ((CommentViewHolder) holder).replyButton.setVisibility(View.VISIBLE);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (comment.hasReply()) {
 | 
			
		||||
                    if (comment.getChildCount() > 0 && (mAlwaysShowChildCommentCount || !comment.isExpanded())) {
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).expandButton.setText("+" + comment.getChildCount());
 | 
			
		||||
                        ((CommentViewHolder) holder).expandButton.setText("+" + comment.getChildCount());
 | 
			
		||||
                    }
 | 
			
		||||
                    if (comment.isExpanded()) {
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).expandButton.setCompoundDrawablesWithIntrinsicBounds(collapseDrawable, null, null, null);
 | 
			
		||||
                        ((CommentViewHolder) holder).expandButton.setCompoundDrawablesWithIntrinsicBounds(collapseDrawable, null, null, null);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).expandButton.setCompoundDrawablesWithIntrinsicBounds(expandDrawable, null, null, null);
 | 
			
		||||
                        ((CommentViewHolder) holder).expandButton.setCompoundDrawablesWithIntrinsicBounds(expandDrawable, null, null, null);
 | 
			
		||||
                    }
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).expandButton.setVisibility(View.VISIBLE);
 | 
			
		||||
                    ((CommentViewHolder) holder).expandButton.setVisibility(View.VISIBLE);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                switch (comment.getVoteType()) {
 | 
			
		||||
                    case Comment.VOTE_TYPE_UPVOTE:
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).upvoteButton.setIconResource(R.drawable.ic_upvote_filled_24dp);
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).upvoteButton.setIconTint(ColorStateList.valueOf(mUpvotedColor));
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).scoreTextView.setTextColor(mUpvotedColor);
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).topScoreTextView.setTextColor(mUpvotedColor);
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).downvoteTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
                        ((CommentViewHolder) holder).upvoteButton
 | 
			
		||||
                                .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:
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).downvoteButton.setIconResource(R.drawable.ic_downvote_filled_24dp);
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).downvoteButton.setIconTint(ColorStateList.valueOf(mDownvotedColor));
 | 
			
		||||
                        if (mSeperateUpandDownvote) {
 | 
			
		||||
                            ((CommentBaseViewHolder) holder).downvoteTextView.setTextColor(mDownvotedColor);
 | 
			
		||||
                            ((CommentBaseViewHolder) holder).scoreTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
                        ((CommentViewHolder) holder).downvoteButton
 | 
			
		||||
                                .setColorFilter(mDownvotedColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                        if(mSeperateUpandDownvote) {
 | 
			
		||||
                            ((CommentViewHolder) holder).downvoteTextView.setTextColor(mDownvotedColor);
 | 
			
		||||
                            ((CommentViewHolder) holder).scoreTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
                        } else {
 | 
			
		||||
                            ((CommentBaseViewHolder) holder).scoreTextView.setTextColor(mDownvotedColor);
 | 
			
		||||
                            ((CommentViewHolder) holder).scoreTextView.setTextColor(mDownvotedColor);
 | 
			
		||||
                        }
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).topScoreTextView.setTextColor(mDownvotedColor);
 | 
			
		||||
                        ((CommentViewHolder) holder).topScoreTextView.setTextColor(mDownvotedColor);
 | 
			
		||||
                        break;
 | 
			
		||||
                    default:
 | 
			
		||||
                        ((CommentBaseViewHolder) holder).downvoteTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
                        ((CommentViewHolder) holder).downvoteTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (mPost.isArchived()) {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).replyButton.setIconTint(ColorStateList.valueOf(mVoteAndReplyUnavailableVoteButtonColor));
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).upvoteButton.setIconTint(ColorStateList.valueOf(mVoteAndReplyUnavailableVoteButtonColor));
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).scoreTextView.setTextColor(mVoteAndReplyUnavailableVoteButtonColor);
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).downvoteButton.setIconTint(ColorStateList.valueOf(mVoteAndReplyUnavailableVoteButtonColor));
 | 
			
		||||
                    ((CommentViewHolder) holder).replyButton
 | 
			
		||||
                            .setColorFilter(mVoteAndReplyUnavailableVoteButtonColor,
 | 
			
		||||
                                    PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                    ((CommentViewHolder) holder).upvoteButton
 | 
			
		||||
                            .setColorFilter(mVoteAndReplyUnavailableVoteButtonColor,
 | 
			
		||||
                                    PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                    ((CommentViewHolder) holder).downvoteButton
 | 
			
		||||
                            .setColorFilter(mVoteAndReplyUnavailableVoteButtonColor,
 | 
			
		||||
                                    PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (mPost.isLocked()) {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).replyButton.setIconTint(ColorStateList.valueOf(mVoteAndReplyUnavailableVoteButtonColor));
 | 
			
		||||
                    ((CommentViewHolder) holder).replyButton
 | 
			
		||||
                            .setColorFilter(mVoteAndReplyUnavailableVoteButtonColor,
 | 
			
		||||
                                    PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (comment.isSaved()) {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).saveButton.setIconResource(R.drawable.ic_bookmark_grey_24dp);
 | 
			
		||||
                    ((CommentViewHolder) holder).saveButton.setImageResource(R.drawable.ic_bookmark_grey_24dp);
 | 
			
		||||
                } else {
 | 
			
		||||
                    ((CommentBaseViewHolder) holder).saveButton.setIconResource(R.drawable.ic_bookmark_border_grey_24dp);
 | 
			
		||||
                    ((CommentViewHolder) holder).saveButton.setImageResource(R.drawable.ic_bookmark_border_grey_24dp);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (position == mSearchCommentIndex) {
 | 
			
		||||
@@ -675,7 +661,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
                        SortType.Type sortType = mCommentRecyclerViewAdapterCallback.getSortType();
 | 
			
		||||
                        FetchComment.fetchComments(mExecutor, new Handler(), retrofit, mAccessToken,
 | 
			
		||||
                                mPost.getId(), parentComment.getId(), sortType,
 | 
			
		||||
                                mExpandChildren, 1, new CommentFilter(), new FetchComment.FetchCommentListener() {
 | 
			
		||||
                                mExpandChildren, 1, new FetchComment.FetchCommentListener() {
 | 
			
		||||
                                    @Override
 | 
			
		||||
                                    public void onFetchCommentSuccess(ArrayList<Comment> expandedComments, Integer parentId, ArrayList<Integer> children) {
 | 
			
		||||
                                        if (parentComment.getId() == mVisibleComments.get(parentPosition).getId()) {
 | 
			
		||||
@@ -832,6 +818,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
    /**
 | 
			
		||||
     * Find position of comment with given {@code fullName} and
 | 
			
		||||
     * {@link Comment#NOT_PLACEHOLDER} placeholder type
 | 
			
		||||
     *
 | 
			
		||||
     * @return position of the placeholder or -1 if not found
 | 
			
		||||
     */
 | 
			
		||||
    private int findCommentPosition(int fullName, int positionHint) {
 | 
			
		||||
@@ -841,6 +828,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
    /**
 | 
			
		||||
     * Find position of comment with given {@code fullName} and
 | 
			
		||||
     * {@link Comment#PLACEHOLDER_LOAD_MORE_COMMENTS} placeholder type
 | 
			
		||||
     *
 | 
			
		||||
     * @return position of the placeholder or -1 if not found
 | 
			
		||||
     */
 | 
			
		||||
    private int findLoadMoreCommentsPlaceholderPosition(int id, int positionHint) {
 | 
			
		||||
@@ -1135,18 +1123,18 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void onItemSwipe(RecyclerView.ViewHolder viewHolder, int direction, int swipeLeftAction, int swipeRightAction) {
 | 
			
		||||
        if (viewHolder instanceof CommentBaseViewHolder) {
 | 
			
		||||
        if (viewHolder instanceof CommentViewHolder) {
 | 
			
		||||
            if (direction == ItemTouchHelper.LEFT || direction == ItemTouchHelper.START) {
 | 
			
		||||
                if (swipeLeftAction == SharedPreferencesUtils.SWIPE_ACITON_UPVOTE) {
 | 
			
		||||
                    ((CommentBaseViewHolder) viewHolder).upvoteButton.performClick();
 | 
			
		||||
                    ((CommentViewHolder) viewHolder).upvoteButton.performClick();
 | 
			
		||||
                } else if (swipeLeftAction == SharedPreferencesUtils.SWIPE_ACITON_DOWNVOTE) {
 | 
			
		||||
                    ((CommentBaseViewHolder) viewHolder).downvoteButton.performClick();
 | 
			
		||||
                    ((CommentViewHolder) viewHolder).downvoteButton.performClick();
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                if (swipeRightAction == SharedPreferencesUtils.SWIPE_ACITON_UPVOTE) {
 | 
			
		||||
                    ((CommentBaseViewHolder) viewHolder).upvoteButton.performClick();
 | 
			
		||||
                    ((CommentViewHolder) viewHolder).upvoteButton.performClick();
 | 
			
		||||
                } else if (swipeRightAction == SharedPreferencesUtils.SWIPE_ACITON_DOWNVOTE) {
 | 
			
		||||
                    ((CommentBaseViewHolder) viewHolder).downvoteButton.performClick();
 | 
			
		||||
                    ((CommentViewHolder) viewHolder).downvoteButton.performClick();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -1173,23 +1161,21 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
 | 
			
		||||
        if (holder instanceof CommentBaseViewHolder) {
 | 
			
		||||
        if (holder instanceof CommentViewHolder) {
 | 
			
		||||
            holder.itemView.setBackgroundColor(mCommentBackgroundColor);
 | 
			
		||||
            ((CommentBaseViewHolder) holder).authorTextView.setTextColor(mUsernameColor);
 | 
			
		||||
            ((CommentBaseViewHolder) holder).authorFlairTextView.setVisibility(View.GONE);
 | 
			
		||||
            ((CommentBaseViewHolder) holder).authorTextView.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
 | 
			
		||||
            mGlide.clear(((CommentBaseViewHolder) holder).authorIconImageView);
 | 
			
		||||
            ((CommentBaseViewHolder) holder).topScoreTextView.setTextColor(mSecondaryTextColor);
 | 
			
		||||
            ((CommentBaseViewHolder) holder).awardsTextView.setText("");
 | 
			
		||||
            ((CommentBaseViewHolder) holder).awardsTextView.setVisibility(View.GONE);
 | 
			
		||||
            ((CommentBaseViewHolder) holder).expandButton.setVisibility(View.GONE);
 | 
			
		||||
            ((CommentBaseViewHolder) holder).upvoteButton.setIconResource(R.drawable.ic_upvote_24dp);
 | 
			
		||||
            ((CommentBaseViewHolder) holder).upvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
            ((CommentBaseViewHolder) holder).scoreTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
            ((CommentBaseViewHolder) holder).downvoteButton.setIconResource(R.drawable.ic_downvote_24dp);
 | 
			
		||||
            ((CommentBaseViewHolder) holder).downvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
            ((CommentBaseViewHolder) holder).expandButton.setText("");
 | 
			
		||||
            ((CommentBaseViewHolder) holder).replyButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
            ((CommentViewHolder) holder).authorTextView.setTextColor(mUsernameColor);
 | 
			
		||||
            ((CommentViewHolder) holder).authorFlairTextView.setVisibility(View.GONE);
 | 
			
		||||
            ((CommentViewHolder) holder).authorTextView.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
 | 
			
		||||
            mGlide.clear(((CommentViewHolder) holder).authorIconImageView);
 | 
			
		||||
            ((CommentViewHolder) holder).topScoreTextView.setTextColor(mSecondaryTextColor);
 | 
			
		||||
            ((CommentViewHolder) holder).awardsTextView.setText("");
 | 
			
		||||
            ((CommentViewHolder) holder).awardsTextView.setVisibility(View.GONE);
 | 
			
		||||
            ((CommentViewHolder) holder).expandButton.setVisibility(View.GONE);
 | 
			
		||||
            ((CommentViewHolder) holder).upvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
            ((CommentViewHolder) holder).scoreTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
            ((CommentViewHolder) holder).downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
            ((CommentViewHolder) holder).expandButton.setText("");
 | 
			
		||||
            ((CommentViewHolder) holder).replyButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) holder.itemView.getLayoutParams();
 | 
			
		||||
            params.setMargins(0, 0, 0, 0);
 | 
			
		||||
        }
 | 
			
		||||
@@ -1224,76 +1210,55 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
        SortType.Type getSortType();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class CommentBaseViewHolder extends RecyclerView.ViewHolder {
 | 
			
		||||
    public class CommentViewHolder extends RecyclerView.ViewHolder {
 | 
			
		||||
        @BindView(R.id.linear_layout_item_comment)
 | 
			
		||||
        LinearLayout linearLayout;
 | 
			
		||||
        @BindView(R.id.author_icon_image_view_item_post_comment)
 | 
			
		||||
        ImageView authorIconImageView;
 | 
			
		||||
        @BindView(R.id.author_text_view_item_post_comment)
 | 
			
		||||
        TextView authorTextView;
 | 
			
		||||
        @BindView(R.id.author_flair_text_view_item_post_comment)
 | 
			
		||||
        TextView authorFlairTextView;
 | 
			
		||||
        @BindView(R.id.comment_time_text_view_item_post_comment)
 | 
			
		||||
        TextView commentTimeTextView;
 | 
			
		||||
        @BindView(R.id.top_score_text_view_item_post_comment)
 | 
			
		||||
        TextView topScoreTextView;
 | 
			
		||||
        @BindView(R.id.awards_text_view_item_comment)
 | 
			
		||||
        TextView awardsTextView;
 | 
			
		||||
        @BindView(R.id.comment_markdown_view_item_post_comment)
 | 
			
		||||
        RecyclerView commentMarkdownView;
 | 
			
		||||
        @BindView(R.id.edited_text_view_item_post_comment)
 | 
			
		||||
        TextView editedTextView;
 | 
			
		||||
        @BindView(R.id.bottom_constraint_layout_item_post_comment)
 | 
			
		||||
        ConstraintLayout bottomConstraintLayout;
 | 
			
		||||
        MaterialButton upvoteButton;
 | 
			
		||||
        @BindView(R.id.up_vote_button_item_post_comment)
 | 
			
		||||
        ImageView upvoteButton;
 | 
			
		||||
        @BindView(R.id.score_text_view_item_post_comment)
 | 
			
		||||
        TextView scoreTextView;
 | 
			
		||||
 | 
			
		||||
        @BindView(R.id.downvote_text_view_item_post_comment)
 | 
			
		||||
        TextView downvoteTextView;
 | 
			
		||||
        MaterialButton downvoteButton;
 | 
			
		||||
        @BindView(R.id.down_vote_button_item_post_comment)
 | 
			
		||||
        ImageView downvoteButton;
 | 
			
		||||
        @BindView(R.id.placeholder_item_post_comment)
 | 
			
		||||
        View placeholder;
 | 
			
		||||
        MaterialButton moreButton;
 | 
			
		||||
        MaterialButton saveButton;
 | 
			
		||||
        @BindView(R.id.more_button_item_post_comment)
 | 
			
		||||
        ImageView moreButton;
 | 
			
		||||
        @BindView(R.id.save_button_item_post_comment)
 | 
			
		||||
        ImageView saveButton;
 | 
			
		||||
        @BindView(R.id.expand_button_item_post_comment)
 | 
			
		||||
        TextView expandButton;
 | 
			
		||||
        MaterialButton replyButton;
 | 
			
		||||
        @BindView(R.id.reply_button_item_post_comment)
 | 
			
		||||
        ImageView replyButton;
 | 
			
		||||
        @BindView(R.id.vertical_block_indentation_item_comment)
 | 
			
		||||
        CommentIndentationView commentIndentationView;
 | 
			
		||||
        @BindView(R.id.divider_item_comment)
 | 
			
		||||
        View commentDivider;
 | 
			
		||||
        CustomMarkwonAdapter mMarkwonAdapter;
 | 
			
		||||
 | 
			
		||||
        CommentBaseViewHolder(@NonNull View itemView) {
 | 
			
		||||
        CommentViewHolder(View itemView) {
 | 
			
		||||
            super(itemView);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        void setBaseView(LinearLayout linearLayout,
 | 
			
		||||
                         ImageView authorIconImageView,
 | 
			
		||||
                         TextView authorTextView,
 | 
			
		||||
                         TextView authorFlairTextView,
 | 
			
		||||
                         TextView commentTimeTextView,
 | 
			
		||||
                         TextView topScoreTextView,
 | 
			
		||||
                         TextView awardsTextView,
 | 
			
		||||
                         RecyclerView commentMarkdownView,
 | 
			
		||||
                         TextView editedTextView,
 | 
			
		||||
                         ConstraintLayout bottomConstraintLayout,
 | 
			
		||||
                         MaterialButton upvoteButton,
 | 
			
		||||
                         TextView scoreTextView,
 | 
			
		||||
                         MaterialButton downvoteButton,
 | 
			
		||||
                         TextView downvoteTextView,
 | 
			
		||||
                         View placeholder,
 | 
			
		||||
                         MaterialButton moreButton,
 | 
			
		||||
                         MaterialButton saveButton,
 | 
			
		||||
                         TextView expandButton,
 | 
			
		||||
                         MaterialButton replyButton,
 | 
			
		||||
                         CommentIndentationView commentIndentationView,
 | 
			
		||||
                         View commentDivider) {
 | 
			
		||||
            this.linearLayout = linearLayout;
 | 
			
		||||
            this.authorIconImageView = authorIconImageView;
 | 
			
		||||
            this.authorTextView = authorTextView;
 | 
			
		||||
            this.authorFlairTextView = authorFlairTextView;
 | 
			
		||||
            this.commentTimeTextView = commentTimeTextView;
 | 
			
		||||
            this.topScoreTextView = topScoreTextView;
 | 
			
		||||
            this.awardsTextView = awardsTextView;
 | 
			
		||||
            this.commentMarkdownView = commentMarkdownView;
 | 
			
		||||
            this.editedTextView = editedTextView;
 | 
			
		||||
            this.bottomConstraintLayout = bottomConstraintLayout;
 | 
			
		||||
            this.upvoteButton = upvoteButton;
 | 
			
		||||
            this.scoreTextView = scoreTextView;
 | 
			
		||||
            this.downvoteButton = downvoteButton;
 | 
			
		||||
            this.downvoteTextView = downvoteTextView;
 | 
			
		||||
            this.placeholder = placeholder;
 | 
			
		||||
            this.moreButton = moreButton;
 | 
			
		||||
            this.saveButton = saveButton;
 | 
			
		||||
            this.expandButton = expandButton;
 | 
			
		||||
            this.replyButton = replyButton;
 | 
			
		||||
            this.commentIndentationView = commentIndentationView;
 | 
			
		||||
            this.commentDivider = commentDivider;
 | 
			
		||||
            ButterKnife.bind(this, itemView);
 | 
			
		||||
 | 
			
		||||
            if (mVoteButtonsOnTheRight) {
 | 
			
		||||
                ConstraintSet constraintSet = new ConstraintSet();
 | 
			
		||||
@@ -1395,14 +1360,14 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
            editedTextView.setTextColor(mSecondaryTextColor);
 | 
			
		||||
            awardsTextView.setTextColor(mSecondaryTextColor);
 | 
			
		||||
            commentDivider.setBackgroundColor(mDividerColor);
 | 
			
		||||
            upvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
            upvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
            scoreTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
            downvoteTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
            downvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
            moreButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
            downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
            moreButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
            expandButton.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
            saveButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
            replyButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
            saveButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
            replyButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
 | 
			
		||||
            authorFlairTextView.setOnClickListener(view -> authorTextView.performClick());
 | 
			
		||||
 | 
			
		||||
@@ -1489,23 +1454,20 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
                    int previousVoteType = comment.getVoteType();
 | 
			
		||||
                    int newVoteType;
 | 
			
		||||
 | 
			
		||||
                    downvoteButton.setIconResource(R.drawable.ic_downvote_24dp);
 | 
			
		||||
                    downvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
                    downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
 | 
			
		||||
                    if (previousVoteType != Comment.VOTE_TYPE_UPVOTE) {
 | 
			
		||||
                        //Not upvoted before
 | 
			
		||||
                        comment.setVoteType(Comment.VOTE_TYPE_UPVOTE);
 | 
			
		||||
                        newVoteType = Integer.parseInt(APIUtils.DIR_UPVOTE);
 | 
			
		||||
                        upvoteButton.setIconResource(R.drawable.ic_upvote_filled_24dp);
 | 
			
		||||
                        upvoteButton.setIconTint(ColorStateList.valueOf(mUpvotedColor));
 | 
			
		||||
                        upvoteButton.setColorFilter(mUpvotedColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                        scoreTextView.setTextColor(mUpvotedColor);
 | 
			
		||||
                        topScoreTextView.setTextColor(mUpvotedColor);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        //Upvoted before
 | 
			
		||||
                        comment.setVoteType(Comment.VOTE_TYPE_NO_VOTE);
 | 
			
		||||
                        newVoteType = Integer.parseInt(APIUtils.DIR_UNVOTE);
 | 
			
		||||
                        upvoteButton.setIconResource(R.drawable.ic_upvote_24dp);
 | 
			
		||||
                        upvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
                        upvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                        scoreTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
                        downvoteTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
                        topScoreTextView.setTextColor(mSecondaryTextColor);
 | 
			
		||||
@@ -1535,8 +1497,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
                            if (newVoteType == Integer.parseInt(APIUtils.DIR_UPVOTE)) {
 | 
			
		||||
                                comment.setVoteType(Comment.VOTE_TYPE_UPVOTE);
 | 
			
		||||
                                if (currentPosition == position) {
 | 
			
		||||
                                    upvoteButton.setIconResource(R.drawable.ic_upvote_filled_24dp);
 | 
			
		||||
                                    upvoteButton.setIconTint(ColorStateList.valueOf(mUpvotedColor));
 | 
			
		||||
                                    upvoteButton.setColorFilter(mUpvotedColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                                    scoreTextView.setTextColor(mUpvotedColor);
 | 
			
		||||
                                    topScoreTextView.setTextColor(mUpvotedColor);
 | 
			
		||||
                                    downvoteTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
@@ -1544,8 +1505,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
                            } else {
 | 
			
		||||
                                comment.setVoteType(Comment.VOTE_TYPE_NO_VOTE);
 | 
			
		||||
                                if (currentPosition == position) {
 | 
			
		||||
                                    upvoteButton.setIconResource(R.drawable.ic_upvote_24dp);
 | 
			
		||||
                                    upvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
                                    upvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                                    scoreTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
                                    topScoreTextView.setTextColor(mSecondaryTextColor);
 | 
			
		||||
                                    downvoteTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
@@ -1553,10 +1513,9 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            if (currentPosition == position) {
 | 
			
		||||
                                downvoteButton.setIconResource(R.drawable.ic_downvote_24dp);
 | 
			
		||||
                                downvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
                                downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                                if (!mHideTheNumberOfVotes) {
 | 
			
		||||
                                    if (mSeperateUpandDownvote) {
 | 
			
		||||
                                    if(mSeperateUpandDownvote){
 | 
			
		||||
                                        int upvoteCount = (comment.getVoteType() == 1) ? comment.getUpvotes() + 1 : comment.getUpvotes();
 | 
			
		||||
                                        scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
 | 
			
		||||
                                                upvoteCount));
 | 
			
		||||
@@ -1581,14 +1540,6 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            scoreTextView.setOnClickListener(view -> {
 | 
			
		||||
                upvoteButton.performClick();
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            downvoteTextView.setOnClickListener(view -> {
 | 
			
		||||
                downvoteButton.performClick();
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            downvoteButton.setOnClickListener(view -> {
 | 
			
		||||
                if (mPost.isArchived()) {
 | 
			
		||||
                    Toast.makeText(mActivity, R.string.archived_post_vote_unavailable, Toast.LENGTH_SHORT).show();
 | 
			
		||||
@@ -1605,19 +1556,17 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
                    int previousVoteType = comment.getVoteType();
 | 
			
		||||
                    int newVoteType;
 | 
			
		||||
 | 
			
		||||
                    upvoteButton.setIconResource(R.drawable.ic_upvote_24dp);
 | 
			
		||||
                    upvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
                    upvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
 | 
			
		||||
                    if (previousVoteType != Comment.VOTE_TYPE_DOWNVOTE) {
 | 
			
		||||
                        //Not downvoted before
 | 
			
		||||
                        comment.setVoteType(Comment.VOTE_TYPE_DOWNVOTE);
 | 
			
		||||
                        newVoteType = Integer.parseInt(APIUtils.DIR_DOWNVOTE);
 | 
			
		||||
                        downvoteButton.setIconResource(R.drawable.ic_downvote_filled_24dp);
 | 
			
		||||
                        downvoteButton.setIconTint(ColorStateList.valueOf(mDownvotedColor));
 | 
			
		||||
                        if (mSeperateUpandDownvote) {
 | 
			
		||||
                        downvoteButton.setColorFilter(mDownvotedColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                        if(mSeperateUpandDownvote){
 | 
			
		||||
                            downvoteTextView.setTextColor(mDownvotedColor);
 | 
			
		||||
                            scoreTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
                        } else {
 | 
			
		||||
                        }else {
 | 
			
		||||
                            scoreTextView.setTextColor(mDownvotedColor);
 | 
			
		||||
                        }
 | 
			
		||||
                        topScoreTextView.setTextColor(mDownvotedColor);
 | 
			
		||||
@@ -1625,8 +1574,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
                        //Downvoted before
 | 
			
		||||
                        comment.setVoteType(Comment.VOTE_TYPE_NO_VOTE);
 | 
			
		||||
                        newVoteType = Integer.parseInt(APIUtils.DIR_UNVOTE);
 | 
			
		||||
                        downvoteButton.setIconResource(R.drawable.ic_downvote_24dp);
 | 
			
		||||
                        downvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
                        downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                        downvoteTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
                        scoreTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
                        topScoreTextView.setTextColor(mSecondaryTextColor);
 | 
			
		||||
@@ -1656,8 +1604,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
                            if (newVoteType == Integer.parseInt(APIUtils.DIR_DOWNVOTE)) {
 | 
			
		||||
                                comment.setVoteType(Comment.VOTE_TYPE_DOWNVOTE);
 | 
			
		||||
                                if (currentPosition == position) {
 | 
			
		||||
                                    downvoteButton.setIconResource(R.drawable.ic_downvote_filled_24dp);
 | 
			
		||||
                                    downvoteButton.setIconTint(ColorStateList.valueOf(mDownvotedColor));
 | 
			
		||||
                                    downvoteButton.setColorFilter(mDownvotedColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                                    if (mSeperateUpandDownvote) {
 | 
			
		||||
                                        downvoteTextView.setTextColor(mDownvotedColor);
 | 
			
		||||
                                    } else {
 | 
			
		||||
@@ -1668,8 +1615,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
                            } else {
 | 
			
		||||
                                comment.setVoteType(Comment.VOTE_TYPE_NO_VOTE);
 | 
			
		||||
                                if (currentPosition == position) {
 | 
			
		||||
                                    downvoteButton.setIconResource(R.drawable.ic_downvote_24dp);
 | 
			
		||||
                                    downvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
                                    downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
 | 
			
		||||
                                    scoreTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
                                    downvoteTextView.setTextColor(mCommentIconAndInfoColor);
 | 
			
		||||
                                    topScoreTextView.setTextColor(mSecondaryTextColor);
 | 
			
		||||
@@ -1677,12 +1623,11 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            if (currentPosition == position) {
 | 
			
		||||
                                upvoteButton.setIconResource(R.drawable.ic_upvote_24dp);
 | 
			
		||||
                                upvoteButton.setIconTint(ColorStateList.valueOf(mCommentIconAndInfoColor));
 | 
			
		||||
                                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();
 | 
			
		||||
                                    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));
 | 
			
		||||
@@ -1690,6 +1635,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
                                        scoreTextView.setText(Utils.getNVotes(mShowAbsoluteNumberOfVotes,
 | 
			
		||||
                                                comment.getScore() + comment.getVoteType()));
 | 
			
		||||
                                    }
 | 
			
		||||
 | 
			
		||||
                                    topScoreTextView.setText(mActivity.getString(R.string.top_score,
 | 
			
		||||
                                            Utils.getNVotes(mShowAbsoluteNumberOfVotes,
 | 
			
		||||
                                                    comment.getScore() + comment.getVoteType())));
 | 
			
		||||
@@ -1716,7 +1662,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
                            public void success() {
 | 
			
		||||
                                comment.setSaved(false);
 | 
			
		||||
                                if (getBindingAdapterPosition() == position) {
 | 
			
		||||
                                    saveButton.setIconResource(R.drawable.ic_bookmark_border_grey_24dp);
 | 
			
		||||
                                    saveButton.setImageResource(R.drawable.ic_bookmark_border_grey_24dp);
 | 
			
		||||
                                }
 | 
			
		||||
                                Toast.makeText(mActivity, R.string.comment_unsaved_success, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                            }
 | 
			
		||||
@@ -1725,7 +1671,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
                            public void failed() {
 | 
			
		||||
                                comment.setSaved(true);
 | 
			
		||||
                                if (getBindingAdapterPosition() == position) {
 | 
			
		||||
                                    saveButton.setIconResource(R.drawable.ic_bookmark_grey_24dp);
 | 
			
		||||
                                    saveButton.setImageResource(R.drawable.ic_bookmark_grey_24dp);
 | 
			
		||||
                                }
 | 
			
		||||
                                Toast.makeText(mActivity, R.string.comment_unsaved_failed, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                            }
 | 
			
		||||
@@ -1737,7 +1683,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
                            public void success() {
 | 
			
		||||
                                comment.setSaved(true);
 | 
			
		||||
                                if (getBindingAdapterPosition() == position) {
 | 
			
		||||
                                    saveButton.setIconResource(R.drawable.ic_bookmark_grey_24dp);
 | 
			
		||||
                                    saveButton.setImageResource(R.drawable.ic_bookmark_grey_24dp);
 | 
			
		||||
                                }
 | 
			
		||||
                                Toast.makeText(mActivity, R.string.comment_saved_success, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                            }
 | 
			
		||||
@@ -1746,7 +1692,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
                            public void failed() {
 | 
			
		||||
                                comment.setSaved(false);
 | 
			
		||||
                                if (getBindingAdapterPosition() == position) {
 | 
			
		||||
                                    saveButton.setIconResource(R.drawable.ic_bookmark_border_grey_24dp);
 | 
			
		||||
                                    saveButton.setImageResource(R.drawable.ic_bookmark_border_grey_24dp);
 | 
			
		||||
                                }
 | 
			
		||||
                                Toast.makeText(mActivity, R.string.comment_saved_failed, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                            }
 | 
			
		||||
@@ -1884,36 +1830,6 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class CommentViewHolder extends CommentBaseViewHolder {
 | 
			
		||||
        ItemCommentBinding binding;
 | 
			
		||||
 | 
			
		||||
        CommentViewHolder(ItemCommentBinding binding) {
 | 
			
		||||
            super(binding.getRoot());
 | 
			
		||||
            this.binding = binding;
 | 
			
		||||
            setBaseView(binding.linearLayoutItemComment,
 | 
			
		||||
                    binding.authorIconImageViewItemPostComment,
 | 
			
		||||
                    binding.authorTextViewItemPostComment,
 | 
			
		||||
                    binding.authorFlairTextViewItemPostComment,
 | 
			
		||||
                    binding.commentTimeTextViewItemPostComment,
 | 
			
		||||
                    binding.topScoreTextViewItemPostComment,
 | 
			
		||||
                    binding.awardsTextViewItemComment,
 | 
			
		||||
                    binding.commentMarkdownViewItemPostComment,
 | 
			
		||||
                    binding.editedTextViewItemPostComment,
 | 
			
		||||
                    binding.bottomConstraintLayoutItemPostComment,
 | 
			
		||||
                    binding.upvoteButtonItemPostComment,
 | 
			
		||||
                    binding.scoreTextViewItemPostComment,
 | 
			
		||||
                    binding.downvoteButtonItemPostComment,
 | 
			
		||||
                    binding.downvoteTextViewItemPostComment,
 | 
			
		||||
                    binding.placeholderItemPostComment,
 | 
			
		||||
                    binding.moreButtonItemPostComment,
 | 
			
		||||
                    binding.saveButtonItemPostComment,
 | 
			
		||||
                    binding.expandButtonItemPostComment,
 | 
			
		||||
                    binding.replyButtonItemPostComment,
 | 
			
		||||
                    binding.verticalBlockIndentationItemComment,
 | 
			
		||||
                    binding.dividerItemComment);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
    private Comment getCurrentComment(RecyclerView.ViewHolder holder) {
 | 
			
		||||
        return getCurrentComment(holder.getBindingAdapterPosition());
 | 
			
		||||
 
 | 
			
		||||
@@ -1,41 +0,0 @@
 | 
			
		||||
package eu.toldi.infinityforlemmy.adapters;
 | 
			
		||||
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.view.ViewGroup;
 | 
			
		||||
import android.widget.ArrayAdapter;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
 | 
			
		||||
public class CustomArrayAdapter extends ArrayAdapter<String> {
 | 
			
		||||
 | 
			
		||||
    CustomThemeWrapper customThemeWrapper;
 | 
			
		||||
 | 
			
		||||
    public CustomArrayAdapter(@NonNull Context context, int textViewResourceId, @NonNull List<String> objects, CustomThemeWrapper customThemeWrapper) {
 | 
			
		||||
        super(context, textViewResourceId, objects);
 | 
			
		||||
        this.customThemeWrapper = customThemeWrapper;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public View getView(int position, View convertView, ViewGroup parent) {
 | 
			
		||||
        TextView itemView = (TextView) super.getView(position, convertView, parent);
 | 
			
		||||
        itemView.setTextColor(customThemeWrapper.getPrimaryTextColor()); // Set the text color
 | 
			
		||||
        itemView.setBackgroundColor(customThemeWrapper.getBackgroundColor()); // Set the background color
 | 
			
		||||
        // Apply any other styling as needed
 | 
			
		||||
        return itemView;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
 | 
			
		||||
        TextView itemView = (TextView) super.getDropDownView(position, convertView, parent);
 | 
			
		||||
        itemView.setTextColor(customThemeWrapper.getPrimaryTextColor()); // Set the text color
 | 
			
		||||
        itemView.setBackgroundColor(customThemeWrapper.getBackgroundColor()); // Set the background color
 | 
			
		||||
        // Apply any other styling as needed
 | 
			
		||||
        return itemView;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -52,7 +52,7 @@ public class FlairBottomSheetRecyclerViewAdapter extends RecyclerView.Adapter<Fl
 | 
			
		||||
                flairEditText.requestFocus();
 | 
			
		||||
                Utils.showKeyboard(activity, new Handler(), flairEditText);
 | 
			
		||||
                new MaterialAlertDialogBuilder(activity, R.style.MaterialAlertDialogTheme)
 | 
			
		||||
                        .setTitle("")
 | 
			
		||||
                        .setTitle(R.string.edit_flair)
 | 
			
		||||
                        .setView(dialogView)
 | 
			
		||||
                        .setPositiveButton(R.string.ok, (dialogInterface, i)
 | 
			
		||||
                                -> {
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -156,7 +156,7 @@ public class MessageRecyclerViewAdapter extends PagedListAdapter<CommentInteract
 | 
			
		||||
            CommentInteraction message = getItem(holder.getBindingAdapterPosition());
 | 
			
		||||
            if (message != null) {
 | 
			
		||||
 | 
			
		||||
                if (!message.isRead()) {
 | 
			
		||||
                if (message.isRead()) {
 | 
			
		||||
                    if (markAllMessagesAsRead) {
 | 
			
		||||
                        message.markAsRead();
 | 
			
		||||
                    } else {
 | 
			
		||||
@@ -193,7 +193,7 @@ public class MessageRecyclerViewAdapter extends PagedListAdapter<CommentInteract
 | 
			
		||||
                        mActivity.startActivity(intent);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (!message.isRead()) {
 | 
			
		||||
                    if (message.isRead()) {
 | 
			
		||||
                        holder.itemView.setBackgroundColor(mMessageBackgroundColor);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ import android.view.View;
 | 
			
		||||
import android.view.ViewGroup;
 | 
			
		||||
import android.widget.ImageView;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
import android.widget.Toast;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView;
 | 
			
		||||
@@ -19,18 +20,19 @@ import java.util.concurrent.Executor;
 | 
			
		||||
 | 
			
		||||
import butterknife.BindView;
 | 
			
		||||
import butterknife.ButterKnife;
 | 
			
		||||
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
 | 
			
		||||
import me.zhanghai.android.fastscroll.PopupTextProvider;
 | 
			
		||||
import eu.toldi.infinityforlemmy.R;
 | 
			
		||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.BaseActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.asynctasks.InsertMultireddit;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.multireddit.FavoriteMultiReddit;
 | 
			
		||||
import eu.toldi.infinityforlemmy.multireddit.MultiReddit;
 | 
			
		||||
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
 | 
			
		||||
import me.zhanghai.android.fastscroll.PopupTextProvider;
 | 
			
		||||
import pl.droidsonroids.gif.GifImageView;
 | 
			
		||||
import retrofit2.Retrofit;
 | 
			
		||||
 | 
			
		||||
public class MultiRedditListingRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements PopupTextProvider {
 | 
			
		||||
public class MultiRedditListingRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>  implements PopupTextProvider {
 | 
			
		||||
 | 
			
		||||
    private static final int VIEW_TYPE_FAVORITE_MULTI_REDDIT_DIVIDER = 0;
 | 
			
		||||
    private static final int VIEW_TYPE_FAVORITE_MULTI_REDDIT = 1;
 | 
			
		||||
@@ -52,7 +54,6 @@ public class MultiRedditListingRecyclerViewAdapter extends RecyclerView.Adapter<
 | 
			
		||||
 | 
			
		||||
    public interface OnItemClickListener {
 | 
			
		||||
        void onClick(MultiReddit multiReddit);
 | 
			
		||||
 | 
			
		||||
        void onLongClick(MultiReddit multiReddit);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -119,31 +120,80 @@ public class MultiRedditListingRecyclerViewAdapter extends RecyclerView.Adapter<
 | 
			
		||||
            MultiReddit multiReddit = mMultiReddits.get(holder.getBindingAdapterPosition() - offset);
 | 
			
		||||
            name = multiReddit.getDisplayName();
 | 
			
		||||
            iconUrl = multiReddit.getIconUrl();
 | 
			
		||||
            if (multiReddit.isFavorite()) {
 | 
			
		||||
            if(multiReddit.isFavorite()) {
 | 
			
		||||
                ((MultiRedditViewHolder) holder).favoriteImageView.setImageResource(R.drawable.ic_favorite_24dp);
 | 
			
		||||
            } else {
 | 
			
		||||
                ((MultiRedditViewHolder) holder).favoriteImageView.setImageResource(R.drawable.ic_favorite_border_24dp);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            ((MultiRedditViewHolder) holder).favoriteImageView.setOnClickListener(view -> {
 | 
			
		||||
                if (multiReddit.isFavorite()) {
 | 
			
		||||
                if(multiReddit.isFavorite()) {
 | 
			
		||||
                    ((MultiRedditViewHolder) holder).favoriteImageView.setImageResource(R.drawable.ic_favorite_border_24dp);
 | 
			
		||||
                    multiReddit.setFavorite(false);
 | 
			
		||||
                    if (mAccessToken == null) {
 | 
			
		||||
                        InsertMultireddit.insertMultireddit(mExecutor, new Handler(), mRedditDataRoomDatabase, multiReddit,
 | 
			
		||||
                                () -> {
 | 
			
		||||
                                    //Do nothing
 | 
			
		||||
                                });
 | 
			
		||||
                    } else {
 | 
			
		||||
                        FavoriteMultiReddit.favoriteMultiReddit(mExecutor, new Handler(), mOauthRetrofit, mRedditDataRoomDatabase,
 | 
			
		||||
                                mAccessToken, false, multiReddit,
 | 
			
		||||
                                new FavoriteMultiReddit.FavoriteMultiRedditListener() {
 | 
			
		||||
                                    @Override
 | 
			
		||||
                                    public void success() {
 | 
			
		||||
                                        int position = holder.getBindingAdapterPosition() - offset;
 | 
			
		||||
                                        if(position >= 0 && mMultiReddits.size() > position) {
 | 
			
		||||
                                            mMultiReddits.get(position).setFavorite(false);
 | 
			
		||||
                                        }
 | 
			
		||||
                                        ((MultiRedditViewHolder) holder).favoriteImageView.setImageResource(R.drawable.ic_favorite_border_24dp);
 | 
			
		||||
                                    }
 | 
			
		||||
 | 
			
		||||
                    InsertMultireddit.insertMultireddit(mExecutor, new Handler(), mRedditDataRoomDatabase, multiReddit,
 | 
			
		||||
                            () -> {
 | 
			
		||||
                                //Do nothing
 | 
			
		||||
                            });
 | 
			
		||||
                                    @Override
 | 
			
		||||
                                    public void failed() {
 | 
			
		||||
                                        Toast.makeText(mActivity, R.string.thing_unfavorite_failed, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                        int position = holder.getBindingAdapterPosition() - offset;
 | 
			
		||||
                                        if(position >= 0 && mMultiReddits.size() > position) {
 | 
			
		||||
                                            mMultiReddits.get(position).setFavorite(true);
 | 
			
		||||
                                        }
 | 
			
		||||
                                        ((MultiRedditViewHolder) holder).favoriteImageView.setImageResource(R.drawable.ic_favorite_24dp);
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                        );
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    ((MultiRedditViewHolder) holder).favoriteImageView.setImageResource(R.drawable.ic_favorite_24dp);
 | 
			
		||||
                    multiReddit.setFavorite(true);
 | 
			
		||||
                    if (mAccessToken == null) {
 | 
			
		||||
                        InsertMultireddit.insertMultireddit(mExecutor, new Handler(), mRedditDataRoomDatabase, multiReddit,
 | 
			
		||||
                                () -> {
 | 
			
		||||
                                    //Do nothing
 | 
			
		||||
                                });
 | 
			
		||||
                    } else {
 | 
			
		||||
                        FavoriteMultiReddit.favoriteMultiReddit(mExecutor, new Handler(), mOauthRetrofit, mRedditDataRoomDatabase,
 | 
			
		||||
                                mAccessToken, true, multiReddit,
 | 
			
		||||
                                new FavoriteMultiReddit.FavoriteMultiRedditListener() {
 | 
			
		||||
                                    @Override
 | 
			
		||||
                                    public void success() {
 | 
			
		||||
                                        int position = holder.getBindingAdapterPosition() - offset;
 | 
			
		||||
                                        if(position >= 0 && mMultiReddits.size() > position) {
 | 
			
		||||
                                            mMultiReddits.get(position).setFavorite(true);
 | 
			
		||||
                                        }
 | 
			
		||||
                                        ((MultiRedditViewHolder) holder).favoriteImageView.setImageResource(R.drawable.ic_favorite_24dp);
 | 
			
		||||
                                    }
 | 
			
		||||
 | 
			
		||||
                    InsertMultireddit.insertMultireddit(mExecutor, new Handler(), mRedditDataRoomDatabase, multiReddit,
 | 
			
		||||
                            () -> {
 | 
			
		||||
                                //Do nothing
 | 
			
		||||
                            });
 | 
			
		||||
                                    @Override
 | 
			
		||||
                                    public void failed() {
 | 
			
		||||
                                        Toast.makeText(mActivity, R.string.thing_favorite_failed, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                        int position = holder.getBindingAdapterPosition() - offset;
 | 
			
		||||
                                        if(position >= 0 && mMultiReddits.size() > position) {
 | 
			
		||||
                                            mMultiReddits.get(position).setFavorite(false);
 | 
			
		||||
                                        }
 | 
			
		||||
                                        ((MultiRedditViewHolder) holder).favoriteImageView.setImageResource(R.drawable.ic_favorite_border_24dp);
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                        );
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            });
 | 
			
		||||
            holder.itemView.setOnClickListener(view -> {
 | 
			
		||||
                mOnItemClickListener.onClick(multiReddit);
 | 
			
		||||
@@ -170,29 +220,79 @@ public class MultiRedditListingRecyclerViewAdapter extends RecyclerView.Adapter<
 | 
			
		||||
            MultiReddit multiReddit = mFavoriteMultiReddits.get(holder.getBindingAdapterPosition() - 1);
 | 
			
		||||
            String name = multiReddit.getDisplayName();
 | 
			
		||||
            String iconUrl = multiReddit.getIconUrl();
 | 
			
		||||
            if (multiReddit.isFavorite()) {
 | 
			
		||||
            if(multiReddit.isFavorite()) {
 | 
			
		||||
                ((FavoriteMultiRedditViewHolder) holder).favoriteImageView.setImageResource(R.drawable.ic_favorite_24dp);
 | 
			
		||||
            } else {
 | 
			
		||||
                ((FavoriteMultiRedditViewHolder) holder).favoriteImageView.setImageResource(R.drawable.ic_favorite_border_24dp);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            ((FavoriteMultiRedditViewHolder) holder).favoriteImageView.setOnClickListener(view -> {
 | 
			
		||||
                if (multiReddit.isFavorite()) {
 | 
			
		||||
                if(multiReddit.isFavorite()) {
 | 
			
		||||
                    ((FavoriteMultiRedditViewHolder) holder).favoriteImageView.setImageResource(R.drawable.ic_favorite_border_24dp);
 | 
			
		||||
                    multiReddit.setFavorite(false);
 | 
			
		||||
                    InsertMultireddit.insertMultireddit(mExecutor, new Handler(), mRedditDataRoomDatabase, multiReddit,
 | 
			
		||||
                            () -> {
 | 
			
		||||
                                //Do nothing
 | 
			
		||||
                            });
 | 
			
		||||
                    if (mAccessToken == null) {
 | 
			
		||||
                        InsertMultireddit.insertMultireddit(mExecutor, new Handler(), mRedditDataRoomDatabase, multiReddit,
 | 
			
		||||
                                () -> {
 | 
			
		||||
                                    //Do nothing
 | 
			
		||||
                                });
 | 
			
		||||
                    } else {
 | 
			
		||||
                        FavoriteMultiReddit.favoriteMultiReddit(mExecutor, new Handler(), mOauthRetrofit, mRedditDataRoomDatabase,
 | 
			
		||||
                                mAccessToken, false, multiReddit,
 | 
			
		||||
                                new FavoriteMultiReddit.FavoriteMultiRedditListener() {
 | 
			
		||||
                                    @Override
 | 
			
		||||
                                    public void success() {
 | 
			
		||||
                                        int position = holder.getBindingAdapterPosition() - 1;
 | 
			
		||||
                                        if(position >= 0 && mFavoriteMultiReddits.size() > position) {
 | 
			
		||||
                                            mFavoriteMultiReddits.get(position).setFavorite(false);
 | 
			
		||||
                                        }
 | 
			
		||||
                                        ((FavoriteMultiRedditViewHolder) holder).favoriteImageView.setImageResource(R.drawable.ic_favorite_border_24dp);
 | 
			
		||||
                                    }
 | 
			
		||||
 | 
			
		||||
                                    @Override
 | 
			
		||||
                                    public void failed() {
 | 
			
		||||
                                        Toast.makeText(mActivity, R.string.thing_unfavorite_failed, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                        int position = holder.getBindingAdapterPosition() - 1;
 | 
			
		||||
                                        if(position >= 0 && mFavoriteMultiReddits.size() > position) {
 | 
			
		||||
                                            mFavoriteMultiReddits.get(position).setFavorite(true);
 | 
			
		||||
                                        }
 | 
			
		||||
                                        ((FavoriteMultiRedditViewHolder) holder).favoriteImageView.setImageResource(R.drawable.ic_favorite_24dp);
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                        );
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    ((FavoriteMultiRedditViewHolder) holder).favoriteImageView.setImageResource(R.drawable.ic_favorite_24dp);
 | 
			
		||||
                    multiReddit.setFavorite(true);
 | 
			
		||||
                    if (mAccessToken == null) {
 | 
			
		||||
                        InsertMultireddit.insertMultireddit(mExecutor, new Handler(), mRedditDataRoomDatabase, multiReddit,
 | 
			
		||||
                                () -> {
 | 
			
		||||
                                    //Do nothing
 | 
			
		||||
                                });
 | 
			
		||||
                    } else {
 | 
			
		||||
                        FavoriteMultiReddit.favoriteMultiReddit(mExecutor, new Handler(), mOauthRetrofit, mRedditDataRoomDatabase,
 | 
			
		||||
                                mAccessToken, true, multiReddit,
 | 
			
		||||
                                new FavoriteMultiReddit.FavoriteMultiRedditListener() {
 | 
			
		||||
                                    @Override
 | 
			
		||||
                                    public void success() {
 | 
			
		||||
                                        int position = holder.getBindingAdapterPosition() - 1;
 | 
			
		||||
                                        if(position >= 0 && mFavoriteMultiReddits.size() > position) {
 | 
			
		||||
                                            mFavoriteMultiReddits.get(position).setFavorite(true);
 | 
			
		||||
                                        }
 | 
			
		||||
                                        ((FavoriteMultiRedditViewHolder) holder).favoriteImageView.setImageResource(R.drawable.ic_favorite_24dp);
 | 
			
		||||
                                    }
 | 
			
		||||
 | 
			
		||||
                    InsertMultireddit.insertMultireddit(mExecutor, new Handler(), mRedditDataRoomDatabase, multiReddit,
 | 
			
		||||
                            () -> {
 | 
			
		||||
                                //Do nothing
 | 
			
		||||
                            });
 | 
			
		||||
                                    @Override
 | 
			
		||||
                                    public void failed() {
 | 
			
		||||
                                        Toast.makeText(mActivity, R.string.thing_favorite_failed, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                        int position = holder.getBindingAdapterPosition() - 1;
 | 
			
		||||
                                        if(position >= 0 && mFavoriteMultiReddits.size() > position) {
 | 
			
		||||
                                            mFavoriteMultiReddits.get(position).setFavorite(false);
 | 
			
		||||
                                        }
 | 
			
		||||
                                        ((FavoriteMultiRedditViewHolder) holder).favoriteImageView.setImageResource(R.drawable.ic_favorite_border_24dp);
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                        );
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
            holder.itemView.setOnClickListener(view -> {
 | 
			
		||||
@@ -222,7 +322,7 @@ public class MultiRedditListingRecyclerViewAdapter extends RecyclerView.Adapter<
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getItemCount() {
 | 
			
		||||
        if (mMultiReddits != null) {
 | 
			
		||||
            if (mFavoriteMultiReddits != null && mFavoriteMultiReddits.size() > 0) {
 | 
			
		||||
            if(mFavoriteMultiReddits != null && mFavoriteMultiReddits.size() > 0) {
 | 
			
		||||
                return mMultiReddits.size() > 0 ?
 | 
			
		||||
                        mFavoriteMultiReddits.size() + mMultiReddits.size() + 2 : 0;
 | 
			
		||||
            }
 | 
			
		||||
@@ -234,7 +334,7 @@ public class MultiRedditListingRecyclerViewAdapter extends RecyclerView.Adapter<
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
 | 
			
		||||
        if (holder instanceof MultiRedditViewHolder) {
 | 
			
		||||
        if(holder instanceof MultiRedditViewHolder) {
 | 
			
		||||
            mGlide.clear(((MultiRedditViewHolder) holder).iconImageView);
 | 
			
		||||
        } else if (holder instanceof FavoriteMultiRedditViewHolder) {
 | 
			
		||||
            mGlide.clear(((FavoriteMultiRedditViewHolder) holder).iconImageView);
 | 
			
		||||
@@ -303,8 +403,7 @@ public class MultiRedditListingRecyclerViewAdapter extends RecyclerView.Adapter<
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class FavoriteMultiRedditsDividerViewHolder extends RecyclerView.ViewHolder {
 | 
			
		||||
        @BindView(R.id.divider_text_view_item_favorite_thing_divider)
 | 
			
		||||
        TextView dividerTextView;
 | 
			
		||||
        @BindView(R.id.divider_text_view_item_favorite_thing_divider) TextView dividerTextView;
 | 
			
		||||
 | 
			
		||||
        FavoriteMultiRedditsDividerViewHolder(@NonNull View itemView) {
 | 
			
		||||
            super(itemView);
 | 
			
		||||
@@ -318,8 +417,7 @@ public class MultiRedditListingRecyclerViewAdapter extends RecyclerView.Adapter<
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class AllMultiRedditsDividerViewHolder extends RecyclerView.ViewHolder {
 | 
			
		||||
        @BindView(R.id.divider_text_view_item_favorite_thing_divider)
 | 
			
		||||
        TextView dividerTextView;
 | 
			
		||||
        @BindView(R.id.divider_text_view_item_favorite_thing_divider) TextView dividerTextView;
 | 
			
		||||
 | 
			
		||||
        AllMultiRedditsDividerViewHolder(@NonNull View itemView) {
 | 
			
		||||
            super(itemView);
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -12,15 +12,11 @@ import java.util.List;
 | 
			
		||||
 | 
			
		||||
import eu.toldi.infinityforlemmy.R;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.BaseActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.adapters.navigationdrawer.PostFilterUsageEmbeddedRecyclerViewAdapter;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customviews.LinearLayoutManagerBugFixed;
 | 
			
		||||
import eu.toldi.infinityforlemmy.databinding.ItemPostFilterWithUsageBinding;
 | 
			
		||||
import eu.toldi.infinityforlemmy.postfilter.PostFilter;
 | 
			
		||||
import eu.toldi.infinityforlemmy.postfilter.PostFilterWithUsage;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.Utils;
 | 
			
		||||
 | 
			
		||||
public class PostFilterWithUsageRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
 | 
			
		||||
public class PostFilterRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
 | 
			
		||||
 | 
			
		||||
    private static final int VIEW_TYPE_HEADER = 1;
 | 
			
		||||
    private static final int VIEW_TYPE_POST_FILTER = 2;
 | 
			
		||||
@@ -28,18 +24,16 @@ public class PostFilterWithUsageRecyclerViewAdapter extends RecyclerView.Adapter
 | 
			
		||||
    private BaseActivity activity;
 | 
			
		||||
    private CustomThemeWrapper customThemeWrapper;
 | 
			
		||||
    private final OnItemClickListener onItemClickListener;
 | 
			
		||||
    private List<PostFilterWithUsage> postFilterWithUsageList;
 | 
			
		||||
    private RecyclerView.RecycledViewPool recycledViewPool;
 | 
			
		||||
    private List<PostFilter> postFilterList;
 | 
			
		||||
 | 
			
		||||
    public interface OnItemClickListener {
 | 
			
		||||
        void onItemClick(PostFilter postFilter);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public PostFilterWithUsageRecyclerViewAdapter(BaseActivity activity, CustomThemeWrapper customThemeWrapper,
 | 
			
		||||
                                                  OnItemClickListener onItemClickListener) {
 | 
			
		||||
    public PostFilterRecyclerViewAdapter(BaseActivity activity, CustomThemeWrapper customThemeWrapper,
 | 
			
		||||
                                         OnItemClickListener onItemClickListener) {
 | 
			
		||||
        this.activity = activity;
 | 
			
		||||
        this.customThemeWrapper = customThemeWrapper;
 | 
			
		||||
        this.recycledViewPool = new RecyclerView.RecycledViewPool();
 | 
			
		||||
        this.onItemClickListener = onItemClickListener;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -57,49 +51,43 @@ public class PostFilterWithUsageRecyclerViewAdapter extends RecyclerView.Adapter
 | 
			
		||||
        if (viewType == VIEW_TYPE_HEADER) {
 | 
			
		||||
            return new HeaderViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_filter_fragment_header, parent, false));
 | 
			
		||||
        } else {
 | 
			
		||||
            return new PostFilterViewHolder(ItemPostFilterWithUsageBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
 | 
			
		||||
            return new PostFilterViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_post_filter, parent, false));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
 | 
			
		||||
        if (holder instanceof PostFilterViewHolder) {
 | 
			
		||||
            ((PostFilterViewHolder) holder).binding.postFilterNameTextViewItemPostFilter.setText(postFilterWithUsageList.get(position - 1).postFilter.name);
 | 
			
		||||
            ((PostFilterViewHolder) holder).adapter.setPostFilterUsageList(postFilterWithUsageList.get(position - 1).postFilterUsages);
 | 
			
		||||
            ((PostFilterViewHolder) holder).textView.setText(postFilterList.get(position - 1).name);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getItemCount() {
 | 
			
		||||
        return postFilterWithUsageList == null ? 1 : 1 + postFilterWithUsageList.size();
 | 
			
		||||
        return postFilterList == null ? 1 : 1 + postFilterList.size();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setPostFilterWithUsageList(List<PostFilterWithUsage> postFilterWithUsageList) {
 | 
			
		||||
        this.postFilterWithUsageList = postFilterWithUsageList;
 | 
			
		||||
    public void setPostFilterList(List<PostFilter> postFilterList) {
 | 
			
		||||
        this.postFilterList = postFilterList;
 | 
			
		||||
        notifyDataSetChanged();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private class PostFilterViewHolder extends RecyclerView.ViewHolder {
 | 
			
		||||
        ItemPostFilterWithUsageBinding binding;
 | 
			
		||||
        PostFilterUsageEmbeddedRecyclerViewAdapter adapter;
 | 
			
		||||
        TextView textView;
 | 
			
		||||
 | 
			
		||||
        public PostFilterViewHolder(@NonNull ItemPostFilterWithUsageBinding binding) {
 | 
			
		||||
            super(binding.getRoot());
 | 
			
		||||
            this.binding = binding;
 | 
			
		||||
            binding.postFilterNameTextViewItemPostFilter.setTextColor(customThemeWrapper.getPrimaryTextColor());
 | 
			
		||||
        public PostFilterViewHolder(@NonNull View itemView) {
 | 
			
		||||
            super(itemView);
 | 
			
		||||
            textView = (TextView) itemView;
 | 
			
		||||
 | 
			
		||||
            textView.setTextColor(customThemeWrapper.getPrimaryTextColor());
 | 
			
		||||
 | 
			
		||||
            if (activity.typeface != null) {
 | 
			
		||||
                binding.postFilterNameTextViewItemPostFilter.setTypeface(activity.typeface);
 | 
			
		||||
                textView.setTypeface(activity.typeface);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            binding.getRoot().setOnClickListener(view -> {
 | 
			
		||||
                onItemClickListener.onItemClick(postFilterWithUsageList.get(getBindingAdapterPosition() - 1).postFilter);
 | 
			
		||||
            itemView.setOnClickListener(view -> {
 | 
			
		||||
                onItemClickListener.onItemClick(postFilterList.get(getBindingAdapterPosition() - 1));
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            binding.postFilterUsageRecyclerViewItemPostFilter.setRecycledViewPool(recycledViewPool);
 | 
			
		||||
            binding.postFilterUsageRecyclerViewItemPostFilter.setLayoutManager(new LinearLayoutManagerBugFixed(activity));
 | 
			
		||||
            adapter = new PostFilterUsageEmbeddedRecyclerViewAdapter(activity);
 | 
			
		||||
            binding.postFilterUsageRecyclerViewItemPostFilter.setAdapter(adapter);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -112,4 +100,4 @@ public class PostFilterWithUsageRecyclerViewAdapter extends RecyclerView.Adapter
 | 
			
		||||
            infoTextView.setCompoundDrawablesWithIntrinsicBounds(Utils.getTintedDrawable(activity, R.drawable.ic_info_preference_24dp, activity.customThemeWrapper.getPrimaryIconColor()), null, null, null);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
@@ -18,18 +18,17 @@ import com.bumptech.glide.RequestBuilder;
 | 
			
		||||
import com.bumptech.glide.RequestManager;
 | 
			
		||||
import com.bumptech.glide.load.DataSource;
 | 
			
		||||
import com.bumptech.glide.load.engine.GlideException;
 | 
			
		||||
import com.bumptech.glide.load.resource.bitmap.DownsampleStrategy;
 | 
			
		||||
import com.bumptech.glide.request.RequestListener;
 | 
			
		||||
import com.bumptech.glide.request.RequestOptions;
 | 
			
		||||
import com.bumptech.glide.request.target.Target;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
import io.noties.markwon.Markwon;
 | 
			
		||||
import jp.wasabeef.glide.transformations.BlurTransformation;
 | 
			
		||||
import eu.toldi.infinityforlemmy.SaveMemoryCenterInisdeDownsampleStrategy;
 | 
			
		||||
import eu.toldi.infinityforlemmy.databinding.ItemGalleryImageInPostFeedBinding;
 | 
			
		||||
import eu.toldi.infinityforlemmy.post.Post;
 | 
			
		||||
import io.noties.markwon.Markwon;
 | 
			
		||||
import jp.wasabeef.glide.transformations.BlurTransformation;
 | 
			
		||||
 | 
			
		||||
public class PostGalleryTypeImageRecyclerViewAdapter extends RecyclerView.Adapter<PostGalleryTypeImageRecyclerViewAdapter.ImageViewHolder> {
 | 
			
		||||
    private RequestManager glide;
 | 
			
		||||
@@ -129,7 +128,7 @@ public class PostGalleryTypeImageRecyclerViewAdapter extends RecyclerView.Adapte
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        RequestBuilder<Drawable> imageRequestBuilder = glide.load(galleryImages.get(index).url).override(1024).listener(new RequestListener<>() {
 | 
			
		||||
        RequestBuilder<Drawable> imageRequestBuilder = glide.load(galleryImages.get(index).url).listener(new RequestListener<>() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
 | 
			
		||||
                holder.binding.progressBarItemGalleryImageInPostFeed.setVisibility(View.GONE);
 | 
			
		||||
@@ -145,10 +144,10 @@ public class PostGalleryTypeImageRecyclerViewAdapter extends RecyclerView.Adapte
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        if (blurImage) {
 | 
			
		||||
            imageRequestBuilder.apply(RequestOptions.bitmapTransform(new BlurTransformation(50, 10))).thumbnail(0.1f).downsample(DownsampleStrategy.CENTER_INSIDE).override(1024)
 | 
			
		||||
            imageRequestBuilder.apply(RequestOptions.bitmapTransform(new BlurTransformation(50, 10)))
 | 
			
		||||
                    .into(holder.binding.imageViewItemGalleryImageInPostFeed);
 | 
			
		||||
        } else {
 | 
			
		||||
            imageRequestBuilder.centerInside().downsample(saveMemoryCenterInisdeDownsampleStrategy).override(1024).thumbnail(0.1f).downsample(DownsampleStrategy.CENTER_INSIDE).into(holder.binding.imageViewItemGalleryImageInPostFeed);
 | 
			
		||||
            imageRequestBuilder.centerInside().downsample(saveMemoryCenterInisdeDownsampleStrategy).into(holder.binding.imageViewItemGalleryImageInPostFeed);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -12,8 +12,6 @@ import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.annotation.Nullable;
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView;
 | 
			
		||||
 | 
			
		||||
import com.bumptech.glide.Glide;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
import butterknife.BindView;
 | 
			
		||||
@@ -39,7 +37,6 @@ import me.saket.bettermovementmethod.BetterLinkMovementMethod;
 | 
			
		||||
public class RulesRecyclerViewAdapter extends RecyclerView.Adapter<RulesRecyclerViewAdapter.RuleViewHolder> {
 | 
			
		||||
    private BaseActivity activity;
 | 
			
		||||
    private Markwon markwon;
 | 
			
		||||
    private boolean mDisableImagePreview;
 | 
			
		||||
    @Nullable
 | 
			
		||||
    private final SliderPanel sliderPanel;
 | 
			
		||||
    private ArrayList<Rule> rules;
 | 
			
		||||
@@ -47,11 +44,10 @@ public class RulesRecyclerViewAdapter extends RecyclerView.Adapter<RulesRecycler
 | 
			
		||||
 | 
			
		||||
    public RulesRecyclerViewAdapter(@NonNull BaseActivity activity,
 | 
			
		||||
                                    @NonNull CustomThemeWrapper customThemeWrapper,
 | 
			
		||||
                                    @Nullable SliderPanel sliderPanel, boolean disableImagePreview) {
 | 
			
		||||
                                    @Nullable SliderPanel sliderPanel) {
 | 
			
		||||
        this.activity = activity;
 | 
			
		||||
        this.sliderPanel = sliderPanel;
 | 
			
		||||
        mPrimaryTextColor = customThemeWrapper.getPrimaryTextColor();
 | 
			
		||||
        mDisableImagePreview = disableImagePreview;
 | 
			
		||||
        int spoilerBackgroundColor = mPrimaryTextColor | 0xFF000000;
 | 
			
		||||
        MarkwonPlugin miscPlugin = new AbstractMarkwonPlugin() {
 | 
			
		||||
            @Override
 | 
			
		||||
@@ -86,7 +82,7 @@ public class RulesRecyclerViewAdapter extends RecyclerView.Adapter<RulesRecycler
 | 
			
		||||
            return true;
 | 
			
		||||
        };
 | 
			
		||||
        markwon = MarkdownUtils.createFullRedditMarkwon(activity,
 | 
			
		||||
                miscPlugin, mPrimaryTextColor, spoilerBackgroundColor, Glide.with(activity.getApplication()), onLinkLongClickListener, mDisableImagePreview);
 | 
			
		||||
                miscPlugin, mPrimaryTextColor, spoilerBackgroundColor, onLinkLongClickListener);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @NonNull
 | 
			
		||||
 
 | 
			
		||||
@@ -2,17 +2,21 @@ package eu.toldi.infinityforlemmy.adapters;
 | 
			
		||||
 | 
			
		||||
import android.graphics.drawable.Drawable;
 | 
			
		||||
import android.view.LayoutInflater;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.view.ViewGroup;
 | 
			
		||||
import android.widget.ImageView;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import butterknife.BindView;
 | 
			
		||||
import butterknife.ButterKnife;
 | 
			
		||||
import eu.toldi.infinityforlemmy.R;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.BaseActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.databinding.ItemRecentSearchQueryBinding;
 | 
			
		||||
import eu.toldi.infinityforlemmy.recentsearchquery.RecentSearchQuery;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.Utils;
 | 
			
		||||
 | 
			
		||||
@@ -41,14 +45,14 @@ public class SearchActivityRecyclerViewAdapter extends RecyclerView.Adapter<Recy
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
 | 
			
		||||
        return new RecentSearchQueryViewHolder(ItemRecentSearchQueryBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
 | 
			
		||||
        return new RecentSearchQueryViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recent_search_query, parent, false));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
 | 
			
		||||
        if (holder instanceof RecentSearchQueryViewHolder) {
 | 
			
		||||
            if (recentSearchQueries != null && !recentSearchQueries.isEmpty() && position < recentSearchQueries.size()) {
 | 
			
		||||
                ((RecentSearchQueryViewHolder) holder).binding.recentSearchQueryTextViewItemRecentSearchQuery.setText(recentSearchQueries.get(position).getSearchQuery());
 | 
			
		||||
                ((RecentSearchQueryViewHolder) holder).recentSearchQueryTextView.setText(recentSearchQueries.get(position).getSearchQuery());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -64,18 +68,22 @@ public class SearchActivityRecyclerViewAdapter extends RecyclerView.Adapter<Recy
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class RecentSearchQueryViewHolder extends RecyclerView.ViewHolder {
 | 
			
		||||
        ItemRecentSearchQueryBinding binding;
 | 
			
		||||
        @BindView(R.id.recent_search_query_text_view_item_recent_search_query)
 | 
			
		||||
        TextView recentSearchQueryTextView;
 | 
			
		||||
        @BindView(R.id.delete_image_view_item_recent_search_query)
 | 
			
		||||
        ImageView deleteImageView;
 | 
			
		||||
 | 
			
		||||
        public RecentSearchQueryViewHolder(@NonNull ItemRecentSearchQueryBinding binding) {
 | 
			
		||||
            super(binding.getRoot());
 | 
			
		||||
            this.binding = binding;
 | 
			
		||||
        public RecentSearchQueryViewHolder(@NonNull View itemView) {
 | 
			
		||||
            super(itemView);
 | 
			
		||||
 | 
			
		||||
            binding.recentSearchQueryTextViewItemRecentSearchQuery.setTextColor(primaryTextColor);
 | 
			
		||||
            binding.recentSearchQueryTextViewItemRecentSearchQuery.setCompoundDrawablesWithIntrinsicBounds(historyIcon, null, null, null);
 | 
			
		||||
            binding.deleteButtonItemRecentSearchQuery.setIcon(deleteIcon);
 | 
			
		||||
            ButterKnife.bind(this, itemView);
 | 
			
		||||
 | 
			
		||||
            recentSearchQueryTextView.setTextColor(primaryTextColor);
 | 
			
		||||
            recentSearchQueryTextView.setCompoundDrawablesWithIntrinsicBounds(historyIcon, null, null, null);
 | 
			
		||||
            deleteImageView.setImageDrawable(deleteIcon);
 | 
			
		||||
 | 
			
		||||
            if (activity.typeface != null) {
 | 
			
		||||
                binding.recentSearchQueryTextViewItemRecentSearchQuery.setTypeface(activity.typeface);
 | 
			
		||||
                recentSearchQueryTextView.setTypeface(activity.typeface);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            itemView.setOnClickListener(view -> {
 | 
			
		||||
@@ -84,7 +92,7 @@ public class SearchActivityRecyclerViewAdapter extends RecyclerView.Adapter<Recy
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            binding.deleteButtonItemRecentSearchQuery.setOnClickListener(view -> {
 | 
			
		||||
            deleteImageView.setOnClickListener(view -> {
 | 
			
		||||
                itemOnClickListener.onDelete(recentSearchQueries.get(getBindingAdapterPosition()));
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -16,14 +16,13 @@ import butterknife.ButterKnife;
 | 
			
		||||
import eu.toldi.infinityforlemmy.R;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.BaseActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subreddit.SubredditWithSelection;
 | 
			
		||||
 | 
			
		||||
public class SelectedSubredditsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
 | 
			
		||||
    private BaseActivity activity;
 | 
			
		||||
    private CustomThemeWrapper customThemeWrapper;
 | 
			
		||||
    private ArrayList<SubredditWithSelection> subreddits;
 | 
			
		||||
    private ArrayList<String> subreddits;
 | 
			
		||||
 | 
			
		||||
    public SelectedSubredditsRecyclerViewAdapter(BaseActivity activity, CustomThemeWrapper customThemeWrapper, ArrayList<SubredditWithSelection> subreddits) {
 | 
			
		||||
    public SelectedSubredditsRecyclerViewAdapter(BaseActivity activity, CustomThemeWrapper customThemeWrapper, ArrayList<String> subreddits) {
 | 
			
		||||
        this.activity = activity;
 | 
			
		||||
        this.customThemeWrapper = customThemeWrapper;
 | 
			
		||||
        if (subreddits == null) {
 | 
			
		||||
@@ -43,7 +42,7 @@ public class SelectedSubredditsRecyclerViewAdapter extends RecyclerView.Adapter<
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
 | 
			
		||||
        if (holder instanceof SubredditViewHolder) {
 | 
			
		||||
            ((SubredditViewHolder) holder).subredditNameTextView.setText(subreddits.get(holder.getBindingAdapterPosition()).getQualifiedName());
 | 
			
		||||
            ((SubredditViewHolder) holder).subredditNameTextView.setText(subreddits.get(holder.getBindingAdapterPosition()));
 | 
			
		||||
            ((SubredditViewHolder) holder).deleteButton.setOnClickListener(view -> {
 | 
			
		||||
                subreddits.remove(holder.getBindingAdapterPosition());
 | 
			
		||||
                notifyItemRemoved(holder.getBindingAdapterPosition());
 | 
			
		||||
@@ -56,22 +55,18 @@ public class SelectedSubredditsRecyclerViewAdapter extends RecyclerView.Adapter<
 | 
			
		||||
        return subreddits.size();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void addSubreddits(ArrayList<SubredditWithSelection> newSubreddits) {
 | 
			
		||||
    public void addSubreddits(ArrayList<String> newSubreddits) {
 | 
			
		||||
        int oldSize = subreddits.size();
 | 
			
		||||
        for (SubredditWithSelection subreddit : newSubreddits) {
 | 
			
		||||
            if (!subreddits.contains(subreddit)) {
 | 
			
		||||
                subreddits.add(subreddit);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        subreddits.addAll(newSubreddits);
 | 
			
		||||
        notifyItemRangeInserted(oldSize, newSubreddits.size());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void addUserInSubredditType(String username) {
 | 
			
		||||
        /*subreddits.add(username);
 | 
			
		||||
        notifyItemInserted(subreddits.size());*/
 | 
			
		||||
        subreddits.add(username);
 | 
			
		||||
        notifyItemInserted(subreddits.size());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ArrayList<SubredditWithSelection> getSubreddits() {
 | 
			
		||||
    public ArrayList<String> getSubreddits() {
 | 
			
		||||
        return subreddits;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,12 +19,12 @@ import java.util.List;
 | 
			
		||||
 | 
			
		||||
import butterknife.BindView;
 | 
			
		||||
import butterknife.ButterKnife;
 | 
			
		||||
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
 | 
			
		||||
import eu.toldi.infinityforlemmy.R;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.BaseActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.customtheme.CustomThemeWrapper;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subreddit.SubredditWithSelection;
 | 
			
		||||
import eu.toldi.infinityforlemmy.subscribedsubreddit.SubscribedSubredditData;
 | 
			
		||||
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
 | 
			
		||||
import pl.droidsonroids.gif.GifImageView;
 | 
			
		||||
 | 
			
		||||
public class SubredditMultiselectionRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
 | 
			
		||||
@@ -53,7 +53,6 @@ public class SubredditMultiselectionRecyclerViewAdapter extends RecyclerView.Ada
 | 
			
		||||
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
 | 
			
		||||
        if (holder instanceof SubscribedSubredditViewHolder) {
 | 
			
		||||
            ((SubscribedSubredditViewHolder) holder).nameTextView.setText(subscribedSubreddits.get(position).getName());
 | 
			
		||||
            ((SubscribedSubredditViewHolder) holder).instanceTextView.setText(subscribedSubreddits.get(position).getQualifiedName().substring(subscribedSubreddits.get(position).getQualifiedName().indexOf("@")));
 | 
			
		||||
            glide.load(subscribedSubreddits.get(position).getIconUrl())
 | 
			
		||||
                    .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
 | 
			
		||||
                    .error(glide.load(R.drawable.subreddit_default_icon)
 | 
			
		||||
@@ -92,11 +91,11 @@ public class SubredditMultiselectionRecyclerViewAdapter extends RecyclerView.Ada
 | 
			
		||||
        notifyDataSetChanged();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ArrayList<SubredditWithSelection> getAllSelectedSubreddits() {
 | 
			
		||||
        ArrayList<SubredditWithSelection> selectedSubreddits = new ArrayList<>();
 | 
			
		||||
    public ArrayList<String> getAllSelectedSubreddits() {
 | 
			
		||||
        ArrayList<String> selectedSubreddits = new ArrayList<>();
 | 
			
		||||
        for (SubredditWithSelection s : subscribedSubreddits) {
 | 
			
		||||
            if (s.isSelected()) {
 | 
			
		||||
                selectedSubreddits.add(s);
 | 
			
		||||
                selectedSubreddits.add(s.getName());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return selectedSubreddits;
 | 
			
		||||
@@ -108,9 +107,6 @@ public class SubredditMultiselectionRecyclerViewAdapter extends RecyclerView.Ada
 | 
			
		||||
        GifImageView iconImageView;
 | 
			
		||||
        @BindView(R.id.name_text_view_item_subscribed_subreddit_multiselection)
 | 
			
		||||
        TextView nameTextView;
 | 
			
		||||
 | 
			
		||||
        @BindView(R.id.instance_text_view_item_subscribed_subreddit_multiselection)
 | 
			
		||||
        TextView instanceTextView;
 | 
			
		||||
        @BindView(R.id.checkbox_item_subscribed_subreddit_multiselection)
 | 
			
		||||
        CheckBox checkBox;
 | 
			
		||||
 | 
			
		||||
@@ -119,12 +115,10 @@ public class SubredditMultiselectionRecyclerViewAdapter extends RecyclerView.Ada
 | 
			
		||||
            this.itemView = itemView;
 | 
			
		||||
            ButterKnife.bind(this, itemView);
 | 
			
		||||
            nameTextView.setTextColor(primaryTextColor);
 | 
			
		||||
            instanceTextView.setTextColor(primaryTextColor);
 | 
			
		||||
            checkBox.setButtonTintList(ColorStateList.valueOf(colorAccent));
 | 
			
		||||
 | 
			
		||||
            if (activity.typeface != null) {
 | 
			
		||||
                nameTextView.setTypeface(activity.typeface);
 | 
			
		||||
                instanceTextView.setTypeface(activity.typeface);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -47,6 +47,7 @@ public class UserFlairRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerV
 | 
			
		||||
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
 | 
			
		||||
        if (holder instanceof UserFlairViewHolder) {
 | 
			
		||||
            if (position == 0) {
 | 
			
		||||
                ((UserFlairViewHolder) holder).userFlairHtmlTextView.setText(R.string.clear_user_flair);
 | 
			
		||||
                ((UserFlairViewHolder) holder).editUserFlairImageView.setVisibility(View.GONE);
 | 
			
		||||
            } else {
 | 
			
		||||
                UserFlair userFlair = userFlairs.get(holder.getBindingAdapterPosition() - 1);
 | 
			
		||||
 
 | 
			
		||||
@@ -24,8 +24,8 @@ 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 = 5;
 | 
			
		||||
    private static final int ANONYMOUS_ACCOUNT_SECTION_ITEMS = 2;
 | 
			
		||||
    private static final int ACCOUNT_SECTION_ITEMS = 4;
 | 
			
		||||
    private static final int ANONYMOUS_ACCOUNT_SECTION_ITEMS = 1;
 | 
			
		||||
 | 
			
		||||
    private BaseActivity baseActivity;
 | 
			
		||||
    private int inboxCount;
 | 
			
		||||
@@ -113,10 +113,6 @@ public class AccountSectionRecyclerViewAdapter extends RecyclerView.Adapter<Recy
 | 
			
		||||
                            baseActivity.startActivity(intent);
 | 
			
		||||
                        });
 | 
			
		||||
                        break;
 | 
			
		||||
                    case 4:
 | 
			
		||||
                        stringId = R.string.multi_reddit;
 | 
			
		||||
                        drawableId = R.drawable.ic_multi_reddit_24dp;
 | 
			
		||||
                        break;
 | 
			
		||||
                    default:
 | 
			
		||||
                        stringId = R.string.account_saved_thing_activity_label;
 | 
			
		||||
                        drawableId = R.drawable.ic_outline_bookmarks_24dp;
 | 
			
		||||
@@ -129,10 +125,6 @@ public class AccountSectionRecyclerViewAdapter extends RecyclerView.Adapter<Recy
 | 
			
		||||
                        stringId = R.string.subscriptions;
 | 
			
		||||
                        drawableId = R.drawable.ic_subscritptions_bottom_app_bar_24dp;
 | 
			
		||||
                        break;
 | 
			
		||||
                    case 2:
 | 
			
		||||
                        stringId = R.string.multi_reddit;
 | 
			
		||||
                        drawableId = R.drawable.ic_multi_reddit_24dp;
 | 
			
		||||
                        break;
 | 
			
		||||
                    default:
 | 
			
		||||
                        stringId = R.string.anonymous_account_instance;
 | 
			
		||||
                        drawableId = R.drawable.ic_account_circle_24dp;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,102 +0,0 @@
 | 
			
		||||
package eu.toldi.infinityforlemmy.adapters.navigationdrawer;
 | 
			
		||||
 | 
			
		||||
import android.view.LayoutInflater;
 | 
			
		||||
import android.view.ViewGroup;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
import android.widget.Toast;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import eu.toldi.infinityforlemmy.R;
 | 
			
		||||
import eu.toldi.infinityforlemmy.activities.BaseActivity;
 | 
			
		||||
import eu.toldi.infinityforlemmy.databinding.ItemPostFilterUsageEmbeddedBinding;
 | 
			
		||||
import eu.toldi.infinityforlemmy.postfilter.PostFilterUsage;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
public class PostFilterUsageEmbeddedRecyclerViewAdapter extends RecyclerView.Adapter<PostFilterUsageEmbeddedRecyclerViewAdapter.EntryViewHolder> {
 | 
			
		||||
 | 
			
		||||
    private BaseActivity baseActivity;
 | 
			
		||||
    private List<PostFilterUsage> postFilterUsageList;
 | 
			
		||||
 | 
			
		||||
    public PostFilterUsageEmbeddedRecyclerViewAdapter(BaseActivity baseActivity) {
 | 
			
		||||
        this.baseActivity = baseActivity;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    public EntryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
 | 
			
		||||
        return new EntryViewHolder(ItemPostFilterUsageEmbeddedBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onBindViewHolder(@NonNull EntryViewHolder holder, int position) {
 | 
			
		||||
        if (postFilterUsageList == null || postFilterUsageList.isEmpty()) {
 | 
			
		||||
            holder.textView.setText(R.string.click_to_apply_post_filter);
 | 
			
		||||
        } else if (holder.getBindingAdapterPosition() > 4) {
 | 
			
		||||
            holder.textView.setText(baseActivity.getString(R.string.post_filter_usage_embedded_more_count, postFilterUsageList.size() - 5));
 | 
			
		||||
        } else {
 | 
			
		||||
            PostFilterUsage postFilterUsage = postFilterUsageList.get(holder.getBindingAdapterPosition());
 | 
			
		||||
            switch (postFilterUsage.usage) {
 | 
			
		||||
                case PostFilterUsage.HOME_TYPE:
 | 
			
		||||
                    holder.textView.setText(R.string.post_filter_usage_home);
 | 
			
		||||
                    break;
 | 
			
		||||
                case PostFilterUsage.SUBREDDIT_TYPE:
 | 
			
		||||
                    if (postFilterUsage.nameOfUsage.equals(PostFilterUsage.NO_USAGE)) {
 | 
			
		||||
                        holder.textView.setText(R.string.post_filter_usage_embedded_subreddit_all);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        holder.textView.setText("r/" + postFilterUsage.nameOfUsage);
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                case PostFilterUsage.USER_TYPE:
 | 
			
		||||
                    if (postFilterUsage.nameOfUsage.equals(PostFilterUsage.NO_USAGE)) {
 | 
			
		||||
                        holder.textView.setText(R.string.post_filter_usage_embedded_user_all);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        holder.textView.setText("u/" + postFilterUsage.nameOfUsage);
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                case PostFilterUsage.SEARCH_TYPE:
 | 
			
		||||
                    holder.textView.setText(R.string.post_filter_usage_search);
 | 
			
		||||
                    break;
 | 
			
		||||
                case PostFilterUsage.MULTIREDDIT_TYPE:
 | 
			
		||||
                    if (postFilterUsage.nameOfUsage.equals(PostFilterUsage.NO_USAGE)) {
 | 
			
		||||
                        holder.textView.setText(R.string.post_filter_usage_embedded_multireddit_all);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        holder.textView.setText(postFilterUsage.nameOfUsage);
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getItemCount() {
 | 
			
		||||
        return postFilterUsageList == null || postFilterUsageList.isEmpty() ? 1 : (postFilterUsageList.size() > 5 ? 6 : postFilterUsageList.size());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setPostFilterUsageList(List<PostFilterUsage> postFilterUsageList) {
 | 
			
		||||
        this.postFilterUsageList = postFilterUsageList;
 | 
			
		||||
        notifyDataSetChanged();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class EntryViewHolder extends RecyclerView.ViewHolder {
 | 
			
		||||
        TextView textView;
 | 
			
		||||
 | 
			
		||||
        public EntryViewHolder(@NonNull ItemPostFilterUsageEmbeddedBinding binding) {
 | 
			
		||||
            super(binding.getRoot());
 | 
			
		||||
            textView = binding.getRoot();
 | 
			
		||||
 | 
			
		||||
            textView.setTextColor(baseActivity.customThemeWrapper.getSecondaryTextColor());
 | 
			
		||||
 | 
			
		||||
            if (baseActivity.typeface != null) {
 | 
			
		||||
                textView.setTypeface(baseActivity.typeface);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            textView.setOnClickListener(view -> {
 | 
			
		||||
                Toast.makeText(baseActivity, textView.getText(), Toast.LENGTH_SHORT).show();
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,10 @@
 | 
			
		||||
package eu.toldi.infinityforlemmy.apis;
 | 
			
		||||
 | 
			
		||||
import retrofit2.Call;
 | 
			
		||||
import retrofit2.http.GET;
 | 
			
		||||
import retrofit2.http.Path;
 | 
			
		||||
 | 
			
		||||
public interface GfycatAPI {
 | 
			
		||||
    @GET("{gfyid}")
 | 
			
		||||
    Call<String> getGfycatData(@Path("gfyid") String gfyId);
 | 
			
		||||
}
 | 
			
		||||
@@ -7,7 +7,6 @@ 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.BlockInstanceDTO;
 | 
			
		||||
import eu.toldi.infinityforlemmy.dto.CommentDTO;
 | 
			
		||||
import eu.toldi.infinityforlemmy.dto.CommentVoteDTO;
 | 
			
		||||
import eu.toldi.infinityforlemmy.dto.DeleteCommentDTO;
 | 
			
		||||
@@ -67,9 +66,6 @@ public interface LemmyAPI {
 | 
			
		||||
    @GET("api/v3/user/unread_count")
 | 
			
		||||
    Call<MessageCount> userUnreadCount(@NonNull @Query("auth") String access_token);
 | 
			
		||||
 | 
			
		||||
    @GET("api/v3/user/validate_auth")
 | 
			
		||||
    Call<String> userValidateAuth();
 | 
			
		||||
 | 
			
		||||
    @Headers("Content-Type: application/json")
 | 
			
		||||
    @POST("api/v3/user/mention/mark_as_read")
 | 
			
		||||
    Call<String> userMentionMarkAsRead(@Body ReadMessageDTO params);
 | 
			
		||||
@@ -276,11 +272,6 @@ public interface LemmyAPI {
 | 
			
		||||
            @Query("auth") String auth
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    @POST("/api/v3/site/block")
 | 
			
		||||
    Call<String> blockInstance(
 | 
			
		||||
            @Body BlockInstanceDTO params
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    @GET("api/v3/private_message/list")
 | 
			
		||||
    Call<String> privateMessagesList(
 | 
			
		||||
            @Query("page") Integer page,
 | 
			
		||||
 
 | 
			
		||||
@@ -54,19 +54,19 @@ public interface RedditAPI {
 | 
			
		||||
    @GET("user/{username}/about.json?raw_json=1")
 | 
			
		||||
    Call<String> getUserData(@Path("username") String username);
 | 
			
		||||
 | 
			
		||||
    @GET("user/{username}/about.json?raw_json=1&limit=100")
 | 
			
		||||
    @GET("user/{username}/about.json?raw_json=1")
 | 
			
		||||
    Call<String> getUserDataOauth(@HeaderMap Map<String, String> headers, @Path("username") String username);
 | 
			
		||||
 | 
			
		||||
    @GET("user/{username}/comments.json?raw_json=1&limit=100")
 | 
			
		||||
    @GET("user/{username}/comments.json?raw_json=1")
 | 
			
		||||
    Call<String> getUserComments(@Path("username") String username, @Query("after") String after,
 | 
			
		||||
                                 @Query("sort") SortType.Type sortType, @Query("t") SortType.Time sortTime);
 | 
			
		||||
 | 
			
		||||
    @GET("user/{username}/comments.json?raw_json=1&limit=100")
 | 
			
		||||
    @GET("user/{username}/comments.json?raw_json=1")
 | 
			
		||||
    Call<String> getUserCommentsOauth(@HeaderMap Map<String, String> headers, @Path("username") String username,
 | 
			
		||||
                                      @Query("after") String after, @Query("sort") SortType.Type sortType,
 | 
			
		||||
                                      @Query("t") SortType.Time sortTime);
 | 
			
		||||
 | 
			
		||||
    @GET("user/{username}/{where}.json?&type=comments&raw_json=1&limit=100")
 | 
			
		||||
    @GET("user/{username}/{where}.json?&type=comments&raw_json=1&limit=25")
 | 
			
		||||
    Call<String> getUserSavedCommentsOauth(@Path("username") String username, @Path("where") String where,
 | 
			
		||||
                                           @Query("after") String lastItem, @Query("sort") SortType.Type sortType,
 | 
			
		||||
                                           @Query("t") SortType.Time sortTime, @HeaderMap Map<String, String> headers);
 | 
			
		||||
@@ -273,108 +273,108 @@ public interface RedditAPI {
 | 
			
		||||
    @GET("/r/{subredditName}/wiki/{wikiPage}.json?raw_json=1")
 | 
			
		||||
    Call<String> getWikiPage(@Path("subredditName") String subredditName, @Path("wikiPage") String wikiPage);
 | 
			
		||||
 | 
			
		||||
    @GET("{sortType}?raw_json=1&limit=100")
 | 
			
		||||
    @GET("{sortType}?raw_json=1")
 | 
			
		||||
    ListenableFuture<Response<String>> getBestPostsListenableFuture(@Path("sortType") SortType.Type sortType, @Query("t") SortType.Time sortTime,
 | 
			
		||||
                                                                   @Query("after") String lastItem, @HeaderMap Map<String, String> headers);
 | 
			
		||||
 | 
			
		||||
    @GET("r/{subredditName}/{sortType}.json?raw_json=1&limit=100&always_show_media=1")
 | 
			
		||||
    @GET("r/{subredditName}/{sortType}.json?raw_json=1&limit=25&always_show_media=1")
 | 
			
		||||
    ListenableFuture<Response<String>> getSubredditBestPostsOauthListenableFuture(@Path("subredditName") String subredditName, @Path("sortType") SortType.Type sortType,
 | 
			
		||||
                                            @Query("t") SortType.Time sortTime, @Query("after") String lastItem,
 | 
			
		||||
                                            @HeaderMap Map<String, String> headers);
 | 
			
		||||
 | 
			
		||||
    @GET("r/{subredditName}/{sortType}.json?raw_json=1&limit=100&always_show_media=1")
 | 
			
		||||
    @GET("r/{subredditName}/{sortType}.json?raw_json=1&limit=25&always_show_media=1")
 | 
			
		||||
    ListenableFuture<Response<String>> getSubredditBestPostsListenableFuture(@Path("subredditName") String subredditName, @Path("sortType") SortType.Type sortType,
 | 
			
		||||
                                       @Query("t") SortType.Time sortTime, @Query("after") String lastItem);
 | 
			
		||||
 | 
			
		||||
    @GET("user/{username}/{where}.json?&type=links&raw_json=1&limit=100")
 | 
			
		||||
    @GET("user/{username}/{where}.json?&type=links&raw_json=1&limit=25")
 | 
			
		||||
    ListenableFuture<Response<String>> getUserPostsOauthListenableFuture(@Path("username") String username, @Path("where") String where,
 | 
			
		||||
                                   @Query("after") String lastItem, @Query("sort") SortType.Type sortType,
 | 
			
		||||
                                   @Query("t") SortType.Time sortTime, @HeaderMap Map<String, String> headers);
 | 
			
		||||
 | 
			
		||||
    @GET("user/{username}/submitted.json?raw_json=1&limit=100")
 | 
			
		||||
    @GET("user/{username}/submitted.json?raw_json=1&limit=25")
 | 
			
		||||
    ListenableFuture<Response<String>> getUserPostsListenableFuture(@Path("username") String username, @Query("after") String lastItem,
 | 
			
		||||
                              @Query("sort") SortType.Type sortType, @Query("t") SortType.Time sortTime);
 | 
			
		||||
 | 
			
		||||
    @GET("search.json?include_over_18=1&raw_json=1&limit=100&type=link")
 | 
			
		||||
    @GET("search.json?include_over_18=1&raw_json=1&type=link")
 | 
			
		||||
    ListenableFuture<Response<String>> searchPostsOauthListenableFuture(@Query("q") String query, @Query("after") String after,
 | 
			
		||||
                                  @Query("sort") SortType.Type sort, @Query("t") SortType.Time sortTime,
 | 
			
		||||
                                  @Query("source") String source,
 | 
			
		||||
                                  @HeaderMap Map<String, String> headers);
 | 
			
		||||
 | 
			
		||||
    @GET("search.json?include_over_18=1&raw_json=1&limit=100&type=link")
 | 
			
		||||
    @GET("search.json?include_over_18=1&raw_json=1&type=link")
 | 
			
		||||
    ListenableFuture<Response<String>> searchPostsListenableFuture(@Query("q") String query, @Query("after") String after,
 | 
			
		||||
                             @Query("sort") SortType.Type sort, @Query("t") SortType.Time sortTime,
 | 
			
		||||
                             @Query("source") String source);
 | 
			
		||||
 | 
			
		||||
    @GET("r/{subredditName}/search.json?include_over_18=1&raw_json=1&limit=100&type=link&restrict_sr=true")
 | 
			
		||||
    @GET("r/{subredditName}/search.json?include_over_18=1&raw_json=1&type=link&restrict_sr=true")
 | 
			
		||||
    ListenableFuture<Response<String>> searchPostsInSpecificSubredditOauthListenableFuture(@Path("subredditName") String subredditName,
 | 
			
		||||
                                                     @Query("q") String query, @Query("sort") SortType.Type sort,
 | 
			
		||||
                                                     @Query("t") SortType.Time sortTime, @Query("after") String after,
 | 
			
		||||
                                                     @HeaderMap Map<String, String> headers);
 | 
			
		||||
 | 
			
		||||
    @GET("r/{subredditName}/search.json?include_over_18=1&raw_json=1&limit=100&type=link&restrict_sr=true")
 | 
			
		||||
    @GET("r/{subredditName}/search.json?include_over_18=1&raw_json=1&type=link&restrict_sr=true")
 | 
			
		||||
    ListenableFuture<Response<String>> searchPostsInSpecificSubredditListenableFuture(@Path("subredditName") String subredditName,
 | 
			
		||||
                                                @Query("q") String query, @Query("sort") SortType.Type sort,
 | 
			
		||||
                                                @Query("t") SortType.Time sortTime, @Query("after") String after);
 | 
			
		||||
 | 
			
		||||
    @GET("{multipath}?raw_json=1&limit=100")
 | 
			
		||||
    @GET("{multipath}?raw_json=1")
 | 
			
		||||
    ListenableFuture<Response<String>> getMultiRedditPostsListenableFuture(@Path(value = "multipath", encoded = true) String multiPath,
 | 
			
		||||
                                     @Query("after") String after, @Query("t") SortType.Time sortTime);
 | 
			
		||||
 | 
			
		||||
    @GET("{multipath}.json?raw_json=1&limit=100")
 | 
			
		||||
    @GET("{multipath}.json?raw_json=1")
 | 
			
		||||
    ListenableFuture<Response<String>> getMultiRedditPostsOauthListenableFuture(@Path(value = "multipath", encoded = true) String multiPath,
 | 
			
		||||
                                          @Query("after") String after, @Query("t") SortType.Time sortTime,
 | 
			
		||||
                                          @HeaderMap Map<String, String> headers);
 | 
			
		||||
 | 
			
		||||
    @GET("{sortType}?raw_json=1&limit=100")
 | 
			
		||||
    @GET("{sortType}?raw_json=1")
 | 
			
		||||
    Call<String> getBestPosts(@Path("sortType") SortType.Type sortType, @Query("t") SortType.Time sortTime,
 | 
			
		||||
                                                                    @Query("after") String lastItem, @HeaderMap Map<String, String> headers);
 | 
			
		||||
 | 
			
		||||
    @GET("r/{subredditName}/{sortType}.json?raw_json=1&limit=100&always_show_media=1")
 | 
			
		||||
    @GET("r/{subredditName}/{sortType}.json?raw_json=1&limit=25&always_show_media=1")
 | 
			
		||||
    Call<String> getSubredditBestPostsOauth(@Path("subredditName") String subredditName, @Path("sortType") SortType.Type sortType,
 | 
			
		||||
                                                                                  @Query("t") SortType.Time sortTime, @Query("after") String lastItem,
 | 
			
		||||
                                                                                  @HeaderMap Map<String, String> headers);
 | 
			
		||||
 | 
			
		||||
    @GET("r/{subredditName}/{sortType}.json?raw_json=1&limit=100&always_show_media=1")
 | 
			
		||||
    @GET("r/{subredditName}/{sortType}.json?raw_json=1&limit=25&always_show_media=1")
 | 
			
		||||
    Call<String> getSubredditBestPosts(@Path("subredditName") String subredditName, @Path("sortType") SortType.Type sortType,
 | 
			
		||||
                                                                             @Query("t") SortType.Time sortTime, @Query("after") String lastItem);
 | 
			
		||||
 | 
			
		||||
    @GET("user/{username}/{where}.json?&type=links&raw_json=1&limit=100")
 | 
			
		||||
    @GET("user/{username}/{where}.json?&type=links&raw_json=1&limit=25")
 | 
			
		||||
    Call<String> getUserPostsOauth(@Path("username") String username, @Path("where") String where,
 | 
			
		||||
                                                                         @Query("after") String lastItem, @Query("sort") SortType.Type sortType,
 | 
			
		||||
                                                                         @Query("t") SortType.Time sortTime, @HeaderMap Map<String, String> headers);
 | 
			
		||||
 | 
			
		||||
    @GET("user/{username}/submitted.json?raw_json=1&limit=100")
 | 
			
		||||
    @GET("user/{username}/submitted.json?raw_json=1&limit=25")
 | 
			
		||||
    Call<String> getUserPosts(@Path("username") String username, @Query("after") String lastItem,
 | 
			
		||||
                                                                    @Query("sort") SortType.Type sortType, @Query("t") SortType.Time sortTime);
 | 
			
		||||
 | 
			
		||||
    @GET("search.json?include_over_18=1&raw_json=1&limit=100&type=link")
 | 
			
		||||
    @GET("search.json?include_over_18=1&raw_json=1&type=link")
 | 
			
		||||
    Call<String> searchPostsOauth(@Query("q") String query, @Query("after") String after,
 | 
			
		||||
                                                                        @Query("sort") SortType.Type sort, @Query("t") SortType.Time sortTime,
 | 
			
		||||
                                                                        @Query("source") String source,
 | 
			
		||||
                                                                        @HeaderMap Map<String, String> headers);
 | 
			
		||||
 | 
			
		||||
    @GET("search.json?include_over_18=1&raw_json=1&limit=100&type=link")
 | 
			
		||||
    @GET("search.json?include_over_18=1&raw_json=1&type=link")
 | 
			
		||||
    Call<String> searchPosts(@Query("q") String query, @Query("after") String after,
 | 
			
		||||
                                                                   @Query("sort") SortType.Type sort, @Query("t") SortType.Time sortTime,
 | 
			
		||||
                                                                   @Query("source") String source);
 | 
			
		||||
 | 
			
		||||
    @GET("r/{subredditName}/search.json?include_over_18=1&raw_json=1&limit=100&type=link&restrict_sr=true")
 | 
			
		||||
    @GET("r/{subredditName}/search.json?include_over_18=1&raw_json=1&type=link&restrict_sr=true")
 | 
			
		||||
    Call<String> searchPostsInSpecificSubredditOauth(@Path("subredditName") String subredditName,
 | 
			
		||||
                                                                                           @Query("q") String query, @Query("sort") SortType.Type sort,
 | 
			
		||||
                                                                                           @Query("t") SortType.Time sortTime, @Query("after") String after,
 | 
			
		||||
                                                                                           @HeaderMap Map<String, String> headers);
 | 
			
		||||
 | 
			
		||||
    @GET("r/{subredditName}/search.json?include_over_18=1&raw_json=1&limit=100&type=link&restrict_sr=true")
 | 
			
		||||
    @GET("r/{subredditName}/search.json?include_over_18=1&raw_json=1&type=link&restrict_sr=true")
 | 
			
		||||
    Call<String> searchPostsInSpecificSubreddit(@Path("subredditName") String subredditName,
 | 
			
		||||
                                                                                      @Query("q") String query, @Query("sort") SortType.Type sort,
 | 
			
		||||
                                                                                      @Query("t") SortType.Time sortTime, @Query("after") String after);
 | 
			
		||||
 | 
			
		||||
    @GET("{multipath}?raw_json=1&limit=100")
 | 
			
		||||
    @GET("{multipath}?raw_json=1")
 | 
			
		||||
    Call<String> getMultiRedditPosts(@Path(value = "multipath", encoded = true) String multiPath,
 | 
			
		||||
                                                                           @Query("after") String after, @Query("t") SortType.Time sortTime);
 | 
			
		||||
 | 
			
		||||
    @GET("{multipath}.json?raw_json=1&limit=100")
 | 
			
		||||
    @GET("{multipath}.json?raw_json=1")
 | 
			
		||||
    Call<String> getMultiRedditPostsOauth(@Path(value = "multipath", encoded = true) String multiPath,
 | 
			
		||||
                                                                                @Query("after") String after, @Query("t") SortType.Time sortTime,
 | 
			
		||||
                                                                                @HeaderMap Map<String, String> headers);
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,11 @@ public class DeleteMultiredditInDatabase {
 | 
			
		||||
                                                   String accountName, String multipath,
 | 
			
		||||
                                                   DeleteMultiredditInDatabaseListener deleteMultiredditInDatabaseListener) {
 | 
			
		||||
        executor.execute(() -> {
 | 
			
		||||
            redditDataRoomDatabase.multiRedditDao().anonymousDeleteMultiReddit(multipath);
 | 
			
		||||
            if (accountName.equals("-")) {
 | 
			
		||||
                redditDataRoomDatabase.multiRedditDao().anonymousDeleteMultiReddit(multipath);
 | 
			
		||||
            } else {
 | 
			
		||||
                redditDataRoomDatabase.multiRedditDao().deleteMultiReddit(multipath, accountName);
 | 
			
		||||
            }
 | 
			
		||||
            handler.post(deleteMultiredditInDatabaseListener::success);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,6 @@ 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.blockedinstances.BlockedInstanceData;
 | 
			
		||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserDao;
 | 
			
		||||
import eu.toldi.infinityforlemmy.blockeduser.BlockedUserData;
 | 
			
		||||
 | 
			
		||||
@@ -23,7 +22,6 @@ public class InsertBlockedThings {
 | 
			
		||||
                                           RedditDataRoomDatabase redditDataRoomDatabase, @Nullable String accountName,
 | 
			
		||||
                                           List<BlockedCommunityData> blockedCommunityDataList,
 | 
			
		||||
                                           List<BlockedUserData> blockedUserDataDataList,
 | 
			
		||||
                                           List<BlockedInstanceData> blockedInstanceDataList,
 | 
			
		||||
 | 
			
		||||
                                           InsertBlockedThingListener insertSubscribedThingListener) {
 | 
			
		||||
        executor.execute(() -> {
 | 
			
		||||
@@ -70,23 +68,6 @@ public class InsertBlockedThings {
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (blockedInstanceDataList != null) {
 | 
			
		||||
                List<BlockedInstanceData> existingBlockedInstanceDataList =
 | 
			
		||||
                        redditDataRoomDatabase.blockedInstanceDao().getAllInstanceInstancesList(accountName);
 | 
			
		||||
                Collections.sort(blockedInstanceDataList, (subscribedInstanceData, t1) -> subscribedInstanceData.getDomain().compareToIgnoreCase(t1.getDomain()));
 | 
			
		||||
                List<String> unblockedInstances = new ArrayList<>();
 | 
			
		||||
                compareTwoBlockedInstanceList(blockedInstanceDataList, existingBlockedInstanceDataList,
 | 
			
		||||
                        unblockedInstances);
 | 
			
		||||
 | 
			
		||||
                for (String unblocked : unblockedInstances) {
 | 
			
		||||
                    redditDataRoomDatabase.blockedInstanceDao().deleteInstanceUser(unblocked, accountName);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                for (BlockedInstanceData s : blockedInstanceDataList) {
 | 
			
		||||
                    redditDataRoomDatabase.blockedInstanceDao().insert(s);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            handler.post(insertSubscribedThingListener::insertSuccess);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
@@ -143,32 +124,6 @@ public class InsertBlockedThings {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void compareTwoBlockedInstanceList(List<BlockedInstanceData> newBlockedInstances,
 | 
			
		||||
                                                      List<BlockedInstanceData> oldBlockedInstances,
 | 
			
		||||
                                                      List<String> unblockedInstances) {
 | 
			
		||||
        int newIndex = 0;
 | 
			
		||||
        for (int oldIndex = 0; oldIndex < oldBlockedInstances.size(); oldIndex++) {
 | 
			
		||||
            if (newIndex >= newBlockedInstances.size()) {
 | 
			
		||||
                for (; oldIndex < oldBlockedInstances.size(); oldIndex++) {
 | 
			
		||||
                    unblockedInstances.add(oldBlockedInstances.get(oldIndex).getDomain());
 | 
			
		||||
                }
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            BlockedInstanceData old = oldBlockedInstances.get(oldIndex);
 | 
			
		||||
            for (; newIndex < newBlockedInstances.size(); newIndex++) {
 | 
			
		||||
                if (newBlockedInstances.get(newIndex).getDomain().compareToIgnoreCase(old.getDomain()) == 0) {
 | 
			
		||||
                    newIndex++;
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
                if (newBlockedInstances.get(newIndex).getDomain().compareToIgnoreCase(old.getDomain()) > 0) {
 | 
			
		||||
                    unblockedInstances.add(old.getDomain());
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public interface InsertBlockedThingListener {
 | 
			
		||||
        void insertSuccess();
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -49,7 +49,6 @@ public class InsertSubscribedThings {
 | 
			
		||||
 | 
			
		||||
                for (SubscribedSubredditData s : subscribedSubredditDataList) {
 | 
			
		||||
                    if (existingSubscribedSubredditDataList.contains(s)) {
 | 
			
		||||
                        subscribedSubredditDao.updateSubscribedSubreddit(s.getQualified_name(), s.getName(), s.getIconUrl(), accountName);
 | 
			
		||||
                        continue;
 | 
			
		||||
                    }
 | 
			
		||||
                    subscribedSubredditDao.insert(s);
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,6 @@ import eu.toldi.infinityforlemmy.RetrofitHolder;
 | 
			
		||||
import eu.toldi.infinityforlemmy.account.Account;
 | 
			
		||||
import eu.toldi.infinityforlemmy.site.FetchSiteInfo;
 | 
			
		||||
import eu.toldi.infinityforlemmy.site.SiteInfo;
 | 
			
		||||
import eu.toldi.infinityforlemmy.user.MyUserInfo;
 | 
			
		||||
import eu.toldi.infinityforlemmy.utils.SharedPreferencesUtils;
 | 
			
		||||
 | 
			
		||||
public class SwitchAccount {
 | 
			
		||||
@@ -34,7 +33,7 @@ public class SwitchAccount {
 | 
			
		||||
            retrofitHolder.setAccessToken(null);
 | 
			
		||||
            FetchSiteInfo.fetchSiteInfo(retrofitHolder.getRetrofit(), account.getAccessToken(), new FetchSiteInfo.FetchSiteInfoListener() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onFetchSiteInfoSuccess(SiteInfo siteInfo, MyUserInfo myUserInfo) {
 | 
			
		||||
                public void onFetchSiteInfoSuccess(SiteInfo siteInfo) {
 | 
			
		||||
                    boolean canDownvote = siteInfo.isEnable_downvotes();
 | 
			
		||||
                    currentAccountSharedPreferences.edit().putBoolean(SharedPreferencesUtils.CAN_DOWNVOTE, canDownvote).apply();
 | 
			
		||||
                    String[] version = siteInfo.getVersion().split("\\.");
 | 
			
		||||
@@ -50,7 +49,7 @@ public class SwitchAccount {
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onFetchSiteInfoFailed(boolean parseFailed) {
 | 
			
		||||
                public void onFetchSiteInfoFailed() {
 | 
			
		||||
                    Log.e("SwitchAccount", "Failed to fetch site info");
 | 
			
		||||
                    currentAccountSharedPreferences.edit().putBoolean(SharedPreferencesUtils.CAN_DOWNVOTE, true).apply();
 | 
			
		||||
                }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,30 +0,0 @@
 | 
			
		||||
package eu.toldi.infinityforlemmy.blockedinstances;
 | 
			
		||||
 | 
			
		||||
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 BlockedInstanceDao {
 | 
			
		||||
    @Insert(onConflict = OnConflictStrategy.REPLACE)
 | 
			
		||||
    void insert(BlockedInstanceData instanceData);
 | 
			
		||||
 | 
			
		||||
    @Insert(onConflict = OnConflictStrategy.REPLACE)
 | 
			
		||||
    void insertAll(List<BlockedInstanceData> blockedUserDataDataList);
 | 
			
		||||
 | 
			
		||||
    @Query("SELECT * FROM blocked_instances WHERE account_name = :accountName AND domain LIKE '%' || :searchQuery || '%' COLLATE NOCASE ORDER BY domain COLLATE NOCASE ASC")
 | 
			
		||||
    LiveData<List<BlockedInstanceData>> getAllBlockedInstancesWithSearchQuery(String accountName, String searchQuery);
 | 
			
		||||
 | 
			
		||||
    @Query("SELECT * FROM blocked_instances WHERE account_name = :accountName COLLATE NOCASE ORDER BY domain COLLATE NOCASE ASC")
 | 
			
		||||
    List<BlockedInstanceData> getAllInstanceInstancesList(String accountName);
 | 
			
		||||
 | 
			
		||||
    @Query("SELECT * FROM blocked_instances WHERE domain = :domain COLLATE NOCASE AND account_name = :accountName COLLATE NOCASE LIMIT 1")
 | 
			
		||||
    BlockedInstanceData getInstanceUser(String domain, String accountName);
 | 
			
		||||
 | 
			
		||||
    @Query("DELETE FROM blocked_instances WHERE domain = :domain COLLATE NOCASE AND account_name = :accountName COLLATE NOCASE")
 | 
			
		||||
    void deleteInstanceUser(String domain, String accountName);
 | 
			
		||||
}
 | 
			
		||||
@@ -1,57 +0,0 @@
 | 
			
		||||
package eu.toldi.infinityforlemmy.blockedinstances;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.room.ColumnInfo;
 | 
			
		||||
import androidx.room.Entity;
 | 
			
		||||
 | 
			
		||||
@Entity(tableName = "blocked_instances", primaryKeys = {"id", "account_name"})
 | 
			
		||||
public class BlockedInstanceData {
 | 
			
		||||
    @ColumnInfo(name = "id")
 | 
			
		||||
    private final int id;
 | 
			
		||||
 | 
			
		||||
    @ColumnInfo(name = "domain")
 | 
			
		||||
    private String domain;
 | 
			
		||||
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @ColumnInfo(name = "account_name")
 | 
			
		||||
    private String accountName;
 | 
			
		||||
 | 
			
		||||
    @ColumnInfo(name = "instance_name")
 | 
			
		||||
    private String name;
 | 
			
		||||
 | 
			
		||||
    @ColumnInfo(name = "icon")
 | 
			
		||||
    private String icon;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public BlockedInstanceData(int id, String domain, String name, String icon, String accountName) {
 | 
			
		||||
        this.id = id;
 | 
			
		||||
        this.domain = domain;
 | 
			
		||||
        this.icon = icon;
 | 
			
		||||
        this.name = name;
 | 
			
		||||
        this.accountName = accountName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getId() {
 | 
			
		||||
        return id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getDomain() {
 | 
			
		||||
        return domain;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getAccountName() {
 | 
			
		||||
        return accountName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAccountName(String accountName) {
 | 
			
		||||
        this.accountName = accountName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getName() {
 | 
			
		||||
        return name;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getIcon() {
 | 
			
		||||
        return icon;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,47 +0,0 @@
 | 
			
		||||
package eu.toldi.infinityforlemmy.blockedinstances;
 | 
			
		||||
 | 
			
		||||
import android.os.AsyncTask;
 | 
			
		||||
 | 
			
		||||
import androidx.lifecycle.LiveData;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import eu.toldi.infinityforlemmy.RedditDataRoomDatabase;
 | 
			
		||||
 | 
			
		||||
public class BlockedInstanceRepository {
 | 
			
		||||
 | 
			
		||||
    private BlockedInstanceDao blockedInstanceDao;
 | 
			
		||||
    private String mAccountName;
 | 
			
		||||
 | 
			
		||||
    BlockedInstanceRepository(RedditDataRoomDatabase redditDataRoomDatabase, String accountName) {
 | 
			
		||||
        blockedInstanceDao = redditDataRoomDatabase.blockedInstanceDao();
 | 
			
		||||
        mAccountName = accountName;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    LiveData<List<BlockedInstanceData>> getAllBlockedInstancesWithSearchQuery(String searchQuery) {
 | 
			
		||||
        return blockedInstanceDao.getAllBlockedInstancesWithSearchQuery(mAccountName, searchQuery);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    LiveData<List<BlockedInstanceData>> getAllFavoriteSubscribedInstancesWithSearchQuery(String searchQuery) {
 | 
			
		||||
        return blockedInstanceDao.getAllBlockedInstancesWithSearchQuery(mAccountName, searchQuery);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void insert(BlockedInstanceData BlockedInstanceData) {
 | 
			
		||||
        new BlockedInstanceRepository.insertAsyncTask(blockedInstanceDao).execute(BlockedInstanceData);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static class insertAsyncTask extends AsyncTask<BlockedInstanceData, Void, Void> {
 | 
			
		||||
 | 
			
		||||
        private BlockedInstanceDao mAsyncTaskDao;
 | 
			
		||||
 | 
			
		||||
        insertAsyncTask(BlockedInstanceDao dao) {
 | 
			
		||||
            mAsyncTaskDao = dao;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        protected Void doInBackground(final BlockedInstanceData... params) {
 | 
			
		||||
            mAsyncTaskDao.insert(params[0]);
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user