diff options
author | Kazuki Yamaguchi <k@rhe.jp> | 2017-10-25 00:54:37 +0900 |
---|---|---|
committer | Kazuki Yamaguchi <k@rhe.jp> | 2017-10-25 00:54:37 +0900 |
commit | 0a6d63b6f02a167ac387f6d04f3a9c5f35a3a902 (patch) | |
tree | ccbff11be451240d1ab40974ae00d64a60427c53 /app/src | |
parent | 065e7a135b9817b94e397f7c21259699eb3b09be (diff) | |
download | SmileEssence-0a6d63b6f02a167ac387f6d04f3a9c5f35a3a902.tar.gz |
good bye dm
Diffstat (limited to 'app/src')
33 files changed, 23 insertions, 665 deletions
diff --git a/app/src/main/java/net/lacolaco/smileessence/World.kt b/app/src/main/java/net/lacolaco/smileessence/World.kt index f3956a4c..3b9a6c30 100644 --- a/app/src/main/java/net/lacolaco/smileessence/World.kt +++ b/app/src/main/java/net/lacolaco/smileessence/World.kt @@ -14,7 +14,10 @@ import com.bumptech.glide.request.transition.Transition import net.lacolaco.smileessence.activity.MainActivity import net.lacolaco.smileessence.compat.Twitter4J import net.lacolaco.smileessence.data.PageInfo -import net.lacolaco.smileessence.entity.* +import net.lacolaco.smileessence.entity.Event +import net.lacolaco.smileessence.entity.SavedSearch +import net.lacolaco.smileessence.entity.Tweet +import net.lacolaco.smileessence.entity.User import net.lacolaco.smileessence.twitter.TwitterTaskException import net.lacolaco.smileessence.twitter.UserStreamListener import net.lacolaco.smileessence.twitter.task.* @@ -28,7 +31,6 @@ import twitter4j.auth.AccessToken import twitter4j.conf.ConfigurationBuilder import java.lang.ref.WeakReference import java.util.* -import java.util.concurrent.ConcurrentHashMap import kotlin.coroutines.experimental.suspendCoroutine /** @@ -42,11 +44,8 @@ class World private constructor(private val persistentData: PersistentData) { // Timelines private val tweets = HashMap<Long, Tweet>() private val tweetNotifiers = WeakHashMap<Any, (Tweet) -> Unit>() - // Direct messages - private val directMessages = ConcurrentHashMap<Long, DirectMessage>() - private val directMessageNotifiers = WeakHashMap<Any, (DirectMessage) -> Unit>() // Events - val events = ArrayList<Event>() + private val events = ArrayList<Event>() private val eventNotifiers = WeakHashMap<Any, (Event) -> Unit>() // Streaming APIs private var stream: TwitterStream? = null @@ -212,25 +211,6 @@ class World private constructor(private val persistentData: PersistentData) { } } - // Direct messages - - @Synchronized - fun addDirectMessageTimeline(key: Any, notify: (DirectMessage) -> Unit) { - for ((_, message) in directMessages) - notify(message) - directMessageNotifiers.put(key, notify) - } - - fun addDirectMessage(entity: DirectMessage) { - if (directMessages.put(entity.id, entity) == null) - for ((_, c) in directMessageNotifiers) - c(entity) - } - - fun addDirectMessage(entities: Iterable<DirectMessage>) { - entities.forEach { addDirectMessage(it) } - } - // Events @Synchronized @@ -369,7 +349,6 @@ class World private constructor(private val persistentData: PersistentData) { ret.add(PageInfo.ComposePageInfo()) ret.add(PageInfo.TweetsPageInfo("Home", arrayListOf(""))) ret.add(PageInfo.TweetsPageInfo("Mentions", arrayListOf("@$screenName"))) - ret.add(PageInfo.MessagesPageInfo()) ret.add(PageInfo.SearchPageInfo("")) ret.add(PageInfo.ListPageInfo(null)) return ret diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.kt b/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.kt index 5b6b5f84..ee2562f8 100644 --- a/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.kt +++ b/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.kt @@ -22,7 +22,6 @@ import net.lacolaco.smileessence.twitter.TwitterTaskException import net.lacolaco.smileessence.twitter.task.getTweetAsync import net.lacolaco.smileessence.twitter.task.getUserAsync import net.lacolaco.smileessence.util.bg -import net.lacolaco.smileessence.util.browse import net.lacolaco.smileessence.util.getMainActivityOrCancel import net.lacolaco.smileessence.util.launchUi import net.lacolaco.smileessence.view.DialogHelper diff --git a/app/src/main/java/net/lacolaco/smileessence/data/Pages.kt b/app/src/main/java/net/lacolaco/smileessence/data/Pages.kt index ffdf09aa..cc3c1ab1 100644 --- a/app/src/main/java/net/lacolaco/smileessence/data/Pages.kt +++ b/app/src/main/java/net/lacolaco/smileessence/data/Pages.kt @@ -40,20 +40,6 @@ sealed class PageInfo(val fragmentClass: Class<out PageFragment<*>>) { } } - class MessagesPageInfo() : PageInfo(MessagesPageFragment::class.java) { - override val name = "Messages" - - override fun describe(): String { - return "" - } - - constructor(json: JsonObject) : this() - - override fun toJson() = json { - obj() - } - } - class EventsPageInfo() : PageInfo(EventsPageFragment::class.java) { override val name = "Events" @@ -109,13 +95,14 @@ sealed class PageInfo(val fragmentClass: Class<out PageFragment<*>>) { when (it.string("kind")) { "compose" -> ComposePageInfo(data) "tweets" -> TweetsPageInfo(data) - "messages" -> MessagesPageInfo(data) "events" -> EventsPageInfo(data) "search" -> SearchPageInfo(data) "list" -> ListPageInfo(data) + // FIXME: Remove this + "messages" -> null else -> throw RuntimeException("invalid kind") } - } + }.mapNotNull { it } // FIXME } fun stringifyList(input: List<PageInfo>): String { @@ -124,7 +111,6 @@ sealed class PageInfo(val fragmentClass: Class<out PageFragment<*>>) { val kind = when (it) { is ComposePageInfo -> "compose" is TweetsPageInfo -> "tweets" - is MessagesPageInfo -> "messages" is EventsPageInfo -> "events" is SearchPageInfo -> "search" is ListPageInfo -> "list" diff --git a/app/src/main/java/net/lacolaco/smileessence/entity/DirectMessage.kt b/app/src/main/java/net/lacolaco/smileessence/entity/DirectMessage.kt deleted file mode 100644 index 5e233e64..00000000 --- a/app/src/main/java/net/lacolaco/smileessence/entity/DirectMessage.kt +++ /dev/null @@ -1,40 +0,0 @@ -package net.lacolaco.smileessence.entity - -import java.util.* - -class DirectMessage private constructor(message: twitter4j.DirectMessage) : IdObject { - override val id = message.id - val sender = User.fromTwitter(message.sender) - val recipient = User.fromTwitter(message.recipient) - val entities = Entities.fromTwitter(message) - val text = entities.extractText(message, message.text) - val createdAt = message.createdAt!! - - companion object { - private val storage = HashMap<Long, DirectMessage>() - - @Synchronized - fun fetch(statusId: Long): DirectMessage? { - return storage[statusId] - } - - @Synchronized - fun fromTwitter(st: twitter4j.DirectMessage): DirectMessage { - var t: DirectMessage? = fetch(st.id) - if (t == null) { - t = DirectMessage(st) - storage.put(st.id, t) - } else { - // Update local cache - User.fromTwitter(st.sender) - User.fromTwitter(st.recipient) - } - return t - } - - @Synchronized - fun fromTwitter(sts: Iterable<twitter4j.DirectMessage>): List<DirectMessage> { - return sts.map { fromTwitter(it) } - } - } -} diff --git a/app/src/main/java/net/lacolaco/smileessence/entity/Entities.kt b/app/src/main/java/net/lacolaco/smileessence/entity/Entities.kt index 0a3579b3..33fc0130 100644 --- a/app/src/main/java/net/lacolaco/smileessence/entity/Entities.kt +++ b/app/src/main/java/net/lacolaco/smileessence/entity/Entities.kt @@ -1,15 +1,16 @@ package net.lacolaco.smileessence.entity -import twitter4j.* - +import twitter4j.HashtagEntity +import twitter4j.MediaEntity +import twitter4j.URLEntity +import twitter4j.UserMentionEntity import java.util.* class Entities private constructor( val mentions: List<String>, val hashtags: List<String>, val mediaUrls: List<String>, - val urlsExpanded: List<String>, - val symbols: List<String> + val urlsExpanded: List<String> ) { fun extractText(status: twitter4j.EntitySupport, text: String): String { val set = TreeSet<twitter4j.URLEntity> { a, b -> a.start - b.start } @@ -28,16 +29,12 @@ class Entities private constructor( mentions = extractMentions(es.userMentionEntities), hashtags = extractHashtags(es.hashtagEntities), mediaUrls = extractMediaUrls(es.mediaEntities), - urlsExpanded = extractExpandedUrls(es.urlEntities), - symbols = extractSymbols(es.symbolEntities) + urlsExpanded = extractExpandedUrls(es.urlEntities) ) private fun extractMentions(entities: Array<UserMentionEntity>?) = entities?.map { it.screenName } ?: listOf() - private fun extractSymbols(entities: Array<SymbolEntity>?) = - entities?.map { it.text } ?: listOf() - private fun extractExpandedUrls(entities: Array<URLEntity>?) = entities?.map { it.expandedURL } ?: listOf() @@ -52,6 +49,6 @@ class Entities private constructor( private fun extractHashtags(entities: Array<HashtagEntity>?) = entities?.map { it.text } ?: listOf() - val placeHolder = Entities(listOf(), listOf(), listOf(), listOf(), listOf()) + val placeHolder = Entities(listOf(), listOf(), listOf(), listOf()) } } diff --git a/app/src/main/java/net/lacolaco/smileessence/entity/Event.kt b/app/src/main/java/net/lacolaco/smileessence/entity/Event.kt index a4eea800..69b51f21 100644 --- a/app/src/main/java/net/lacolaco/smileessence/entity/Event.kt +++ b/app/src/main/java/net/lacolaco/smileessence/entity/Event.kt @@ -17,7 +17,6 @@ class Event constructor(val event: EnumEvent, val source: User, val targetObject FOLLOWED("Followed by %s"), BLOCKED("Blocked by %s"), UNBLOCKED("Unblocked by %s"), - RECEIVE_MESSAGE("Received a direct message from %s") } companion object { diff --git a/app/src/main/java/net/lacolaco/smileessence/entity/IdObject.kt b/app/src/main/java/net/lacolaco/smileessence/entity/IdObject.kt index 02d0cc90..35e76213 100644 --- a/app/src/main/java/net/lacolaco/smileessence/entity/IdObject.kt +++ b/app/src/main/java/net/lacolaco/smileessence/entity/IdObject.kt @@ -1,7 +1,5 @@ package net.lacolaco.smileessence.entity -import java.util.* - interface IdObject { val id: Long /* diff --git a/app/src/main/java/net/lacolaco/smileessence/entity/Tweet.kt b/app/src/main/java/net/lacolaco/smileessence/entity/Tweet.kt index eddaeb7c..373d37dd 100644 --- a/app/src/main/java/net/lacolaco/smileessence/entity/Tweet.kt +++ b/app/src/main/java/net/lacolaco/smileessence/entity/Tweet.kt @@ -1,8 +1,7 @@ package net.lacolaco.smileessence.entity import android.net.Uri -import twitter4j.* - +import twitter4j.Status import java.util.* class Tweet private constructor( diff --git a/app/src/main/java/net/lacolaco/smileessence/twitter/UserStreamListener.kt b/app/src/main/java/net/lacolaco/smileessence/twitter/UserStreamListener.kt index f40c1ebf..7a59f945 100644 --- a/app/src/main/java/net/lacolaco/smileessence/twitter/UserStreamListener.kt +++ b/app/src/main/java/net/lacolaco/smileessence/twitter/UserStreamListener.kt @@ -3,7 +3,6 @@ package net.lacolaco.smileessence.twitter import net.lacolaco.smileessence.Logger import net.lacolaco.smileessence.R import net.lacolaco.smileessence.World -import net.lacolaco.smileessence.entity.DirectMessage import net.lacolaco.smileessence.entity.Event import net.lacolaco.smileessence.entity.Tweet import net.lacolaco.smileessence.entity.User @@ -61,11 +60,7 @@ class UserStreamListener(private val world: World) : twitter4j.UserStreamListene // --------------------- Interface UserStreamListener --------------------- - override fun onDeletionNotice(directMessageId: Long, userId: Long) { - // FIXME - // StatusFilter.getInstance().remove(MessageViewModel.class, directMessageId); - // DirectMessage.remove(directMessageId); - } + override fun onDeletionNotice(directMessageId: Long, userId: Long) {} override fun onFriendList(friendIds: LongArray) {} @@ -93,13 +88,7 @@ class UserStreamListener(private val world: World) : twitter4j.UserStreamListene override fun onUnfollow(source: twitter4j.User, unfollowedUser: twitter4j.User) {} - override fun onDirectMessage(directMessage: twitter4j.DirectMessage) { - val message = DirectMessage.fromTwitter(directMessage) - world.addDirectMessage(message) - if (message.recipient === world.user) { - addToHistory(Event(Event.EnumEvent.RECEIVE_MESSAGE, message.sender)) - } - } + override fun onDirectMessage(directMessage: twitter4j.DirectMessage) {} override fun onUserListMemberAddition(addedMember: twitter4j.User, listOwner: twitter4j.User, list: twitter4j.UserList) {} diff --git a/app/src/main/java/net/lacolaco/smileessence/twitter/task/Messages.kt b/app/src/main/java/net/lacolaco/smileessence/twitter/task/Messages.kt deleted file mode 100644 index bdf782a0..00000000 --- a/app/src/main/java/net/lacolaco/smileessence/twitter/task/Messages.kt +++ /dev/null @@ -1,30 +0,0 @@ -package net.lacolaco.smileessence.twitter.task - -import net.lacolaco.smileessence.World -import net.lacolaco.smileessence.entity.DirectMessage -import net.lacolaco.smileessence.twitter.TwitterTaskException -import net.lacolaco.smileessence.util.bg - -fun World.createMessageAsync(recipient: Long, text: String) = bg { - DirectMessage.fromTwitter(TwitterTaskException.wrap { - twitter.directMessages().sendDirectMessage(recipient, text) - }) -} - -fun World.destroyMessageAsync(id: Long) = bg { - DirectMessage.fromTwitter(TwitterTaskException.wrap { - twitter.directMessages().destroyDirectMessage(id) - }) -} - -fun World.getReceivedMessagesAsync(sinceId: Long? = null, maxId: Long? = null) = bg { - DirectMessage.fromTwitter(TwitterTaskException.wrap { - twitter.directMessages().getDirectMessages(makePaging(sinceId, maxId)) - }) -} - -fun World.getSentMessagesAsync(sinceId: Long? = null, maxId: Long? = null) = bg { - DirectMessage.fromTwitter(TwitterTaskException.wrap { - twitter.directMessages().getSentDirectMessages(makePaging(sinceId, maxId)) - }) -} diff --git a/app/src/main/java/net/lacolaco/smileessence/view/Partials.kt b/app/src/main/java/net/lacolaco/smileessence/view/Partials.kt index c24eb5cd..3a42af8c 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/Partials.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/Partials.kt @@ -8,14 +8,12 @@ import com.bumptech.glide.Glide import kotlinx.android.synthetic.main.item_status_base.view.* import net.lacolaco.smileessence.R import net.lacolaco.smileessence.World -import net.lacolaco.smileessence.entity.DirectMessage import net.lacolaco.smileessence.entity.Tweet import net.lacolaco.smileessence.entity.User import net.lacolaco.smileessence.twitter.task.getTweetAsync import net.lacolaco.smileessence.util.launchBg import net.lacolaco.smileessence.util.toCompactString import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter -import net.lacolaco.smileessence.view.dialog.MessageDetailDialogFragment import net.lacolaco.smileessence.view.dialog.StatusDetailDialogFragment import net.lacolaco.smileessence.view.dialog.UserDetailDialogFragment @@ -86,7 +84,6 @@ object Partials { (view as TweetStateFrameLayout).isMention = tweet.entities.mentions.contains(world.user.screenName) view.isRetweet = tweet.isRetweet - view.isDirectMessage = false view.isMine = tweet.originalTweet.user == world.user } @@ -110,32 +107,4 @@ object Partials { view.imageview_status_favorited.visibility = View.INVISIBLE } } - - fun getDirectMessageView(directMessage: DirectMessage, world: World, activity: Activity, convertView: View?): View { - val view = convertView ?: activity.layoutInflater.inflate(R.layout.list_item_status, null) - - view.setOnClickListener { - DialogHelper.showDialog(activity, MessageDetailDialogFragment.newInstance(directMessage)) - } - - view.imageview_status_favorited.visibility = View.GONE - view.tweet_favorite_count.visibility = View.GONE - view.imageview_status_retweeted.visibility = View.GONE - view.tweet_retweet_count.visibility = View.GONE - view.listview_status_embedded_status.visibility = View.GONE - //view.textview_status_header.setTextColor(getStyledColor(activity, world, R.attr.color_message_text_header)) - (view as TweetStateFrameLayout).isDirectMessage = true - view.isMine = directMessage.sender == world.user - - updateViewUser(directMessage.sender, activity, view) - - view.textview_status_text.text = directMessage.text - var footerText = directMessage.createdAt.toCompactString() - if (directMessage.sender == world.user) { - footerText += " to @${directMessage.recipient.screenName}" - } - view.textview_status_footer.text = footerText - - return view - } } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/TweetStateFrameLayout.kt b/app/src/main/java/net/lacolaco/smileessence/view/TweetStateFrameLayout.kt index 5a971a74..0e4f602e 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/TweetStateFrameLayout.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/TweetStateFrameLayout.kt @@ -16,13 +16,6 @@ class TweetStateFrameLayout : FrameLayout { constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : super(context, attrs, defStyleAttr) - var isDirectMessage = false - set(value) { - val current = field - field = value - if (current != value) - refreshDrawableState() - } var isMention = false set(value) { val current = field @@ -47,8 +40,6 @@ class TweetStateFrameLayout : FrameLayout { override fun onCreateDrawableState(extraSpace: Int): IntArray { val add = mutableListOf<Int>() - if (isDirectMessage) - add += R.attr.state_tweet_direct_message if (isRetweet) add += R.attr.state_tweet_retweet if (isMention) diff --git a/app/src/main/java/net/lacolaco/smileessence/view/adapter/MessageListAdapter.kt b/app/src/main/java/net/lacolaco/smileessence/view/adapter/MessageListAdapter.kt deleted file mode 100644 index 8f9c86e3..00000000 --- a/app/src/main/java/net/lacolaco/smileessence/view/adapter/MessageListAdapter.kt +++ /dev/null @@ -1,15 +0,0 @@ -package net.lacolaco.smileessence.view.adapter - -import android.app.Activity -import android.view.View -import android.view.ViewGroup -import net.lacolaco.smileessence.World -import net.lacolaco.smileessence.entity.DirectMessage -import net.lacolaco.smileessence.view.Partials - -class MessageListAdapter(private val activity: Activity, private val world: World) : - OrderedCustomListAdapter<DirectMessage>() { - override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { - return Partials.getDirectMessageView(getItem(position), world, activity, convertView) - } -} diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/MessageDetailDialogFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/dialog/MessageDetailDialogFragment.kt deleted file mode 100644 index 233b0850..00000000 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/MessageDetailDialogFragment.kt +++ /dev/null @@ -1,138 +0,0 @@ -package net.lacolaco.smileessence.view.dialog - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import kotlinx.android.synthetic.main.dialog_status_detail.view.* -import net.lacolaco.smileessence.R -import net.lacolaco.smileessence.activity.MainActivity -import net.lacolaco.smileessence.entity.DirectMessage -import net.lacolaco.smileessence.twitter.TwitterTaskException -import net.lacolaco.smileessence.twitter.task.destroyMessageAsync -import net.lacolaco.smileessence.twitter.task.getUserAsync -import net.lacolaco.smileessence.util.* -import net.lacolaco.smileessence.view.DialogHelper -import net.lacolaco.smileessence.view.Partials -import net.lacolaco.smileessence.view.PopupMenu -import net.lacolaco.smileessence.view.adapter.MessageListAdapter -import net.lacolaco.smileessence.view.confirm - -class MessageDetailDialogFragment : StackableDialogFragment() { - private lateinit var message: DirectMessage - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - val found = DirectMessage.fetch(arguments.getLong(KEY_MESSAGE_ID)) - if (found == null) { - world.notifyError(R.string.notice_error_get_messages) - dismiss() - return - } - message = found - } - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { - val view = inflater.inflate(R.layout.dialog_status_detail, container, false) - - val messageHeader = Partials.getDirectMessageView(message, world, activity, view.detail_current_status) - messageHeader.isClickable = false - - //--- buttons - view.button_status_detail_reply.setOnClickListener { - DialogHelper.showDialog(activity, SendMessageDialogFragment.newInstance(message.sender)) - } - view.button_status_detail_delete.setOnClickListener { - confirm(R.string.dialog_confirm_commands) { - launchBg { - try { - world.destroyMessageAsync(message.id).await() - world.notify(R.string.notice_message_delete_succeeded) - } catch (e: TwitterTaskException) { - world.notifyError(R.string.notice_message_delete_failed) - } - } - dismiss() - } - } - // -- menu dialog - view.button_status_detail_menu.setOnClickListener { - val popup = PopupMenu(activity, view.button_status_detail_menu) - popup.add(R.string.command_status_copy_text_to_clipboard) { - SystemServiceHelper.copyToClipboard(activity, "message text", message.text) - world.notify(R.string.notice_copy_clipboard) - } - popup.show() - } - - // -- menu embedded in dialog - val users = mutableListOf<String>() - if (message.sender !== message.recipient) - users += message.recipient.screenName - users += message.entities.mentions - for (screenName in users.distinct()) - view.embedded_menu_items.add("@$screenName") { - val ref = ref(activity as MainActivity) - launchUi { - try { - val user = world.getUserAsync(screenName).await() - DialogHelper.showDialog(ref.get(), UserDetailDialogFragment.newInstance(user)) - } catch (e: TwitterTaskException) { - world.notifyError(R.string.notice_error_show_user) - } - } - } - for (hashtag in message.entities.hashtags) - view.embedded_menu_items.add("#$hashtag") { - // XXX - (activity as MainActivity).openPostPageAndAppendText(" #$hashtag") - } - for (url in message.entities.urlsExpanded + message.entities.mediaUrls) - view.embedded_menu_items.add(url) { - activity.browse(url) - } - if (view.embedded_menu_items.childCount == 0) { - view.detail_dialog_divider_bottom.visibility = View.GONE - view.embedded_menu_items.visibility = View.GONE - } - view.detail_dialog_divider_top.visibility = View.GONE - view.button_status_detail_retweet.visibility = View.GONE - view.button_status_detail_favorite.visibility = View.GONE - - val adapter = MessageListAdapter(activity, world) - view.listview_status_detail_reply_to.adapter = adapter - - // TODO: 効率的な探索どうする - val replyTo: DirectMessage? = null - // FIXME - // for (DirectMessage mes : DirectMessage.cached()) { - // if (message.getId() > mes.getId() && - // message.getRecipient() == mes.getSender() && - // message.getSender() == mes.getRecipient() && - // (replyTo == null || replyTo.getId() < mes.getId())) { - // replyTo = mes; - // } - // } - if (replyTo != null) { - view.listview_status_detail_reply_to.visibility = View.VISIBLE - adapter.add(replyTo) - adapter.updateForce() - } else { - view.listview_status_detail_reply_to.visibility = View.GONE - } - - return view - } - - companion object { - private val KEY_MESSAGE_ID = "message_id" - - fun newInstance(message: DirectMessage): MessageDetailDialogFragment { - val obj = MessageDetailDialogFragment() - val args = Bundle() - args.putLong(KEY_MESSAGE_ID, message.id) - obj.arguments = args - return obj - } - } -} diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/SendMessageDialogFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/dialog/SendMessageDialogFragment.kt deleted file mode 100644 index 8a8eda3b..00000000 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/SendMessageDialogFragment.kt +++ /dev/null @@ -1,100 +0,0 @@ -package net.lacolaco.smileessence.view.dialog - -import android.os.Bundle -import android.support.v4.content.ContextCompat -import android.text.Editable -import android.text.TextWatcher -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.twitter.Validator -import kotlinx.android.synthetic.main.dialog_send_message.view.* -import net.lacolaco.smileessence.R -import net.lacolaco.smileessence.entity.User -import net.lacolaco.smileessence.twitter.TwitterTaskException -import net.lacolaco.smileessence.twitter.task.createMessageAsync -import net.lacolaco.smileessence.util.SystemServiceHelper -import net.lacolaco.smileessence.util.launchUi - -class SendMessageDialogFragment : StackableDialogFragment(), TextWatcher, View.OnClickListener { - private lateinit var recipient: User - - override fun onClick(v: View) { - val id = v.id - when (id) { - R.id.button_send_message -> { - sendMessage() - } - R.id.button_send_message_delete -> { - view.edittext_send_message.setText("") - } - } - } - - override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { - - } - - override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { - val validator = Validator() - val remainingCount = 140 - validator.getTweetLength(s.toString()) - view.textview_send_message_count.text = remainingCount.toString() - if (remainingCount == 140 || remainingCount < 0) { - view.textview_send_message_count.setTextColor(ContextCompat.getColor(activity, R.color.red)) - } else { - view.textview_send_message_count.setTextAppearance(activity, android.R.style.TextAppearance_Widget_TextView) - } - } - - override fun afterTextChanged(s: Editable) { - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - val found = User.fetch(arguments.getLong(KEY_RECIPIENT_ID)) - if (found == null) { - world.notifyError(R.string.notice_error_show_user) - dismiss() - return - } - recipient = found - } - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { - val view = inflater.inflate(R.layout.dialog_send_message, container, false) - view.textview_send_message_name.text = "To: @" + recipient.screenName - view.edittext_send_message.setText("") - view.edittext_send_message.addTextChangedListener(this) - view.button_send_message.setOnClickListener(this) - view.button_send_message_delete.setOnClickListener(this) - return view - } - - private fun sendMessage() { - SystemServiceHelper.hideIM(activity, view.edittext_send_message) - val text = view.edittext_send_message.text.toString() - - launchUi { - try { - val message = world.createMessageAsync(recipient.id, text).await() - world.addDirectMessage(message) - world.notify(R.string.notice_message_send_succeeded) - dismiss() - } catch (e: TwitterTaskException) { - world.notifyError(R.string.notice_message_send_failed, e) - } - } - } - - companion object { - private val KEY_RECIPIENT_ID = "KEY_RECIPIENT_ID" - - fun newInstance(recipient: User): SendMessageDialogFragment { - val obj = SendMessageDialogFragment() - val args = Bundle() - args.putLong(KEY_RECIPIENT_ID, recipient.id) - obj.arguments = args - return obj - } - } -} diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.kt index 9e589176..ea2fa461 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/StatusDetailDialogFragment.kt @@ -74,10 +74,9 @@ class StatusDetailDialogFragment : StackableDialogFragment() { val builder = StringBuilder() builder.append("@${originalTweet.user.screenName} ") - for (screenName in originalTweet.entities.mentions) { - if (screenName != world.user.screenName) - builder.append("@$screenName ") - } + originalTweet.entities.mentions + .filter { it != world.user.screenName } + .forEach { builder.append("@$it ") } val text = builder.toString() val selStart = originalTweet.user.screenName.length + 2 // "@" and " " diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/UserDetailDialogFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/dialog/UserDetailDialogFragment.kt index 275f4a9c..8ca91d5c 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/UserDetailDialogFragment.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/UserDetailDialogFragment.kt @@ -18,7 +18,6 @@ import net.lacolaco.smileessence.twitter.TwitterTaskException import net.lacolaco.smileessence.twitter.task.* import net.lacolaco.smileessence.util.browse import net.lacolaco.smileessence.util.launchUi -import net.lacolaco.smileessence.view.DialogHelper import net.lacolaco.smileessence.view.PopupMenu import net.lacolaco.smileessence.view.adapter.TimelineAdapter import net.lacolaco.smileessence.view.confirm @@ -33,9 +32,6 @@ class UserDetailDialogFragment : StackableDialogFragment() { (activity as MainActivity).openPostPageAndReplyTo(user) world.notify(R.string.notice_add_to_reply) } - popup.add(R.string.command_user_send_message) { - DialogHelper.showDialog(activity, SendMessageDialogFragment.newInstance(user)) - } popup.add(R.string.command_user_block) { confirm(R.string.dialog_confirm_commands) { launchUi { diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/MessagesPageFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/page/MessagesPageFragment.kt deleted file mode 100644 index 7ca61030..00000000 --- a/app/src/main/java/net/lacolaco/smileessence/view/page/MessagesPageFragment.kt +++ /dev/null @@ -1,70 +0,0 @@ -package net.lacolaco.smileessence.view.page - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import com.omadahealth.github.swipyrefreshlayout.library.SwipyRefreshLayout -import kotlinx.coroutines.experimental.Deferred -import net.lacolaco.smileessence.R -import net.lacolaco.smileessence.data.PageInfo -import net.lacolaco.smileessence.entity.DirectMessage -import net.lacolaco.smileessence.twitter.TwitterTaskException -import net.lacolaco.smileessence.twitter.task.getReceivedMessagesAsync -import net.lacolaco.smileessence.twitter.task.getSentMessagesAsync -import net.lacolaco.smileessence.util.launchUi -import net.lacolaco.smileessence.view.Partials - -// TODO: Needs rework -class MessagesPageFragment : RefreshableTimelinePageFragment<DirectMessage, PageInfo.MessagesPageInfo>() { - override fun refresh() { - runRefreshTask(world.getReceivedMessagesAsync()) {} - runRefreshTask(world.getSentMessagesAsync()) {} - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - world.addDirectMessageTimeline(this) { message -> - adapter.sortedList.add(message) - } - refresh() - } - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedInstanceState: Bundle?): View { - return inflater.inflate(R.layout.page_fragment_refreshable_timeline, container, false) - } - - override fun onSwipeDown(view: SwipyRefreshLayout) { - val sinceId = if (adapter.sortedList.size > 0) adapter.sortedList[0].id else null - runRefreshTask(world.getReceivedMessagesAsync(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(world.getReceivedMessagesAsync(maxId = maxId)) { - view.isRefreshing = false - } - } - - override fun onBindItemView(item: DirectMessage, itemView: View) { - Partials.getDirectMessageView(item, world, activity, itemView) - } - - override fun onCreateItemView(parent: ViewGroup): View { - val layoutInflater = LayoutInflater.from(parent.context) - return layoutInflater.inflate(R.layout.list_item_status, parent, false) - } - - private fun runRefreshTask(task: Deferred<List<DirectMessage>>, onFinish: () -> Unit) = launchUi { - try { - val messages = task.await() - world.addDirectMessage(messages) - } catch (e: TwitterTaskException) { - world.notifyError(R.string.notice_error_get_messages) - } - onFinish() - } -} diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/TimelinePageFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/page/TimelinePageFragment.kt index 6daa1ac0..bb0026f6 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/page/TimelinePageFragment.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/page/TimelinePageFragment.kt @@ -61,8 +61,7 @@ abstract class TimelinePageFragment<T : IdObject, out PI : PageInfo> : PageFragm ) override fun onBindViewHolder(holder: ViewHolder, position: Int) { - @Suppress("UNCHECKED_CAST") - onBindItemView(sortedList[position] as T, holder.itemView) + onBindItemView(sortedList[position], holder.itemView) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { diff --git a/app/src/main/res/color/status_item_header.xml b/app/src/main/res/color/status_item_header.xml index e33ab6af..d0293fc8 100644 --- a/app/src/main/res/color/status_item_header.xml +++ b/app/src/main/res/color/status_item_header.xml @@ -1,5 +1,4 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:color="@color/md_amber_700" app:state_tweet_mine="true" /> - <item android:color="@color/md_orange_700" app:state_tweet_direct_message="true" /> <item android:color="@color/md_green_700" /> </selector> diff --git a/app/src/main/res/color/status_item_header_light.xml b/app/src/main/res/color/status_item_header_light.xml index 89cf4e7b..67cc570b 100644 --- a/app/src/main/res/color/status_item_header_light.xml +++ b/app/src/main/res/color/status_item_header_light.xml @@ -1,6 +1,5 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <!-- XXX --> <item android:color="@color/dark_blue" app:state_tweet_mine="true" /> - <item android:color="@color/orange" app:state_tweet_direct_message="true" /> <item android:color="@color/md_green_800" /> </selector> diff --git a/app/src/main/res/drawable/button_round_blue.xml b/app/src/main/res/drawable/button_round_blue.xml deleted file mode 100644 index 7776d8b8..00000000 --- a/app/src/main/res/drawable/button_round_blue.xml +++ /dev/null @@ -1,7 +0,0 @@ -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle"> - <stroke - android:width="1dp" - android:color="@android:color/holo_blue_dark" /> - <solid android:color="@color/gray_dark_dark" /> -</shape> diff --git a/app/src/main/res/drawable/button_round_blue_light.xml b/app/src/main/res/drawable/button_round_blue_light.xml deleted file mode 100644 index 29c1fb76..00000000 --- a/app/src/main/res/drawable/button_round_blue_light.xml +++ /dev/null @@ -1,7 +0,0 @@ -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle"> - <stroke - android:width="1dp" - android:color="@color/white" /> - <solid android:color="@android:color/holo_blue_dark" /> -</shape> diff --git a/app/src/main/res/drawable/button_round_orange.xml b/app/src/main/res/drawable/button_round_orange.xml deleted file mode 100644 index 59164de4..00000000 --- a/app/src/main/res/drawable/button_round_orange.xml +++ /dev/null @@ -1,7 +0,0 @@ -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle"> - <stroke - android:width="1dp" - android:color="@color/orange" /> - <solid android:color="@color/gray_dark_dark" /> -</shape> diff --git a/app/src/main/res/drawable/button_round_orange_light.xml b/app/src/main/res/drawable/button_round_orange_light.xml deleted file mode 100644 index e0f51bae..00000000 --- a/app/src/main/res/drawable/button_round_orange_light.xml +++ /dev/null @@ -1,7 +0,0 @@ -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle"> - <stroke - android:width="1dp" - android:color="@color/white" /> - <solid android:color="@color/orange_light" /> -</shape> diff --git a/app/src/main/res/drawable/button_round_red.xml b/app/src/main/res/drawable/button_round_red.xml deleted file mode 100644 index 34070912..00000000 --- a/app/src/main/res/drawable/button_round_red.xml +++ /dev/null @@ -1,7 +0,0 @@ -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle"> - <stroke - android:width="1dp" - android:color="@android:color/holo_red_dark" /> - <solid android:color="@color/gray_dark_dark" /> -</shape> diff --git a/app/src/main/res/drawable/button_round_red_light.xml b/app/src/main/res/drawable/button_round_red_light.xml deleted file mode 100644 index 3647c6d0..00000000 --- a/app/src/main/res/drawable/button_round_red_light.xml +++ /dev/null @@ -1,7 +0,0 @@ -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle"> - <stroke - android:width="1dp" - android:color="@color/white" /> - <solid android:color="@android:color/holo_red_dark" /> -</shape> diff --git a/app/src/main/res/drawable/tweet_background.xml b/app/src/main/res/drawable/tweet_background.xml index 4fb995ae..f6e5f7a7 100644 --- a/app/src/main/res/drawable/tweet_background.xml +++ b/app/src/main/res/drawable/tweet_background.xml @@ -1,5 +1,4 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - <item android:drawable="@color/md_blue_grey_900" app:state_tweet_direct_message="true" /> <item android:drawable="@color/md_brown_850" app:state_tweet_mention="true" /> <item android:drawable="@color/md_grey_850" app:state_tweet_retweet="true" /> <item android:drawable="@color/md_grey_900" /> diff --git a/app/src/main/res/drawable/tweet_background_light.xml b/app/src/main/res/drawable/tweet_background_light.xml index e20398a1..6ecbbc2f 100644 --- a/app/src/main/res/drawable/tweet_background_light.xml +++ b/app/src/main/res/drawable/tweet_background_light.xml @@ -1,5 +1,4 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - <item android:drawable="@color/orange_light" app:state_tweet_direct_message="true" /> <item android:drawable="@color/light_red" app:state_tweet_mention="true" /> <item android:drawable="@color/light_blue" app:state_tweet_retweet="true" /> <item android:drawable="@color/md_white_1000" /> diff --git a/app/src/main/res/layout/dialog_send_message.xml b/app/src/main/res/layout/dialog_send_message.xml deleted file mode 100644 index 032154ca..00000000 --- a/app/src/main/res/layout/dialog_send_message.xml +++ /dev/null @@ -1,76 +0,0 @@ -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:padding="15dp"> - - <TextView - android:id="@+id/textview_send_message_name" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:padding="5dp" - android:textAppearance="@android:style/TextAppearance.DeviceDefault" /> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="1px" - android:background="?attr/app_divider" /> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="10dp" - android:layout_marginTop="10dp" - android:baselineAligned="false" - android:orientation="horizontal"> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_weight="1"> - - <EditText - android:id="@+id/edittext_send_message" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="top" - android:inputType="text|textMultiLine" - android:minHeight="60dp"> - - <requestFocus /> - </EditText> - </FrameLayout> - - <RelativeLayout - android:layout_width="70dp" - android:layout_height="match_parent" - android:layout_weight="1"> - - <ImageButton - android:id="@+id/button_send_message_delete" - android:layout_width="match_parent" - android:layout_height="30dp" - android:layout_alignParentTop="true" - android:background="?selectableItemBackgroundBorderless" - android:scaleType="fitCenter" - android:src="@drawable/ic_clear_black_24dp" - android:tint="?color_nonactivatable" /> - - <TextView - android:id="@+id/textview_send_message_count" - android:layout_width="match_parent" - android:layout_height="30dp" - android:layout_alignParentBottom="true" - android:freezesText="true" - android:gravity="center_horizontal|center_vertical" - android:textAppearance="@android:style/TextAppearance.Widget.TextView" /> - </RelativeLayout> - </LinearLayout> - - <Button - android:id="@+id/button_send_message" - android:layout_width="match_parent" - android:layout_height="40dp" - android:gravity="center" - android:text="@string/post_button_send_message" /> -</LinearLayout> diff --git a/app/src/main/res/layout/item_status_base.xml b/app/src/main/res/layout/item_status_base.xml index c3f2ab2c..bc52dbcd 100644 --- a/app/src/main/res/layout/item_status_base.xml +++ b/app/src/main/res/layout/item_status_base.xml @@ -22,10 +22,10 @@ android:id="@+id/source_user_protected" android:layout_width="16dp" android:layout_height="16dp" + android:alpha="0.7" android:contentDescription="@null" android:src="@drawable/ic_lock_black_24dp" android:tint="@color/md_grey_900" - android:alpha="0.7" app:layout_constraintBottom_toBottomOf="@+id/imageview_status_icon" app:layout_constraintEnd_toEndOf="@+id/imageview_status_icon" /> diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index c730d570..412b9b43 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -8,7 +8,6 @@ <attr name="color_green_activatable" format="reference" /> <declare-styleable name="TweetStateFrameLayout"> - <attr name="state_tweet_direct_message" format="boolean" /> <attr name="state_tweet_mention" format="boolean" /> <attr name="state_tweet_retweet" format="boolean" /> <attr name="state_tweet_mine" format="boolean" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 799d2246..8c4a618b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,29 +6,16 @@ <string name="message_oauth_text">Please get PIN code at a URL below, and input it.</string> <string name="message_oauth_hint">PIN code</string> <string name="message_oauth_authenticate">Authenticate</string> - <string name="theme_dark">Dark</string> - <string name="theme_light">Light</string> - <string name="page_name_post">Post</string> - <string name="page_name_home">Home</string> - <string name="page_name_mentions">Mentions</string> - <string name="page_name_messages">Messages</string> - <string name="page_name_history">History</string> - <string name="page_name_search">Search</string> - <string name="page_name_list">List</string> - <string name="actionbar_aclog">Aclog</string> <string name="error_intent_status_cannot_load">Failed to get tweet</string> <string name="alert_dialog_ok">OK</string> <string name="alert_dialog_cancel">Cancel</string> <string name="post_button_tweet">Tweet</string> - <string name="post_button_send_message">Send Message</string> <string name="user_detail_tweets">Tweets</string> <string name="user_detail_following">Following</string> <string name="user_detail_followers">Followers</string> <string name="user_detail_favorites">Favorites</string> <string name="user_detail_protected">Protected</string> - <string name="user_detail_follow">Follow</string> <string name="user_detail_followed_is_me">This is you</string> - <string name="user_detail_unfollow">Unfollow</string> <string name="user_detail_followed">Followed</string> <string name="user_detail_not_followed">Not Followed</string> <string name="user_detail_loading">Loading</string> @@ -57,41 +44,28 @@ <string name="notice_unblock_failed">Failed to unblock</string> <string name="notice_r4s_succeeded">Succeeded to report</string> <string name="notice_r4s_failed">Failed to report</string> - <string name="notice_message_delete_succeeded">Succeeded to delete message</string> - <string name="notice_message_delete_failed">Failed to delete message</string> - <string name="notice_message_send_succeeded">Succeeded to send the message</string> - <string name="notice_message_send_failed">Failed to send the message: %s</string> <string name="notice_stream_connect">Connect to stream</string> <string name="notice_stream_disconnect">Disconnect from stream</string> <string name="notice_unfavorite_succeeded">Succeeded to unfavorite</string> <string name="notice_unfavorite_failed">Failed to unfavorite</string> <string name="notice_select_image_succeeded">Succeed to select image</string> <string name="notice_select_image_failed">Failed to select image</string> - <string name="notice_search_text_empty">Query is empty</string> <string name="notice_add_to_reply">Added to reply</string> <string name="notice_copy_clipboard">Copied to clipboard</string> - <string name="notice_userlist_not_selected">No List is selected</string> <string name="notice_search_query_deleted">Query was deleted</string> - <string name="notice_query_is_empty">Query is empty</string> <string name="notice_query_saved">Query is saved</string> <string name="notice_error_show_user">Can\'t show this user</string> - <string name="notice_error_show_status">Can\'t show this status</string> <string name="notice_error_get_home">Failed to get home timeline</string> - <string name="notice_error_get_mentions">Failed to get mentions</string> - <string name="notice_error_get_messages">Failed to get direct messages</string> <string name="notice_error_authenticate">Failed to authenticate. Please try later again.</string> <string name="notice_error_authenticate_request">Failed to prepare for authentication. Please check internet access.</string> <string name="notice_error_search">Failed to search</string> <string name="command_user_add_to_reply">Add to reply</string> - <string name="command_user_open_aclog">Open aclog</string> <string name="command_user_block">Block</string> <string name="command_user_unblock">Unblock</string> <string name="command_user_r4s">Report for spam</string> - <string name="command_user_send_message">Send a direct message</string> <string name="command_status_copy_text_to_clipboard">Copy to clipboard</string> <string name="command_status_copy_url_to_clipboard">Copy permalink to clipboard</string> <string name="command_status_open_in_browser">Open in browser</string> - <string name="command_status_open_talk_view">Show this talk</string> <string name="command_status_add_to_reply">Add to reply</string> <string name="notice_error_get_user_timeline">Failed to get user timeline</string> <string name="notice_error_get_list">Failed to get list timeline</string> |