diff --git a/app/src/main/kotlin/com/pitchedapps/frost/activities/BaseMainActivity.kt b/app/src/main/kotlin/com/pitchedapps/frost/activities/BaseMainActivity.kt index 394969cb4..99c11b4d8 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/activities/BaseMainActivity.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/activities/BaseMainActivity.kt @@ -846,7 +846,7 @@ abstract class BaseMainActivity : BaseActivity(), MainActivityContract, .setCustomView(BadgedIcon(this@BaseMainActivity).apply { iicon = fbItem.icon }.also { - it.setAllAlpha(if (index == 0) SELECTED_TAB_ALPHA else UNSELECTED_TAB_ALPHA) + it.init(index, fbItem) }) ) } @@ -861,6 +861,15 @@ abstract class BaseMainActivity : BaseActivity(), MainActivityContract, } } + private fun BadgedIcon.init(index: Int, fbItem: FbItem) { + setAllAlpha(if (index == 0) SELECTED_TAB_ALPHA else UNSELECTED_TAB_ALPHA) + setOnLongClickListener { + if (index != contentBinding.viewpager.currentItem) return@setOnLongClickListener false + currentFragment?.onTabLongClick() + true + } + } + fun saveInstanceState(outState: Bundle) { outState.putStringArrayList(STATE_FORCE_FALLBACK, ArrayList(forcedFallbacks)) } diff --git a/app/src/main/kotlin/com/pitchedapps/frost/contracts/FrostContentContract.kt b/app/src/main/kotlin/com/pitchedapps/frost/contracts/FrostContentContract.kt index b8d0d86f0..a5d4e191c 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/contracts/FrostContentContract.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/contracts/FrostContentContract.kt @@ -16,11 +16,19 @@ */ package com.pitchedapps.frost.contracts +import android.content.Context import android.view.View +import ca.allanwang.kau.utils.materialDialog +import com.pitchedapps.frost.R +import com.pitchedapps.frost.db.CookieDao +import com.pitchedapps.frost.db.updateMessengerCookie +import com.pitchedapps.frost.facebook.FbCookie import com.pitchedapps.frost.facebook.FbItem +import com.pitchedapps.frost.prefs.Prefs import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.BroadcastChannel +import kotlinx.coroutines.launch /** * Created by Allan Wang on 20/12/17. @@ -171,8 +179,37 @@ interface FrostContentCore : DynamicUiContract { */ fun onTabClicked() + /** + * Triggered when view is within viewpager + * and tab is long clicked + */ + fun onTabLongClicked() + /** * Signal destruction to release some content manually */ fun destroy() } + +internal fun FrostContentCore.onTabLongClicked( + context: Context, + prefs: Prefs, + fbCookie: FbCookie, + cookieDao: CookieDao +) { + when (parent.baseEnum) { + FbItem.MESSENGER -> { + context.materialDialog { + message(R.string.messenger_logout) + positiveButton(R.string.kau_logout) { + scope.launch { + fbCookie.removeMessengerCookie() + cookieDao.updateMessengerCookie(prefs.userId, null) + reloadBase(true) + } + } + negativeButton(R.string.kau_cancel) + } + } + } +} diff --git a/app/src/main/kotlin/com/pitchedapps/frost/facebook/FbCookie.kt b/app/src/main/kotlin/com/pitchedapps/frost/facebook/FbCookie.kt index 4e932d091..eb3580d46 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/facebook/FbCookie.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/facebook/FbCookie.kt @@ -110,6 +110,22 @@ class FbCookie(private val prefs: Prefs, private val cookieDao: CookieDao) { } } + /** + * As far as I'm aware there is no way to remove a specific cookie. + * As we only care about fb and messenger cookies, this is a workaround + * in which we remove all cookies then add back the fb one. + */ + suspend fun removeMessengerCookie() { + withContext(Dispatchers.Main + NonCancellable) { + val fbCookie = webCookie + with(CookieManager.getInstance()) { + removeAllCookies() + suspendSetWebCookie(FB_COOKIE_DOMAIN, fbCookie) + flush() + } + } + } + suspend fun switchUser(id: Long) { val cookie = cookieDao.selectById(id) ?: return L.e { "No cookie for id" } switchUser(cookie) diff --git a/app/src/main/kotlin/com/pitchedapps/frost/fragments/FragmentBase.kt b/app/src/main/kotlin/com/pitchedapps/frost/fragments/FragmentBase.kt index c07884bcf..e91069c87 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/fragments/FragmentBase.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/fragments/FragmentBase.kt @@ -251,4 +251,6 @@ abstract class BaseFragment : Fragment(), CoroutineScope, FragmentContract, override fun onBackPressed(): Boolean = content?.core?.onBackPressed() ?: false override fun onTabClick(): Unit = content?.core?.onTabClicked() ?: Unit + + override fun onTabLongClick(): Unit = content?.core?.onTabLongClicked() ?: Unit } diff --git a/app/src/main/kotlin/com/pitchedapps/frost/fragments/FragmentContract.kt b/app/src/main/kotlin/com/pitchedapps/frost/fragments/FragmentContract.kt index 10c612c50..3cd06bc94 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/fragments/FragmentContract.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/fragments/FragmentContract.kt @@ -96,6 +96,8 @@ interface FragmentContract : FrostContentContainer { fun onBackPressed(): Boolean fun onTabClick() + + fun onTabLongClick() } interface RecyclerContentContract { diff --git a/app/src/main/kotlin/com/pitchedapps/frost/views/FrostRecyclerView.kt b/app/src/main/kotlin/com/pitchedapps/frost/views/FrostRecyclerView.kt index 89009b567..f4f0fe11a 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/views/FrostRecyclerView.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/views/FrostRecyclerView.kt @@ -26,6 +26,9 @@ import ca.allanwang.kau.utils.fadeOut import com.pitchedapps.frost.contracts.FrostContentContainer import com.pitchedapps.frost.contracts.FrostContentCore import com.pitchedapps.frost.contracts.FrostContentParent +import com.pitchedapps.frost.contracts.onTabLongClicked +import com.pitchedapps.frost.db.CookieDao +import com.pitchedapps.frost.facebook.FbCookie import com.pitchedapps.frost.fragments.RecyclerContentContract import com.pitchedapps.frost.prefs.Prefs import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -47,6 +50,8 @@ class FrostRecyclerView @JvmOverloads constructor( FrostContentCore { private val prefs: Prefs by inject() + private val fbCookie: FbCookie by inject() + private val cookieDao: CookieDao by inject() override fun reload(animate: Boolean) = reloadBase(animate) @@ -107,6 +112,10 @@ class FrostRecyclerView @JvmOverloads constructor( else scrollToTop() } + override fun onTabLongClicked() { + onTabLongClicked(context, prefs, fbCookie, cookieDao) + } + private fun scrollToTop() { stopScroll() smoothScrollToPosition(0) diff --git a/app/src/main/kotlin/com/pitchedapps/frost/views/FrostWebView.kt b/app/src/main/kotlin/com/pitchedapps/frost/views/FrostWebView.kt index ecd8c0930..887d17f0c 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/views/FrostWebView.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/views/FrostWebView.kt @@ -29,6 +29,7 @@ import ca.allanwang.kau.utils.launchMain import com.pitchedapps.frost.contracts.FrostContentContainer import com.pitchedapps.frost.contracts.FrostContentCore import com.pitchedapps.frost.contracts.FrostContentParent +import com.pitchedapps.frost.contracts.onTabLongClicked import com.pitchedapps.frost.db.CookieDao import com.pitchedapps.frost.db.currentCookie import com.pitchedapps.frost.facebook.FB_HOME_URL @@ -196,6 +197,10 @@ class FrostWebView @JvmOverloads constructor( private fun smoothScrollBy(y: Int) = smoothScrollTo(max(0, scrollY + y)) + override fun onTabLongClicked() { + onTabLongClicked(context, prefs, fbCookie, cookieDao) + } + override var active: Boolean = true set(value) { if (field == value) return diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 860895e57..53b291a29 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -79,4 +79,6 @@ Disclaimer + Log out of Messenger? + diff --git a/app/src/test/kotlin/com/pitchedapps/frost/facebook/FbConstTest.kt b/app/src/test/kotlin/com/pitchedapps/frost/facebook/FbConstTest.kt index 8a8c42d6f..83bce9738 100644 --- a/app/src/test/kotlin/com/pitchedapps/frost/facebook/FbConstTest.kt +++ b/app/src/test/kotlin/com/pitchedapps/frost/facebook/FbConstTest.kt @@ -1,3 +1,19 @@ +/* + * Copyright 2021 Allan Wang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package com.pitchedapps.frost.facebook import kotlin.test.Test @@ -34,4 +50,4 @@ class FbConstTest { ) } } -} \ No newline at end of file +}