1
0
mirror of https://github.com/TwidereProject/Twidere-Android synced 2025-02-09 00:08:41 +01:00

crash fixes

This commit is contained in:
Mariotaku Lee 2017-09-08 19:40:12 +08:00
parent 0b381c013e
commit e3978b91bf
No known key found for this signature in database
GPG Key ID: 15C10F89D7C33535
16 changed files with 214 additions and 299 deletions

View File

@ -49,6 +49,7 @@ public class ParcelableUser implements Parcelable, Comparable<ParcelableUser> {
@ParcelableThisPlease @ParcelableThisPlease
@JsonField(name = "account_id", typeConverter = UserKeyConverter.class) @JsonField(name = "account_id", typeConverter = UserKeyConverter.class)
@Nullable
public UserKey account_key; public UserKey account_key;
@ParcelableThisPlease @ParcelableThisPlease

View File

@ -959,13 +959,14 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
private fun handleMentionIntent(user: ParcelableUser?): Boolean { private fun handleMentionIntent(user: ParcelableUser?): Boolean {
if (user == null || user.key == null) return false if (user?.key == null) return false
val accountScreenName = DataStoreUtils.getAccountScreenName(this, user.account_key) val accountKey = user.account_key ?: return false
val accountScreenName = DataStoreUtils.getAccountScreenName(this, accountKey)
if (TextUtils.isEmpty(accountScreenName)) return false if (TextUtils.isEmpty(accountScreenName)) return false
editText.setText("@${user.acct} ") editText.setText("@${user.acct} ")
val selectionEnd = editText.length() val selectionEnd = editText.length()
editText.setSelection(selectionEnd) editText.setSelection(selectionEnd)
accountsAdapter.selectedAccountKeys = arrayOf(user.account_key) accountsAdapter.selectedAccountKeys = arrayOf(accountKey)
return true return true
} }

View File

@ -26,21 +26,16 @@ import org.mariotaku.twidere.R
import org.mariotaku.twidere.util.StatusCodeMessageUtils import org.mariotaku.twidere.util.StatusCodeMessageUtils
import java.security.cert.CertPathValidatorException import java.security.cert.CertPathValidatorException
/**
* Created by mariotaku on 2017/4/20.
*/
fun Throwable.getErrorMessage(context: Context): CharSequence = when (this) { fun Throwable.getErrorMessage(context: Context): CharSequence = when (this) {
is MicroBlogException -> getMicroBlogErrorMessage(context) is MicroBlogException -> getMicroBlogErrorMessage(context)
is CertPathValidatorException -> context.getString(R.string.message_toast_ssl_tls_error) is CertPathValidatorException -> context.getString(R.string.message_toast_ssl_tls_error)
else -> message ?: toString() else -> message ?: toString()
} }
private fun MicroBlogException.getMicroBlogErrorMessage(context: Context): String { private fun MicroBlogException.getMicroBlogErrorMessage(context: Context): String {
if (isRateLimitExceeded) { val rateLimitStatus = this.rateLimitStatus
val status = rateLimitStatus if (isRateLimitExceeded && rateLimitStatus != null) {
val secUntilReset = status.secondsUntilReset * 1000L val secUntilReset = rateLimitStatus.secondsUntilReset * 1000L
val nextResetTime = DateUtils.getRelativeTimeSpanString(System.currentTimeMillis() + secUntilReset) val nextResetTime = DateUtils.getRelativeTimeSpanString(System.currentTimeMillis() + secUntilReset)
return context.getString(R.string.error_message_rate_limit, nextResetTime.trim()) return context.getString(R.string.error_message_rate_limit, nextResetTime.trim())
} else if (isCausedByNetworkIssue) { } else if (isCausedByNetworkIssue) {
@ -50,12 +45,10 @@ private fun MicroBlogException.getMicroBlogErrorMessage(context: Context): Strin
} }
return context.getString(R.string.message_toast_network_error_with_message, msg) return context.getString(R.string.message_toast_network_error_with_message, msg)
} }
val msg = if (StatusCodeMessageUtils.containsTwitterError(errorCode)) { val msg = when {
StatusCodeMessageUtils.getTwitterErrorMessage(context, errorCode) StatusCodeMessageUtils.containsTwitterError(errorCode) -> StatusCodeMessageUtils.getTwitterErrorMessage(context, errorCode)
} else if (StatusCodeMessageUtils.containsHttpStatus(statusCode)) { StatusCodeMessageUtils.containsHttpStatus(statusCode) -> StatusCodeMessageUtils.getHttpStatusMessage(context, statusCode)
StatusCodeMessageUtils.getHttpStatusMessage(context, statusCode) else -> errorMessage
} else {
errorMessage
} }
return msg ?: message ?: javaClass.simpleName return msg ?: message ?: javaClass.simpleName
} }

View File

