Cache locked state of connected accounts (#3790)

Small improvement to the behavior on bad/disconnected networks

Fixes https://github.com/tuskyapp/Tusky/issues/3773
This commit is contained in:
Konrad Pozniak 2023-07-27 00:09:26 +02:00 committed by GitHub
parent 1bdf19407c
commit ee711598c7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 1027 additions and 19 deletions

File diff suppressed because it is too large Load Diff

View File

@ -167,8 +167,6 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
private lateinit var glide: RequestManager private lateinit var glide: RequestManager
private var accountLocked: Boolean = false
// We need to know if the emoji pack has been changed // We need to know if the emoji pack has been changed
private var selectedEmojiPack: String? = null private var selectedEmojiPack: String? = null
@ -236,7 +234,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
// user clicked a notification, show follow requests for type FOLLOW_REQUEST, // user clicked a notification, show follow requests for type FOLLOW_REQUEST,
// otherwise show notification tab // otherwise show notification tab
if (intent.getStringExtra(NotificationHelper.TYPE) == Notification.Type.FOLLOW_REQUEST.name) { if (intent.getStringExtra(NotificationHelper.TYPE) == Notification.Type.FOLLOW_REQUEST.name) {
val intent = AccountListActivity.newIntent(this, AccountListActivity.Type.FOLLOW_REQUESTS, accountLocked = true) val intent = AccountListActivity.newIntent(this, AccountListActivity.Type.FOLLOW_REQUESTS)
startActivityWithSlideInAnimation(intent) startActivityWithSlideInAnimation(intent)
} else { } else {
showNotificationTab = true showNotificationTab = true
@ -538,7 +536,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
nameRes = R.string.action_view_follow_requests nameRes = R.string.action_view_follow_requests
iconicsIcon = GoogleMaterial.Icon.gmd_person_add iconicsIcon = GoogleMaterial.Icon.gmd_person_add
onClick = { onClick = {
val intent = AccountListActivity.newIntent(context, AccountListActivity.Type.FOLLOW_REQUESTS, accountLocked = accountLocked) val intent = AccountListActivity.newIntent(context, AccountListActivity.Type.FOLLOW_REQUESTS)
startActivityWithSlideInAnimation(intent) startActivityWithSlideInAnimation(intent)
} }
}, },
@ -872,8 +870,6 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
disableAllNotifications(this, accountManager) disableAllNotifications(this, accountManager)
} }
accountLocked = me.locked
updateProfiles() updateProfiles()
updateShortcut(this, accountManager.activeAccount!!) updateShortcut(this, accountManager.activeAccount!!)
} }

View File

