diff --git a/twidere/build.gradle b/twidere/build.gradle index d65441678..cc6776998 100644 --- a/twidere/build.gradle +++ b/twidere/build.gradle @@ -36,8 +36,8 @@ android { applicationId "org.mariotaku.twidere" minSdkVersion project.properties['overrideMinSdkVersion'] ?: 14 targetSdkVersion 25 - versionCode 319 - versionName '3.5.2' + versionCode 320 + versionName '3.5.3' multiDexEnabled true buildConfigField 'boolean', 'LEAK_CANARY_ENABLED', 'Boolean.parseBoolean("true")' diff --git a/twidere/src/main/kotlin/org/mariotaku/ktextension/BundleExtensions.kt b/twidere/src/main/kotlin/org/mariotaku/ktextension/BundleExtensions.kt index 7a78ced2a..ca9fe86b1 100644 --- a/twidere/src/main/kotlin/org/mariotaku/ktextension/BundleExtensions.kt +++ b/twidere/src/main/kotlin/org/mariotaku/ktextension/BundleExtensions.kt @@ -39,4 +39,8 @@ operator fun Bundle.set(key: String, value: Array?) { fun Bundle.getTypedArray(key: String, creator: Parcelable.Creator): Array { return getParcelableArray(key).toTypedArray(creator) +} + +fun Bundle.getNullableTypedArray(key: String, creator: Parcelable.Creator): Array? { + return getParcelableArray(key)?.toTypedArray(creator) } \ No newline at end of file diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/text/EditableExtensions.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/text/EditableExtensions.kt new file mode 100644 index 000000000..dfeca566c --- /dev/null +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/text/EditableExtensions.kt @@ -0,0 +1,29 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2017 Mariotaku Lee + * + * 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 . + */ + +package org.mariotaku.twidere.extension.text + +import android.text.Editable + +fun Editable.appendCompat(text: CharSequence, what: Any, flags: Int) { + val start = length + append(text) + val end = length + setSpan(what, start, end, flags) +} diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/text/SpannableStringBuilderExtensions.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/text/SpannableStringBuilderExtensions.kt new file mode 100644 index 000000000..9887aadf4 --- /dev/null +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/text/SpannableStringBuilderExtensions.kt @@ -0,0 +1,29 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2017 Mariotaku Lee + * + * 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 . + */ + +package org.mariotaku.twidere.extension.text + +import android.text.SpannableStringBuilder + +fun SpannableStringBuilder.appendCompat(text: CharSequence, what: Any, flags: Int) { + val start = length + append(text) + val end = length + setSpan(what, start, end, flags) +} diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt index cd25f7820..f4b2e7825 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/UserFragment.kt @@ -945,15 +945,17 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener, startActivity(intent) } R.id.send_direct_message -> { - val builder = Uri.Builder() - builder.scheme(SCHEME_TWIDERE) - builder.authority(AUTHORITY_MESSAGES) - builder.path(PATH_MESSAGES_CONVERSATION_NEW) - builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, user.account_key.toString()) - builder.appendQueryParameter(QUERY_PARAM_USER_KEY, user.key.toString()) + val am = AccountManager.get(activity) + val builder = Uri.Builder().apply { + scheme(SCHEME_TWIDERE) + authority(AUTHORITY_MESSAGES) + path(PATH_MESSAGES_CONVERSATION_NEW) + appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, user.account_key.toString()) + } val intent = Intent(Intent.ACTION_VIEW, builder.build()) - intent.putExtra(EXTRA_ACCOUNT, AccountUtils.getAccountDetails(AccountManager.get(activity), user.account_key, true)) - intent.putExtra(EXTRA_USER, user) + intent.putExtra(EXTRA_ACCOUNT, AccountUtils.getAccountDetails(am, user.account_key, + true)) + intent.putExtra(EXTRA_USERS, arrayOf(user)) startActivity(intent) } R.id.set_color -> { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/message/MessageNewConversationFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/message/MessageNewConversationFragment.kt index a8c79f873..5148b7292 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/message/MessageNewConversationFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/message/MessageNewConversationFragment.kt @@ -31,15 +31,14 @@ import android.support.v4.content.Loader import android.support.v7.widget.LinearLayoutManager import android.text.Editable import android.text.Spannable +import android.text.SpannableStringBuilder import android.text.TextUtils import android.text.style.ReplacementSpan import android.view.* import com.bumptech.glide.Glide import kotlinx.android.synthetic.main.fragment_messages_conversation_new.* import org.mariotaku.kpreferences.get -import org.mariotaku.ktextension.Bundle -import org.mariotaku.ktextension.set -import org.mariotaku.ktextension.setItemAvailability +import org.mariotaku.ktextension.* import org.mariotaku.library.objectcursor.ObjectCursor import org.mariotaku.sqliteqb.library.Expression import org.mariotaku.twidere.R @@ -47,6 +46,7 @@ import org.mariotaku.twidere.adapter.SelectableUsersAdapter import org.mariotaku.twidere.constant.IntentConstants.* import org.mariotaku.twidere.constant.nameFirstKey import org.mariotaku.twidere.extension.model.isOfficial +import org.mariotaku.twidere.extension.text.appendCompat import org.mariotaku.twidere.fragment.BaseFragment import org.mariotaku.twidere.loader.CacheUserSearchLoader import org.mariotaku.twidere.model.ParcelableMessageConversation @@ -71,11 +71,24 @@ class MessageNewConversationFragment : BaseFragment(), LoaderCallbacks + private var selectedRecipients: List get() { val text = editParticipants.editableText ?: return emptyList() return text.getSpans(0, text.length, ParticipantSpan::class.java).map(ParticipantSpan::user) } + set(value) { + val roundRadius = resources.getDimension(R.dimen.element_spacing_xsmall) + val spanPadding = resources.getDimension(R.dimen.element_spacing_xsmall) + val nameFirst = preferences[nameFirstKey] + editParticipants.text = SpannableStringBuilder().apply { + value.forEach { user -> + val displayName = userColorNameManager.getDisplayName(user, nameFirst) + val span = ParticipantSpan(user, displayName, roundRadius, spanPadding) + appendCompat(user.screen_name, span, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + append(" ") + } + } + } private var loaderInitialized: Boolean = false private var performSearchRequestRunnable: Runnable? = null @@ -141,7 +154,7 @@ class MessageNewConversationFragment : BaseFragment(), LoaderCallbacks val text: Editable = editParticipants.editableText ?: return@itemChecked false - val user = usersAdapter.getUser(pos) ?: return@itemChecked false + val user = usersAdapter.getUser(pos) if (checked) { text.getSpans(0, text.length, PendingQuerySpan::class.java).forEach { pending -> val start = text.getSpanStart(pending) @@ -152,10 +165,8 @@ class MessageNewConversationFragment : BaseFragment(), LoaderCallbacks if (user != span.user) { @@ -175,6 +186,14 @@ class MessageNewConversationFragment : BaseFragment(), LoaderCallbacks