@ -31,7 +31,7 @@ import org.mariotaku.twidere.util.Utils
fun ParcelableUser.getBestProfileBanner(width: Int, height: Int = 0): String? { fun ParcelableUser.getBestProfileBanner(width: Int, height: Int = 0): String? {
return profile_banner_url?.let { return profile_banner_url?.let {
InternalTwitterContentUtils.getBestBannerUrl(it, width, height) InternalTwitterContentUtils.getBestBannerUrl(it, width, height)
} ?: if (USER_TYPE_FANFOU_COM == key.host) { } ?: if (USER_TYPE_FANFOU_COM == key?.host) {
profile_background_url profile_background_url
} else { } else {
null null
@ -60,11 +60,12 @@ fun ParcelableUser.applyTo(relationship: ParcelableRelationship) {
} }
} }
val ParcelableUser.relationship: ParcelableRelationship get() = ParcelableRelationship().also { val ParcelableUser.relationship: ParcelableRelationship
get() = ParcelableRelationship().also {
it.account_key = this.account_key it.account_key = this.account_key
it.user_key = this.key it.user_key = this.key
this.applyTo(it) this.applyTo(it)
} }
val ParcelableUser.host: String val ParcelableUser.host: String
get() { get() {
@ -77,18 +78,22 @@ val ParcelableUser.host: String
val ParcelableUser.isFanfouUser: Boolean val ParcelableUser.isFanfouUser: Boolean
get() = USER_TYPE_FANFOU_COM == key.host get() = USER_TYPE_FANFOU_COM == key.host
inline val ParcelableUser.originalProfileImage: String? get() { inline val ParcelableUser.originalProfileImage: String?
get() {
return extras?.profile_image_url_original?.takeIf(String::isNotEmpty) return extras?.profile_image_url_original?.takeIf(String::isNotEmpty)
?: Utils.getOriginalTwitterProfileImage(profile_image_url) ?: Utils.getOriginalTwitterProfileImage(profile_image_url)
} }
inline val ParcelableUser.urlPreferred: String? get() = url_expanded?.takeIf(String::isNotEmpty) ?: url inline val ParcelableUser.urlPreferred: String? get() = url_expanded?.takeIf(String::isNotEmpty) ?: url
inline val ParcelableUser.acct: String
inline val ParcelableUser.acct: String get() = if (account_key.host == key.host) { get() {
val key = this.key ?: return screen_name
return if (account_key?.host == key.host) {
screen_name screen_name
} else { } else {
"$screen_name@${key.host}" "$screen_name@${key.host}"
} }
}
inline val ParcelableUser.groups_count: Long get() = extras?.groups_count ?: -1 inline val ParcelableUser.groups_count: Long get() = extras?.groups_count ?: -1

View File

@ -40,7 +40,8 @@ class AddUserFilterDialogFragment : AbsUserMuteBlockDialogFragment() {
override fun performUserAction(user: ParcelableUser, filterEverywhere: Boolean) { override fun performUserAction(user: ParcelableUser, filterEverywhere: Boolean) {
DataStoreUtils.addToFilter(context, listOf(user), filterEverywhere) DataStoreUtils.addToFilter(context, listOf(user), filterEverywhere)
bus.post(FriendshipTaskEvent(FriendshipTaskEvent.Action.FILTER, user.account_key, user.key).apply { val accountKey = user.account_key ?: return
bus.post(FriendshipTaskEvent(FriendshipTaskEvent.Action.FILTER, accountKey, user.key).apply {
isFinished = true isFinished = true
isSucceeded = true isSucceeded = true
}) })

View File

@ -42,7 +42,8 @@ class CreateUserBlockDialogFragment : AbsUserMuteBlockDialogFragment() {
} }
override fun performUserAction(user: ParcelableUser, filterEverywhere: Boolean) { override fun performUserAction(user: ParcelableUser, filterEverywhere: Boolean) {
twitterWrapper.createBlockAsync(user.account_key, user.key, filterEverywhere) val accountKey = user.account_key ?: return
twitterWrapper.createBlockAsync(accountKey, user.key, filterEverywhere)
} }
companion object { companion object {

View File

@ -43,7 +43,8 @@ class CreateUserMuteDialogFragment : AbsUserMuteBlockDialogFragment() {
} }
override fun performUserAction(user: ParcelableUser, filterEverywhere: Boolean) { override fun performUserAction(user: ParcelableUser, filterEverywhere: Boolean) {
twitterWrapper.createMuteAsync(user.account_key, user.key, filterEverywhere) val accountKey = user.account_key ?: return
twitterWrapper.createMuteAsync(accountKey, user.key, filterEverywhere)
} }
companion object { companion object {

View File

@ -39,7 +39,8 @@ class DestroyFriendshipDialogFragment : BaseDialogFragment(), DialogInterface.On
override fun onClick(dialog: DialogInterface, which: Int) { override fun onClick(dialog: DialogInterface, which: Int) {
when (which) { when (which) {
DialogInterface.BUTTON_POSITIVE -> { DialogInterface.BUTTON_POSITIVE -> {
twitterWrapper.destroyFriendshipAsync(user.account_key, user.key) val accountKey = user.account_key ?: return
twitterWrapper.destroyFriendshipAsync(accountKey, user.key)
} }
else -> { else -> {
} }

View File

@ -209,24 +209,27 @@ abstract class ParcelableUsersFragment : AbsContentListRecyclerViewFragment<Parc
override fun onFollowClicked(holder: UserViewHolder, position: Int) { override fun onFollowClicked(holder: UserViewHolder, position: Int) {
val user = adapter.getUser(position) ?: return val user = adapter.getUser(position) ?: return
if (twitterWrapper.isUpdatingRelationship(user.account_key, user.key)) return val accountKey = user.account_key ?: return
if (twitterWrapper.isUpdatingRelationship(accountKey, user.key)) return
if (user.is_following) { if (user.is_following) {
DestroyFriendshipDialogFragment.show(fragmentManager, user) DestroyFriendshipDialogFragment.show(fragmentManager, user)
} else { } else {
twitterWrapper.createFriendshipAsync(user.account_key, user.key, user.screen_name) twitterWrapper.createFriendshipAsync(accountKey, user.key, user.screen_name)
} }
} }
override fun onUnblockClicked(holder: UserViewHolder, position: Int) { override fun onUnblockClicked(holder: UserViewHolder, position: Int) {
val user = adapter.getUser(position) ?: return val user = adapter.getUser(position) ?: return
if (twitterWrapper.isUpdatingRelationship(user.account_key, user.key)) return val accountKey = user.account_key ?: return
twitterWrapper.destroyBlockAsync(user.account_key, user.key) if (twitterWrapper.isUpdatingRelationship(accountKey, user.key)) return
twitterWrapper.destroyBlockAsync(accountKey, user.key)
} }
override fun onUnmuteClicked(holder: UserViewHolder, position: Int) { override fun onUnmuteClicked(holder: UserViewHolder, position: Int) {
val user = adapter.getUser(position) ?: return val user = adapter.getUser(position) ?: return
if (twitterWrapper.isUpdatingRelationship(user.account_key, user.key)) return val accountKey = user.account_key ?: return
twitterWrapper.destroyMuteAsync(user.account_key, user.key) if (twitterWrapper.isUpdatingRelationship(accountKey, user.key)) return
twitterWrapper.destroyMuteAsync(accountKey, user.key)
} }

View File

@ -43,7 +43,8 @@ class ReportUserSpamDialogFragment : AbsUserMuteBlockDialogFragment() {
} }
override fun performUserAction(user: ParcelableUser, filterEverywhere: Boolean) { override fun performUserAction(user: ParcelableUser, filterEverywhere: Boolean) {
twitterWrapper.reportSpamAsync(user.account_key, user.key) val accountKey = user.account_key ?: return
twitterWrapper.reportSpamAsync(accountKey, user.key)
} }
companion object { companion object {

View File

@ -410,7 +410,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
val activity = activity ?: return val activity = activity ?: return
this.user = user this.user = user
this.account = account this.account = account
if (user == null || user.key == null) { if (user?.key == null) {
profileImage.visibility = View.GONE profileImage.visibility = View.GONE
profileType.visibility = View.GONE profileType.visibility = View.GONE
val theme = Chameleon.getOverrideTheme(activity, activity) val theme = Chameleon.getOverrideTheme(activity, activity)
@ -612,36 +612,34 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
val user = user val user = user ?: return
val accountKey = user.account_key ?: return
when (requestCode) { when (requestCode) {
REQUEST_SET_COLOR -> { REQUEST_SET_COLOR -> {
if (user == null) return
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
if (data == null) return if (data == null) return
val color = data.getIntExtra(EXTRA_COLOR, Color.TRANSPARENT) val color = data.getIntExtra(EXTRA_COLOR, Color.TRANSPARENT)
userColorNameManager.setUserColor(this.user!!.key, color) userColorNameManager.setUserColor(user.key, color)
} else if (resultCode == ColorPickerDialogActivity.RESULT_CLEARED) { } else if (resultCode == ColorPickerDialogActivity.RESULT_CLEARED) {
userColorNameManager.clearUserColor(this.user!!.key) userColorNameManager.clearUserColor(user.key)
} }
} }
REQUEST_ADD_TO_LIST -> { REQUEST_ADD_TO_LIST -> {
if (user == null) return
if (resultCode == Activity.RESULT_OK && data != null) { if (resultCode == Activity.RESULT_OK && data != null) {
val twitter = twitterWrapper val twitter = twitterWrapper
val list = data.getParcelableExtra<ParcelableUserList>(EXTRA_USER_LIST) ?: return val list = data.getParcelableExtra<ParcelableUserList>(EXTRA_USER_LIST) ?: return
twitter.addUserListMembersAsync(user.account_key, list.id, user) twitter.addUserListMembersAsync(accountKey, list.id, user)
} }
} }
REQUEST_SELECT_ACCOUNT -> { REQUEST_SELECT_ACCOUNT -> {
if (user == null) return
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
if (data == null || !data.hasExtra(EXTRA_ID)) return if (data == null || !data.hasExtra(EXTRA_ID)) return
val accountKey = data.getParcelableExtra<UserKey>(EXTRA_ACCOUNT_KEY) val selectedAccountKey: UserKey = data.getParcelableExtra(EXTRA_ACCOUNT_KEY) ?: return
var userKey = user.key var userKey = user.key
if (account?.type == AccountType.MASTODON && account?.key?.host != accountKey.host) { if (account?.type == AccountType.MASTODON && account?.key?.host != selectedAccountKey.host) {
userKey = AcctPlaceholderUserKey(user.key.host) userKey = AcctPlaceholderUserKey(user.key.host)
} }
IntentUtils.openUserProfile(activity, accountKey, userKey, user.screen_name, IntentUtils.openUserProfile(activity, selectedAccountKey, userKey, user.screen_name,
user.extras?.statusnet_profile_url, preferences[newDocumentApiKey], user.extras?.statusnet_profile_url, preferences[newDocumentApiKey],
null) null)
} }
@ -786,10 +784,11 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
@UiThread @UiThread
override fun onPrepareOptionsMenu(menu: Menu) { override fun onPrepareOptionsMenu(menu: Menu) {
val user = this.user ?: return val user = this.user ?: return
val accountKey = user.account_key ?: return
val account = this.account val account = this.account
val relationship = this.relationship val relationship = this.relationship
val isMyself = user.account_key.maybeEquals(user.key) val isMyself = accountKey.maybeEquals(user.key)
val mentionItem = menu.findItem(R.id.mention) val mentionItem = menu.findItem(R.id.mention)
if (mentionItem != null) { if (mentionItem != null) {
val displayName = UserColorNameManager.decideDisplayName(user.nickname, val displayName = UserColorNameManager.decideDisplayName(user.nickname,
@ -881,14 +880,14 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
val context = context val context = context
val twitter = twitterWrapper val twitter = twitterWrapper
val user = user val user = user ?: return false
val accountKey = user.account_key ?: return false
val userRelationship = relationship val userRelationship = relationship
if (user == null) return false
when (item.itemId) { when (item.itemId) {
R.id.block -> { R.id.block -> {
if (userRelationship == null) return true if (userRelationship == null) return true
if (userRelationship.blocking) { if (userRelationship.blocking) {
twitter.destroyBlockAsync(user.account_key, user.key) twitter.destroyBlockAsync(accountKey, user.key)
} else { } else {
CreateUserBlockDialogFragment.show(fragmentManager, user) CreateUserBlockDialogFragment.show(fragmentManager, user)
} }
@ -910,7 +909,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
R.id.mute_user -> { R.id.mute_user -> {
if (userRelationship == null) return true if (userRelationship == null) return true
if (userRelationship.muting) { if (userRelationship.muting) {
twitter.destroyMuteAsync(user.account_key, user.key) twitter.destroyMuteAsync(accountKey, user.key)
} else { } else {
CreateUserMuteDialogFragment.show(fragmentManager, user) CreateUserMuteDialogFragment.show(fragmentManager, user)
} }
@ -928,10 +927,10 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
scheme(SCHEME_TWIDERE) scheme(SCHEME_TWIDERE)
authority(AUTHORITY_MESSAGES) authority(AUTHORITY_MESSAGES)
path(PATH_MESSAGES_CONVERSATION_NEW) path(PATH_MESSAGES_CONVERSATION_NEW)
appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, user.account_key.toString()) appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
} }
val intent = Intent(Intent.ACTION_VIEW, builder.build()) val intent = Intent(Intent.ACTION_VIEW, builder.build())
intent.putExtra(EXTRA_ACCOUNT, AccountUtils.getAccountDetails(am, user.account_key, intent.putExtra(EXTRA_ACCOUNT, AccountUtils.getAccountDetails(am, accountKey,
true)) true))
intent.putExtra(EXTRA_USERS, arrayOf(user)) intent.putExtra(EXTRA_USERS, arrayOf(user))
intent.putExtra(EXTRA_OPEN_CONVERSATION, true) intent.putExtra(EXTRA_OPEN_CONVERSATION, true)
@ -966,13 +965,13 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
} }
R.id.follow -> { R.id.follow -> {
if (userRelationship == null) return true if (userRelationship == null) return true
val updatingRelationship = twitter.isUpdatingRelationship(user.account_key, val updatingRelationship = twitter.isUpdatingRelationship(accountKey,
user.key) user.key)
if (!updatingRelationship) { if (!updatingRelationship) {
if (userRelationship.following) { if (userRelationship.following) {
DestroyFriendshipDialogFragment.show(fragmentManager, user) DestroyFriendshipDialogFragment.show(fragmentManager, user)
} else { } else {
twitter.createFriendshipAsync(user.account_key, user.key, user.screen_name) twitter.createFriendshipAsync(accountKey, user.key, user.screen_name)
} }
} }
return true return true
@ -981,7 +980,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
val newState = !item.isChecked val newState = !item.isChecked
val update = FriendshipUpdate() val update = FriendshipUpdate()
update.retweets(newState) update.retweets(newState)
twitter.updateFriendship(user.account_key, user.key, update) twitter.updateFriendship(accountKey, user.key, update)
item.isChecked = newState item.isChecked = newState
return true return true
} }
@ -993,28 +992,28 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
} }
val update = FriendshipUpdate() val update = FriendshipUpdate()
update.deviceNotifications(newState) update.deviceNotifications(newState)
twitter.updateFriendship(user.account_key, user.key, update) twitter.updateFriendship(accountKey, user.key, update)
item.isChecked = newState item.isChecked = newState
return true return true
} }
R.id.muted_users -> { R.id.muted_users -> {
IntentUtils.openMutesUsers(activity, user.account_key) IntentUtils.openMutesUsers(activity, accountKey)
return true return true
} }
R.id.blocked_users -> { R.id.blocked_users -> {
IntentUtils.openUserBlocks(activity, user.account_key) IntentUtils.openUserBlocks(activity, accountKey)
return true return true
} }
R.id.incoming_friendships -> { R.id.incoming_friendships -> {
IntentUtils.openIncomingFriendships(activity, user.account_key) IntentUtils.openIncomingFriendships(activity, accountKey)
return true return true
} }
R.id.user_mentions -> { R.id.user_mentions -> {
IntentUtils.openUserMentions(context, user.account_key, user.screen_name) IntentUtils.openUserMentions(context, accountKey, user.screen_name)
return true return true
} }
R.id.saved_searches -> { R.id.saved_searches -> {
IntentUtils.openSavedSearches(context, user.account_key) IntentUtils.openSavedSearches(context, accountKey)
return true return true
} }
R.id.open_in_browser -> { R.id.open_in_browser -> {
@ -1039,22 +1038,22 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
} }
R.id.add_user_to_home_screen -> { R.id.add_user_to_home_screen -> {
ShortcutCreator.performCreation(this) { ShortcutCreator.performCreation(this) {
ShortcutCreator.user(context, user.account_key, user) ShortcutCreator.user(context, accountKey, user)
} }
} }
R.id.add_statuses_to_home_screen -> { R.id.add_statuses_to_home_screen -> {
ShortcutCreator.performCreation(this) { ShortcutCreator.performCreation(this) {
ShortcutCreator.userTimeline(context, user.account_key, user) ShortcutCreator.userTimeline(context, accountKey, user)
} }
} }
R.id.add_favorites_to_home_screen -> { R.id.add_favorites_to_home_screen -> {
ShortcutCreator.performCreation(this) { ShortcutCreator.performCreation(this) {
ShortcutCreator.userFavorites(context, user.account_key, user) ShortcutCreator.userFavorites(context, accountKey, user)
} }
} }
R.id.add_media_to_home_screen -> { R.id.add_media_to_home_screen -> {
ShortcutCreator.performCreation(this) { ShortcutCreator.performCreation(this) {
ShortcutCreator.userMediaTimeline(context, user.account_key, user) ShortcutCreator.userMediaTimeline(context, accountKey, user)
} }
} }
else -> { else -> {
@ -1197,28 +1196,28 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
} }
override fun onClick(view: View) { override fun onClick(view: View) {
val activity = activity val activity = activity ?: return
val user = user val user = user ?: return
if (activity == null || user == null) return val accountKey = user.account_key ?: return
when (view.id) { when (view.id) {
R.id.errorContainer -> { R.id.errorContainer -> {
getUserInfo(true) getUserInfo(true)
} }
R.id.follow -> { R.id.follow -> {
if (user.account_key.maybeEquals(user.key)) { if (accountKey.maybeEquals(user.key)) {
IntentUtils.openProfileEditor(getActivity(), user.account_key) IntentUtils.openProfileEditor(getActivity(), accountKey)
} else { } else {
val userRelationship = relationship val userRelationship = relationship
val twitter = twitterWrapper val twitter = twitterWrapper
if (userRelationship == null) return if (userRelationship == null) return
if (userRelationship.blocking) { if (userRelationship.blocking) {
twitter.destroyBlockAsync(user.account_key, user.key) twitter.destroyBlockAsync(accountKey, user.key)
} else if (userRelationship.blocked_by) { } else if (userRelationship.blocked_by) {
CreateUserBlockDialogFragment.show(childFragmentManager, user) CreateUserBlockDialogFragment.show(childFragmentManager, user)
} else if (userRelationship.following) { } else if (userRelationship.following) {
DestroyFriendshipDialogFragment.show(fragmentManager, user) DestroyFriendshipDialogFragment.show(fragmentManager, user)
} else { } else {
twitter.createFriendshipAsync(user.account_key, user.key, user.screen_name) twitter.createFriendshipAsync(accountKey, user.key, user.screen_name)
} }
} }
} }
@ -1228,7 +1227,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
profileImage.type = ParcelableMedia.Type.IMAGE profileImage.type = ParcelableMedia.Type.IMAGE
profileImage.preview_url = user.profile_image_url profileImage.preview_url = user.profile_image_url
val media = arrayOf(profileImage) val media = arrayOf(profileImage)
IntentUtils.openMedia(activity, user.account_key, media, null, false, IntentUtils.openMedia(activity, accountKey, media, null, false,
preferences[newDocumentApiKey], preferences[displaySensitiveContentsKey]) preferences[newDocumentApiKey], preferences[displaySensitiveContentsKey])
} }
R.id.profileBanner -> { R.id.profileBanner -> {
@ -1236,28 +1235,28 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
val profileBanner = ParcelableMediaUtils.image(url) val profileBanner = ParcelableMediaUtils.image(url)
profileBanner.type = ParcelableMedia.Type.IMAGE profileBanner.type = ParcelableMedia.Type.IMAGE
val media = arrayOf(profileBanner) val media = arrayOf(profileBanner)
IntentUtils.openMedia(activity, user.account_key, media, null, false, IntentUtils.openMedia(activity, accountKey, media, null, false,
preferences[newDocumentApiKey], preferences[displaySensitiveContentsKey]) preferences[newDocumentApiKey], preferences[displaySensitiveContentsKey])
} }
R.id.listedContainer -> { R.id.listedContainer -> {
IntentUtils.openUserLists(getActivity(), user.account_key, user.key, IntentUtils.openUserLists(getActivity(), accountKey, user.key,
user.screen_name) user.screen_name)
} }
R.id.groupsContainer -> { R.id.groupsContainer -> {
IntentUtils.openUserGroups(getActivity(), user.account_key, user.key, IntentUtils.openUserGroups(getActivity(), accountKey, user.key,
user.screen_name) user.screen_name)
} }
R.id.followersContainer -> { R.id.followersContainer -> {
IntentUtils.openUserFollowers(getActivity(), user.account_key, user.key, IntentUtils.openUserFollowers(getActivity(), accountKey, user.key,
user.screen_name) user.screen_name)
} }
R.id.friendsContainer -> { R.id.friendsContainer -> {
IntentUtils.openUserFriends(getActivity(), user.account_key, user.key, IntentUtils.openUserFriends(getActivity(), accountKey, user.key,
user.screen_name) user.screen_name)
} }
R.id.nameContainer -> { R.id.nameContainer -> {
if (user.account_key == user.key) return if (accountKey == user.key) return
IntentUtils.openProfileEditor(getActivity(), user.account_key) IntentUtils.openProfileEditor(getActivity(), accountKey)
} }
R.id.urlContainer -> { R.id.urlContainer -> {
val uri = user.urlPreferred?.let(Uri::parse) ?: return val uri = user.urlPreferred?.let(Uri::parse) ?: return
@ -1379,7 +1378,8 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
private fun getUserInfo(omitIntentExtra: Boolean) { private fun getUserInfo(omitIntentExtra: Boolean) {
val user = this.user ?: return val user = this.user ?: return
getUserInfo(user.account_key, user.key, user.screen_name, omitIntentExtra) val accountKey = user.account_key ?: return
getUserInfo(accountKey, user.key, user.screen_name, omitIntentExtra)
} }
private fun setUiColor(color: Int) { private fun setUiColor(color: Int) {
@ -1598,6 +1598,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
} }
private fun showAddToListDialog(user: ParcelableUser) { private fun showAddToListDialog(user: ParcelableUser) {
val accountKey = user.account_key ?: return
val weakThis = WeakReference(this) val weakThis = WeakReference(this)
executeAfterFragmentResumed { executeAfterFragmentResumed {
ProgressDialogFragment.show(it.childFragmentManager, "get_list_progress") ProgressDialogFragment.show(it.childFragmentManager, "get_list_progress")
@ -1618,7 +1619,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
return result return result
} }
val microBlog = MicroBlogAPIFactory.getInstance(fragment.context, user.account_key) val microBlog = MicroBlogAPIFactory.getInstance(fragment.context, accountKey)
val ownedLists = ArrayList<ParcelableUserList>() val ownedLists = ArrayList<ParcelableUserList>()
val listMemberships = microBlog.getUserListOwnerMemberships(user.key.id) val listMemberships = microBlog.getUserListOwnerMemberships(user.key.id)
val paging = Paging() val paging = Paging()
@ -1627,7 +1628,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
do { do {
val resp = microBlog.getUserListOwnerships(paging) val resp = microBlog.getUserListOwnerships(paging)
resp.mapTo(ownedLists) { item -> resp.mapTo(ownedLists) { item ->
val userList = item.toParcelable(user.account_key) val userList = item.toParcelable(accountKey)
userList.is_user_inside = listMemberships.any { it.id == item.id } userList.is_user_inside = listMemberships.any { it.id == item.id }
return@mapTo userList return@mapTo userList
} }
@ -1645,7 +1646,7 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
fragment.executeAfterFragmentResumed { f -> fragment.executeAfterFragmentResumed { f ->
val df = AddRemoveUserListDialogFragment() val df = AddRemoveUserListDialogFragment()
df.arguments = Bundle { df.arguments = Bundle {
this[EXTRA_ACCOUNT_KEY] = user.account_key this[EXTRA_ACCOUNT_KEY] = accountKey
this[EXTRA_USER_KEY] = user.key this[EXTRA_USER_KEY] = user.key
this[EXTRA_USER_LISTS] = result this[EXTRA_USER_LISTS] = result
} }

View File

@ -57,12 +57,14 @@ class IncomingFriendshipsFragment : ParcelableUsersFragment(), IUsersAdapter.Req
override fun onAcceptClicked(holder: UserViewHolder, position: Int) { override fun onAcceptClicked(holder: UserViewHolder, position: Int) {
val user = adapter.getUser(position) ?: return val user = adapter.getUser(position) ?: return
twitterWrapper.acceptFriendshipAsync(user.account_key, user.key) val accountKey = user.account_key ?: return
twitterWrapper.acceptFriendshipAsync(accountKey, user.key)
} }
override fun onDenyClicked(holder: UserViewHolder, position: Int) { override fun onDenyClicked(holder: UserViewHolder, position: Int) {
val user = adapter.getUser(position) ?: return val user = adapter.getUser(position) ?: return
twitterWrapper.denyFriendshipAsync(user.account_key, user.key) val accountKey = user.account_key ?: return
twitterWrapper.denyFriendshipAsync(accountKey, user.key)
} }
@SuppressLint("SwitchIntDef") @SuppressLint("SwitchIntDef")

View File

@ -36,7 +36,7 @@ abstract class ComponentPickerPreference(context: Context, attrs: AttributeSet?
override fun getSummary(): CharSequence { override fun getSummary(): CharSequence {
if (isNoneValue(value)) return noneEntry if (isNoneValue(value)) return noneEntry
return entry return entry ?: noneEntry
} }
protected abstract val intentAction: String protected abstract val intentAction: String

View File

@ -69,7 +69,7 @@ object IntentUtils {
fun userProfile(user: ParcelableUser): Intent { fun userProfile(user: ParcelableUser): Intent {
val uri = LinkCreator.getTwidereUserLink(user.account_key, user.key, user.screen_name) val uri = LinkCreator.getTwidereUserLink(user.account_key, user.key, user.screen_name)
val intent = Intent(Intent.ACTION_VIEW, uri) val intent = uri.intent()
intent.setExtrasClassLoader(TwidereApplication::class.java.classLoader) intent.setExtrasClassLoader(TwidereApplication::class.java.classLoader)
intent.putExtra(EXTRA_USER, user) intent.putExtra(EXTRA_USER, user)
if (user.extras != null) { if (user.extras != null) {
@ -81,7 +81,7 @@ object IntentUtils {
fun userProfile(accountKey: UserKey?, userKey: UserKey?, screenName: String?, fun userProfile(accountKey: UserKey?, userKey: UserKey?, screenName: String?,
profileUrl: String? = null, accountHost: String? = accountKey?.host ?: userKey?.host): Intent { profileUrl: String? = null, accountHost: String? = accountKey?.host ?: userKey?.host): Intent {
val uri = LinkCreator.getTwidereUserLink(accountKey, userKey, screenName) val uri = LinkCreator.getTwidereUserLink(accountKey, userKey, screenName)
val intent = Intent(Intent.ACTION_VIEW, uri) val intent = uri.intent()
intent.putExtra(EXTRA_PROFILE_URL, profileUrl) intent.putExtra(EXTRA_PROFILE_URL, profileUrl)
intent.putExtra(EXTRA_ACCOUNT_HOST, accountHost) intent.putExtra(EXTRA_ACCOUNT_HOST, accountHost)
return intent return intent
@ -100,7 +100,7 @@ object IntentUtils {
profileUrl: String? = null): Intent { profileUrl: String? = null): Intent {
val uri = LinkCreator.getTwidereUserRelatedLink(AUTHORITY_USER_MEDIA_TIMELINE, accountKey, val uri = LinkCreator.getTwidereUserRelatedLink(AUTHORITY_USER_MEDIA_TIMELINE, accountKey,
userKey, screenName) userKey, screenName)
val intent = Intent(Intent.ACTION_VIEW, uri) val intent = uri.intent()
intent.putExtra(EXTRA_PROFILE_URL, profileUrl) intent.putExtra(EXTRA_PROFILE_URL, profileUrl)
return intent return intent
} }
@ -109,7 +109,7 @@ object IntentUtils {
profileUrl: String? = null): Intent { profileUrl: String? = null): Intent {
val uri = LinkCreator.getTwidereUserRelatedLink(AUTHORITY_USER_FAVORITES, accountKey, val uri = LinkCreator.getTwidereUserRelatedLink(AUTHORITY_USER_FAVORITES, accountKey,
userKey, screenName) userKey, screenName)
val intent = Intent(Intent.ACTION_VIEW, uri) val intent = uri.intent()
intent.putExtra(EXTRA_PROFILE_URL, profileUrl) intent.putExtra(EXTRA_PROFILE_URL, profileUrl)
return intent return intent
} }
@ -118,25 +118,20 @@ object IntentUtils {
if (items == null) return if (items == null) return
val extras = Bundle() val extras = Bundle()
extras.putParcelableArrayList(EXTRA_ITEMS, ArrayList(items)) extras.putParcelableArrayList(EXTRA_ITEMS, ArrayList(items))
val builder = Uri.Builder() val builder = UriBuilder(AUTHORITY_ITEMS)
builder.scheme(SCHEME_TWIDERE) val intent = builder.intent()
builder.authority(AUTHORITY_ITEMS)
val intent = Intent(Intent.ACTION_VIEW, builder.build())
intent.putExtras(extras) intent.putExtras(extras)
context.startActivity(intent) context.startActivity(intent)
} }
fun openUserMentions(context: Context, accountKey: UserKey?, fun openUserMentions(context: Context, accountKey: UserKey?,
screenName: String) { screenName: String) {
val builder = Uri.Builder() val builder = UriBuilder(AUTHORITY_USER_MENTIONS)
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_USER_MENTIONS)
if (accountKey != null) { if (accountKey != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
} }
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName) builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName)
val intent = Intent(Intent.ACTION_VIEW, builder.build()) context.startActivity(builder.intent())
context.startActivity(intent)
} }
fun openMedia(context: Context, status: ParcelableStatus, fun openMedia(context: Context, status: ParcelableStatus,
@ -250,137 +245,107 @@ object IntentUtils {
} }
fun messageConversation(accountKey: UserKey, conversationId: String): Intent { fun messageConversation(accountKey: UserKey, conversationId: String): Intent {
val builder = Uri.Builder() val builder = UriBuilder(AUTHORITY_MESSAGES)
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_MESSAGES)
builder.path(PATH_MESSAGES_CONVERSATION) builder.path(PATH_MESSAGES_CONVERSATION)
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
builder.appendQueryParameter(QUERY_PARAM_CONVERSATION_ID, conversationId) builder.appendQueryParameter(QUERY_PARAM_CONVERSATION_ID, conversationId)
val intent = Intent(Intent.ACTION_VIEW, builder.build()) return builder.intent()
intent.`package` = BuildConfig.APPLICATION_ID
return intent
} }
fun messageConversationInfo(accountKey: UserKey, conversationId: String): Intent { fun messageConversationInfo(accountKey: UserKey, conversationId: String): Intent {
val builder = Uri.Builder() val builder = UriBuilder(AUTHORITY_MESSAGES)
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_MESSAGES)
builder.path(PATH_MESSAGES_CONVERSATION_INFO) builder.path(PATH_MESSAGES_CONVERSATION_INFO)
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
builder.appendQueryParameter(QUERY_PARAM_CONVERSATION_ID, conversationId) builder.appendQueryParameter(QUERY_PARAM_CONVERSATION_ID, conversationId)
val intent = Intent(Intent.ACTION_VIEW, builder.build()) return builder.intent()
intent.`package` = BuildConfig.APPLICATION_ID
return intent
} }
fun newMessageConversation(accountKey: UserKey): Intent { fun newMessageConversation(accountKey: UserKey): Intent {
val builder = Uri.Builder() val builder = UriBuilder(AUTHORITY_MESSAGES)
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_MESSAGES)
builder.path(PATH_MESSAGES_CONVERSATION_NEW) builder.path(PATH_MESSAGES_CONVERSATION_NEW)
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
val intent = Intent(Intent.ACTION_VIEW, builder.build()) return builder.intent()
intent.`package` = BuildConfig.APPLICATION_ID
return intent
} }
fun openIncomingFriendships(context: Context, fun openIncomingFriendships(context: Context,
accountKey: UserKey?) { accountKey: UserKey?) {
val builder = Uri.Builder() val builder = UriBuilder(AUTHORITY_INCOMING_FRIENDSHIPS)
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_INCOMING_FRIENDSHIPS)
if (accountKey != null) { if (accountKey != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
} }
val intent = Intent(Intent.ACTION_VIEW, builder.build()) context.startActivity(builder.intent())
intent.`package` = BuildConfig.APPLICATION_ID
context.startActivity(intent)
} }
fun openMap(context: Context, latitude: Double, longitude: Double) { fun openMap(context: Context, latitude: Double, longitude: Double) {
if (!ParcelableLocationUtils.isValidLocation(latitude, longitude)) return if (!ParcelableLocationUtils.isValidLocation(latitude, longitude)) return
val builder = Uri.Builder() val builder = UriBuilder(AUTHORITY_MAP)
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_MAP)
builder.appendQueryParameter(QUERY_PARAM_LAT, latitude.toString()) builder.appendQueryParameter(QUERY_PARAM_LAT, latitude.toString())
builder.appendQueryParameter(QUERY_PARAM_LNG, longitude.toString()) builder.appendQueryParameter(QUERY_PARAM_LNG, longitude.toString())
val intent = Intent(Intent.ACTION_VIEW, builder.build()) context.startActivity(builder.intent())
intent.`package` = BuildConfig.APPLICATION_ID
context.startActivity(intent)
} }
fun openMutesUsers(context: Context, fun openMutesUsers(context: Context,
accountKey: UserKey?) { accountKey: UserKey?) {
val builder = Uri.Builder() val builder = UriBuilder(AUTHORITY_MUTES_USERS)
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_MUTES_USERS)
if (accountKey != null) { if (accountKey != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
} }
val intent = Intent(Intent.ACTION_VIEW, builder.build()) context.startActivity(builder.intent())
intent.`package` = BuildConfig.APPLICATION_ID
context.startActivity(intent)
} }
fun openSavedSearches(context: Context, accountKey: UserKey?) { fun openSavedSearches(context: Context, accountKey: UserKey?) {
val builder = Uri.Builder() val builder = UriBuilder(AUTHORITY_SAVED_SEARCHES)
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_SAVED_SEARCHES)
if (accountKey != null) { if (accountKey != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
} }
val intent = Intent(Intent.ACTION_VIEW, builder.build()) context.startActivity(builder.intent())
intent.`package` = BuildConfig.APPLICATION_ID
context.startActivity(intent)
} }
fun openSearch(context: Context, accountKey: UserKey?, query: String, type: String? = null) { fun openSearch(context: Context, accountKey: UserKey?, query: String, type: String? = null) {
val intent = Intent(Intent.ACTION_VIEW) val builder = UriBuilder(AUTHORITY_SEARCH)
// Some devices cannot process query parameter with hashes well, so add this intent extra
intent.putExtra(EXTRA_QUERY, query)
if (accountKey != null) {
intent.putExtra(EXTRA_ACCOUNT_KEY, accountKey)
}
val builder = Uri.Builder()
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_SEARCH)
if (accountKey != null) { if (accountKey != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
} }
builder.appendQueryParameter(QUERY_PARAM_QUERY, query) builder.appendQueryParameter(QUERY_PARAM_QUERY, query)
if (!TextUtils.isEmpty(type)) { if (!TextUtils.isEmpty(type)) {
builder.appendQueryParameter(QUERY_PARAM_TYPE, type) builder.appendQueryParameter(QUERY_PARAM_TYPE, type)
}
val intent = builder.intent()
// Some devices cannot process query parameter with hashes well, so add this intent extra
intent.putExtra(EXTRA_QUERY, query)
if (!TextUtils.isEmpty(type)) {
intent.putExtra(EXTRA_TYPE, type) intent.putExtra(EXTRA_TYPE, type)
} }
intent.data = builder.build()
if (accountKey != null) {
intent.putExtra(EXTRA_ACCOUNT_KEY, accountKey)
}
context.startActivity(intent) context.startActivity(intent)
} }
fun openMastodonSearch(context: Context, accountKey: UserKey?, query: String) { fun openMastodonSearch(context: Context, accountKey: UserKey?, query: String) {
val intent = Intent(Intent.ACTION_VIEW) val builder = UriBuilder(AUTHORITY_MASTODON_SEARCH)
if (accountKey != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
}
builder.appendQueryParameter(QUERY_PARAM_QUERY, query)
val intent = builder.intent()
// Some devices cannot process query parameter with hashes well, so add this intent extra // Some devices cannot process query parameter with hashes well, so add this intent extra
intent.putExtra(EXTRA_QUERY, query) intent.putExtra(EXTRA_QUERY, query)
if (accountKey != null) { if (accountKey != null) {
intent.putExtra(EXTRA_ACCOUNT_KEY, accountKey) intent.putExtra(EXTRA_ACCOUNT_KEY, accountKey)
} }
val builder = Uri.Builder()
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_MASTODON_SEARCH)
if (accountKey != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
}
builder.appendQueryParameter(QUERY_PARAM_QUERY, query)
intent.data = builder.build()
context.startActivity(intent) context.startActivity(intent)
} }
fun status(accountKey: UserKey?, statusId: String): Intent { fun status(accountKey: UserKey?, statusId: String): Intent {
val uri = LinkCreator.getTwidereStatusLink(accountKey, statusId) val uri = LinkCreator.getTwidereStatusLink(accountKey, statusId)
return Intent(Intent.ACTION_VIEW, uri) return Intent(Intent.ACTION_VIEW, uri).setPackage(BuildConfig.APPLICATION_ID)
} }
fun openStatus(context: Context, accountKey: UserKey?, statusId: String) { fun openStatus(context: Context, accountKey: UserKey?, statusId: String) {
@ -388,65 +353,44 @@ object IntentUtils {
} }
fun openStatus(context: Context, status: ParcelableStatus, activityOptions: Bundle? = null) { fun openStatus(context: Context, status: ParcelableStatus, activityOptions: Bundle? = null) {
val builder = Uri.Builder() val intent = status(status.account_key, status.id)
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_STATUS)
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, status.account_key.toString())
builder.appendQueryParameter(QUERY_PARAM_STATUS_ID, status.id)
val intent = Intent(Intent.ACTION_VIEW, builder.build())
intent.setExtrasClassLoader(TwidereApplication::class.java.classLoader) intent.setExtrasClassLoader(TwidereApplication::class.java.classLoader)
intent.putExtra(EXTRA_STATUS, status) intent.putExtra(EXTRA_STATUS, status)
ActivityCompat.startActivity(context, intent, activityOptions) ActivityCompat.startActivity(context, intent, activityOptions)
} }
fun openStatusFavoriters(context: Context, accountKey: UserKey?, fun openStatusFavoriters(context: Context, accountKey: UserKey?, statusId: String) {
statusId: String) { val builder = UriBuilder(AUTHORITY_STATUS_FAVORITERS)
val builder = Uri.Builder()
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_STATUS_FAVORITERS)
if (accountKey != null) { if (accountKey != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
} }
builder.appendQueryParameter(QUERY_PARAM_STATUS_ID, statusId) builder.appendQueryParameter(QUERY_PARAM_STATUS_ID, statusId)
val intent = Intent(Intent.ACTION_VIEW, builder.build()) ActivityCompat.startActivity(context, builder.intent(), null)
ActivityCompat.startActivity(context, intent, null)
} }
fun openStatusRetweeters(context: Context, accountKey: UserKey?, fun openStatusRetweeters(context: Context, accountKey: UserKey?, statusId: String) {
statusId: String) { val builder = UriBuilder(AUTHORITY_STATUS_RETWEETERS)
val builder = Uri.Builder()
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_STATUS_RETWEETERS)
if (accountKey != null) { if (accountKey != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
} }
builder.appendQueryParameter(QUERY_PARAM_STATUS_ID, statusId) builder.appendQueryParameter(QUERY_PARAM_STATUS_ID, statusId)
val intent = Intent(Intent.ACTION_VIEW, builder.build()) ActivityCompat.startActivity(context, builder.intent(), null)
ActivityCompat.startActivity(context, intent, null)
} }
fun openTweetSearch(context: Context, accountKey: UserKey?, fun openTweetSearch(context: Context, accountKey: UserKey?, query: String) {
query: String) {
openSearch(context, accountKey, query, QUERY_PARAM_VALUE_TWEETS) openSearch(context, accountKey, query, QUERY_PARAM_VALUE_TWEETS)
} }
fun openUserBlocks(activity: Activity?, accountKey: UserKey) { fun openUserBlocks(activity: Activity?, accountKey: UserKey) {
if (activity == null) return if (activity == null) return
val builder = Uri.Builder() val builder = UriBuilder(AUTHORITY_USER_BLOCKS)
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_USER_BLOCKS)
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
val intent = Intent(Intent.ACTION_VIEW, builder.build()) activity.startActivity(builder.intent())
activity.startActivity(intent)
} }
fun openUserFavorites(context: Context, fun openUserFavorites(context: Context, accountKey: UserKey?, userKey: UserKey?,
accountKey: UserKey?,
userKey: UserKey?,
screenName: String?) { screenName: String?) {
val builder = Uri.Builder() val builder = UriBuilder(AUTHORITY_USER_FAVORITES)
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_USER_FAVORITES)
if (accountKey != null) { if (accountKey != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
} }
@ -456,8 +400,7 @@ object IntentUtils {
if (screenName != null) { if (screenName != null) {
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName) builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName)
} }
val intent = Intent(Intent.ACTION_VIEW, builder.build()) context.startActivity(builder.intent())
context.startActivity(intent)
} }
@ -468,13 +411,9 @@ object IntentUtils {
context.startActivity(Intent(Intent.ACTION_VIEW, intent)) context.startActivity(Intent(Intent.ACTION_VIEW, intent))
} }
fun openUserFriends(context: Context, fun openUserFriends(context: Context, accountKey: UserKey?, userKey: UserKey?,
accountKey: UserKey?,
userKey: UserKey?,
screenName: String?) { screenName: String?) {
val builder = Uri.Builder() val builder = UriBuilder(AUTHORITY_USER_FRIENDS)
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_USER_FRIENDS)
if (accountKey != null) { if (accountKey != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
} }
@ -484,9 +423,7 @@ object IntentUtils {
if (screenName != null) { if (screenName != null) {
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName) builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName)
} }
val intent = Intent(Intent.ACTION_VIEW, builder.build()) context.startActivity(builder.intent())
context.startActivity(intent)
} }
fun openUserListDetails(context: Context, accountKey: UserKey?, listId: String?, fun openUserListDetails(context: Context, accountKey: UserKey?, listId: String?,
@ -496,14 +433,14 @@ object IntentUtils {
fun userListDetails(accountKey: UserKey?, listId: String?, userKey: UserKey?, fun userListDetails(accountKey: UserKey?, listId: String?, userKey: UserKey?,
screenName: String?, listName: String?): Intent { screenName: String?, listName: String?): Intent {
return Intent(Intent.ACTION_VIEW, getTwidereUserListRelatedLink(AUTHORITY_USER_LIST, return getTwidereUserListRelatedLink(AUTHORITY_USER_LIST, accountKey, listId, userKey,
accountKey, listId, userKey, screenName, listName)) screenName, listName).intent()
} }
fun userListTimeline(accountKey: UserKey?, listId: String?, userKey: UserKey?, fun userListTimeline(accountKey: UserKey?, listId: String?, userKey: UserKey?,
screenName: String?, listName: String?): Intent { screenName: String?, listName: String?): Intent {
return Intent(Intent.ACTION_VIEW, getTwidereUserListRelatedLink(AUTHORITY_USER_LIST_TIMELINE, return getTwidereUserListRelatedLink(AUTHORITY_USER_LIST_TIMELINE, accountKey, listId,
accountKey, listId, userKey, screenName, listName)) userKey, screenName, listName).intent()
} }
fun openUserListDetails(context: Context, userList: ParcelableUserList) { fun openUserListDetails(context: Context, userList: ParcelableUserList) {
@ -513,35 +450,28 @@ object IntentUtils {
fun userListDetails(userList: ParcelableUserList): Intent { fun userListDetails(userList: ParcelableUserList): Intent {
val userKey = userList.user_key val userKey = userList.user_key
val listId = userList.id val listId = userList.id
val builder = Uri.Builder() val builder = UriBuilder(AUTHORITY_USER_LIST)
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_USER_LIST)
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, userList.account_key.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, userList.account_key.toString())
builder.appendQueryParameter(QUERY_PARAM_USER_KEY, userKey.toString()) builder.appendQueryParameter(QUERY_PARAM_USER_KEY, userKey.toString())
builder.appendQueryParameter(QUERY_PARAM_LIST_ID, listId) builder.appendQueryParameter(QUERY_PARAM_LIST_ID, listId)
val intent = Intent(Intent.ACTION_VIEW, builder.build()) val intent = builder.intent()
intent.setExtrasClassLoader(TwidereApplication::class.java.classLoader) intent.setExtrasClassLoader(TwidereApplication::class.java.classLoader)
intent.putExtra(EXTRA_USER_LIST, userList) intent.putExtra(EXTRA_USER_LIST, userList)
return intent return intent
} }
fun openGroupDetails(context: Context, group: ParcelableGroup) { fun openGroupDetails(context: Context, group: ParcelableGroup) {
val builder = Uri.Builder() val builder = UriBuilder(AUTHORITY_GROUP)
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_GROUP)
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, group.account_key.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, group.account_key.toString())
builder.appendQueryParameter(QUERY_PARAM_GROUP_ID, group.id) builder.appendQueryParameter(QUERY_PARAM_GROUP_ID, group.id)
builder.appendQueryParameter(QUERY_PARAM_GROUP_NAME, group.nickname) builder.appendQueryParameter(QUERY_PARAM_GROUP_NAME, group.nickname)
val intent = Intent(Intent.ACTION_VIEW, builder.build()) val intent = builder.intent()
intent.setExtrasClassLoader(TwidereApplication::class.java.classLoader) intent.setExtrasClassLoader(TwidereApplication::class.java.classLoader)
intent.putExtra(EXTRA_GROUP, group) intent.putExtra(EXTRA_GROUP, group)
context.startActivity(intent) context.startActivity(intent)
} }
fun openUserLists(context: Context, fun openUserLists(context: Context, accountKey: UserKey?, userKey: UserKey?, screenName: String?) {
accountKey: UserKey?,
userKey: UserKey?,
screenName: String?) {
val builder = Uri.Builder() val builder = Uri.Builder()
builder.scheme(SCHEME_TWIDERE) builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_USER_LISTS) builder.authority(AUTHORITY_USER_LISTS)
@ -554,16 +484,12 @@ object IntentUtils {
if (screenName != null) { if (screenName != null) {
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName) builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName)
} }
val intent = Intent(Intent.ACTION_VIEW, builder.build()) context.startActivity(builder.intent())
context.startActivity(intent)
} }
fun openUserGroups(context: Context, accountKey: UserKey?, userKey: UserKey?, fun openUserGroups(context: Context, accountKey: UserKey?, userKey: UserKey?, screenName: String?) {
screenName: String?) { val builder = UriBuilder(AUTHORITY_USER_GROUPS)
val builder = Uri.Builder()
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_USER_GROUPS)
if (accountKey != null) { if (accountKey != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
} }
@ -573,104 +499,69 @@ object IntentUtils {
if (screenName != null) { if (screenName != null) {
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName) builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName)
} }
val intent = Intent(Intent.ACTION_VIEW, builder.build()) context.startActivity(builder.intent())
context.startActivity(intent)
} }
fun openDirectMessages(context: Context, accountKey: UserKey?) { fun openDirectMessages(context: Context, accountKey: UserKey?) {
val builder = Uri.Builder() val builder = UriBuilder(AUTHORITY_MESSAGES)
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_MESSAGES)
if (accountKey != null) { if (accountKey != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
} }
val intent = Intent(Intent.ACTION_VIEW, builder.build()) context.startActivity(builder.intent())
context.startActivity(intent)
} }
fun openInteractions(context: Context, accountKey: UserKey?) { fun openInteractions(context: Context, accountKey: UserKey?) {
val builder = Uri.Builder() val builder = UriBuilder(AUTHORITY_INTERACTIONS)
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_INTERACTIONS)
if (accountKey != null) { if (accountKey != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
} }
val intent = Intent(Intent.ACTION_VIEW, builder.build()) context.startActivity(builder.intent())
context.startActivity(intent)
} }
fun openPublicTimeline(context: Context, accountKey: UserKey?) { fun openPublicTimeline(context: Context, accountKey: UserKey?) {
val builder = Uri.Builder() val builder = UriBuilder(AUTHORITY_PUBLIC_TIMELINE)
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_PUBLIC_TIMELINE)
if (accountKey != null) { if (accountKey != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
} }
val intent = Intent(Intent.ACTION_VIEW, builder.build()) context.startActivity(builder.intent())
context.startActivity(intent)
} }
fun openNetworkPublicTimeline(context: Context, accountKey: UserKey?) { fun openNetworkPublicTimeline(context: Context, accountKey: UserKey?) {
val builder = Uri.Builder() val builder = UriBuilder(AUTHORITY_NETWORK_PUBLIC_TIMELINE)
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_NETWORK_PUBLIC_TIMELINE)
if (accountKey != null) { if (accountKey != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
} }
val intent = Intent(Intent.ACTION_VIEW, builder.build()) context.startActivity(builder.intent())
context.startActivity(intent)
} }
fun openAccountsManager(context: Context) { fun openAccountsManager(context: Context) {
val intent = Intent() val builder = UriBuilder(AUTHORITY_ACCOUNTS)
val builder = Uri.Builder() context.startActivity(builder.intent())
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_ACCOUNTS)
intent.data = builder.build()
intent.`package` = BuildConfig.APPLICATION_ID
context.startActivity(intent)
} }
fun openDrafts(context: Context) { fun openDrafts(context: Context) {
val intent = Intent() val builder = UriBuilder(AUTHORITY_DRAFTS)
val builder = Uri.Builder() context.startActivity(builder.intent())
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_DRAFTS)
intent.data = builder.build()
intent.`package` = BuildConfig.APPLICATION_ID
context.startActivity(intent)
} }
fun settings(initialTag: String? = null): Intent { fun settings(initialTag: String? = null): Intent {
val intent = Intent()
val builder = Uri.Builder() val builder = Uri.Builder()
builder.scheme(SCHEME_TWIDERE_SETTINGS) builder.scheme(SCHEME_TWIDERE_SETTINGS)
builder.authority(initialTag.orEmpty()) builder.authority(initialTag.orEmpty())
intent.data = builder.build() return builder.intent()
intent.`package` = BuildConfig.APPLICATION_ID
return intent
} }
fun openProfileEditor(context: Context, accountKey: UserKey?) { fun openProfileEditor(context: Context, accountKey: UserKey?) {
val intent = Intent() val builder = UriBuilder(AUTHORITY_PROFILE_EDITOR)
val builder = Uri.Builder()
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_PROFILE_EDITOR)
if (accountKey != null) { if (accountKey != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()) builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString())
} }
intent.data = builder.build() context.startActivity(builder.intent())
intent.`package` = BuildConfig.APPLICATION_ID
context.startActivity(intent)
} }
fun openFilters(context: Context, initialTab: String? = null) { fun openFilters(context: Context, initialTab: String? = null) {
val intent = Intent() val builder = UriBuilder(AUTHORITY_FILTERS)
val builder = Uri.Builder() val intent = builder.intent()
builder.scheme(SCHEME_TWIDERE)
builder.authority(AUTHORITY_FILTERS)
intent.data = builder.build()
intent.`package` = BuildConfig.APPLICATION_ID
intent.putExtra(EXTRA_INITIAL_TAB, initialTab) intent.putExtra(EXTRA_INITIAL_TAB, initialTab)
context.startActivity(intent) context.startActivity(intent)
} }
@ -702,4 +593,16 @@ object IntentUtils {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT)
} }
} }
private fun UriBuilder(authority: String): Uri.Builder {
return Uri.Builder().scheme(SCHEME_TWIDERE).authority(authority)
}
private fun Uri.intent(action: String = Intent.ACTION_VIEW): Intent {
return Intent(action, this).setPackage(BuildConfig.APPLICATION_ID)
}
private fun Uri.Builder.intent(action: String = Intent.ACTION_VIEW): Intent {
return build().intent(action)
}
} }