@ -48,7 +48,6 @@ class AccountListActivity : BottomSheetActivity(), HasAndroidInjector {
val type = intent.getSerializableExtra(EXTRA_TYPE) as Type val type = intent.getSerializableExtra(EXTRA_TYPE) as Type
val id: String? = intent.getStringExtra(EXTRA_ID) val id: String? = intent.getStringExtra(EXTRA_ID)
val accountLocked: Boolean = intent.getBooleanExtra(EXTRA_ACCOUNT_LOCKED, false)
setSupportActionBar(binding.includedToolbar.toolbar) setSupportActionBar(binding.includedToolbar.toolbar)
supportActionBar?.apply { supportActionBar?.apply {
@ -66,7 +65,7 @@ class AccountListActivity : BottomSheetActivity(), HasAndroidInjector {
} }
supportFragmentManager.commit { supportFragmentManager.commit {
replace(R.id.fragment_container, AccountListFragment.newInstance(type, id, accountLocked)) replace(R.id.fragment_container, AccountListFragment.newInstance(type, id))
} }
} }
@ -75,13 +74,11 @@ class AccountListActivity : BottomSheetActivity(), HasAndroidInjector {
companion object { companion object {
private const val EXTRA_TYPE = "type" private const val EXTRA_TYPE = "type"
private const val EXTRA_ID = "id" private const val EXTRA_ID = "id"
private const val EXTRA_ACCOUNT_LOCKED = "acc_locked"
fun newIntent(context: Context, type: Type, id: String? = null, accountLocked: Boolean = false): Intent { fun newIntent(context: Context, type: Type, id: String? = null): Intent {
return Intent(context, AccountListActivity::class.java).apply { return Intent(context, AccountListActivity::class.java).apply {
putExtra(EXTRA_TYPE, type) putExtra(EXTRA_TYPE, type)
putExtra(EXTRA_ID, id) putExtra(EXTRA_ID, id)
putExtra(EXTRA_ACCOUNT_LOCKED, accountLocked)
} }
} }
} }

View File

@ -107,13 +107,15 @@ class AccountListFragment :
val animateEmojis = pm.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false) val animateEmojis = pm.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false)
val showBotOverlay = pm.getBoolean(PrefKeys.SHOW_BOT_OVERLAY, true) val showBotOverlay = pm.getBoolean(PrefKeys.SHOW_BOT_OVERLAY, true)
val activeAccount = accountManager.activeAccount!!
adapter = when (type) { adapter = when (type) {
Type.BLOCKS -> BlocksAdapter(this, animateAvatar, animateEmojis, showBotOverlay) Type.BLOCKS -> BlocksAdapter(this, animateAvatar, animateEmojis, showBotOverlay)
Type.MUTES -> MutesAdapter(this, animateAvatar, animateEmojis, showBotOverlay) Type.MUTES -> MutesAdapter(this, animateAvatar, animateEmojis, showBotOverlay)
Type.FOLLOW_REQUESTS -> { Type.FOLLOW_REQUESTS -> {
val headerAdapter = FollowRequestsHeaderAdapter( val headerAdapter = FollowRequestsHeaderAdapter(
instanceName = accountManager.activeAccount!!.domain, instanceName = activeAccount.domain,
accountLocked = arguments?.getBoolean(ARG_ACCOUNT_LOCKED) == true accountLocked = activeAccount.locked
) )
val followRequestsAdapter = FollowRequestsAdapter(this, this, animateAvatar, animateEmojis, showBotOverlay) val followRequestsAdapter = FollowRequestsAdapter(this, this, animateAvatar, animateEmojis, showBotOverlay)
binding.recyclerView.adapter = ConcatAdapter(headerAdapter, followRequestsAdapter) binding.recyclerView.adapter = ConcatAdapter(headerAdapter, followRequestsAdapter)
@ -404,14 +406,12 @@ class AccountListFragment :
private const val TAG = "AccountList" // logging tag private const val TAG = "AccountList" // logging tag
private const val ARG_TYPE = "type" private const val ARG_TYPE = "type"
private const val ARG_ID = "id" private const val ARG_ID = "id"
private const val ARG_ACCOUNT_LOCKED = "acc_locked"
fun newInstance(type: Type, id: String? = null, accountLocked: Boolean = false): AccountListFragment { fun newInstance(type: Type, id: String? = null): AccountListFragment {
return AccountListFragment().apply { return AccountListFragment().apply {
arguments = Bundle(3).apply { arguments = Bundle(3).apply {
putSerializable(ARG_TYPE, type) putSerializable(ARG_TYPE, type)
putString(ARG_ID, id) putString(ARG_ID, id)
putBoolean(ARG_ACCOUNT_LOCKED, accountLocked)
} }
} }
} }

View File

@ -100,7 +100,11 @@ data class AccountEntity(
* ID of the status at the top of the visible list in the home timeline when the * ID of the status at the top of the visible list in the home timeline when the
* user navigated away. * user navigated away.
*/ */
var lastVisibleHomeTimelineStatusId: String? = null var lastVisibleHomeTimelineStatusId: String? = null,
/** true if the connected Mastodon account is locked (has to manually approve all follow requests **/
@ColumnInfo(defaultValue = "0")
var locked: Boolean = false
) { ) {
val identifier: String val identifier: String

View File

@ -156,6 +156,7 @@ class AccountManager @Inject constructor(db: AppDatabase) {
it.defaultPostLanguage = account.source?.language.orEmpty() it.defaultPostLanguage = account.source?.language.orEmpty()
it.defaultMediaSensitivity = account.source?.sensitive ?: false it.defaultMediaSensitivity = account.source?.sensitive ?: false
it.emojis = account.emojis.orEmpty() it.emojis = account.emojis.orEmpty()
it.locked = account.locked
Log.d(TAG, "updateActiveAccount: saving account with id " + it.id) Log.d(TAG, "updateActiveAccount: saving account with id " + it.id)
accountDao.insertOrReplace(it) accountDao.insertOrReplace(it)

View File

@ -42,11 +42,12 @@ import java.io.File;
TimelineAccountEntity.class, TimelineAccountEntity.class,
ConversationEntity.class ConversationEntity.class
}, },
version = 51, version = 52,
autoMigrations = { autoMigrations = {
@AutoMigration(from = 48, to = 49), @AutoMigration(from = 48, to = 49),
@AutoMigration(from = 49, to = 50, spec = AppDatabase.MIGRATION_49_50.class), @AutoMigration(from = 49, to = 50, spec = AppDatabase.MIGRATION_49_50.class),
@AutoMigration(from = 50, to = 51) @AutoMigration(from = 50, to = 51),
@AutoMigration(from = 51, to = 52)
} }
) )
public abstract class AppDatabase extends RoomDatabase { public abstract class AppDatabase extends RoomDatabase {