package net.lacolaco.smileessence.view.page import android.os.Bundle import android.text.Html import android.text.method.LinkMovementMethod import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.bumptech.glide.Glide import com.omadahealth.github.swipyrefreshlayout.library.SwipyRefreshLayout import kotlinx.android.synthetic.main.page_fragment_user.* import net.lacolaco.smileessence.R import net.lacolaco.smileessence.activity.MainActivity import net.lacolaco.smileessence.data.PageInfo import net.lacolaco.smileessence.entity.Tweet import net.lacolaco.smileessence.entity.User import net.lacolaco.smileessence.twitter.* import net.lacolaco.smileessence.util.browse import net.lacolaco.smileessence.util.launchUi import net.lacolaco.smileessence.view.Partials import net.lacolaco.smileessence.view.PopupMenu import net.lacolaco.smileessence.view.confirm class UserPageFragment : RefreshableTimelinePageFragment() { private lateinit var user: User private var isFollowedByMe = false private var isFollowingMe = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) var found = User.cached(pageInfo.userId) if (found == null) { world.notify(R.string.notice_error_show_user) found = User.placeHolder } user = found } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { return inflater.inflate(R.layout.page_fragment_user, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) imageview_user_detail_menu.setOnClickListener { showPopupMenu() } user_detail_screenname.setOnClickListener { browse(user.userHomeURL) } textview_user_detail_description.movementMethod = LinkMovementMethod.getInstance() textview_user_detail_tweet_count.setOnClickListener { browse(user.userHomeURL) } textview_user_detail_friend_count.setOnClickListener { browse(String.format("%s/following", user.userHomeURL)) } textview_user_detail_follower_count.setOnClickListener { browse(String.format("%s/followers", user.userHomeURL)) } textview_user_detail_favorite_count.setOnClickListener { browse(String.format("%s/favorites", user.userHomeURL)) } user_detail_icon.setOnClickListener { browse(user.profileImageUrl) } user_detail_banner.setOnClickListener { user.profileBannerUrl?.let { browse(it) } } toggle_follow.setOnClickListener { toggleFollowing() } refresh() } override fun refresh() { setSwipeRefreshEnabled(user.id == pageInfo.userId) adapter.sortedList.clear() updateRelationship() refreshViews() runRefreshTask { } } private fun refreshViews() { Glide.with(this).load(user.profileImageUrl).into(user_detail_icon) Glide.with(this).load(user.profileBannerUrl).into(user_detail_banner) user_detail_name.text = user.name user_detail_screenname.text = "@${user.screenName}" user_protected_indicator.visibility = if (user.isProtected) View.VISIBLE else View.INVISIBLE user_detail_location.text = user.location user_detail_url.text = user.url textview_user_detail_description.text = Html.fromHtml(user.decoratedDescription) textview_user_detail_tweet_count.text = user.statusesCount.toString() textview_user_detail_friend_count.text = user.friendsCount.toString() textview_user_detail_follower_count.text = user.followersCount.toString() textview_user_detail_favorite_count.text = user.favoritesCount.toString() if (user === world.user) { toggle_follow.text = "This is you" toggle_follow.isEnabled = false textview_user_detail_followed.visibility = View.GONE } else { toggle_follow.isEnabled = true toggle_follow.isActivated = isFollowedByMe toggle_follow.text = if (isFollowedByMe) "Unfollow" else "Follow" textview_user_detail_followed.setText( if (isFollowingMe) R.string.user_detail_followed else R.string.user_detail_not_followed) } } private fun showPopupMenu() { val popup = PopupMenu(activity!!, imageview_user_detail_menu) popup.add(R.string.command_user_add_to_reply) { (activity as MainActivity).openPostPageAndReplyTo(user) world.notify(R.string.notice_add_to_reply) } popup.add(R.string.command_user_block) { confirm(R.string.dialog_confirm_commands) { launchUi { try { world.blockAsync(user.id).await() world.notify(R.string.notice_block_succeeded) updateRelationship() } catch (e: TwitterTaskException) { world.notifyError(R.string.notice_block_failed) } } } } popup.add(R.string.command_user_unblock) { launchUi { try { world.unblockAsync(user.id).await() world.notify(R.string.notice_unblock_succeeded) updateRelationship() } catch (e: TwitterTaskException) { world.notifyError(R.string.notice_unblock_failed) } } } popup.add(R.string.command_user_r4s) { confirm(R.string.dialog_confirm_commands) { launchUi { try { world.reportSpamAsync(user.id).await() world.notify(R.string.notice_r4s_succeeded) updateRelationship() } catch (e: TwitterTaskException) { world.notifyError(R.string.notice_r4s_failed) } } } } popup.show() } private fun toggleFollowing() { assert(toggle_follow.isEnabled) confirm(R.string.dialog_confirm_commands) { val isFollowing = toggle_follow.isActivated toggle_follow.isEnabled = false toggle_follow.text = "..." launchUi { try { if (isFollowing) { world.unfollowAsync(user.id).await() world.notify(R.string.notice_unfollow_succeeded) } else { world.followAsync(user.id).await() world.notify(R.string.notice_follow_succeeded) } updateRelationship() } catch (e: TwitterTaskException) { world.notifyError(if (isFollowing) R.string.notice_unfollow_failed else R.string.notice_follow_failed) } } } } private fun updateRelationship() { if (user !== world.user) { toggle_follow.isEnabled = false toggle_follow.text = "..." launchUi { textview_user_detail_followed.setText(R.string.user_detail_loading) try { val relationship = world.getRelationshipAsync(user.id).await() isFollowedByMe = relationship.isSourceFollowingTarget isFollowingMe = relationship.isSourceFollowedByTarget } catch (e: TwitterTaskException) { world.notifyError("Failed to fetch relationship") } refreshViews() } } } override fun onSwipeDown(view: SwipyRefreshLayout) { val sinceId = if (adapter.sortedList.size > 0) adapter.sortedList[0].id else null runRefreshTask(sinceId = sinceId) { view.isRefreshing = false } } override fun onSwipeUp(view: SwipyRefreshLayout) { val maxId = if (adapter.sortedList.size > 0) adapter.sortedList[adapter.sortedList.size - 1].id - 1 else null runRefreshTask(maxId = maxId) { view.isRefreshing = false } } private fun runRefreshTask(sinceId: Long? = null, maxId: Long? = null, onFinish: () -> Unit) = launchUi { try { val tweets = world.getUserTimelineAsync(user.id, sinceId = sinceId, maxId = maxId).await() adapter.sortedList.addAll(tweets) onFinish() } catch (e: TwitterTaskException) { world.notifyError("Could not retrieve user timeline") } } override fun onBindItemView(item: Tweet, itemView: View) { Partials.getTweetView(item, world, mainActivity, itemView) } override fun onCreateItemView(parent: ViewGroup): View { val layoutInflater = LayoutInflater.from(parent.context) return layoutInflater.inflate(R.layout.list_item_tweet_rich, parent, false) } }