From d8b5af2a619d4af617f872d18c090e0caad8dd4b Mon Sep 17 00:00:00 2001 From: Matthieu <24-artectrex@users.noreply.shinice.net> Date: Sat, 31 Aug 2024 00:59:35 +0200 Subject: [PATCH] Implement syncing of nsfw show preference --- .../org/pixeldroid/app/main/MainActivity.kt | 7 ++++ .../app/settings/SettingsActivity.kt | 39 ++++++++++++++++++- .../pixeldroid/app/utils/api/PixelfedAPI.kt | 7 ++++ .../app/utils/api/objects/ServerConfig.kt | 34 ++++++++++++++++ app/src/main/res/xml/root_preferences.xml | 4 +- 5 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/org/pixeldroid/app/utils/api/objects/ServerConfig.kt diff --git a/app/src/main/java/org/pixeldroid/app/main/MainActivity.kt b/app/src/main/java/org/pixeldroid/app/main/MainActivity.kt index a5a4f645..11327db4 100644 --- a/app/src/main/java/org/pixeldroid/app/main/MainActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/main/MainActivity.kt @@ -32,6 +32,7 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.paging.ExperimentalPagingApi +import androidx.preference.PreferenceManager import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.widget.ViewPager2 @@ -554,6 +555,12 @@ class MainActivity : BaseActivity() { val account = api.verifyCredentials() updateUserInfoDb(db, account) + val show = api.getSettings().common.media.always_show_cw + launch { + PreferenceManager.getDefaultSharedPreferences(applicationContext) + .edit().putBoolean("always_show_nsfw", show).commit() + } + //No need to update drawer account info here, the ViewModel listens to db updates } catch (exception: Exception) { Log.e("ACCOUNT UPDATE:", exception.toString()) diff --git a/app/src/main/java/org/pixeldroid/app/settings/SettingsActivity.kt b/app/src/main/java/org/pixeldroid/app/settings/SettingsActivity.kt index 918ec0ba..a70e62f7 100644 --- a/app/src/main/java/org/pixeldroid/app/settings/SettingsActivity.kt +++ b/app/src/main/java/org/pixeldroid/app/settings/SettingsActivity.kt @@ -4,11 +4,13 @@ import android.content.Intent import android.content.SharedPreferences import android.os.Build import android.os.Bundle +import android.util.Log import android.view.View import androidx.activity.addCallback import androidx.appcompat.app.AppCompatDelegate import androidx.fragment.app.DialogFragment import androidx.lifecycle.lifecycleScope +import androidx.preference.CheckBoxPreference import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat @@ -22,12 +24,14 @@ import org.pixeldroid.app.R import org.pixeldroid.app.databinding.SettingsBinding import org.pixeldroid.app.main.MainActivity import org.pixeldroid.app.settings.TutorialSettingsDialog.Companion.START_TUTORIAL +import org.pixeldroid.app.utils.BaseActivity +import org.pixeldroid.app.utils.api.PixelfedAPI +import org.pixeldroid.app.utils.api.objects.CommonWrapper import org.pixeldroid.app.utils.setThemeFromPreferences -import org.pixeldroid.common.ThemedActivity @AndroidEntryPoint -class SettingsActivity : ThemedActivity(), SharedPreferences.OnSharedPreferenceChangeListener { +class SettingsActivity : BaseActivity(), SharedPreferences.OnSharedPreferenceChangeListener { private var restartMainOnExit = false private lateinit var binding: SettingsBinding @@ -105,6 +109,27 @@ class SettingsActivity : ThemedActivity(), SharedPreferences.OnSharedPreferenceC "themeColor" -> { recreateWithRestartStatus() } + + "always_show_nsfw" -> { + lifecycleScope.launch { + val api: PixelfedAPI = apiHolder.api ?: apiHolder.setToCurrentUser() + try { + // Get old settings and modify just the nsfw one + val settings = api.getSettings().let { settings -> + settings.common.copy( + media = settings.common.media.copy( + always_show_cw = sharedPreferences.getBoolean(key, settings.common.media.always_show_cw) + ) + ) + } + api.setSettings(CommonWrapper(settings)) + } catch (e: Exception) { + Log.e("Pixelfed API settings", e.toString()) + } + } + } + + else -> {} } } } @@ -191,6 +216,16 @@ class SettingsActivity : ThemedActivity(), SharedPreferences.OnSharedPreferenceC locale?.getDisplayName(locale) ?: getString(R.string.default_system) } } + findPreference("always_show_nsfw")?.let { + lifecycleScope.launch { + val api: PixelfedAPI = (requireActivity() as SettingsActivity).apiHolder.api ?: (requireActivity() as SettingsActivity).apiHolder.setToCurrentUser() + + try { + val show = api.getSettings().common.media.always_show_cw + it.isChecked = show + } catch (_: Exception){} + } + } //Hide Notification setting for Android versions where it doesn't work if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { diff --git a/app/src/main/java/org/pixeldroid/app/utils/api/PixelfedAPI.kt b/app/src/main/java/org/pixeldroid/app/utils/api/PixelfedAPI.kt index 12446f97..daadb1ec 100644 --- a/app/src/main/java/org/pixeldroid/app/utils/api/PixelfedAPI.kt +++ b/app/src/main/java/org/pixeldroid/app/utils/api/PixelfedAPI.kt @@ -469,4 +469,11 @@ interface PixelfedAPI { @Field("forward") forward: Boolean = true ) : Report + @POST("/api/pixelfed/v1/app/settings") + suspend fun setSettings( + @Body account_id: CommonWrapper, + ) : PixelfedAppSettings + + @GET("/api/pixelfed/v1/app/settings") + suspend fun getSettings() : PixelfedAppSettings } diff --git a/app/src/main/java/org/pixeldroid/app/utils/api/objects/ServerConfig.kt b/app/src/main/java/org/pixeldroid/app/utils/api/objects/ServerConfig.kt new file mode 100644 index 00000000..10cb4b17 --- /dev/null +++ b/app/src/main/java/org/pixeldroid/app/utils/api/objects/ServerConfig.kt @@ -0,0 +1,34 @@ +package org.pixeldroid.app.utils.api.objects + +data class PixelfedAppSettings( + val id: String, + val username: String, + val updated_at: String, + val common: Common +) +data class CommonWrapper( + val common: Common +) + +data class Common( + val timelines: Timelines, + val media: Media, + val appearance: Appearance +) + +data class Timelines( + val show_public: Boolean, + val show_network: Boolean, + val hide_likes_shares: Boolean +) + +data class Media( + val hide_public_behind_cw: Boolean, + val always_show_cw: Boolean, + val show_alt_text: Boolean +) + +data class Appearance( + val links_use_in_app_browser: Boolean, + val theme: String +) \ No newline at end of file diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index 7355e284..c7e7457d 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -33,7 +33,9 @@ android:summary="@string/arrange_tabs_description" android:icon="@drawable/outline_bottom_navigation" /> -