From 89a6cea14be145e39acc237a29675c08b7017d7f Mon Sep 17 00:00:00 2001 From: rimthekid Date: Wed, 9 Feb 2022 22:10:39 +0400 Subject: [PATCH] change instance fixed --- .../java/com/github/libretube/PipedApi.kt | 7 +++ .../com/github/libretube/ResettableLazy.kt | 51 +++++++++++++++++++ .../com/github/libretube/RetrofitInstance.kt | 9 ++-- .../java/com/github/libretube/Settings.kt | 4 ++ .../libretube/adapters/SearchAdapter.kt | 5 ++ .../com/github/libretube/obj/Subscribe.kt | 8 +++ 6 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/com/github/libretube/ResettableLazy.kt create mode 100644 app/src/main/java/com/github/libretube/obj/Subscribe.kt diff --git a/app/src/main/java/com/github/libretube/PipedApi.kt b/app/src/main/java/com/github/libretube/PipedApi.kt index 294ca1627..fe133a617 100644 --- a/app/src/main/java/com/github/libretube/PipedApi.kt +++ b/app/src/main/java/com/github/libretube/PipedApi.kt @@ -46,4 +46,11 @@ interface PipedApi { @GET("subscriptions") suspend fun subscriptions(@Header("Authorization") token: String): List + @POST("subscribe") + suspend fun subscribe(@Header("Authorization") token: String, @Body subscribe: Subscribe): String + + @POST("unsubscribe") + suspend fun unsubscribe(@Header("Authorization") token: String, @Body subscribe: Subscribe): String + + } \ No newline at end of file diff --git a/app/src/main/java/com/github/libretube/ResettableLazy.kt b/app/src/main/java/com/github/libretube/ResettableLazy.kt new file mode 100644 index 000000000..6ca72435a --- /dev/null +++ b/app/src/main/java/com/github/libretube/ResettableLazy.kt @@ -0,0 +1,51 @@ +package com.github.libretube + +import java.util.* +import kotlin.reflect.KProperty + +class ResettableLazyManager { + // we synchronize to make sure the timing of a reset() call and new inits do not collide + val managedDelegates = LinkedList() + + fun register(managed: Resettable) { + synchronized (managedDelegates) { + managedDelegates.add(managed) + } + } + + fun reset() { + synchronized (managedDelegates) { + managedDelegates.forEach { it.reset() } + managedDelegates.clear() + } + } +} + +interface Resettable { + fun reset() +} + +class ResettableLazy(val manager: ResettableLazyManager, val init: ()->PROPTYPE): Resettable { + @Volatile var lazyHolder = makeInitBlock() + + operator fun getValue(thisRef: Any?, property: KProperty<*>): PROPTYPE { + return lazyHolder.value + } + + override fun reset() { + lazyHolder = makeInitBlock() + } + + fun makeInitBlock(): Lazy { + return lazy { + manager.register(this) + init() + } + } +} + +fun resettableLazy(manager: ResettableLazyManager, init: ()->PROPTYPE): ResettableLazy { + return ResettableLazy(manager, init) +} + +fun resettableManager(): ResettableLazyManager = ResettableLazyManager() \ No newline at end of file diff --git a/app/src/main/java/com/github/libretube/RetrofitInstance.kt b/app/src/main/java/com/github/libretube/RetrofitInstance.kt index d18305b4f..c267aa071 100644 --- a/app/src/main/java/com/github/libretube/RetrofitInstance.kt +++ b/app/src/main/java/com/github/libretube/RetrofitInstance.kt @@ -1,20 +1,17 @@ package com.github.libretube -import android.content.Context -import android.util.Log -import androidx.preference.PreferenceManager -import kotlinx.coroutines.withContext import retrofit2.Retrofit import retrofit2.converter.jackson.JacksonConverterFactory -import kotlin.coroutines.coroutineContext object RetrofitInstance { lateinit var url: String - val api: PipedApi by lazy { + val lazyMgr = resettableManager() + val api: PipedApi by resettableLazy(lazyMgr) { Retrofit.Builder() .baseUrl(url) .addConverterFactory(JacksonConverterFactory.create()) .build() .create(PipedApi::class.java) } + } \ No newline at end of file diff --git a/app/src/main/java/com/github/libretube/Settings.kt b/app/src/main/java/com/github/libretube/Settings.kt index 0b736554f..9ca921602 100644 --- a/app/src/main/java/com/github/libretube/Settings.kt +++ b/app/src/main/java/com/github/libretube/Settings.kt @@ -6,6 +6,9 @@ import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreferenceCompat +import okhttp3.HttpUrl +import retrofit2.Retrofit +import retrofit2.converter.jackson.JacksonConverterFactory class Settings : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { @@ -13,6 +16,7 @@ class Settings : PreferenceFragmentCompat() { val instance = findPreference("instance") instance?.setOnPreferenceChangeListener { preference, newValue -> RetrofitInstance.url=newValue.toString() + RetrofitInstance.lazyMgr.reset() true } val login = findPreference("login_register") diff --git a/app/src/main/java/com/github/libretube/adapters/SearchAdapter.kt b/app/src/main/java/com/github/libretube/adapters/SearchAdapter.kt index 7f325f9f8..b3ef217b5 100644 --- a/app/src/main/java/com/github/libretube/adapters/SearchAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/SearchAdapter.kt @@ -77,6 +77,11 @@ class CustomViewHolder1(private val v: View): RecyclerView.ViewHolder(v){ .replace(R.id.container, frag) .commitNow() } + channelImage.setOnClickListener { + val activity = v.context as MainActivity + val bundle = bundleOf("channel_id" to item.uploaderUrl) + activity.navController.navigate(R.id.channel, bundle) + } } private fun bindChannel(item: SearchItem) { val channelImage = v.findViewById(R.id.search_channel_image) diff --git a/app/src/main/java/com/github/libretube/obj/Subscribe.kt b/app/src/main/java/com/github/libretube/obj/Subscribe.kt new file mode 100644 index 000000000..83995018b --- /dev/null +++ b/app/src/main/java/com/github/libretube/obj/Subscribe.kt @@ -0,0 +1,8 @@ +package com.github.libretube.obj + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties + +@JsonIgnoreProperties(ignoreUnknown = true) +data class Subscribe( + var channelId: String? = null +)