1
0
mirror of https://github.com/AllanWang/Frost-for-Facebook.git synced 2024-11-08 12:02:33 +01:00

Add option to log out for messenger

This commit is contained in:
Allan Wang 2021-01-24 19:52:51 -08:00
parent 58068ce55e
commit 4c2c8a9ce4
No known key found for this signature in database
GPG Key ID: 69D90B885D405BDB
9 changed files with 100 additions and 2 deletions

View File

@ -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))
}

View File

@ -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)
}
}
}
}

View File

@ -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)

View File

@ -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
}

View File

@ -96,6 +96,8 @@ interface FragmentContract : FrostContentContainer {
fun onBackPressed(): Boolean
fun onTabClick()
fun onTabLongClick()
}
interface RecyclerContentContract {

View File

@ -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)

View File

@ -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

View File

@ -79,4 +79,6 @@
<string name="disclaimer">Disclaimer</string>
<string name="messenger_logout">Log out of Messenger?</string>
</resources>

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
package com.pitchedapps.frost.facebook
import kotlin.test.Test