View File

@ -134,8 +134,8 @@ object LinkCreator {
when (user.user_type) { when (user.user_type) {
AccountType.FANFOU -> return getFanfouUserLink(user.key.id) AccountType.FANFOU -> return getFanfouUserLink(user.key.id)
AccountType.MASTODON -> { AccountType.MASTODON -> {
val host = user.key.host ?: user.account_key.host val host = (user.key.host ?: user.account_key?.host)!! // Let it crash
return getMastodonUserLink(host!!, user.screen_name) return getMastodonUserLink(host, user.screen_name)
} }
} }
return getTwitterUserLink(user.screen_name) return getTwitterUserLink(user.screen_name)

View File

@ -120,14 +120,15 @@ class UserViewHolder(
profileImageView.visibility = View.GONE profileImageView.visibility = View.GONE
} }
if (user.account_key != null && twitter.isUpdatingRelationship(user.account_key, user.key)) { val accountKey = user.account_key
if (accountKey != null && twitter.isUpdatingRelationship(accountKey, user.key)) {
processingRequestProgress.visibility = View.VISIBLE processingRequestProgress.visibility = View.VISIBLE
actionsContainer.visibility = View.GONE actionsContainer.visibility = View.GONE
} else { } else {
processingRequestProgress.visibility = View.GONE processingRequestProgress.visibility = View.GONE
actionsContainer.visibility = View.VISIBLE actionsContainer.visibility = View.VISIBLE
} }
if (user.account_key != null && user.key.hasSameHost(user.account_key)) { if (accountKey != null && user.key.hasSameHost(accountKey)) {
externalIndicator.visibility = View.GONE externalIndicator.visibility = View.GONE
} else { } else {
externalIndicator.visibility = View.VISIBLE externalIndicator.visibility = View.VISIBLE
@ -137,7 +138,7 @@ class UserViewHolder(
followButton.setImageResource(if (user.is_following) R.drawable.ic_action_confirm else R.drawable.ic_action_add) followButton.setImageResource(if (user.is_following) R.drawable.ic_action_confirm else R.drawable.ic_action_add)
followButton.isActivated = user.is_following followButton.isActivated = user.is_following
val isMySelf = user.account_key == user.key val isMySelf = accountKey == user.key
if (requestClickListener != null && !isMySelf) { if (requestClickListener != null && !isMySelf) {
acceptRequestButton.visibility = View.VISIBLE acceptRequestButton.visibility = View.VISIBLE