Twidere-App-Android-Twitter.../twidere/src/main/kotlin/org/mariotaku/twidere/fragment/GroupFragment.kt

141 lines
5.2 KiB
Kotlin
Raw Normal View History

2016-07-06 15:21:34 +02:00
package org.mariotaku.twidere.fragment
import android.content.Context
import android.nfc.NdefMessage
import android.nfc.NdefRecord
import android.nfc.NfcAdapter
import android.os.Bundle
2020-01-26 08:35:15 +01:00
import androidx.loader.app.LoaderManager.LoaderCallbacks
import androidx.loader.content.FixedAsyncTaskLoader
import androidx.loader.content.Loader
2016-07-06 15:21:34 +02:00
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.statusnet.model.Group
import org.mariotaku.twidere.Constants.*
import org.mariotaku.twidere.R
import org.mariotaku.twidere.adapter.SupportTabsAdapter
2017-04-21 14:24:15 +02:00
import org.mariotaku.twidere.fragment.statuses.GroupTimelineFragment
2017-04-21 11:23:55 +02:00
import org.mariotaku.twidere.fragment.users.GroupMembersFragment
2016-07-06 15:21:34 +02:00
import org.mariotaku.twidere.model.ParcelableGroup
import org.mariotaku.twidere.model.SingleResponse
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.util.ParcelableGroupUtils
import org.mariotaku.twidere.util.MicroBlogAPIFactory
import org.mariotaku.twidere.util.Utils
/**
* Created by mariotaku on 16/3/23.
*/
class GroupFragment : AbsToolbarTabPagesFragment(), LoaderCallbacks<SingleResponse<ParcelableGroup>> {
var group: ParcelableGroup? = null
private set
private var groupLoaderInitialized: Boolean = false
override fun addTabs(adapter: SupportTabsAdapter) {
val args = arguments
2017-03-27 05:08:09 +02:00
adapter.add(cls = GroupTimelineFragment::class.java, args = args, name = getString(R.string.title_statuses), tag = "statuses")
adapter.add(cls = GroupMembersFragment::class.java, args = args, name = getString(R.string.members), tag = "members")
2016-07-06 15:21:34 +02:00
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
2020-01-26 08:35:15 +01:00
activity?.let {
Utils.setNdefPushMessageCallback(it, NfcAdapter.CreateNdefMessageCallback {
2016-07-06 15:21:34 +02:00
val url = group?.url ?: return@CreateNdefMessageCallback null
NdefMessage(arrayOf(NdefRecord.createUri(url)))
})
2020-01-26 08:35:15 +01:00
}
2016-07-06 15:21:34 +02:00
getGroupInfo(false)
}
2020-01-26 08:35:15 +01:00
override fun onCreateLoader(id: Int, args: Bundle?): Loader<SingleResponse<ParcelableGroup>> {
val accountKey = args!!.getParcelable<UserKey?>(EXTRA_ACCOUNT_KEY)
2016-07-06 15:21:34 +02:00
val groupId = args.getString(EXTRA_GROUP_ID)
val groupName = args.getString(EXTRA_GROUP_NAME)
val omitIntentExtra = args.getBoolean(EXTRA_OMIT_INTENT_EXTRA, true)
return ParcelableGroupLoader(requireContext(), omitIntentExtra, arguments, accountKey, groupId,
2017-04-12 14:58:08 +02:00
groupName)
2016-07-06 15:21:34 +02:00
}
override fun onLoadFinished(loader: Loader<SingleResponse<ParcelableGroup>>, data: SingleResponse<ParcelableGroup>) {
if (data.hasData()) {
displayGroup(data.data)
}
}
override fun onLoaderReset(loader: Loader<SingleResponse<ParcelableGroup>>) {
}
fun displayGroup(group: ParcelableGroup?) {
val activity = activity ?: return
loaderManager.destroyLoader(0)
this.group = group
if (group != null) {
activity.title = group.fullname
} else {
2017-04-17 15:10:14 +02:00
activity.setTitle(R.string.title_user_list)
2016-07-06 15:21:34 +02:00
}
2016-11-30 08:18:43 +01:00
activity.invalidateOptionsMenu()
2016-07-06 15:21:34 +02:00
}
fun getGroupInfo(omitIntentExtra: Boolean) {
val lm = loaderManager
lm.destroyLoader(0)
val args = Bundle(arguments)
args.putBoolean(EXTRA_OMIT_INTENT_EXTRA, omitIntentExtra)
if (!groupLoaderInitialized) {
lm.initLoader(0, args, this)
groupLoaderInitialized = true
} else {
lm.restartLoader(0, args, this)
}
}
internal class ParcelableGroupLoader(
context: Context,
private val omitIntentExtra: Boolean,
private val extras: Bundle?,
2017-04-12 14:58:08 +02:00
private val accountKey: UserKey?,
2016-07-06 15:21:34 +02:00
private val groupId: String?,
private val groupName: String?
2017-02-07 16:36:29 +01:00
) : FixedAsyncTaskLoader<SingleResponse<ParcelableGroup>>(context) {
2016-07-06 15:21:34 +02:00
override fun loadInBackground(): SingleResponse<ParcelableGroup> {
if (!omitIntentExtra && extras != null) {
2017-04-12 14:58:08 +02:00
val cache = extras.getParcelable<ParcelableGroup?>(EXTRA_GROUP)
if (cache != null) return SingleResponse(cache)
2016-07-06 15:21:34 +02:00
}
try {
2017-04-12 14:58:08 +02:00
if (accountKey == null) throw MicroBlogException("No account")
val twitter = MicroBlogAPIFactory.getInstance(context, accountKey) ?:
throw MicroBlogException("No account")
2016-07-06 15:21:34 +02:00
val group: Group
2020-06-09 02:21:48 +02:00
group = when {
groupId != null -> {
twitter.showGroup(groupId)
}
groupName != null -> {
twitter.showGroupByName(groupName)
}
else -> {
return SingleResponse()
}
2016-07-06 15:21:34 +02:00
}
return SingleResponse.getInstance(ParcelableGroupUtils.from(group, accountKey, 0,
group.isMember))
} catch (e: MicroBlogException) {
2017-04-12 14:58:08 +02:00
return SingleResponse(e)
2016-07-06 15:21:34 +02:00
}
}
override fun onStartLoading() {
2016-07-06 15:21:34 +02:00
forceLoad()
}
}
}